From 74543484893693360cb91c8432548d7171ef5bcb Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:37 +0200 Subject: [PATCH 01/22] feat(agent-host): install the DeepSeek Harness runtime on demand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The release archives and the default image ship the agent host without any agent binary: a driver downloads what it needs at the version and sha512 `pnpm-lock.yaml` pins, so a pinned agent is never shadowed by whatever the machine happens to have installed. That worked for single-platform binaries. The DeepSeek Harness runtime is a different shape: a pure-JS CLI whose ~700-package npm closure must be present and resolvable or it does not boot at all. Two pieces, both keyed to the lockfile: - `src/lockfilePins.ts` gains `packageTree()`, which walks the format-9 `snapshots:` graph from a root package pinned in one importer and emits the full closure with the `node_modules/` spot each entry must occupy. A name the closure needs at two versions is laid out the way npm itself does it — one variant at the root, preferring one required paths reach, the others nested under each parent that requires them — and the walker refuses a graph it cannot place exactly. `src/generated/dshPackages.ts` is that output, checked in beside `platformPackages.ts` and covered by the same regenerate-and-diff test. - `src/agentInstall.ts` gains `installPackageTree()`, which downloads that closure into `/@/node_modules/` from the configured registry (mirror included), rejecting any tarball whose sha512 does not match its pin, extracting it whole (the existing ustar/pax parser, in an extract-everything mode with the same path-traversal refusal), and installing each destination atomically through a staging directory. Downloads run in a small parallel pool; extraction is serial and shallow-first, because a nested entry lives inside its parent's directory and would race it. An interrupted install resumes, and a package that cannot be fetched is skipped only when it was reached through `optionalDependencies`. Moving a staged package into place is retried, because one filesystem this runs on refuses a directory rename that the same filesystem accepts a moment later: a bind mount from a Windows host (the container's `/data`) answers EACCES while a file just written inside the directory is still being let go of by the host side. Waiting is the whole of the answer; a rename that keeps failing, or fails for any other reason, is still a failure. A binary's own rename gets the same wait. `@deepseek-ai/dsh` joins `opencode-ai` as an exact-pinned devDependency: present so the lockfile pins its closure, absent from `pnpm deploy --prod` output, so the archives stay lean and the runtime arrives on first use. Co-Authored-By: Claude Code --- packages/agent-host/package.json | 6 +- .../src/__tests__/agentInstall.test.ts | 203 +- .../src/__tests__/lockfilePins.test.ts | 110 +- packages/agent-host/src/agentInstall.ts | 327 +- .../agent-host/src/generated/dshPackages.ts | 707 ++ .../src/generated/platformPackages.ts | 76 + packages/agent-host/src/lockfilePins.ts | 291 +- pnpm-lock.yaml | 9828 +++++++++++++++-- 8 files changed, 10550 insertions(+), 998 deletions(-) create mode 100644 packages/agent-host/src/generated/dshPackages.ts diff --git a/packages/agent-host/package.json b/packages/agent-host/package.json index 7fbedb91..6968a723 100644 --- a/packages/agent-host/package.json +++ b/packages/agent-host/package.json @@ -3,7 +3,7 @@ "version": "1.2.0", "private": true, "type": "module", - "description": "CodeDeck+ agent host — the Node sidecar the bridge runs agent SDKs in (Claude Code, OpenCode), spoken to over the driver protocol on stdio.", + "description": "CodeDeck+ agent host — the Node sidecar the bridge runs agent SDKs in (Claude Code, OpenCode, DeepSeek Harness), spoken to over the driver protocol on stdio.", "scripts": { "build": "node build.mjs", "typecheck": "tsc --noEmit", @@ -16,8 +16,12 @@ "zod": "^4.6.5" }, "devDependencies": { + "@agentclientprotocol/sdk": "^1.7.0", + "@deepseek-ai/dsh": "0.2.0-rc.2", + "@types/js-yaml": "^4.0.9", "@types/node": "^22.10.0", "esbuild": "^0.25.0", + "js-yaml": "^4.2.0", "opencode-ai": "1.18.32", "typescript": "^5.7.0", "vitest": "^3.0.0" diff --git a/packages/agent-host/src/__tests__/agentInstall.test.ts b/packages/agent-host/src/__tests__/agentInstall.test.ts index 1e5d79d9..7839e38b 100644 --- a/packages/agent-host/src/__tests__/agentInstall.test.ts +++ b/packages/agent-host/src/__tests__/agentInstall.test.ts @@ -4,14 +4,23 @@ import * as os from 'node:os'; import * as path from 'node:path'; import { gzipSync } from 'node:zlib'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { extractFile, installBinary, type PackagedBinary, withoutAgentBin } from '../agentInstall'; +import { + extractFile, + extractTree, + installBinary, + installPackageTree, + renameIntoPlace, + type PackagedBinary, + withoutAgentBin, +} from '../agentInstall'; +import type { TreePackageEntry } from '../lockfilePins'; /** One ustar header + body, padded to 512-byte blocks. */ -function tarEntry(name: string, body: Buffer | string, type = '0'): Buffer { +function tarEntry(name: string, body: Buffer | string, type = '0', mode = 0o755): Buffer { const data = typeof body === 'string' ? Buffer.from(body) : body; const header = Buffer.alloc(512); header.write(name.slice(0, 100), 0); - header.write('0000755\0', 100); + header.write(`${mode.toString(8).padStart(7, '0')}\0`, 100); header.write('0000000\0', 108); header.write('0000000\0', 116); header.write(`${data.length.toString(8).padStart(11, '0')}\0`, 124); @@ -164,6 +173,194 @@ describe.skipIf(process.platform === 'win32')('the stable links in /bin', }); }); +describe('extractTree', () => { + let dir: string; + beforeEach(() => { + dir = fs.mkdtempSync(path.join(os.tmpdir(), 'extract-tree-')); + }); + afterEach(() => fs.rmSync(dir, { recursive: true, force: true })); + + it('writes every file under dest, stripping the package/ prefix, whatever the chunking', async () => { + const tar = Buffer.concat([ + tarEntry('package/', '', '5'), + tarEntry('package/package.json', '{"version":"1.0.0"}', '0', 0o644), + tarEntry('package/lib/', '', '5'), + tarEntry('package/lib/bin.js', 'console.log(1)'), + tarEntry('package/LICENSE', 'mit', '0', 0o644), + Buffer.alloc(1024), + ]); + for (const size of [1, 300, 512, 4096, tar.length]) { + const dest = path.join(dir, `tree-${size}`); + await extractTree(chunks(tar, size), dest); + expect(fs.readFileSync(path.join(dest, 'package.json'), 'utf8')).toBe('{"version":"1.0.0"}'); + expect(fs.readFileSync(path.join(dest, 'lib', 'bin.js'), 'utf8')).toBe('console.log(1)'); + expect(fs.readFileSync(path.join(dest, 'LICENSE'), 'utf8')).toBe('mit'); + } + }); + + it('skips an entry that would leave the package, and keeps going', async () => { + const tar = Buffer.concat([ + tarEntry('package/../evil', 'no'), + tarEntry('package/ok', 'yes'), + Buffer.alloc(1024), + ]); + await extractTree(chunks(tar, 512), dir); + expect(fs.existsSync(path.join(dir, 'evil'))).toBe(false); + expect(fs.readFileSync(path.join(dir, 'ok'), 'utf8')).toBe('yes'); + }); + + it('keeps a file executable only when its tar mode is', async () => { + const tar = Buffer.concat([ + tarEntry('package/run.sh', '#!/bin/sh\n', '0', 0o755), + tarEntry('package/plain.txt', 'x', '0', 0o644), + Buffer.alloc(1024), + ]); + await extractTree(chunks(tar, 512), dir); + if (process.platform !== 'win32') { + expect(fs.statSync(path.join(dir, 'run.sh')).mode & 0o111).not.toBe(0); + expect(fs.statSync(path.join(dir, 'plain.txt')).mode & 0o111).toBe(0); + } + }); + + it('follows a pax long name', async () => { + const long = `package/${'d/'.repeat(60)}tool`; + const tar = Buffer.concat([paxEntry(long), tarEntry('package/truncated', 'x'.repeat(10)), Buffer.alloc(1024)]); + await extractTree(chunks(tar, 300), dir); + expect(fs.readFileSync(path.join(dir, ...long.slice('package/'.length).split('/')), 'utf8')).toBe('x'.repeat(10)); + }); +}); + +describe('renameIntoPlace', () => { + it('retries a rename a filesystem refuses for a moment, and then takes it', async () => { + const codes: Array = ['EACCES', 'EPERM', 'EBUSY', undefined]; + let calls = 0; + const rename = (): void => { + const code = codes[calls++]; + if (code !== undefined) throw Object.assign(new Error(`${code}: permission denied`), { code }); + }; + const logs: string[] = []; + await renameIntoPlace('/staging/a', '/tree/a', { rename, log: (line) => logs.push(line) }); + expect(calls).toBe(4); + // Said once, so a slow install on such a filesystem is explicable. + expect(logs).toEqual(['[install] /tree/a was busy (EPERM); retrying']); + }); + + it('fails at once for a rename that is a real error', async () => { + const failing = (): void => { + throw Object.assign(new Error('ENOTEMPTY: directory not empty'), { code: 'ENOTEMPTY' }); + }; + await expect(renameIntoPlace('/a', '/b', { rename: failing })).rejects.toThrow(/ENOTEMPTY/); + }); + + it('gives up after enough attempts on one that never takes', async () => { + let attempts = 0; + const never = (): void => { + attempts++; + throw Object.assign(new Error('EACCES: still busy'), { code: 'EACCES' }); + }; + await expect(renameIntoPlace('/a', '/b', { rename: never })).rejects.toThrow(/still busy/); + expect(attempts).toBe(8); + }); +}); + +describe('installPackageTree', () => { + let cache: string; + const log = vi.fn(); + + /** A minimal npm package tarball: package.json + lib/bin.js for the root. */ + const packageTarball = (name: string, version: string): Buffer => + tarball( + tarEntry('package/package.json', JSON.stringify({ name, version }), '0', 0o644), + ...(name === '@deepseek-ai/dsh' ? [tarEntry('package/lib/bin.js', 'bin!')] : [tarEntry('package/index.js', 'ok', '0', 0o644)]), + ); + + const tgzOf = new Map([ + ['@deepseek-ai/dsh', packageTarball('@deepseek-ai/dsh', '1.0.0')], + ['commander', packageTarball('commander', '15.0.0')], + ['shared-old', packageTarball('shared-old', '0.6.4')], + ]); + const entries: TreePackageEntry[] = [ + { name: '@deepseek-ai/dsh', version: '1.0.0', integrity: sha512(tgzOf.get('@deepseek-ai/dsh')!), dest: 'node_modules/@deepseek-ai/dsh' }, + { name: 'commander', version: '15.0.0', integrity: sha512(tgzOf.get('commander')!), dest: 'node_modules/commander' }, + // A second version of a name, nested under its consumer like pnpm laid it out. + { name: 'shared-old', version: '0.6.4', integrity: sha512(tgzOf.get('shared-old')!), dest: 'node_modules/commander/node_modules/shared-old' }, + { name: 'sunos-only', version: '1.0.0', integrity: 'sha512-whatever', dest: 'node_modules/sunos-only', optional: true, os: ['sunos'] }, + ]; + const registryOf = (bodies: Map) => + vi.fn(async (url: string | URL | Request) => { + const name = [...bodies.keys()].find((n) => String(url).includes(`/${n}/-`)); + const body = name !== undefined ? bodies.get(name) : undefined; + if (typeof body === 'number') return new Response('nope', { status: body }); + return body !== undefined ? new Response(body) : new Response('nope', { status: 404 }); + }) as unknown as typeof fetch; + + beforeEach(() => { + cache = fs.mkdtempSync(path.join(os.tmpdir(), 'install-tree-')); + log.mockClear(); + }); + afterEach(() => fs.rmSync(cache, { recursive: true, force: true })); + + it('lays every entry out at its dest, serving a repeat call from the cache', async () => { + const fetchFn = registryOf(tgzOf); + const root = await installPackageTree('@deepseek-ai/dsh', entries, { cacheDir: cache, registry: 'https://registry.test', log, fetchFn, label: 'DSH' }); + expect(root).toBe(path.join(cache, '@deepseek-ai+dsh@1.0.0', 'node_modules', '@deepseek-ai', 'dsh')); + expect(JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'))).toEqual({ name: '@deepseek-ai/dsh', version: '1.0.0' }); + expect(fs.readFileSync(path.join(root, 'lib', 'bin.js'), 'utf8')).toBe('bin!'); + expect(fs.readFileSync(path.join(root, '..', '..', 'commander', 'index.js'), 'utf8')).toBe('ok'); + expect( + JSON.parse(fs.readFileSync(path.join(root, '..', '..', 'commander', 'node_modules', 'shared-old', 'package.json'), 'utf8')).version, + ).toBe('0.6.4'); + // The sunos-only optional is gated away on any machine CI runs; it must + // be neither fetched nor laid down. + expect(fs.existsSync(path.join(cache, '@deepseek-ai+dsh@1.0.0', 'node_modules', 'sunos-only'))).toBe(false); + expect(fetchFn).toHaveBeenCalledTimes(3); + + await installPackageTree('@deepseek-ai/dsh', entries, { cacheDir: cache, log, fetchFn, label: 'DSH' }); + expect(fetchFn).toHaveBeenCalledTimes(3); + expect(fs.readdirSync(path.join(cache, '@deepseek-ai+dsh@1.0.0'))).toEqual(['node_modules']); // no staging left + }); + + it('replaces a package left at the wrong version', async () => { + const stale = path.join(cache, '@deepseek-ai+dsh@1.0.0', 'node_modules', 'commander'); + fs.mkdirSync(stale, { recursive: true }); + fs.writeFileSync(path.join(stale, 'package.json'), '{"version":"14.0.0"}'); + const fetchFn = registryOf(tgzOf); + await installPackageTree('@deepseek-ai/dsh', entries, { cacheDir: cache, log, fetchFn, label: 'DSH' }); + expect(JSON.parse(fs.readFileSync(path.join(stale, 'package.json'), 'utf8')).version).toBe('15.0.0'); + }); + + it('skips an optional package the registry will not serve', async () => { + const withOptional = [ + ...entries.slice(0, 3), + { name: 'maybe-here', version: '1.0.0', integrity: 'sha512-x', dest: 'node_modules/maybe-here', optional: true } as TreePackageEntry, + ]; + await installPackageTree('@deepseek-ai/dsh', withOptional, { cacheDir: cache, log, fetchFn: registryOf(tgzOf), label: 'DSH' }); + expect(log).toHaveBeenCalledWith(expect.stringMatching(/skipping optional maybe-here@1.0.0/)); + expect(fs.existsSync(path.join(cache, '@deepseek-ai+dsh@1.0.0', 'node_modules', 'maybe-here'))).toBe(false); + }); + + it('fails the install when a required tarball does not match its pin', async () => { + const tampered = new Map([['@deepseek-ai/dsh', packageTarball('@deepseek-ai/dsh', '9.9.9')], ['commander', tgzOf.get('commander')!], ['shared-old', tgzOf.get('shared-old')!]]); + await expect( + installPackageTree('@deepseek-ai/dsh', entries, { cacheDir: cache, log, fetchFn: registryOf(tampered), label: 'DSH' }), + ).rejects.toThrow(/@deepseek-ai\/dsh could not be installed: the tarball does not match its pinned sha512/); + }); + + it('refuses a root this build does not pin', async () => { + await expect(installPackageTree('unpinned', entries, { cacheDir: cache, log })).rejects.toThrow(/unpinned is not pinned/); + }); + + it('prunes older versions of the tree once the new one is in', async () => { + const old = path.join(cache, '@deepseek-ai+dsh@0.9.0'); + const unrelated = path.join(cache, 'opencode-linux-x64@1.0.0'); + fs.mkdirSync(old); + fs.mkdirSync(unrelated); + await installPackageTree('@deepseek-ai/dsh', entries, { cacheDir: cache, log, fetchFn: registryOf(tgzOf), label: 'DSH' }); + expect(fs.existsSync(old)).toBe(false); + expect(fs.existsSync(unrelated)).toBe(true); + }); +}); + describe('withoutAgentBin', () => { it("drops only /bin from PATH, keeping the variable's own name", () => { const cache = path.resolve('/srv/agents'); diff --git a/packages/agent-host/src/__tests__/lockfilePins.test.ts b/packages/agent-host/src/__tests__/lockfilePins.test.ts index af57961d..e8d6e5cf 100644 --- a/packages/agent-host/src/__tests__/lockfilePins.test.ts +++ b/packages/agent-host/src/__tests__/lockfilePins.test.ts @@ -1,7 +1,7 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; import { describe, expect, it } from 'vitest'; -import { platformPackages, renderPlatformPackages } from '../lockfilePins'; +import { packageTree, platformPackages, renderDshPackages, renderPlatformPackages } from '../lockfilePins'; const LOCKFILE = `lockfileVersion: '9.0' @@ -65,3 +65,111 @@ describe('src/generated/platformPackages.ts', () => { await expect(renderPlatformPackages(platformPackages(lockfile))).toMatchFileSnapshot('../generated/platformPackages.ts'); }); }); + +// A format-9 lockfile in miniature: metadata in `packages:`, resolved graphs +// in `snapshots:` with pnpm's `(peer…)`/`(hash)` id suffixes, the root pinned +// for an importer, and a name the closure needs at two versions (negotiator) +// — the walker must read through all of that and place every entry where +// Node would resolve it. +const TREE_LOCKFILE = `lockfileVersion: '9.0' + +importers: + + packages/agent-host: + dependencies: + kept: + specifier: ^1.0.0 + version: 1.0.0 + devDependencies: + '@deepseek-ai/dsh': + specifier: 1.0.0 + version: 1.0.0(ab12cd34) + +packages: + + '@deepseek-ai/dsh@1.0.0': + resolution: {integrity: sha512-dsh} + hasBin: true + + '@deepseek-ai/dsh-base@1.0.0': + resolution: {integrity: sha512-base} + + commander@15.0.0: + resolution: {integrity: sha512-commander} + version: 15.0.0 + + negotiator@0.6.4: + resolution: {integrity: sha512-neg-old} + + negotiator@1.1.0: + resolution: {integrity: sha512-neg-new} + + wasm-fallback@1.0.0: + resolution: {integrity: sha512-wasm} + + darwin-only@1.0.0: + resolution: {integrity: sha512-darwin} + os: [darwin] + + unrelated@2.0.0: + resolution: {integrity: sha512-unrelated} + +snapshots: + + '@deepseek-ai/dsh@1.0.0(ab12cd34)': + dependencies: + '@deepseek-ai/dsh-base': 1.0.0(cd34ef56) + commander: 15.0.0 + negotiator: 1.1.0 + wasm-fallback: 1.0.0 + + '@deepseek-ai/dsh-base@1.0.0(cd34ef56)': + dependencies: + commander: 15.0.0 + negotiator: 0.6.4 + optionalDependencies: + darwin-only: 1.0.0 +`; + +describe('packageTree', () => { + it('places the closure, nesting a second version under its consumer', () => { + expect(packageTree(TREE_LOCKFILE, 'packages/agent-host', '@deepseek-ai/dsh')).toEqual([ + { name: '@deepseek-ai/dsh', version: '1.0.0', integrity: 'sha512-dsh', dest: 'node_modules/@deepseek-ai/dsh' }, + { name: '@deepseek-ai/dsh-base', version: '1.0.0', integrity: 'sha512-base', dest: 'node_modules/@deepseek-ai/dsh-base' }, + { name: 'negotiator', version: '1.1.0', integrity: 'sha512-neg-new', dest: 'node_modules/@deepseek-ai/dsh/node_modules/negotiator' }, + { name: 'commander', version: '15.0.0', integrity: 'sha512-commander', dest: 'node_modules/commander' }, + { name: 'darwin-only', version: '1.0.0', integrity: 'sha512-darwin', dest: 'node_modules/darwin-only', optional: true, os: ['darwin'] }, + { name: 'negotiator', version: '0.6.4', integrity: 'sha512-neg-old', dest: 'node_modules/negotiator' }, + { name: 'wasm-fallback', version: '1.0.0', integrity: 'sha512-wasm', dest: 'node_modules/wasm-fallback' }, + ]); + }); + + it('refuses ambiguous peer resolutions of one package', () => { + const ambiguous = TREE_LOCKFILE.replace( + 'snapshots:', + "snapshots:\n\n '@deepseek-ai/dsh-base@1.0.0(other)':\n dependencies:\n commander: 15.0.0", + ); + expect(() => packageTree(ambiguous, 'packages/agent-host', '@deepseek-ai/dsh')).toThrow(/peer resolutions of @deepseek-ai\/dsh-base@1\.0\.0/); + }); + + it('refuses a dependency with no pinned entry', () => { + const dangling = TREE_LOCKFILE.replace( + " '@deepseek-ai/dsh@1.0.0(ab12cd34)':\n dependencies:", + " '@deepseek-ai/dsh@1.0.0(ab12cd34)':\n dependencies:\n ghost: 1.0.0", + ); + expect(() => packageTree(dangling, 'packages/agent-host', '@deepseek-ai/dsh')).toThrow(/no pinned entry for ghost@1\.0\.0/); + }); + + it('refuses a root the importer does not pin', () => { + expect(() => packageTree(TREE_LOCKFILE, 'packages/agent-host', 'not-a-dep')).toThrow(/does not pin not-a-dep/); + }); +}); + +describe('src/generated/dshPackages.ts', () => { + it('matches pnpm-lock.yaml', async () => { + const lockfile = fs.readFileSync(path.resolve(__dirname, '../../../../pnpm-lock.yaml'), 'utf8'); + await expect(renderDshPackages(packageTree(lockfile, 'packages/agent-host', '@deepseek-ai/dsh'))).toMatchFileSnapshot( + '../generated/dshPackages.ts', + ); + }); +}); diff --git a/packages/agent-host/src/agentInstall.ts b/packages/agent-host/src/agentInstall.ts index 151fdef0..d3cc18fa 100644 --- a/packages/agent-host/src/agentInstall.ts +++ b/packages/agent-host/src/agentInstall.ts @@ -19,10 +19,10 @@ import * as os from 'node:os'; import * as path from 'node:path'; import { Readable, Transform } from 'node:stream'; import { pipeline } from 'node:stream/promises'; -import { createGunzip } from 'node:zlib'; -import { isFile } from './executable'; +import { createGunzip, gunzipSync } from 'node:zlib'; +import { isFile, isMusl } from './executable'; import { PLATFORM_PACKAGES } from './generated/platformPackages'; -import type { PackagePin } from './lockfilePins'; +import type { PackagePin, TreePackageEntry } from './lockfilePins'; const DEFAULT_REGISTRY = 'https://registry.npmjs.org'; @@ -143,7 +143,9 @@ export async function installBinary(binary: PackagedBinary, options: InstallOpti } if (!found) throw new Error(`${binary.pkg}@${pin.version} has no ${binary.file}`); fs.chmodSync(partial, 0o755); - fs.renameSync(partial, target); + // A file's rename is refused by the same filesystem in the same way (see + // renameIntoPlace), so it waits the same way. + await renameIntoPlace(partial, target, { log: options.log }); } catch (err) { throw new Error(`${binary.label} could not be installed: ${err instanceof Error ? err.message : String(err)}`); } finally { @@ -292,3 +294,320 @@ function paxPath(records: string): string | undefined { } return undefined; } + +// --- Whole dependency trees --- +// +// A pure-JS agent CLI (the DeepSeek Harness runtime) is not one platform +// binary but a ~90-package npm closure: nothing to run unless every package +// sits in one node_modules. The pins for that come from pnpm-lock.yaml the +// same way the single-binary pins do (src/lockfilePins.ts), and the same +// rules hold — every tarball at the exact pinned version, rejected unless +// its sha512 matches, from the configured registry or mirror. + +/** Whether a tree package's platform gates admit this machine. */ +export function packageMatchesPlatform( + pin: { os?: string[]; cpu?: string[]; libc?: string[] }, + platform: NodeJS.Platform = process.platform, + arch: string = process.arch, + musl: boolean = isMusl(), +): boolean { + if (pin.os && !pin.os.includes(platform)) return false; + if (pin.cpu && !pin.cpu.includes(arch)) return false; + if (pin.libc && !pin.libc.includes(musl ? 'musl' : 'glibc')) return false; + return true; +} + +/** The `version` of an installed package's package.json, or undefined for a + * missing or unreadable package. */ +function installedVersion(dir: string): string | undefined { + try { + const parsed = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as { version?: unknown }; + return typeof parsed.version === 'string' ? parsed.version : undefined; + } catch { + return undefined; + } +} + +/** Download one tarball and verify it against its sha512 pin. */ +async function fetchVerifiedTarball( + url: string, + integrity: string, + fetchFn: typeof fetch, +): Promise { + const res = await fetchFn(url); + if (!res.ok) throw new Error(`HTTP ${res.status} from ${url}`); + const body = Buffer.from(await res.arrayBuffer()); + const actual = `sha512-${createHash('sha512').update(body).digest('base64')}`; + if (actual !== integrity) throw new Error('the tarball does not match its pinned sha512; the download was rejected'); + return body; +} + +async function* oneBuffer(data: Buffer): AsyncGenerator { + yield data; +} + +/** + * Extract every regular file of a package tarball under `dest` (its + * `package/` prefix stripped). Understands the same ustar/pax quirks as + * extractFile; non-file entries other than directories (symlinks, devices) + * do not occur in npm tarballs and are skipped. The executable bit of a + * file's tar mode survives as 0o755. + */ +export async function extractTree(tar: AsyncIterable, dest: string): Promise { + let pending: Buffer = Buffer.alloc(0); + let inBody = false; + let bodyLeft = 0; + let padLeft = 0; + let sink: 'skip' | 'file' | 'dir' | 'pax' | 'longname' = 'skip'; + let meta: Buffer[] = []; + let nextName: string | undefined; + let out: fs.WriteStream | null = null; + let outPath = ''; + let mode = 0; + + /** npm packs under `package/`; anything else is not an npm tarball, and a + * `..` or empty segment would write outside `dest` — refuse both. */ + const target = (name: string): string | null => { + const rel = name.startsWith('package/') ? name.slice('package/'.length) : name; + if (rel.length === 0) return null; + const parts = rel.split('/'); + if (parts.some((p) => p === '' || p === '.' || p === '..')) return null; + return path.join(dest, ...parts); + }; + + const endBody = async (): Promise => { + inBody = false; + if (sink === 'file' && out) { + out.end(); + await once(out, 'finish'); + out = null; + // A set executable bit is the only mode that matters: bin/ scripts. + if (mode & 0o111) { + try { + fs.chmodSync(outPath, 0o755); + } catch { + /* best effort — the bit is not worth failing an install */ + } + } + } else if (sink === 'dir') { + fs.mkdirSync(outPath, { recursive: true }); + } + if (sink === 'longname') nextName = cString(Buffer.concat(meta), 0, Infinity); + if (sink === 'pax') nextName = paxPath(Buffer.concat(meta).toString('utf8')) ?? nextName; + }; + + try { + for await (const chunk of tar) { + pending = pending.length > 0 ? Buffer.concat([pending, chunk]) : chunk; + let offset = 0; + for (;;) { + if (!inBody) { + const skip = Math.min(padLeft, pending.length - offset); + offset += skip; + padLeft -= skip; + if (padLeft > 0 || pending.length - offset < 512) break; + const header = pending.subarray(offset, offset + 512); + offset += 512; + if (header.every((b) => b === 0)) continue; // end-of-archive blocks + const type = String.fromCharCode(header[156] || 0x30); + const name = nextName ?? entryName(header); + nextName = undefined; + mode = parseInt(cString(header, 100, 8).trim() || '0', 8); + bodyLeft = parseInt(cString(header, 124, 12).trim() || '0', 8); + padLeft = (512 - (bodyLeft % 512)) % 512; + meta = []; + const file = type === '0' || type === ' ' || type === '\0'; + sink = type === 'x' ? 'pax' : type === 'L' ? 'longname' : file ? 'file' : type === '5' ? 'dir' : 'skip'; + const where = sink === 'file' || sink === 'dir' ? target(name) : null; + if (sink === 'file' && where === null) sink = 'skip'; // not an npm path: skip, keep parsing + if (sink === 'dir' && where === null) sink = 'skip'; + if (sink === 'file') { + outPath = where!; + fs.mkdirSync(path.dirname(outPath), { recursive: true }); + out = fs.createWriteStream(outPath); + } else if (sink === 'dir') { + outPath = where!; + } + inBody = true; + if (bodyLeft === 0) await endBody(); + continue; + } + const n = Math.min(bodyLeft, pending.length - offset); + if (n === 0) break; + const piece = pending.subarray(offset, offset + n); + offset += n; + bodyLeft -= n; + if (sink === 'file' && out && !out.write(piece)) await once(out, 'drain'); + else if (sink === 'pax' || sink === 'longname') meta.push(Buffer.from(piece)); + if (bodyLeft === 0) await endBody(); + } + pending = pending.subarray(offset); + } + } finally { + if (out && !out.writableFinished) out.destroy(); + } +} + +/** How many packages the installer downloads at once. */ +const TREE_CONCURRENCY = 4; + +/** How many times a directory rename is retried before it is a real failure, + * and how long the longest wait between two attempts is. Long enough to sit + * out a foreign filesystem's moment of busyness (~2.5s in all), short enough + * that a filesystem that is simply not going to allow it fails the install + * rather than hanging it. */ +const RENAME_ATTEMPTS = 8; +const RENAME_BACKOFF_MS = 500; + +/** + * Move a staged package into place. + * + * Retried, because one filesystem this runs on refuses a directory rename + * that the same filesystem accepts a moment later: a bind mount from a + * Windows host (the container's `/data`, Docker Desktop) answers EACCES while + * a file just written inside the directory is still being let go of by the + * host side. It is not a race this code could remove — the rename is + * serialised, the destination is recreated first, and the same tree of a few + * hundred packages installs on the first attempt on an ordinary filesystem — + * and it is not a failure the caller can fix, since which package it lands on + * differs from run to run. Waiting is the whole of the answer; a rename that + * keeps failing, or fails for any other reason, is still a failure. + */ +export async function renameIntoPlace( + from: string, + to: string, + options: { log?: (message: string) => void; rename?: (from: string, to: string) => void } = {}, +): Promise { + const rename = options.rename ?? fs.renameSync; + for (let attempt = 1; ; attempt++) { + try { + rename(from, to); + return; + } catch (error) { + const code = (error as NodeJS.ErrnoException).code ?? ''; + if (attempt >= RENAME_ATTEMPTS || !['EACCES', 'EPERM', 'EBUSY'].includes(code)) throw error; + if (attempt === 2) options.log?.(`[install] ${to} was busy (${code}); retrying`); + await delay(Math.min(attempt * 100, RENAME_BACKOFF_MS)); + } + } +} + +function delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +/** + * Install one runtime's pinned dependency closure — `entries` come from a + * generated pins module (src/generated/dshPackages.ts today; any pure-JS + * agent CLI installed this way gets its own) — into + * `/@/node_modules/`, laid out as each + * entry's `dest` says (flat at the root, nested under a consumer when the + * closure needs two versions of one name), and return the root package's + * directory. Destinations already present at their pinned version are + * skipped, so an interrupted install resumes; an optional package that + * cannot be fetched is skipped (npm's own semantics), everything else fails + * the install. + */ +export async function installPackageTree( + root: string, + entries: readonly TreePackageEntry[], + options: InstallOptions & { label?: string }, +): Promise { + const rootEntry = entries.find((entry) => entry.name === root); + if (!rootEntry) throw new Error(`${options.label ?? root}: ${root} is not pinned in this build, so it cannot be downloaded`); + + const label = options.label ?? root; + const dir = path.join(options.cacheDir, `${root.replace('/', '+')}@${rootEntry.version}`); + const nodeModules = path.join(dir, 'node_modules'); + const target = (dest: string): string => path.join(dir, ...dest.split('/')); + + // A package whose platform gates exclude this machine: optional ones are + // simply not for us (the wasm or other-OS variant), while a required one + // would leave the tree unbootable — that is a pins problem to surface, not + // a download to attempt. + const wanted: TreePackageEntry[] = []; + for (const entry of entries) { + if (!packageMatchesPlatform(entry)) { + if (!entry.optional) throw new Error(`${label}: ${entry.name}@${entry.version} is required but gated to other platforms`); + continue; + } + wanted.push(entry); + } + + const atVersion = (entry: TreePackageEntry): boolean => installedVersion(target(entry.dest)) === entry.version; + if (wanted.every(atVersion)) return target(rootEntry.dest); + + // The same tarball serves every spot its package occupies (a nested + // variant may sit under several consumers): fetch once, extract per dest. + const byTarball = new Map(); + for (const entry of wanted) { + const key = `${entry.name}@${entry.version}`; + byTarball.set(key, [...(byTarball.get(key) ?? []), entry]); + } + + const staging = path.join(dir, `.staging-${process.pid}`); + const registry = options.registry ?? DEFAULT_REGISTRY; + const fetchFn = options.fetchFn ?? fetch; + const started = Date.now(); + options.log(`[install] downloading ${label} (${byTarball.size} packages) from ${registry}`); + try { + fs.mkdirSync(staging, { recursive: true }); + + // Phase 1: fetch every distinct tarball once, in parallel — this is the + // network-bound part. An optional package that cannot be fetched is + // dropped here (npm's own semantics); anything else fails the install. + const tarballs = new Map(); + const jobs = [...byTarball.keys()]; + let next = 0; + const download = async (): Promise => { + for (;;) { + const index = next++; + if (index >= jobs.length) return; + const group = byTarball.get(jobs[index]!)!; + const first = group[0]!; + if (group.every(atVersion)) { + tarballs.set(jobs[index]!, null); // already on disk + continue; + } + try { + const url = `${registry}/${first.name}/-/${first.name.split('/').pop()}-${first.version}.tgz`; + tarballs.set(jobs[index]!, gunzipSync(await fetchVerifiedTarball(url, first.integrity, fetchFn))); + } catch (err) { + const reason = err instanceof Error ? err.message : String(err); + if (first.optional) { + options.log(`[install] skipping optional ${first.name}@${first.version}: ${reason}`); + tarballs.set(jobs[index]!, null); + continue; + } + throw new Error(`${first.name} could not be installed: ${reason}`); + } + } + }; + await Promise.all(Array.from({ length: TREE_CONCURRENCY }, () => download())); + + // Phase 2: lay the tarballs down serially, shallow dest first. A nested + // entry installs inside its parent's directory, so extracting in + // parallel would race a parent's replace against its children. + const depth = (dest: string): number => dest.split('/').length; + const ordered = wanted + .filter((entry) => tarballs.get(`${entry.name}@${entry.version}`)) + .sort((a, b) => depth(a.dest) - depth(b.dest)); + for (const entry of ordered) { + if (atVersion(entry)) continue; + const tar = tarballs.get(`${entry.name}@${entry.version}`)!; + const pkgDir = target(entry.dest); + const stage = path.join(staging, entry.dest); + fs.rmSync(stage, { recursive: true, force: true }); + await extractTree(oneBuffer(tar), stage); + fs.rmSync(pkgDir, { recursive: true, force: true }); + fs.mkdirSync(path.dirname(pkgDir), { recursive: true }); + await renameIntoPlace(stage, pkgDir, { log: options.log }); + } + + pruneOtherVersions(options.cacheDir, `${root.replace('/', '+')}@`, path.basename(dir)); + options.log(`[install] ${label} installed at ${dir} (${((Date.now() - started) / 1000) | 0}s)`); + return target(rootEntry.dest); + } finally { + removeQuietly(staging); + } +} diff --git a/packages/agent-host/src/generated/dshPackages.ts b/packages/agent-host/src/generated/dshPackages.ts new file mode 100644 index 00000000..c255d4ab --- /dev/null +++ b/packages/agent-host/src/generated/dshPackages.ts @@ -0,0 +1,707 @@ +// Generated from pnpm-lock.yaml by src/lockfilePins.ts — do not edit. +// Regenerate with this package's `gen:platform-packages` script. +import type { TreePackageEntry } from '../lockfilePins'; + +export const DSH_PACKAGES: readonly TreePackageEntry[] = [ + { name: "@agentclientprotocol/sdk", version: "1.4.0", integrity: "sha512-/eufudw+aFY1LKLolT6yFE6UMmYRl7fMJ/DEONSIyR6wI3slHWITBsANRGqXEY8FRzqUxwh7QEaGiZHcJPVThg==", dest: "node_modules/@agentclientprotocol/sdk" }, + { name: "@anthropic-ai/sdk", version: "0.124.0", integrity: "sha512-cN5O8i9UVxHeOQAzj/XjshWXG8KiibJDw9OGpH2Z/eR3n/RBxdoLxDJOcfqAJWvjaMDFfHTBADU04hWRJVkDyA==", dest: "node_modules/@anthropic-ai/sdk" }, + { name: "@aws-sdk/client-bedrock-runtime", version: "3.1127.0", integrity: "sha512-IDl/lrPb90aH+pZFHGNDmgH9nAUQj5PlZH1sJ3w7RikctyjHSnY3oNjZhrLoaBoQn/rNK0zsP6OHEqEhj2tdLA==", dest: "node_modules/@aws-sdk/client-bedrock-runtime" }, + { name: "@aws-sdk/core", version: "3.978.1", integrity: "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg==", dest: "node_modules/@aws-sdk/core" }, + { name: "@aws-sdk/credential-provider-env", version: "3.972.72", integrity: "sha512-xTKO/FWJPozTIXbozVnVGoNBhaGba8TBcx+KyUjRVeOlXE+dUc7GTR1cLvu0uTdIdmemzaFbqqCshXeZA1fZew==", dest: "node_modules/@aws-sdk/credential-provider-env" }, + { name: "@aws-sdk/credential-provider-http", version: "3.972.74", integrity: "sha512-u91E/hT8f4d1xy0Jl7VG4nVKJ3lxbrZkoBTeSVoJdWBiSEUMwMS/9+e0H/aJVQV//Lt5wuzP+E69v4aRSsNTmw==", dest: "node_modules/@aws-sdk/credential-provider-http" }, + { name: "@aws-sdk/credential-provider-ini", version: "3.973.17", integrity: "sha512-ged4KXdBkvIC81bLvNHHuQKdKak/VXhQTR1NWYTTqW0474nlmsxy9O/vlgTIohDDWH3xpBdtVMZRyjb+DnocDA==", dest: "node_modules/@aws-sdk/credential-provider-ini" }, + { name: "@aws-sdk/credential-provider-login", version: "3.972.79", integrity: "sha512-L+Z85anONJd8MaiuraO4wRxATCdEejBZ3K3eymzWI5JPXa9sOS9CkIm72PBKqXKX+Z9p9NGMX5AIMXm0LEflgw==", dest: "node_modules/@aws-sdk/credential-provider-login" }, + { name: "@aws-sdk/credential-provider-node", version: "3.972.84", integrity: "sha512-oHt854odINVwzwsh+c5x69j0ajm4DbqqqVJ+O1ECsCIZeMDAbzFpXItaqP7UZstJj/ATdTk/KFSH0LaNAgV+kA==", dest: "node_modules/@aws-sdk/credential-provider-node" }, + { name: "@aws-sdk/credential-provider-process", version: "3.972.72", integrity: "sha512-rLIp2xbMjX/k9/od7APpqq1ZgXXnV0pOL1Th3ZsL8Wu0TRtBsDTVS8iPqcfRFcHakFxPvR04OSTv2ka2qOb/2A==", dest: "node_modules/@aws-sdk/credential-provider-process" }, + { name: "@aws-sdk/credential-provider-sso", version: "3.973.16", integrity: "sha512-IGihaJfFZYacJJr/odqILCoK7W/mvrZ7cuK7ECn3sAu4vLC6u0V8bS7mCGbdugJ8Aum2tnvqmx0F2MRFp2rn9g==", dest: "node_modules/@aws-sdk/credential-provider-sso" }, + { name: "@aws-sdk/token-providers", version: "3.1138.0", integrity: "sha512-GpyAr0DD63YOEmYFM6Df+gJuIgC92MMTiBK4FTKfxii5MJ9ge20epR7LyroulscYlG89J+ZB2ivFDPjvfQhzdw==", dest: "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers" }, + { name: "@aws-sdk/credential-provider-web-identity", version: "3.972.78", integrity: "sha512-/y9WvNtlcPBGLR0qc1a+9J/xtYZfVczvLUOuXaVWylzttH7ewsxwHtjmiJSolNrVSDorIxHGHMU61CbonRkmwA==", dest: "node_modules/@aws-sdk/credential-provider-web-identity" }, + { name: "@aws-sdk/eventstream-handler-node", version: "3.972.35", integrity: "sha512-a8xilRoRaalvSPZdfrs0VY3/BPc0uYhXW56Z/k6nmZ5Vk430LHeowf9APIPq8utM3tMJSNGSSuJMlB9YrPsN+A==", dest: "node_modules/@aws-sdk/eventstream-handler-node" }, + { name: "@aws-sdk/middleware-eventstream", version: "3.972.30", integrity: "sha512-B6gvZlcnRBNWraKgyEjKsbhv+VjtbyHmpU7hmtTHzXpDSxHPpCJnYLpglEOOsF+SFne20DbZC5IVC1aNr2Pb4A==", dest: "node_modules/@aws-sdk/middleware-eventstream" }, + { name: "@aws-sdk/middleware-websocket", version: "3.972.54", integrity: "sha512-bhESdru8u8KosziH8jcVta/NM/dNreeRz2+2aU86si5bfBYOiJ6IiqD+9U4URUcU5WJO3Yw+jO3GLDIHlscXMQ==", dest: "node_modules/@aws-sdk/middleware-websocket" }, + { name: "@aws-sdk/nested-clients", version: "3.997.46", integrity: "sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ==", dest: "node_modules/@aws-sdk/nested-clients" }, + { name: "@aws-sdk/signature-v4-multi-region", version: "3.996.47", integrity: "sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g==", dest: "node_modules/@aws-sdk/signature-v4-multi-region" }, + { name: "@aws-sdk/token-providers", version: "3.1127.0", integrity: "sha512-Dv2TMWBshJ+tF6ahs2Sy5bh4Iabsd4GAQqVvE9XZmYmnoaVbpS2QKIKE/HRacc7bTtbjEEvP+laGzHvHlf1CiQ==", dest: "node_modules/@aws-sdk/token-providers" }, + { name: "@aws-sdk/types", version: "3.974.6", integrity: "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==", dest: "node_modules/@aws-sdk/types" }, + { name: "@aws-sdk/xml-builder", version: "3.972.41", integrity: "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ==", dest: "node_modules/@aws-sdk/xml-builder" }, + { name: "@aws/lambda-invoke-store", version: "0.3.0", integrity: "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==", dest: "node_modules/@aws/lambda-invoke-store" }, + { name: "@babel/code-frame", version: "7.29.7", integrity: "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", dest: "node_modules/@babel/code-frame" }, + { name: "@babel/helper-validator-identifier", version: "7.29.7", integrity: "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", dest: "node_modules/@babel/helper-validator-identifier" }, + { name: "@babel/runtime", version: "7.29.7", integrity: "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", dest: "node_modules/@babel/runtime" }, + { name: "@deepseek-ai/cordis", version: "4.0.4", integrity: "sha512-obgyxqWAmFn3Re8kvsuUnyW+ihrz6eJCnJO4fh1cQzDtmPYz/zzVeUkH9R94I0OwSVOocK67Kgakm04j/oQXzg==", dest: "node_modules/@deepseek-ai/cordis" }, + { name: "@deepseek-ai/cordis-plugin-group", version: "1.0.4", integrity: "sha512-/7tuY5pMQetHava4v6QUeOa4CwZA+mleNvbIoj+iqEmzkYUtlXbLqhzJIcbnDa/Hxgr1jaCwROrI77nuLyeCFg==", dest: "node_modules/@deepseek-ai/cordis-plugin-group" }, + { name: "@deepseek-ai/cordis-plugin-include", version: "1.0.9", integrity: "sha512-Xmekm7u5Kpeym6nABL4T1/Mg6aQYFZxsipB0WycmCctvX1DqAv8nCFwRmg2XMx/f7EbZgNEbXQwJfabcMu8zxQ==", dest: "node_modules/@deepseek-ai/cordis-plugin-include" }, + { name: "@deepseek-ai/cordis-plugin-loader", version: "1.0.5", integrity: "sha512-200huL2ttWcjyeYllvPYn+qMR7I89qy8MhZasbHltPzB/KMrSfsyoCYKdCGc5KqPGj5iJugcmibQzjINMO9I+Q==", dest: "node_modules/@deepseek-ai/cordis-plugin-loader" }, + { name: "@deepseek-ai/cordis-plugin-timer", version: "1.1.6", integrity: "sha512-/nZC7G637LIDF8G+lhF4OSXl1uFRuNAZqv1x11CDGLSjUpmIayePfzABEGTDEKAY+IBivg2DIXBr/sjjaLZxqg==", dest: "node_modules/@deepseek-ai/cordis-plugin-timer" }, + { name: "@deepseek-ai/cosmokit", version: "1.8.5", integrity: "sha512-LXsrlem9z8dq4sLflj2yuCuYX7KqhdzF5hZly3eZyuTo8d6oDSOXuEgC5DbQWKW+lksm6zmOutQLsP/ma6wR6A==", dest: "node_modules/@deepseek-ai/cosmokit" }, + { name: "@deepseek-ai/dsh", version: "0.2.0-rc.2", integrity: "sha512-EAJ3gPNcVt/uv8X19PMm9NkVhWgT7xXNMk0UKCVm+IQ5rpSQOcsMUa0HWlnYYVybKMsccjcRB21vVVsaXQ6IdA==", dest: "node_modules/@deepseek-ai/dsh" }, + { name: "@deepseek-ai/dsh-acp", version: "0.2.0-rc.2", integrity: "sha512-UbejJaK2DycmUbIw+N3LCdcENeD7I3fgs5xvieHQNUjEK4PKnmv8Z2em+74FG2ltKZs9l77PL3AWO0d4KcfPJg==", dest: "node_modules/@deepseek-ai/dsh-acp" }, + { name: "@deepseek-ai/dsh-acp-app", version: "0.2.0-rc.2", integrity: "sha512-4eL+Cj/kGKvf1VSEE8NFmrh+uELCUUAFesaFh0NMTxUWO9HP8f71qjkWvNl2tUcNCP9DiIxSzNTmV1PPCZ0ovw==", dest: "node_modules/@deepseek-ai/dsh-acp-app" }, + { name: "@deepseek-ai/dsh-agent", version: "0.2.0-rc.2", integrity: "sha512-CUkbU+c1G0ETXkpoLkpAFo5midz66FQGtlgQOP9pzvU9H3zJQVl4H5LrhhGVbEXKLFgdbtQiOynEW8hpWn3y0Q==", dest: "node_modules/@deepseek-ai/dsh-agent" }, + { name: "@deepseek-ai/dsh-agent-default-model", version: "0.2.0-rc.2", integrity: "sha512-m0obV++p2V7nJp0X/04VntPisDUcNQfuyV+AuG9XhUxdm3tvFvBtY6wgNjAcqE2GMLwFVnZovCnO7GqnhBbB8A==", dest: "node_modules/@deepseek-ai/dsh-agent-default-model" }, + { name: "@deepseek-ai/dsh-agent-instructions", version: "0.2.0-rc.2", integrity: "sha512-jasnwitU5efx5WT8X0OBapbdfssUdo+YpK7aquN7tSItCgVodN5RmGjm83zNw9awvlXjVlt7QMYeRcFUfZrZ6Q==", dest: "node_modules/@deepseek-ai/dsh-agent-instructions" }, + { name: "@deepseek-ai/dsh-agent-loop", version: "0.2.0-rc.2", integrity: "sha512-Ayi1L7s1LIJAq3iCCRFDCGM9Y2lriGlV6nblIYXhKrq+J8bUFQtOdfBYNE1N39WcYb3CwSvTNHDtzZ4oW6MZ6A==", dest: "node_modules/@deepseek-ai/dsh-agent-loop" }, + { name: "@deepseek-ai/dsh-agent-preset", version: "0.2.0-rc.2", integrity: "sha512-hrRWLO0ow0lVWqDL0nWPPZqsjUR+J05JgDoTuz1qJrpvGbXMykayOx+ZkKWy64ErkqW2pMIgT4JGYeOPoH7kmA==", dest: "node_modules/@deepseek-ai/dsh-agent-preset" }, + { name: "@deepseek-ai/dsh-agent-preset-registry", version: "0.2.0-rc.2", integrity: "sha512-Awdhxsnm85ZrQASUc/fLpBHnggAnI2ar7RIJL++Lcy04Hx9q/INqJlFfCKVL68ugZGh14iJNy5/OM+ZfcmbjUw==", dest: "node_modules/@deepseek-ai/dsh-agent-preset-registry" }, + { name: "@deepseek-ai/dsh-agent-tool-presentation", version: "0.2.0-rc.2", integrity: "sha512-TDoipfVMvuuwZglKn8eW3oVCRcMb10A1SPgj8xn753F6IWo4sDnlQ5I3/+xZ5lNfWowKJcQlBCobokHSAs/TIg==", dest: "node_modules/@deepseek-ai/dsh-agent-tool-presentation" }, + { name: "@deepseek-ai/dsh-anonymous-user-id", version: "0.2.0-rc.2", integrity: "sha512-/VDAUjcv/xj+iPDrTTt6rC/+jo8r/H8WXEQPmjbB8W9q/cDnlp3KzM87Dy/6jT085G7a3BjsXTk0K6Bol0AcTg==", dest: "node_modules/@deepseek-ai/dsh-anonymous-user-id" }, + { name: "@deepseek-ai/dsh-api-account-controller", version: "0.2.0-rc.2", integrity: "sha512-auwEoRLEBcWbtdxpEoeQjeQ72dk9igh/fNJHEVPbmDLK7oXR+Yxn+hTxoT3v4IsLfQjKKljeEN4zz6aNgdbqjw==", dest: "node_modules/@deepseek-ai/dsh-api-account-controller" }, + { name: "@deepseek-ai/dsh-api-gateway", version: "0.2.0-rc.2", integrity: "sha512-syeclzuoVpGor6JyDHcxg2Iwy9oeM76y4dK8abY19x1s/eMgJMCO3kL/IeKPg+d0Go7aHPTEyWRvCmfkA35U1g==", dest: "node_modules/@deepseek-ai/dsh-api-gateway" }, + { name: "@deepseek-ai/dsh-api-job-controller", version: "0.2.0-rc.2", integrity: "sha512-AAAi3SaeLUHyz/qbY5iiGnU9T+d44z82b5oyQaf6HdU8tnHe7dJsO/y2YRRB52AuS+KWpXpwka1qW5XT8/9N6g==", dest: "node_modules/@deepseek-ai/dsh-api-job-controller" }, + { name: "@deepseek-ai/dsh-api-remotes", version: "0.2.0-rc.2", integrity: "sha512-mfDctTtpM26rS5O0upviPofuyiiNCkaSgRifc5wgaCiBPJ5rG1FE2lxMQSfUiBASs7s+xXR5JVZlDrrZCzYTLg==", dest: "node_modules/@deepseek-ai/dsh-api-remotes" }, + { name: "@deepseek-ai/dsh-api-session-controller", version: "0.2.0-rc.2", integrity: "sha512-WDmk1aWOHbzIKRRt7rtHDxSupw/XLB+BgMyKHlzB7QGinXrK/Dnht6JIdgE1iSShnf1RNANGAGh2G94VzDpl5Q==", dest: "node_modules/@deepseek-ai/dsh-api-session-controller" }, + { name: "@deepseek-ai/dsh-api-settings-controller", version: "0.2.0-rc.2", integrity: "sha512-+tWsZLldhUVPwEKhz3o/oYVMEjnFndYwaDJnpN5PqeuEctU3PgZ/xYd5QxH44Ob/g5ROokHAkUWP8wER7+EwWA==", dest: "node_modules/@deepseek-ai/dsh-api-settings-controller" }, + { name: "@deepseek-ai/dsh-api-terminal-controller", version: "0.2.0-rc.2", integrity: "sha512-Cn+kZR2kHG2JH+e5eU2J7aS31c4UUGNcEkSfUizJ5SPLEa413qyFKlvVMU0DhITpljJSarpxrG6tfGqsF6mX1A==", dest: "node_modules/@deepseek-ai/dsh-api-terminal-controller" }, + { name: "@deepseek-ai/dsh-api-workspace-controller", version: "0.2.0-rc.2", integrity: "sha512-3CoKQUgGxJ8yH++j/HurB4ZTrVLMZXS0cMm8Fb3ZaMB1dTseroaMoepvnBtzJF1hQx6YArNu8XvXO5qPRA6Fgg==", dest: "node_modules/@deepseek-ai/dsh-api-workspace-controller" }, + { name: "@deepseek-ai/dsh-api-workspace-files", version: "0.2.0-rc.2", integrity: "sha512-X2mKXzaWOjTv2rBvZl4GyKsB63ZUHJZaq9KX2r+yaMJfguxMkWMCx0to6bdp2BPrzaD826X1D672hFY6Ps/0jA==", dest: "node_modules/@deepseek-ai/dsh-api-workspace-files" }, + { name: "@deepseek-ai/dsh-app-boot", version: "0.2.0-rc.2", integrity: "sha512-WvgNhBHSj85Z7u9vC1oQr9C7yZQ/L/JS+eVK4bueWEkaoqdEna504V5bi7qtWXxAz5JkeVZTy1sX86p8XG7LJg==", dest: "node_modules/@deepseek-ai/dsh-app-boot" }, + { name: "@deepseek-ai/dsh-atomic-write", version: "0.2.0-rc.2", integrity: "sha512-CezxdPmADDnOyG/ed9R18In/NifnLgu8hfJEjTBKxd7kbu0XXenyqnk25jeWD6bJYwu8AWAwcpVFuf438EJPJA==", dest: "node_modules/@deepseek-ai/dsh-atomic-write" }, + { name: "@deepseek-ai/dsh-attachment", version: "0.2.0-rc.2", integrity: "sha512-asUDLv+mfb30vjjlQtMI9aBnC+kmPoUxS1ooadhwAd8wssIlLetq97nzC5W1qd0GQGwZtPG/gpljVAMcSwPr1g==", dest: "node_modules/@deepseek-ai/dsh-attachment" }, + { name: "@deepseek-ai/dsh-attachment-local", version: "0.2.0-rc.2", integrity: "sha512-VDyHGvKoN59D+3t3rwkZYNFJJJ1PbCV/6z9ngL5lErd1H98NqmFqFzGgGypGPvBGdmi42ckhVldBPq8ZJWzKcA==", dest: "node_modules/@deepseek-ai/dsh-attachment-local" }, + { name: "@deepseek-ai/dsh-authorization", version: "0.2.0-rc.2", integrity: "sha512-hcvguIxKa6P5zhb6API9gLNLveQ2H2dXUo8vf2aTzoc9J4madUFltR2suUDfvusgN13qCWtbbUcgWdZt79uVuw==", dest: "node_modules/@deepseek-ai/dsh-authorization" }, + { name: "@deepseek-ai/dsh-base", version: "0.2.0-rc.2", integrity: "sha512-AclHClefnPmUe2qoPrKMUvauA/KelYevYlxFdHLZGcPRqrDH+D21HyrwJmj4f7Iu5OO0IqfjB4zBOkwMp5h1ug==", dest: "node_modules/@deepseek-ai/dsh-base" }, + { name: "@deepseek-ai/dsh-bash-local", version: "0.2.0-rc.2", integrity: "sha512-38cihtu0JSBfj4GAH8pPX0v2tPDZBcPbgX9CjjMTPbhNRF30C+Ncg5zhJo5weaHQR0RnqOIJVuDHxcJ3yT50gg==", dest: "node_modules/@deepseek-ai/dsh-bash-local" }, + { name: "@deepseek-ai/dsh-bash-sandbox", version: "0.2.0-rc.2", integrity: "sha512-PNTarU5/b5rmkpMVqk5iHq12dktFL68B7dGofWoG9S3xKe7QXTmjQCZXPxyfMqEujtTxDE8HyLcLDE+46Nlchw==", dest: "node_modules/@deepseek-ai/dsh-bash-sandbox" }, + { name: "@deepseek-ai/dsh-brand", version: "0.2.0-rc.2", integrity: "sha512-A5XlN4tIgP0qObkYFhcZ7Oz/tM2oESEZqLwS0Qq+sM1ivGx6o4AMPgJdfKQlwLzqk0cMLNtAaVBHfiYoElt4lw==", dest: "node_modules/@deepseek-ai/dsh-brand" }, + { name: "@deepseek-ai/dsh-chunked-list", version: "0.2.0-rc.2", integrity: "sha512-3KJhtGoWL39UIY6dyQ/FNuwRssPzxf3Abe6BuYdGwEh8FJcEG1JgSFIltKL+mfhbp4idV3cF7EnTVutGlurMDw==", dest: "node_modules/@deepseek-ai/dsh-chunked-list" }, + { name: "@deepseek-ai/dsh-client-connection", version: "0.2.0-rc.2", integrity: "sha512-eL66YSZ0+HlWRzAPGU8jtCLd322WXBoMGN1g1OsM5T7Skqbbo9hSwV1FO3Lm0IcMZR3Y07sGPQBwZwf/l66T3w==", dest: "node_modules/@deepseek-ai/dsh-client-connection" }, + { name: "@deepseek-ai/dsh-client-file-upload", version: "0.2.0-rc.2", integrity: "sha512-+uU8KHjLyHoMpslnRQZp02BtBSSBvRsJdYlH2vnVYE00b86fVtrBOvtzcF3jv1f7b0pYbph5z6ikIH8hvhzdOQ==", dest: "node_modules/@deepseek-ai/dsh-client-file-upload" }, + { name: "@deepseek-ai/dsh-client-hmr", version: "0.2.0-rc.2", integrity: "sha512-hE/+LDYFelYY5ayisx1UkBVXe7hygvgI7Ts9IyJa7nZNoppsChoZQbf5iHMO/ogS5efeeyy/yS0nKOzJB9RYPw==", dest: "node_modules/@deepseek-ai/dsh-client-hmr" }, + { name: "@deepseek-ai/dsh-client-locale", version: "0.2.0-rc.2", integrity: "sha512-JdZPMv/8hLOQNxHk1dM6YbNbChB5S6lGaGAPtraP0670i9Tb4dX+yKOAUgkS7nSoO5TYZztXgI1kgcEregRPJA==", dest: "node_modules/@deepseek-ai/dsh-client-locale" }, + { name: "@deepseek-ai/dsh-client-modules", version: "0.2.0-rc.2", integrity: "sha512-eDF7dycEl8QJ8CAZTSTz+dZh2PFHsf/ESAsjWjhcHxueLji7LF8/MY54PgU051Ho0V7zQKCAAeFWK2/GyIpgIg==", dest: "node_modules/@deepseek-ai/dsh-client-modules" }, + { name: "@deepseek-ai/dsh-client-product-analytics", version: "0.2.0-rc.2", integrity: "sha512-gAxwso7bK4S+5M4KURB/JzUWX55z+gZBSNpzy6dyiIwUg6SZo536hVUjzmb+Tlu72vULgZ4K/uO2zO0d1WcceQ==", dest: "node_modules/@deepseek-ai/dsh-client-product-analytics" }, + { name: "@deepseek-ai/dsh-client-resources", version: "0.2.0-rc.2", integrity: "sha512-fij1KTx7rBMyZHHnghZyXYWGpli9j3KrcfDBq+XhzNY2n5nidoIMIPj647DTajH+CaHFrb7f0Btj2/7Rs0d0Ng==", dest: "node_modules/@deepseek-ai/dsh-client-resources" }, + { name: "@deepseek-ai/dsh-client-shortcuts", version: "0.2.0-rc.2", integrity: "sha512-/mgW9+qbx/XMFODH58vtBsMeZr0lFE4i+mZWqGXfHbmwG9b5POBWi6QQOcCB6tQGE1TPSeiWC8GbCJL7lGAYSg==", dest: "node_modules/@deepseek-ai/dsh-client-shortcuts" }, + { name: "@deepseek-ai/dsh-client-store", version: "0.2.0-rc.2", integrity: "sha512-unHIDNnHudDIj05W99m+dVPXLYy7qNvMJ/D5FWb7cov0CbiQvliqbvFeMAU6LzC+u3vTkVJgSMIAwAVdQgYHEA==", dest: "node_modules/@deepseek-ai/dsh-client-store" }, + { name: "@deepseek-ai/dsh-client-ui-agent-preset", version: "0.2.0-rc.2", integrity: "sha512-G4d4OFNoqQoLrIHDu4yy0xkvJhtZdTDPAEglmAkfDt03I6ypZxNO/cer6hasDne+gqUw7iwQB35Hvo1Gg1gAFw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-agent-preset" }, + { name: "@deepseek-ai/dsh-client-ui-approval", version: "0.2.0-rc.2", integrity: "sha512-r85w95YxSwl/VlwAp5G9Y984KetesWGwsoV7ZYt0lV3gAo69GwH05EkUsZr1YmrQGdpu+hHUx4GOc24Qvgdz/g==", dest: "node_modules/@deepseek-ai/dsh-client-ui-approval" }, + { name: "@deepseek-ai/dsh-client-ui-attachment", version: "0.2.0-rc.2", integrity: "sha512-KwJC64HYqhsT/evoYZ2EjueCRWTknwTLVTth2LrL5XXtt5tMkDYDLgr3D/SHbb6gRpmtAgEClskj3kVYJUQ6fw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-attachment" }, + { name: "@deepseek-ai/dsh-client-ui-brand-official", version: "0.2.0-rc.2", integrity: "sha512-R0rHBtD1YWEDU0X7Tu+GvTyj1zqJUkvZmu08wXAyNGlCWvlOWyMNQyBmOjqDM7tBDuNh9yQlKw9WpcHtb0zPGw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-brand-official" }, + { name: "@deepseek-ai/dsh-client-ui-chat", version: "0.2.0-rc.2", integrity: "sha512-1rsCHGvWNLaO6B6t1fJa8Qsov0OvJC6bnhpyK2NmDCaLu9uzb4dC4DxCH3OzmJwJkEByHrb3j3l9kbpaV+dTCw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-chat" }, + { name: "@deepseek-ai/dsh-client-ui-commands", version: "0.2.0-rc.2", integrity: "sha512-2bbQT/isVZX+xr+Wd2FA8Wfr3Ltomt3eFapvH8EGU2Ygf9bF+msGVm3DzqfHkTAUcU6C5n6WczzGdmnFUFk33g==", dest: "node_modules/@deepseek-ai/dsh-client-ui-commands" }, + { name: "@deepseek-ai/dsh-client-ui-conversation", version: "0.2.0-rc.2", integrity: "sha512-Y1eWKVeh84cbB0fcV0MFOMUHBeptlzBCzsw6xslZS7p1a8l9PeFcjx5ZVTkKFuFMCfwEHWTeV9HcYqWLYH0bhw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-conversation" }, + { name: "@deepseek-ai/dsh-client-ui-cordis", version: "0.2.0-rc.2", integrity: "sha512-5ScFoWmk2S0+e4a0ZxthBicpE53edBprpA3j86wdpaYbK6wAQI3nzlTYAvtuIfC+rLIBNm0mQR+GFabKnFJkpA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-cordis" }, + { name: "@deepseek-ai/dsh-client-ui-deliverables", version: "0.2.0-rc.2", integrity: "sha512-zsPP0ZB38O+otSib61XM37jUeUWlfXMHMUO3upb2O9Rz0RhAuXyjrk7/0ZLCAtN4q+qawVnLlEMHvwIk10kheg==", dest: "node_modules/@deepseek-ai/dsh-client-ui-deliverables" }, + { name: "@deepseek-ai/dsh-client-ui-directory-picker-browse", version: "0.2.0-rc.2", integrity: "sha512-RxHNr6jUawkQvMLlrwQok6CrFcZKc3TsrJS4UWGGEFZd54D0AtpnhMP5NDVo4mL/LNti6m1VSlL/8nNgMQJa1w==", dest: "node_modules/@deepseek-ai/dsh-client-ui-directory-picker-browse" }, + { name: "@deepseek-ai/dsh-client-ui-directory-picker-native", version: "0.2.0-rc.2", integrity: "sha512-MaFnBCKvcr4cZ1Zx6QJ3+0+n4JHB3GISNEcYWtvUPmRh1WEZCIx/MOfWdcs0bltMUezGQ7RwV6VB43lxRo3FqA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-directory-picker-native" }, + { name: "@deepseek-ai/dsh-client-ui-goal", version: "0.2.0-rc.2", integrity: "sha512-VmboGx4kq+9EigTdvvbqiekXB0443MpS+sLBBUlr6wREL8kBjiSzkTNYX1XNHMtGXgKJULYTuTIrcaKWK/bftA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-goal" }, + { name: "@deepseek-ai/dsh-client-ui-input-trigger", version: "0.2.0-rc.2", integrity: "sha512-X63sYrlwQflDyzCbT/rBxXJtq9hEmKbzwggYmXQ3x1N+ZgNT3RQsd8Q7D3DWycNHnavoJ3R84smxY+GB6nW7MA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-input-trigger" }, + { name: "@deepseek-ai/dsh-client-ui-jobs", version: "0.2.0-rc.2", integrity: "sha512-UhiL5YGvHSXXg9PRyOFuqu79XIMsgxCSeGxpiX+mr5JK41mZ9MX4NSDNXh8yyuwzjKQlt/HPpOYuv5uTfaGG0w==", dest: "node_modules/@deepseek-ai/dsh-client-ui-jobs" }, + { name: "@deepseek-ai/dsh-client-ui-layout", version: "0.2.0-rc.2", integrity: "sha512-OZzGxqoAV5zHPgFveJnw599J0j0pWbJiD5c5hdPeLyNMdRdTa2CC2gR7fbn63XGu08O+OruTDXHkCrOVuvkdQw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-layout" }, + { name: "@deepseek-ai/dsh-client-ui-message-feedback", version: "0.2.0-rc.2", integrity: "sha512-de4g5/IjIMEUHOGTWr6yqduBkmYfpA0BmqGchqQbsrYvmnvGqOOzo/rkcyC8uq1XIF55HfHEhgqKFmA1R0AwqA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-message-feedback" }, + { name: "@deepseek-ai/dsh-client-ui-model-selection", version: "0.2.0-rc.2", integrity: "sha512-fL6Iyirvk4xOMjbioguxv3E/iAf4AlfqnA9WhEPwdK/0wV7StMKhuAcZkbz2o3kEFHBE98yroyzrbM//yJv4ow==", dest: "node_modules/@deepseek-ai/dsh-client-ui-model-selection" }, + { name: "@deepseek-ai/dsh-client-ui-open-in-app", version: "0.2.0-rc.2", integrity: "sha512-T8xjc7I2YAB4iPC4XlmiTFfksKkOPRt7iSX8yWD+rJCjznbqWVS9fiPDI0IaNwrQRf9mR9mGdc14jkHpWcEG3g==", dest: "node_modules/@deepseek-ai/dsh-client-ui-open-in-app" }, + { name: "@deepseek-ai/dsh-client-ui-permission-presets", version: "0.2.0-rc.2", integrity: "sha512-qeawIA9Q2rBpn0wlv7cCpkk0zssb8vR1nhrh0igeXJOHpz27CA3jEwy31pfc9hcR24PAWgXcwfZnqWu00HwRAA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-permission-presets" }, + { name: "@deepseek-ai/dsh-client-ui-plan", version: "0.2.0-rc.2", integrity: "sha512-uXaj8o+CKLGd56rsl8rfJporCAnzX+XArs5lTRq6DvD7tyO3iah2wy/e3Hsa3RLdv5dz19S6oUqldn/mNxIcEA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-plan" }, + { name: "@deepseek-ai/dsh-client-ui-plugin-manager", version: "0.2.0-rc.2", integrity: "sha512-AncAiGUMawllpfnqirmABN7KXwmVEhu0E8ClJvfsLDhEd2oazZ6nk2nUPHHPu1tVKq+e8IbiTHqwpnlDR7mPUA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-plugin-manager" }, + { name: "@deepseek-ai/dsh-client-ui-primitives", version: "0.2.0-rc.2", integrity: "sha512-Zx/MRT8NH6rYEvPnk4FQaHrADM6Dh1PQCprieqdvKj6yFhD/CJUVjSN08suGF6FPQekfVTJtS0WxY1XbQ5Ed9Q==", dest: "node_modules/@deepseek-ai/dsh-client-ui-primitives" }, + { name: "@deepseek-ai/dsh-client-ui-reference", version: "0.2.0-rc.2", integrity: "sha512-HCdQto0tHfERzxNSDHZRKYVu+lBPjhfzf0F/rblzda2znMxNE5pjHtFfHZHkaQwUH3lPhFHkuGzP/AvBtamISQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-reference" }, + { name: "@deepseek-ai/dsh-client-ui-renderer", version: "0.2.0-rc.2", integrity: "sha512-vQ/LH4A53K1J/UeF5fQs1Dj8km5cnVos7vO0rmj+pJROhE6Vs7pAAKGz5P2e02t2/2to6+iMDu2+SSITrcYWTQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-renderer" }, + { name: "@deepseek-ai/dsh-client-ui-schedule", version: "0.2.0-rc.2", integrity: "sha512-aBWxbwbbrLzqKIi8BU5gc82clY4totY+ikE4ypaanxr8qDgJ/ZOe3SVaZRHWWSAsunLP/rYtsamIRE/2eJDveA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-schedule" }, + { name: "@deepseek-ai/dsh-client-ui-session", version: "0.2.0-rc.2", integrity: "sha512-QbavrwYkWqdmR4Be7Bv2tNqf+Gh1LV6+rlDkdukMWvdJFSeAmX9Fsctwn8yqgnPRGEHZUfZIjef8zKXIWexuYQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-session" }, + { name: "@deepseek-ai/dsh-client-ui-settings", version: "0.2.0-rc.2", integrity: "sha512-Kyho8FvRGYb7Ok1t7T429d4Dj/XF8+tE/+MX6T1s41RkXCe7v0sP89i4DUMo6OeUxyE+/uGoAVa5QZXY4O/y+g==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings" }, + { name: "@deepseek-ai/dsh-client-ui-settings-account", version: "0.2.0-rc.2", integrity: "sha512-4Twq6woo7QJshkHu7hXzE0eyDnYCf01iuLfWZftWpLl6olaA6eQBxaRrMyW7YDubYpnTIu6m+1QRGtQ5MARYgw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-account" }, + { name: "@deepseek-ai/dsh-client-ui-settings-agent-loop", version: "0.2.0-rc.2", integrity: "sha512-e3Vx0ZE8jfuNQjaGXggUA+cp8x71VqkYFldd3IeXuMW1w4MeBzo+wbKeCOOf4TCCyvqLTD+x3OD5wVr1lgkjiQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-agent-loop" }, + { name: "@deepseek-ai/dsh-client-ui-settings-general", version: "0.2.0-rc.2", integrity: "sha512-LqM4OitgSKe7KDFiyBauVuJ8wvS2G5Vk/BNV1wmYz3oTNyCJXZxdJVP6qijFc4yf1zPXWfEGAufYBdtyYb35WA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-general" }, + { name: "@deepseek-ai/dsh-client-ui-settings-models", version: "0.2.0-rc.2", integrity: "sha512-vZVCHW1PYaPOhlunGL771e2WfkN023CTvZ7ZeiTWX6vkiDloUPCAMCjCl0e/xkbtgSMGvVjquuqGluwxqqIShQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-models" }, + { name: "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", version: "0.2.0-rc.2", integrity: "sha512-oS2EwNGQeNQwSsbZYv7PzuR9byUu905KcVuf4nwaQ/JOJJRfMj7fzpP2wSh6nJ1l11Yjhvvc9TQ6nzmGDmL9jA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-plugin-inventory" }, + { name: "@deepseek-ai/dsh-client-ui-settings-plugins", version: "0.2.0-rc.2", integrity: "sha512-mW/BaxHgKNyO2Q/ePhqFvFziQc0OVU7HUVu5RC0YG6YbT6ZIEsXs8UWrucwgExjcenPDnmW11j89+q1Vi/1YJQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-plugins" }, + { name: "@deepseek-ai/dsh-client-ui-settings-session-log", version: "0.2.0-rc.2", integrity: "sha512-aacrU3GfHkCTB8FFM0yEF2XFHetX7DZz4TWPJeAbMafFpbXi90pLOxY2wg92wehURtTuhNebqa+IYWBldg8sOA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-session-log" }, + { name: "@deepseek-ai/dsh-client-ui-settings-shell", version: "0.2.0-rc.2", integrity: "sha512-dTEdo5Pbh/M3bi+co7gvKbdTewHakkvwy9ESJVjzq0WD/7qtQT6szbhlBJ+WaDKvRDhxnlcnuXB2u5wyRsKVmg==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-shell" }, + { name: "@deepseek-ai/dsh-client-ui-settings-subagent", version: "0.2.0-rc.2", integrity: "sha512-Fk61weXn1Udb0lHSnvmId2rqNtdwg51Gw/Hdk2Upf+D5hGKaeRCv+lsO97Xi83fJaJz+md7OvBnqu9htduZuxg==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-subagent" }, + { name: "@deepseek-ai/dsh-client-ui-settings-web-search", version: "0.2.0-rc.2", integrity: "sha512-vt2Rgf0Z4sx1EE10EJDKQvHjK7xsNEMxrUv2ZUoxA6E8cFtRMD+wGblW7f8s6OwV2pNyAE+hiYePPf1zK24dbg==", dest: "node_modules/@deepseek-ai/dsh-client-ui-settings-web-search" }, + { name: "@deepseek-ai/dsh-client-ui-shortcuts", version: "0.2.0-rc.2", integrity: "sha512-MZtbV4PgYGx7MOUFlwfiWF75sBeLZcds9uHlYTQlHSjkJwJWLnqnT9OYwTVQdfWYs5MBv3Bj5PK1kS8zUO49hg==", dest: "node_modules/@deepseek-ai/dsh-client-ui-shortcuts" }, + { name: "@deepseek-ai/dsh-client-ui-sidebar", version: "0.2.0-rc.2", integrity: "sha512-qAvv42Jt36dVVHNuuZFUbR5kMofhPmGeFafBcOU1mlmUJitZFf31MFFF34UER3JSnByxwAeHsMx9JMq4k7nA4w==", dest: "node_modules/@deepseek-ai/dsh-client-ui-sidebar" }, + { name: "@deepseek-ai/dsh-client-ui-sidebar-browser", version: "0.2.0-rc.2", integrity: "sha512-tp5007jcJlcJnnjslpix4XbnbKGpKQjXCzlRKyFdUqcbua7Oqn1ZcIrCM/+gvgd3cOC+ZlAxrmyJQtbulFg4oQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-sidebar-browser" }, + { name: "@deepseek-ai/dsh-client-ui-sidebar-documentpreview", version: "0.2.0-rc.2", integrity: "sha512-0daQxoPZiJ7Jkq3xwVZguqYURtrM4Sa8ghxyVjw7/Kyp5xGZ8+agFAJ7ZovlVramp7LacBc3A6aNlB3aRLlBMA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-sidebar-documentpreview" }, + { name: "@deepseek-ai/dsh-client-ui-sidebar-files", version: "0.2.0-rc.2", integrity: "sha512-QapGZ5bpiGRFFOT4tw32nJxgkFdTkbEw7qO32vYLkcSdmbuWMETCutVBp77HLGsizB1RtYUtW/Y3IMT3uGb3Xw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-sidebar-files" }, + { name: "@deepseek-ai/dsh-client-ui-sidebar-right", version: "0.2.0-rc.2", integrity: "sha512-ocVUP6v3X7vShYeJ5I1Z3t1lDC02hJdZ49/kIRj29Xbe+BIfMY9HSDyUVUUDdijdd3jP8dpmhmbHbDJudwFUtQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-sidebar-right" }, + { name: "@deepseek-ai/dsh-client-ui-sidebar-terminal", version: "0.2.0-rc.2", integrity: "sha512-W49Incf9cPFQ8Ntpb0S0dUkbn7bdlffbEUASYACxIxPceZc1YVzz7Tp32kTYUEZNJPkyi7E4r3M81wAhSYimmA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-sidebar-terminal" }, + { name: "@deepseek-ai/dsh-client-ui-skill", version: "0.2.0-rc.2", integrity: "sha512-WJ991QnG+V5Lc9rkpexlgDShO8kCGva0K3mc+VI+6BRJ5tRE6ZFf0hutCax6iyUz/gtaFsxoYs615Uw2jas6sQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-skill" }, + { name: "@deepseek-ai/dsh-client-ui-slots", version: "0.2.0-rc.2", integrity: "sha512-zfILCyG3ijHT7S8+WDXFz4RMxBJtG9A3ngtDBnqcLbD5wzKz8H7E+HC657USa6RgG13C2RGSs73sfKcSs4WtWQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-slots" }, + { name: "@deepseek-ai/dsh-client-ui-subagent", version: "0.2.0-rc.2", integrity: "sha512-n/1dJBhJE/LgC9qFr+sTm70yu8mY/vULcKCZo7rFs1+/GGlycjqBW4NjOF1Rc66QQQRpaMFuWPEGo83RelwiSQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-subagent" }, + { name: "@deepseek-ai/dsh-client-ui-theme", version: "0.2.0-rc.2", integrity: "sha512-1pdHD6QfRGalG3BchmvvuVZportaMcSGQ1lwjFlddB2oyZrHk4lsYMYN8l1icQDgB7VrA4cA1VIlYlUfl7qbLw==", dest: "node_modules/@deepseek-ai/dsh-client-ui-theme" }, + { name: "@deepseek-ai/dsh-client-ui-tool", version: "0.2.0-rc.2", integrity: "sha512-Obs9FeOoIHWJUszQTY4MbdqAhlxX+lkzpwPpxk36t2pGCfkvaPWDdKwC0oUrTkRZxqYdx7inY8JK/+PZaWPnoA==", dest: "node_modules/@deepseek-ai/dsh-client-ui-tool" }, + { name: "@deepseek-ai/dsh-client-ui-trajectory", version: "0.2.0-rc.2", integrity: "sha512-CSN5GnTpg03QysgHL2XW+DKAUea15Sf7a8CKHyHvp/EhtbRMq3JLcvkfx2SV8/d6he9AcJ9wu8++r+S7Qfmm2g==", dest: "node_modules/@deepseek-ai/dsh-client-ui-trajectory" }, + { name: "@deepseek-ai/dsh-client-ui-user-questions", version: "0.2.0-rc.2", integrity: "sha512-N19AmrBM4BNl2FNOVwi8q48W3utd3IUSdnhRxeDSR6TZRzWcFPlYZx9irt+kFFehsjvKRCnPz3Dv2A/CgCppcQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-user-questions" }, + { name: "@deepseek-ai/dsh-client-ui-workflow-run", version: "0.2.0-rc.2", integrity: "sha512-vwHA+gyGXc9faftXvd5qoxmEy+8C4bWXuTogSs4/bA51hXhpOfFolQxm/C0F9Pq5nTDe926mcwIm/8KK5nTR+w==", dest: "node_modules/@deepseek-ai/dsh-client-ui-workflow-run" }, + { name: "@deepseek-ai/dsh-client-ui-workspace", version: "0.2.0-rc.2", integrity: "sha512-dGKLOFJXBiGDKl+qWMQ0cYF0AT485JMzSk+AUM6/81tZPapJuirxP7Yf5ZFMfsmgQFv6m4jjYlnOc6KcIfUUZQ==", dest: "node_modules/@deepseek-ai/dsh-client-ui-workspace" }, + { name: "@deepseek-ai/dsh-cmdline", version: "0.2.0-rc.2", integrity: "sha512-S4X5fqxjRykgZvfISnw4ta8Kr5YDFUHD73NwD0aUaFbfyhCNFgVSgdZUHVA/a3NmBptIv4Wh+dGM1sI/5DI0yA==", dest: "node_modules/@deepseek-ai/dsh-cmdline" }, + { name: "@deepseek-ai/dsh-command-compact", version: "0.2.0-rc.2", integrity: "sha512-QrDjlw1aU0IV6JUdvD7ZGGBjMScRar1JIzpO7g/9LAKvbDLhuJC8RNU2cnZDGCvcAC4sD87KAzK/x+y5JhUeGQ==", dest: "node_modules/@deepseek-ai/dsh-command-compact" }, + { name: "@deepseek-ai/dsh-command-feedback", version: "0.2.0-rc.2", integrity: "sha512-O6h7T503zXfKkqgdo5aNDW04oZ1V7owMxsMeU/OGbvlx8Y3RmhgSY2Gyt6UAC2o+6sD0AKWk7fCjm61Ic/FeJg==", dest: "node_modules/@deepseek-ai/dsh-command-feedback" }, + { name: "@deepseek-ai/dsh-command-goal", version: "0.2.0-rc.2", integrity: "sha512-zAQTumQZorlPoDKt7EnrWkIgIVRpRII/8i+aC1bUasf6l1L5Nua5Sy6g2Mf/ILzMO8eiIt7p3/CPJWbL/tvrEw==", dest: "node_modules/@deepseek-ai/dsh-command-goal" }, + { name: "@deepseek-ai/dsh-commands", version: "0.2.0-rc.2", integrity: "sha512-pU5oUyOMPDN0yxEjE1wJRInNeC5hs5vJnbOG8MSSfkFov/7Q8hrfwETxZtcRnbrpzzeG19wsvtRz1twkEMKZBA==", dest: "node_modules/@deepseek-ai/dsh-commands" }, + { name: "@deepseek-ai/dsh-compaction", version: "0.2.0-rc.2", integrity: "sha512-aghHthiqhFZK5NlX/EJk54UgdBYJesmqHMxLQqwwzdq35kuFAx1ThxyNCEM/d244MG9IvvD0tSVk0Fj4UPx+Mw==", dest: "node_modules/@deepseek-ai/dsh-compaction" }, + { name: "@deepseek-ai/dsh-compaction-basic", version: "0.2.0-rc.2", integrity: "sha512-5FUfmXUTM04gjnMhWxnpRk2iHY1eUgBBqSFNJFYTxRx5bVV5ZMJH8E5E+Bc1P8Xt0FORxW4y25MhpC+XA0uBow==", dest: "node_modules/@deepseek-ai/dsh-compaction-basic" }, + { name: "@deepseek-ai/dsh-compaction-image-offload", version: "0.2.0-rc.2", integrity: "sha512-aNX4glTxfengJnr26a8oxHaxjHgBEQxEKaoKXPINlASeBzbsJpCdPyQelTPpn5B/CgRFpw2p7oqlRLwGZjyYoA==", dest: "node_modules/@deepseek-ai/dsh-compaction-image-offload" }, + { name: "@deepseek-ai/dsh-compaction-tool-result-pruner", version: "0.2.0-rc.2", integrity: "sha512-FK/nqlznWQm0HBJDQkXB7QjEm5ou01em2is+dbVo+LQJtIMo8V7tUDbjqRiIAOCK3MesxyF0HdG16TkY4M5F7Q==", dest: "node_modules/@deepseek-ai/dsh-compaction-tool-result-pruner" }, + { name: "@deepseek-ai/dsh-config-editor", version: "0.2.0-rc.2", integrity: "sha512-LG/4EyMMBEwcUAsewqn9+6m9+mFeXVGaze0gaz3YOO/bCnJRI/2f4iuejsk/n+yMI9CNczOaIfWT5b3s7zyhfA==", dest: "node_modules/@deepseek-ai/dsh-config-editor" }, + { name: "@deepseek-ai/dsh-cordis-client-runner", version: "0.2.0-rc.2", integrity: "sha512-5VeQlKRUD2VitlGaDvksOI/bIGGOH4C8E1e+Y5kp+CeFxd1W3IABJkQEhEK90Vv3Gj+2S+ZbDh8n0ydsP7s9hg==", dest: "node_modules/@deepseek-ai/dsh-cordis-client-runner" }, + { name: "@deepseek-ai/dsh-cordis-host-runner", version: "0.2.0-rc.2", integrity: "sha512-XbCihVALcsNc/wZlOHTM5IRB1WyMbk753eUPlbtlAxjzRalzXVlnfjw5FFdxjoeavDGC+36k8aZFRtTnnCULBQ==", dest: "node_modules/@deepseek-ai/dsh-cordis-host-runner" }, + { name: "@deepseek-ai/dsh-credentials", version: "0.2.0-rc.2", integrity: "sha512-TQlvP0jxXYGy1ZNzh4nVsiCzb8FR9iGarD6BfIZ3LwJC8lDtjSxQHWE8//NYjpn10TIMxmaR4s6niHuJ3JkTOw==", dest: "node_modules/@deepseek-ai/dsh-credentials" }, + { name: "@deepseek-ai/dsh-credentials-local", version: "0.2.0-rc.2", integrity: "sha512-az83NVgu0COpjrPRAbXs0+evmSznQN1c8tFv/JKVvgcyPeFw5nLK5+0kA2QRBQ2g1p0+1x5H/4XBtr3Lwq/Piw==", dest: "node_modules/@deepseek-ai/dsh-credentials-local" }, + { name: "@deepseek-ai/dsh-deepseek-account", version: "0.2.0-rc.2", integrity: "sha512-hA1Etqs6oFvcRvkwCBP5Zp3lknSc629WyOgudMF/N7DkOsMBsYC+3Qj4hpkoF/G2pWGO7qsXmC3fRwFk17foHg==", dest: "node_modules/@deepseek-ai/dsh-deepseek-account" }, + { name: "@deepseek-ai/dsh-deepseek-account-platform", version: "0.2.0-rc.2", integrity: "sha512-JX61prldKAfHmsBE7yyVfp7EShGp0PgWvIAmQnUqy3MxZvBB24k2XBZ/UmPk56WvRhHnirGM4pJyipaT/ljdlw==", dest: "node_modules/@deepseek-ai/dsh-deepseek-account-platform" }, + { name: "@deepseek-ai/dsh-deepseek-llm-api-extensions", version: "0.2.0-rc.2", integrity: "sha512-AAiHShG4cgAtDa2XOe0mI6fTTkxrAI70x29HilYN6ZNss8XzC5tFF/XWlEf6fUx+l98Ohudn5101nhhbENgqkQ==", dest: "node_modules/@deepseek-ai/dsh-deepseek-llm-api-extensions" }, + { name: "@deepseek-ai/dsh-deque", version: "0.2.0-rc.2", integrity: "sha512-XwZvafZAxyDm2TRnQetEizuczZ1UG7RhO8vmmIUbAdjbRbMA15NOTlJ3d24uw+I8gcSKKkmWl/jwoKYKl/qo/A==", dest: "node_modules/@deepseek-ai/dsh-deque" }, + { name: "@deepseek-ai/dsh-experimental-agent-team", version: "0.2.0-rc.2", integrity: "sha512-ds9BrnyJ+BAbxaH3J81c/+JJpk8jUtnpzUCyTXxrDW2nZOnFWqdPH/TZKAI1ttCuls218+RF4PPFPbhYaXNl6g==", dest: "node_modules/@deepseek-ai/dsh-experimental-agent-team" }, + { name: "@deepseek-ai/dsh-experimental-agent-team-profile", version: "0.2.0-rc.2", integrity: "sha512-XmOjwaAoHlmLkN3weOGd6phIdXtc3JaaT927Em32/yeduirVwdlQ9igDwIrpOcmNqi7jH6FldliHHvT3zrVkuQ==", dest: "node_modules/@deepseek-ai/dsh-experimental-agent-team-profile" }, + { name: "@deepseek-ai/dsh-experimental-api-speech-to-text", version: "0.2.0-rc.2", integrity: "sha512-1RUi6flQ368MYEv3ukRFwyGqf9/5WaUfPgbi4/IAI0CaZeER/yBp7AlbaAzVwWo4EVqew0fXNcW95KoUgpHwZA==", dest: "node_modules/@deepseek-ai/dsh-experimental-api-speech-to-text" }, + { name: "@deepseek-ai/dsh-experimental-auto-review", version: "0.2.0-rc.2", integrity: "sha512-WMGHoNP/vX2TU8PmONeC4ji+DzRH/6LBjo0Sml66Nko9++m0n0+ksL4/DjIcJrBKGSH73gTGsDFNWt9YxO7wyA==", dest: "node_modules/@deepseek-ai/dsh-experimental-auto-review" }, + { name: "@deepseek-ai/dsh-experimental-client-ui-agent-team", version: "0.2.0-rc.2", integrity: "sha512-xrx4ThE3TbK0gbDcbW3oLLL0NzyP1poTygNeTBwoyY3gwPQZGx+4Q3W7CugGpEjNU2Ie4SZWqGYDN9jauiki3A==", dest: "node_modules/@deepseek-ai/dsh-experimental-client-ui-agent-team" }, + { name: "@deepseek-ai/dsh-experimental-client-ui-voice-input", version: "0.2.0-rc.2", integrity: "sha512-oDJf2pSeaV+785Rk5le0HBteinB17Lw01EtexH27UWQQombNhOj1ZXs+PH5F/caTGyLaiIt/1Z4+o7e+TIcr0g==", dest: "node_modules/@deepseek-ai/dsh-experimental-client-ui-voice-input" }, + { name: "@deepseek-ai/dsh-experimental-schedule-bundle", version: "0.2.0-rc.2", integrity: "sha512-6oGDFceBMAsrKeJfFxByyvXBPE+Obfd0oMCwNYdWesPmRBueuRwj5lwp8BY+v59mQAc3Jzdkx1hZh/E6xRcMng==", dest: "node_modules/@deepseek-ai/dsh-experimental-schedule-bundle" }, + { name: "@deepseek-ai/dsh-experimental-speech-to-text", version: "0.2.0-rc.2", integrity: "sha512-p9j8bU00eRlKsVfKK/tYj4Y4tHtuyYV5WSg/zd08g28/07ejUNu0J9vMlw6RzTFHMHqOSGGnsx6ra9IxfvCc2w==", dest: "node_modules/@deepseek-ai/dsh-experimental-speech-to-text" }, + { name: "@deepseek-ai/dsh-experimental-speech-to-text-sensevoice", version: "0.2.0-rc.2", integrity: "sha512-Czz8Vp+p1wPXU0quJ2en7Okhrq5mp2wYxh/ZDjsiYq/Nm6GagNz4ZRYXSyxWZE/yFCv2UQ5gVcVOzp6OKNqxnw==", dest: "node_modules/@deepseek-ai/dsh-experimental-speech-to-text-sensevoice" }, + { name: "@deepseek-ai/dsh-experimental-tool-agent-team", version: "0.2.0-rc.2", integrity: "sha512-iwaUH4Ev4jz56iV9Zm1IkY/34c0NoUe3gFDKDzw8UQfy8S87uNoTOR5z4//ycdN0uuHQ01MfP7U0zKkdIuYjoA==", dest: "node_modules/@deepseek-ai/dsh-experimental-tool-agent-team" }, + { name: "@deepseek-ai/dsh-experimental-voice-input-bundle", version: "0.2.0-rc.2", integrity: "sha512-am08Ylak3AYyX2DYxnfN8zn5t80xl5a5Iys6BJ46Ji7ruF4vD6d4C3SaitEtjNgciPxn41R9B9iWTzYTD/cQhA==", dest: "node_modules/@deepseek-ai/dsh-experimental-voice-input-bundle" }, + { name: "@deepseek-ai/dsh-file-reference", version: "0.2.0-rc.2", integrity: "sha512-vIjixx03qmWeEoVAhIOFEXyQ7I3UTenWtql8tT0IEQLYp7WRRhMNr7vojpkRO7JPgSgW5tjUIiQvg8/h990GvA==", dest: "node_modules/@deepseek-ai/dsh-file-reference" }, + { name: "@deepseek-ai/dsh-file-reference-local", version: "0.2.0-rc.2", integrity: "sha512-xrzsF7lrCExK4mdrFXuJM6XeYaZCQoaaqgv1Ab4YbN56N2UcCTHd5rKgFwwRRwauPkeytUAYMoFmXZmTIdhnVA==", dest: "node_modules/@deepseek-ai/dsh-file-reference-local" }, + { name: "@deepseek-ai/dsh-fs", version: "0.2.0-rc.2", integrity: "sha512-PuVcI7drTwa19Key54DROoqnDFTTFkl8TPlyrTnS3BSnykm+jKbB13ES/PQEJoRunNdQkNZa12jtbUI4BP/EHw==", dest: "node_modules/@deepseek-ai/dsh-fs" }, + { name: "@deepseek-ai/dsh-fs-local", version: "0.2.0-rc.2", integrity: "sha512-lDzh5VlQsXf3nI+E0+T0weYdH1VAoo+htj6Kwc62P7/Lx+xjnYSLQYTeGeaJR1d8H2iQv2FvlwaDKv60AorKdA==", dest: "node_modules/@deepseek-ai/dsh-fs-local" }, + { name: "@deepseek-ai/dsh-fs-observation-policy", version: "0.2.0-rc.2", integrity: "sha512-YPqpJ+WPhYUHS6PtUN4abjUx/dK6bexUiQdFGeQ81F0CEWbIfxyT1QzadKPvU5PrjxpG5e+UtjoEmAQKSCrsiA==", dest: "node_modules/@deepseek-ai/dsh-fs-observation-policy" }, + { name: "@deepseek-ai/dsh-fs-sandbox", version: "0.2.0-rc.2", integrity: "sha512-y1RCQ64FOXzKXsLLHKVcExn8wKVN3klZY+OBeLYpiTEGZemADk6lf/5bNXQP9v6EwXK4bi4FRkTe8vURZMB/HQ==", dest: "node_modules/@deepseek-ai/dsh-fs-sandbox" }, + { name: "@deepseek-ai/dsh-goal", version: "0.2.0-rc.2", integrity: "sha512-dxjUpSl1WAmg6GqO+m9dYGKPAV+whMR+0xqQCoapb8C60FEmeHa2YdopGKKRLziUzB9H5JoDXjtv5HsfuRQRjA==", dest: "node_modules/@deepseek-ai/dsh-goal" }, + { name: "@deepseek-ai/dsh-goal-round-driver", version: "0.2.0-rc.2", integrity: "sha512-9J+uUo7+US98xqboK+JPXUF1TIGDwN3BB5AdhiDRDweLi1T3wBefpAHD4+ngM3C2e81MnUHk7FIFmK5IUY4B9A==", dest: "node_modules/@deepseek-ai/dsh-goal-round-driver" }, + { name: "@deepseek-ai/dsh-headless", version: "0.2.0-rc.2", integrity: "sha512-qe1X+9fV0bgStRFlegsaXvIV34Y6gP/7Cxlf2MmhRduXtUQhvHAX+OJC8oySCiy1xKGeaFjB3POG3Bh5Er2y4g==", dest: "node_modules/@deepseek-ai/dsh-headless" }, + { name: "@deepseek-ai/dsh-hmr", version: "0.2.0-rc.2", integrity: "sha512-DyMnylNJ3v8NgtUi13SdVm7Y2Aml4MN0K7gvN+7FDrSD9iCqr0BlPqODxD/XH2EM2AYULxK2ISis7Y5/8gqnfQ==", dest: "node_modules/@deepseek-ai/dsh-hmr" }, + { name: "@deepseek-ai/dsh-home-paths", version: "0.2.0-rc.2", integrity: "sha512-n4O5C9pNIVWbBklB5RzSTc3kr9hmUnDlZ6Leqj3TIk+CO593DTAmDGTt0rHMQe8H+1Ur+Jqj9Hqgsug/WRkkvQ==", dest: "node_modules/@deepseek-ai/dsh-home-paths" }, + { name: "@deepseek-ai/dsh-hook-protocol", version: "0.2.0-rc.2", integrity: "sha512-ew0biR00o9ilXExq71XGYYbC0uJl+sr6Ju/zjzNUf/vXSZEuOMs9I89xA0R82Od8KLPMobPtQIs8YMwTHjiJEQ==", dest: "node_modules/@deepseek-ai/dsh-hook-protocol" }, + { name: "@deepseek-ai/dsh-hooks-claude-code", version: "0.2.0-rc.2", integrity: "sha512-xMcX3KOeLOdiiA2Kzzo6TZbXmNMtr3xfJdbRu2Z4/MDvOHOxzPW1GUqDKUjpR16dZHZr8pB1Q2YhPlnWij/dXA==", dest: "node_modules/@deepseek-ai/dsh-hooks-claude-code" }, + { name: "@deepseek-ai/dsh-hooks-codex", version: "0.2.0-rc.2", integrity: "sha512-EtA1KUArcSwiyJqZCclbZ26Mo8+DLpP9JIFevicj40jD/wjBjX3DutFFiEdAxigUi3qgJs7VZKmNQd2yQuTbgQ==", dest: "node_modules/@deepseek-ai/dsh-hooks-codex" }, + { name: "@deepseek-ai/dsh-host-directory-picker", version: "0.2.0-rc.2", integrity: "sha512-qrgr2mgIaLCQJbJnMiVCuDnrGyQUgamjOnC9/K3oUL4YRc6ymNy7SJ5y+6YHtziA1dF81pSmFAA2QPZd2zQDVA==", dest: "node_modules/@deepseek-ai/dsh-host-directory-picker" }, + { name: "@deepseek-ai/dsh-host-directory-picker-auto", version: "0.2.0-rc.2", integrity: "sha512-loiTeinKMrqstd+4GdGV2Odz1rhdCZ4hHtS+oVeK/C/r+EhWK++GiZMWKf2fn06+32QOS4Gi079AlMT0/cuPOg==", dest: "node_modules/@deepseek-ai/dsh-host-directory-picker-auto" }, + { name: "@deepseek-ai/dsh-host-directory-picker-browse", version: "0.2.0-rc.2", integrity: "sha512-1mWqpuxBRxm4O+fUKpiAYne35MQMDTeerClJhW3pclnO90T5fs/gaaa+np1nDhLdsUMXeZKBvDf0X0KuvdMDEA==", dest: "node_modules/@deepseek-ai/dsh-host-directory-picker-browse" }, + { name: "@deepseek-ai/dsh-host-directory-picker-native", version: "0.2.0-rc.2", integrity: "sha512-p+KJRDaCyiZzCozcdW+M2wtw3uvZ+EBbquaMFy0Z2PL2EacgDWY329nihql2NsziyJ3/EfwP4nya55N6Jn+jfg==", dest: "node_modules/@deepseek-ai/dsh-host-directory-picker-native" }, + { name: "@deepseek-ai/dsh-host-frontend-static", version: "0.2.0-rc.2", integrity: "sha512-8wLpf1rw7gGINGISrHloNaPJDIGUuekqGAlq1bn14BjE2SNd01woy/+xOJgWgu365poefA/xlQ/6hEv3rnsLug==", dest: "node_modules/@deepseek-ai/dsh-host-frontend-static" }, + { name: "@deepseek-ai/dsh-host-open-in-app", version: "0.2.0-rc.2", integrity: "sha512-d/DDm/8s+VjLVx19FyXdn+TDDn+JUqmucU6ZHo7QqQClBndzyL4qvWKjHpRuYLmJDSwlcmsrKIppjdYIm9L9Fw==", dest: "node_modules/@deepseek-ai/dsh-host-open-in-app" }, + { name: "@deepseek-ai/dsh-host-plugin-inventory", version: "0.2.0-rc.2", integrity: "sha512-l/ESrOGxkk0aemM4t2b8yV3AvMZQ9oxSmgo4b1FSK3CYeaDoPJHC6iKW41DhmnJ0igdLpVIw+rg7R3KN0DREdg==", dest: "node_modules/@deepseek-ai/dsh-host-plugin-inventory" }, + { name: "@deepseek-ai/dsh-host-product-telemetry-otel", version: "0.2.0-rc.2", integrity: "sha512-qwAG4OA9IIILLr8NQwVJ+vBb25WLCSzj0lWM56nCKEir71rRST83DsSfaycR+xghWbJGf8nnJl5Nq9iFYDc0dQ==", dest: "node_modules/@deepseek-ai/dsh-host-product-telemetry-otel" }, + { name: "@deepseek-ai/dsh-host-webserver", version: "0.2.0-rc.2", integrity: "sha512-0zvI44emJMRr928Tfl//cPJlx/hiTGWfD1zaDlXu35eGIgOATFJlTPkJLApJvJOPVPPAlSOSdhI2L+j1TnzStw==", dest: "node_modules/@deepseek-ai/dsh-host-webserver" }, + { name: "negotiator", version: "1.1.0", integrity: "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", dest: "node_modules/@deepseek-ai/dsh-host-webserver/node_modules/negotiator" }, + { name: "@deepseek-ai/dsh-http-proxy", version: "0.2.0-rc.2", integrity: "sha512-zIGscCHeW6MUIKrksxhW03McWtKKpaDVVMf877bt51ZPP8p4UG8KmBUqJmX2l3eVoHeuuEyqM5zJSCj5NtSBGg==", dest: "node_modules/@deepseek-ai/dsh-http-proxy" }, + { name: "@deepseek-ai/dsh-invariants", version: "0.2.0-rc.2", integrity: "sha512-QOVc0HpRsS8ekvprb45FlxieDvgR/cAMaxW289HASjMoV/U/B54FpbkHuPBw4EnTw07/sPkjx2B/23+YqE0cbg==", dest: "node_modules/@deepseek-ai/dsh-invariants" }, + { name: "@deepseek-ai/dsh-jobs", version: "0.2.0-rc.2", integrity: "sha512-SuCCfXZDabBxsKbHoulXEeQrRSYuOYLSfhvnflQf+CYeb68wggKraejkLyO60LrCGnBJsgCqKIdIKLCUvIeN+g==", dest: "node_modules/@deepseek-ai/dsh-jobs" }, + { name: "@deepseek-ai/dsh-jobs-local", version: "0.2.0-rc.2", integrity: "sha512-sNyolYfcNVodxGyoWUM3G0f+numJexMrqwR0HC4x9kvzzZNR1WZV7ca4lCAzlaRSEvY8UPYxKC6Fi4T+MnBkSQ==", dest: "node_modules/@deepseek-ai/dsh-jobs-local" }, + { name: "@deepseek-ai/dsh-launch-environment", version: "0.2.0-rc.2", integrity: "sha512-IyhZjJJQ7RVLcKlc4pPPjojOKrr2XCYm7VRpslFq7bvGj3DGt8WMTSCCZUWxCThY2jg6kFF1ujiTGunELfRO6Q==", dest: "node_modules/@deepseek-ai/dsh-launch-environment" }, + { name: "@deepseek-ai/dsh-lazy-require", version: "0.2.0-rc.2", integrity: "sha512-t6m+13fe+4veaepjGwNu0BLTtqdrSPq+A/zmOzC+7DXgWCBHJ3IxfW2vUlLviKfviwMI4BqQMPv4wHeuJgYFIw==", dest: "node_modules/@deepseek-ai/dsh-lazy-require" }, + { name: "@deepseek-ai/dsh-llm", version: "0.2.0-rc.2", integrity: "sha512-6QFrQn/h0iNqCfPpgQidnHtLSpA99A7ZND/uYKaGSd/4BGP8KBhuRd0w63e9s4u+hfW8jc3j29WKcNLIOeUfcA==", dest: "node_modules/@deepseek-ai/dsh-llm" }, + { name: "@deepseek-ai/dsh-llm-deepseek", version: "0.2.0-rc.2", integrity: "sha512-Vk0oz0qAXYLC/tKoGfhRioank4FNX0Xdx8oDYduKL1HDf2tO72X+Nrq7hZaJp9nwvXCcg5TnPRIvE8ETZ98C5g==", dest: "node_modules/@deepseek-ai/dsh-llm-deepseek" }, + { name: "@deepseek-ai/dsh-llm-deepseek-account", version: "0.2.0-rc.2", integrity: "sha512-02nSBVyVxfRgZhNa7IHvSb3OMWFWRBTu1jCKMPcOONZx5e4wv8+Adad2vMfPRftEIJg7hFV2RGh/yN/5y02sZQ==", dest: "node_modules/@deepseek-ai/dsh-llm-deepseek-account" }, + { name: "@deepseek-ai/dsh-llm-deepseek-api-key", version: "0.2.0-rc.2", integrity: "sha512-F022Y9VK7NE3Z24TqTADgd9Gg3XzuVt8eRPXMRvs6rRDJiZBUCthFcSFAuZ668oTH6If4dC7PNoLgaN7QQVLRA==", dest: "node_modules/@deepseek-ai/dsh-llm-deepseek-api-key" }, + { name: "@deepseek-ai/dsh-llm-pi-ai", version: "0.2.0-rc.2", integrity: "sha512-8DxCwQNhfQwqNQ6khxyDSh6Pba9PjpnNQqvAz29SF/V86ClZNH5xZuqCdNfU8E426Ec6wti5oUtM+uKohMAe3A==", dest: "node_modules/@deepseek-ai/dsh-llm-pi-ai" }, + { name: "@deepseek-ai/dsh-llm-retry", version: "0.2.0-rc.2", integrity: "sha512-k992Xuafcz0plUyUHyxABDrB+elh6JYvVtQDnEIjUJkSAc8bbsN7ZcF5fxHFx0zCEoMrxRA7ZqtqxkFTYUiNMA==", dest: "node_modules/@deepseek-ai/dsh-llm-retry" }, + { name: "@deepseek-ai/dsh-mcp-client", version: "0.2.0-rc.2", integrity: "sha512-UqP2sY1r6qAhBPFeuclqrXiMBBxPaCNrXlXRqKxAON7uI1wmZZ0B3/1GmBviQ3/WjjTQlOOkj0su2v4e5DMkug==", dest: "node_modules/@deepseek-ai/dsh-mcp-client" }, + { name: "@deepseek-ai/dsh-mcp-resources", version: "0.2.0-rc.2", integrity: "sha512-ZP4B0DQPFlFpzUymv7GuZ2rwcyxTJ/xPAhn2r06yPUfUnwVFpcyt32ipOSAds8OnpHm9jEybRX4+lWzE8MK+JA==", dest: "node_modules/@deepseek-ai/dsh-mcp-resources" }, + { name: "@deepseek-ai/dsh-message-feedback", version: "0.2.0-rc.2", integrity: "sha512-c6gc3173YL1vIqyLXdj6vcTwXUhPZYOhSyMrOK4Zb5KkrSfGshNo5mG3+BVGd7ZW0vbsMScSGbNG2PXidmUTpw==", dest: "node_modules/@deepseek-ai/dsh-message-feedback" }, + { name: "@deepseek-ai/dsh-native-command", version: "0.2.0-rc.2", integrity: "sha512-RgjkI2avXHxJFwI7tjb42WTHHd4xL6Ybbg5I12T8qbuW4ph6gzAGcl8UKv7tSFM59yD85i2rnULTiZOzKKSdqw==", dest: "node_modules/@deepseek-ai/dsh-native-command" }, + { name: "@deepseek-ai/dsh-office-to-pdf", version: "0.2.0-rc.2", integrity: "sha512-Dl0TjqzrrzgQZCLATAvLuoXGOkmJ+deQLsLtL1HZUehN/aTyDI9j42obKPdOwSEHZeUnrdY2SEga+RiqY/J8ag==", dest: "node_modules/@deepseek-ai/dsh-office-to-pdf" }, + { name: "@deepseek-ai/dsh-otel", version: "0.2.0-rc.2", integrity: "sha512-LR1fSfTS2/0D/TYSSinIOu1AXO/iKRbZAnJ5d4un/rlGQKL0caQiCflQ2lo5ryPOIa9pJnIIEGu949xsZY2gIg==", dest: "node_modules/@deepseek-ai/dsh-otel" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@deepseek-ai/dsh-otel/node_modules/@opentelemetry/core" }, + { name: "@deepseek-ai/dsh-output-retention", version: "0.2.0-rc.2", integrity: "sha512-+yVL95Om473rZTHIyvjZ6JUyDl2orRpyjXeMSqOzJqh66/sERUfPgCtwMbnH9tzhxTF6nw6cC30I9dxgHEz13w==", dest: "node_modules/@deepseek-ai/dsh-output-retention" }, + { name: "@deepseek-ai/dsh-package-manifest", version: "0.2.0-rc.2", integrity: "sha512-CFycoLxUT4g4w1IGjaHi/IjTzTRgnQ2PQVeHHSWoEppD+0NTZ1rHHW3ofkh74ZgQagoeo7n+91Yjl0rDGuWE3g==", dest: "node_modules/@deepseek-ai/dsh-package-manifest" }, + { name: "@deepseek-ai/dsh-permission-presets", version: "0.2.0-rc.2", integrity: "sha512-7jOAGdhEtRlhXZnJC92Sj+Z689jGcZdI8xMkA64o5GNyTxDcyzmTMwQLa24Jqm0NH5GKj1DHYoKm8LMEmicl0w==", dest: "node_modules/@deepseek-ai/dsh-permission-presets" }, + { name: "@deepseek-ai/dsh-persona", version: "0.2.0-rc.2", integrity: "sha512-GfOs+GRlYVN4KHmCmAYal7aONmNQ9Z8m5yLwZKVC2c9tG1TsF2+wU+sHUXU1KrStdF5UDOKoE5qMhz2lPkC6xA==", dest: "node_modules/@deepseek-ai/dsh-persona" }, + { name: "@deepseek-ai/dsh-plan-mode", version: "0.2.0-rc.2", integrity: "sha512-Lpjv2GSz7rHijH+RNUwLTLH6AIptf6jUw/VfjiD7jGG0w6kq9KfpNs9WEW+lHeBrIWKGcfUkx47P3nu8uUbVvw==", dest: "node_modules/@deepseek-ai/dsh-plan-mode" }, + { name: "@deepseek-ai/dsh-plugin-manager", version: "0.2.0-rc.2", integrity: "sha512-WnLDgkj3snW8YnOESlAhHTYerLSZBVEqYlup8XHJBXly2SnOTG6GG11phLvngocSDbhvMI6PB3L2oWkFNTYNFQ==", dest: "node_modules/@deepseek-ai/dsh-plugin-manager" }, + { name: "@deepseek-ai/dsh-plugin-package-inventory-deepseek", version: "0.2.0-rc.2", integrity: "sha512-aSSwU1KDIodDj0s28C6njtDE8Mz3pIrPh3i7aVu4SHbGkYxhURcrfCtdRREVGnCRBsp0QV6W8qx6ArC2i+DwUA==", dest: "node_modules/@deepseek-ai/dsh-plugin-package-inventory-deepseek" }, + { name: "@deepseek-ai/dsh-ptc-runtime", version: "0.2.0-rc.2", integrity: "sha512-HR/3h1VFRcNlAAjCtCAxZ4V3F5pViYicXcLBuYLGjzXWpOhr4zKzeFKh9+UMLjsc9XWIarJMoSvxl662nDV/xQ==", dest: "node_modules/@deepseek-ai/dsh-ptc-runtime" }, + { name: "@deepseek-ai/dsh-ptc-runtime-node", version: "0.2.0-rc.2", integrity: "sha512-MYGTCOBFYuD8568j0hm4ChOTX/cBOUk0H1s+xuioRy9NAjjpTz+ybNZUJTYP3+noN5nzinDZfeiRdHqVoFh6YQ==", dest: "node_modules/@deepseek-ai/dsh-ptc-runtime-node" }, + { name: "@deepseek-ai/dsh-pwsh-local", version: "0.2.0-rc.2", integrity: "sha512-WNKHUCDkNeT108RB5o/clJ696K3vp9dw38Ekr23wRlWX1EDyxYmTzRDt7WfWDZoeQ+sh5CguLrUbFoPsOy9uEg==", dest: "node_modules/@deepseek-ai/dsh-pwsh-local" }, + { name: "@deepseek-ai/dsh-pwsh-sandbox", version: "0.2.0-rc.2", integrity: "sha512-V59arHVNWPhPHWZaEtdsl3hQ+9E1dZuqW85aGp5N/Vh2IdvEW99BcKL18jB5o+uZ1eI4PmAQ6HHWDU95ephmyA==", dest: "node_modules/@deepseek-ai/dsh-pwsh-sandbox" }, + { name: "@deepseek-ai/dsh-repeat-tool-reminder", version: "0.2.0-rc.2", integrity: "sha512-UOtSkw6L8OTUrCofK2t+VDuJTlX6eR/Ppki8lnHyJY4kcqUwiIMQ58SwQlB0shDdrJbMcK6HlpvZBsIEB3wTxQ==", dest: "node_modules/@deepseek-ai/dsh-repeat-tool-reminder" }, + { name: "@deepseek-ai/dsh-sandbox", version: "0.2.0-rc.2", integrity: "sha512-luKF7ey6HRZkGhImqLCB5Npt4f4omDRk1r+x5qQNqqdNOuN9LXciKDMNPfnSbHfKCcqSZbH3sK+APOmKzRAhVA==", dest: "node_modules/@deepseek-ai/dsh-sandbox" }, + { name: "@deepseek-ai/dsh-sandbox-local", version: "0.2.0-rc.2", integrity: "sha512-fM1QtkRxeQ498isBeotl0lW+oK/GS0G63cBNvwJJn6686Qzdl+gqwTDPS61L8pFzxRnqhqcXFxzu2tIV3o2zbg==", dest: "node_modules/@deepseek-ai/dsh-sandbox-local" }, + { name: "@deepseek-ai/dsh-sandbox-policy", version: "0.2.0-rc.2", integrity: "sha512-0xXVqWw908/V6scohMyyU9SZSiQJYji+S1hMPulcUNLb3iew89d+WPWMIkWQBJRvcJzdQ2ghHwCESRkONXTJnQ==", dest: "node_modules/@deepseek-ai/dsh-sandbox-policy" }, + { name: "@deepseek-ai/dsh-sandbox-windows-acl", version: "0.2.0-rc.2", integrity: "sha512-z8blR3g/lIfWd2zR/GjEitXdysNU8NOcPZdILuxoSodBDpkPmKQOHYaH7nzjB1a/S5TxMADgPE1UDXsmJ0zfTA==", dest: "node_modules/@deepseek-ai/dsh-sandbox-windows-acl" }, + { name: "@deepseek-ai/dsh-schedule", version: "0.2.0-rc.2", integrity: "sha512-1eqTxT3gTs0qDynu0r63ciHIAP+tUNgOE964Y7WsfpzOyuE+CyF5FvZhxEdErVp84bakXehePUdKZ6Z+2IVIkw==", dest: "node_modules/@deepseek-ai/dsh-schedule" }, + { name: "@deepseek-ai/dsh-scope", version: "0.2.0-rc.2", integrity: "sha512-066p7Wv74GNWt4xA5Cyvl+7c/i9KrNEDALYh2/hu0VsJPLb4T9He+TY7y1bld9OgungmqyTy1n/cB2ZrVskvxA==", dest: "node_modules/@deepseek-ai/dsh-scope" }, + { name: "@deepseek-ai/dsh-sdk-app", version: "0.2.0-rc.2", integrity: "sha512-RX2ugii2C1AwJk/n1ajqypelNubOxdMfTNsG+vwTBEtonmjiJ4ACoKLFV/P6+RtyEeKEcveIEO1EmI6yXEjeMw==", dest: "node_modules/@deepseek-ai/dsh-sdk-app" }, + { name: "@deepseek-ai/dsh-sdk-jsonrpc-server", version: "0.2.0-rc.2", integrity: "sha512-lNg524lActTvh27Z+FDQOD3n43hzVXe/rN9+q3gGBuUeUkMv+7Hw5TFiDqE6H4VzqAUvuQp8B/0LkChtY2Fi4A==", dest: "node_modules/@deepseek-ai/dsh-sdk-jsonrpc-server" }, + { name: "@deepseek-ai/dsh-sdk-minimal", version: "0.2.0-rc.2", integrity: "sha512-yGb64ou0LUM9mH0dz4UaX8d+bKp9FAybIIS4IRJVxrWc/K3eCETrFNoSVE3LKmVY/QgUzx15XpVVp6GzdGRx/g==", dest: "node_modules/@deepseek-ai/dsh-sdk-minimal" }, + { name: "@deepseek-ai/dsh-sdk-protocol", version: "0.2.0-rc.2", integrity: "sha512-hs4Kl2x17wAuhSMUWuNpeHvv1mOm+F+A2EQnYu1QmxVux50PR3xHthee7IX/PylpgZybcfBn1JAigKvOFs5GPA==", dest: "node_modules/@deepseek-ai/dsh-sdk-protocol" }, + { name: "@deepseek-ai/dsh-session", version: "0.2.0-rc.2", integrity: "sha512-wj+6MeqCYbDcbEvKH3puHyEGdjyu51JwBoN6Ua2tz6griLufDgLM5HpSU40L5xgpbOfrYVhXZs4vRgOrMlFY2g==", dest: "node_modules/@deepseek-ai/dsh-session" }, + { name: "@deepseek-ai/dsh-session-checkpoint-policy", version: "0.2.0-rc.2", integrity: "sha512-aymiGTfsQcEmlkeq8X4ybYUjKlJagjwhY7qwj7+85i/EOlU8qSzBF7clYkjJBdtN9CAKBAcAPElbgLtwzqfT4w==", dest: "node_modules/@deepseek-ai/dsh-session-checkpoint-policy" }, + { name: "@deepseek-ai/dsh-session-format", version: "0.2.0-rc.2", integrity: "sha512-qdWtsJt1cLJbUAMCgzRBZ2LyW+XRJpetnle4N/0X/pkmJ9eOM6Y+QqwRQdcEcI4pWuEbPwuq7/HrnqoanVaiwg==", dest: "node_modules/@deepseek-ai/dsh-session-format" }, + { name: "@deepseek-ai/dsh-session-format-catalog", version: "0.2.0-rc.2", integrity: "sha512-wBGYOqel01uyjVyhKjttJeWH99MyuKaaZRrrlvNa5iLDBTysqKrc5AE5MNx3UvvBFmF6Gi/N8FoycZYWOPL6Ww==", dest: "node_modules/@deepseek-ai/dsh-session-format-catalog" }, + { name: "@deepseek-ai/dsh-session-format-v0-to-v1", version: "0.2.0-rc.2", integrity: "sha512-PPcfT7txn82/sZnFNxsuxEEUSSdEfBTkNTuOCaiu5ANDMmxUaxOOW6gXt+zBKndGJZRgCR/u9SoAdKv659FSZQ==", dest: "node_modules/@deepseek-ai/dsh-session-format-v0-to-v1" }, + { name: "@deepseek-ai/dsh-session-format-v1-to-v2", version: "0.2.0-rc.2", integrity: "sha512-PBIsz4OBE0wNnapaD87lz6255em24Kn53BKV4K1AqiNH9OWf1+m29TLXs/ICtZ2xigk6TK5H9q6oOVBBmbZyVw==", dest: "node_modules/@deepseek-ai/dsh-session-format-v1-to-v2" }, + { name: "@deepseek-ai/dsh-session-format-v2-to-v3", version: "0.2.0-rc.2", integrity: "sha512-vrQQ1l3JgPIv/19mhm50FVD40hjro+tAkP3L1PNtGHrbBoYriNWXpR4QDOCQsHdPhg3vpnp9MmARMr8vZzl0Nw==", dest: "node_modules/@deepseek-ai/dsh-session-format-v2-to-v3" }, + { name: "@deepseek-ai/dsh-session-format-v3-to-v4", version: "0.2.0-rc.2", integrity: "sha512-UkiNDdGS8cwJKqjvHs52BKi+3NuKhoziz/l0IrDoDYpSdgDfK8HrrXkvIxOi+QaBUgIxNTQzA6tsI+TAIMDsGQ==", dest: "node_modules/@deepseek-ai/dsh-session-format-v3-to-v4" }, + { name: "@deepseek-ai/dsh-session-log-deepseek", version: "0.2.0-rc.2", integrity: "sha512-sfQSvHI+19z1fzw6Fz8kGNHIBnuJ3Fp2HOOF1uSRAypCQaiiIvhcP+1TmDrbix7Dwh1uEcF0A3lqKX92G55ZkQ==", dest: "node_modules/@deepseek-ai/dsh-session-log-deepseek" }, + { name: "@deepseek-ai/dsh-session-log-export", version: "0.2.0-rc.2", integrity: "sha512-e8Hwf6Cpnv4mWYiN7xFeSwI5qfPhyGhkDF0ln/k+gANwyQltk0hHu1D1aWQ2OTMvMhpJ9i+MlRJH06DA99n26Q==", dest: "node_modules/@deepseek-ai/dsh-session-log-export" }, + { name: "fflate", version: "0.8.3", integrity: "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", dest: "node_modules/@deepseek-ai/dsh-session-log-export/node_modules/fflate" }, + { name: "@deepseek-ai/dsh-session-persistence", version: "0.2.0-rc.2", integrity: "sha512-2OoRHZYWi5Vy0+1bPU37Y/NTh6uQiZ3VdpvDmW1oCgsapQr2JS/Lbody1gXOMJ1KXglCSLmePgTMC00uKw/UIg==", dest: "node_modules/@deepseek-ai/dsh-session-persistence" }, + { name: "@deepseek-ai/dsh-session-persistence-jsonl", version: "0.2.0-rc.2", integrity: "sha512-iAzXWC8jmiLYjK+wuN/fAKXLniAfClWm0CmEIwSxZnJGVy8c0iy7j5v8UfOqUbwuGfqo5HUWfyLGgxbWH7SG3g==", dest: "node_modules/@deepseek-ai/dsh-session-persistence-jsonl" }, + { name: "@deepseek-ai/dsh-session-projection", version: "0.2.0-rc.2", integrity: "sha512-caJ+XGjmR8ouws0LrvuXrabrzi21akB2l8CniUHdx4IpT6GkLapFYlWLbjZlDYqEWB3ktR+q32nxW2s+f27GSA==", dest: "node_modules/@deepseek-ai/dsh-session-projection" }, + { name: "@deepseek-ai/dsh-session-projection-cache", version: "0.2.0-rc.2", integrity: "sha512-w6V+7Xl6drXgTjsfUAY76/dmt+B6WRnNin3Vyf+2Bo+Y2eMjyymlzc3j0+Tz0bH5oaCLD4k5zYKV9sOZEk24Yw==", dest: "node_modules/@deepseek-ai/dsh-session-projection-cache" }, + { name: "@deepseek-ai/dsh-session-query", version: "0.2.0-rc.2", integrity: "sha512-seZkaK6E+L2KVUYbzQ5O3S9kKkINul/1WujXNsE7/9vE4NSg97hJjZxCwqYs81qlEO0Ei3f27+W61EtXOYYoGw==", dest: "node_modules/@deepseek-ai/dsh-session-query" }, + { name: "@deepseek-ai/dsh-session-query-sqlite", version: "0.2.0-rc.2", integrity: "sha512-LyR/1M40kFBJF8TtidCJLLHNQN07ANWtW8+IISBmH0/XqrfqPGXQGBlxorNEYC+JyJ+QHF8+8ltdThMpdEqdkg==", dest: "node_modules/@deepseek-ai/dsh-session-query-sqlite" }, + { name: "@deepseek-ai/dsh-session-reference", version: "0.2.0-rc.2", integrity: "sha512-RWiFw97/ydhe9dwiLJwCVTJ78pvEQXZKVu72ZcbIcBZvoD5MUjVy+5dMjwhzVUwqOlaeRYhQZ+XaLZYt0FsEdg==", dest: "node_modules/@deepseek-ai/dsh-session-reference" }, + { name: "@deepseek-ai/dsh-session-stats", version: "0.2.0-rc.2", integrity: "sha512-kA5Yv/FhIbrsFuNuahOPZP28KXbbCnEO6qHAULDvKZ5iO0/MpnriLKeSXRLS657c6DETC25d0I97HBujeNRQgg==", dest: "node_modules/@deepseek-ai/dsh-session-stats" }, + { name: "@deepseek-ai/dsh-session-telemetry", version: "0.2.0-rc.2", integrity: "sha512-L0ST+ZmVYdk2YMzgOZLPZNmhB2htF1HqNahuBJpID2d+XyiWYNy3vXhm/lHPs79FxHKN0XVJUR5mUv//MZK4LQ==", dest: "node_modules/@deepseek-ai/dsh-session-telemetry" }, + { name: "@deepseek-ai/dsh-session-telemetry-otel", version: "0.2.0-rc.2", integrity: "sha512-MIxi5PWmJIkhkPro8DSycrF5TFWgCA+5y0UVHtiHqUN+tXTltAd0OWtG/wAveyaWhbJdsY/jikx0U7YSibcyrg==", dest: "node_modules/@deepseek-ai/dsh-session-telemetry-otel" }, + { name: "@deepseek-ai/dsh-session-title", version: "0.2.0-rc.2", integrity: "sha512-602qEtmftsQfRzUu4u0sispiHXDGnRGwtS3+isaPmcEDlxETwMjWusatAaGvRIlrl6GGc27mr1IbqxjHWwI5zA==", dest: "node_modules/@deepseek-ai/dsh-session-title" }, + { name: "@deepseek-ai/dsh-session-title-first-prompt-llm", version: "0.2.0-rc.2", integrity: "sha512-72eo8zMep5+okUgUcBCIFhrTVb/5EuR/Ts9W2fbVzSh3+hFC8WKkjKTFrtUMoZeIX9yv2se/R6QC/GH6q0Yjdw==", dest: "node_modules/@deepseek-ai/dsh-session-title-first-prompt-llm" }, + { name: "@deepseek-ai/dsh-session-title-llm", version: "0.2.0-rc.2", integrity: "sha512-S3WNORrtkrDI6F9NADF2cKdGO8FxS7tvSsf+cxmOu6qJktidRP0/n2O9ePmOX3azZ93Ta/mGNMbPueSs7Dta+Q==", dest: "node_modules/@deepseek-ai/dsh-session-title-llm" }, + { name: "@deepseek-ai/dsh-session-turn-outline", version: "0.2.0-rc.2", integrity: "sha512-MMh5n7FpikqC/JkH0M4v+2zO8ezrxonq0XSQ81F7A9lD+eEXGngpspdj/Fatf7l+x9OQpy+BcNqFwlst2i31DA==", dest: "node_modules/@deepseek-ai/dsh-session-turn-outline" }, + { name: "@deepseek-ai/dsh-settings", version: "0.2.0-rc.2", integrity: "sha512-Py4ZbCyady6st+h8wlsPJxrAOg9VrT1+tltymnJUiAmdnZjMADZKWec9JrB2KwUuo27R+IbibxzaYQOvnZdUkg==", dest: "node_modules/@deepseek-ai/dsh-settings" }, + { name: "@deepseek-ai/dsh-shell", version: "0.2.0-rc.2", integrity: "sha512-+3uBpxhXSzukUZx7XjdnUVfItj/w4maPQAcDXnVxF8vVt/dHa2NDJBXyYC9fzIA4PnXqVHFURdrhMfFgeD7GJA==", dest: "node_modules/@deepseek-ai/dsh-shell" }, + { name: "@deepseek-ai/dsh-shell-env", version: "0.2.0-rc.2", integrity: "sha512-Cl4i32DPSLPra4mt8wBPNVDbV4+mG6UBLGF1EXsmjpj51Xg8slVqPMcs7ThkgesHBG+Fvpbvu4Y0aGhOckcXYw==", dest: "node_modules/@deepseek-ai/dsh-shell-env" }, + { name: "@deepseek-ai/dsh-skill", version: "0.2.0-rc.2", integrity: "sha512-3QfzZ6qWfESq1TRoVjEfoBRCTONRLU9aLopKpA7hJg/LZ2GqCgMoSvOwJJL+q2Djbs3oiUyC9qJHRnnN6EacIA==", dest: "node_modules/@deepseek-ai/dsh-skill" }, + { name: "@deepseek-ai/dsh-skill-badge", version: "0.2.0-rc.2", integrity: "sha512-LbxiwrQIt1DJNdWDpbJxdOqW2rDAjBlMY5RaNxmQv+PPuS2cbpwlO2oFxNP0qmcodu3YPww+t1S5JK7Jsb3dhA==", dest: "node_modules/@deepseek-ai/dsh-skill-badge" }, + { name: "@deepseek-ai/dsh-skill-filesystem", version: "0.2.0-rc.2", integrity: "sha512-V/88b4uEFwhCAewQhI/VE7/IvgBkDQb//3/zQjK7xieZ+D9wVpOc5AY8GCcQThZu5aGBnI1gX5ITHPlUHjKUtQ==", dest: "node_modules/@deepseek-ai/dsh-skill-filesystem" }, + { name: "chokidar", version: "5.0.0", integrity: "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", dest: "node_modules/@deepseek-ai/dsh-skill-filesystem/node_modules/chokidar" }, + { name: "readdirp", version: "5.1.1", integrity: "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", dest: "node_modules/@deepseek-ai/dsh-skill-filesystem/node_modules/chokidar/node_modules/readdirp" }, + { name: "@deepseek-ai/dsh-skill-office", version: "0.2.0-rc.2", integrity: "sha512-VCo/orDfkq0tvngJZ9TGfcmnZ1Xud1wrmQdXRiof6DzIu89pEV3q6lfnrnptNynBojKu4dQ1zIChl3jtofamjw==", dest: "node_modules/@deepseek-ai/dsh-skill-office" }, + { name: "@deepseek-ai/dsh-spill", version: "0.2.0-rc.2", integrity: "sha512-DWcSeURbNzlxMPOtRCzjmM6QTtEzlt7hD26fypE+9guvKPFJ9HUeCg/GQJRfpLbRQqukm4SJroHTSoZitd/t5g==", dest: "node_modules/@deepseek-ai/dsh-spill" }, + { name: "@deepseek-ai/dsh-spill-local", version: "0.2.0-rc.2", integrity: "sha512-S6OVSa76ngIAk7lT7NymB2tXg/t0GXFodkwTuU/LGu166DmzvLTNlPqvTbxpJw3N1U1M86w5YV7q/DvSOdWCpw==", dest: "node_modules/@deepseek-ai/dsh-spill-local" }, + { name: "@deepseek-ai/dsh-spill-policy", version: "0.2.0-rc.2", integrity: "sha512-xuxH8VGxqJHIYlWUcDWvz4HBYswYtm+sfy1Qs31s8YG2E7ATQ58syI78UbSiaTnJqG1TAOZn+YWZyXv1G9KvHQ==", dest: "node_modules/@deepseek-ai/dsh-spill-policy" }, + { name: "@deepseek-ai/dsh-storage", version: "0.2.0-rc.2", integrity: "sha512-tItvFJ1IAurwmZfBdrr8w+GuyLADZXZ01bos06Ma0QmD3+0NNyvo0E9qmYb54TfJ2h5yvRcFosHO1048gzuPPw==", dest: "node_modules/@deepseek-ai/dsh-storage" }, + { name: "@deepseek-ai/dsh-storage-domain", version: "0.2.0-rc.2", integrity: "sha512-GHHphcdLUNnFBPY1QOfE3dg6yKenIxB5wpgSNghZ7iG+Ifunwj4tyRUZ6YLKvni3HO9Kog1eIdXlUa9yEux39A==", dest: "node_modules/@deepseek-ai/dsh-storage-domain" }, + { name: "@deepseek-ai/dsh-storage-json", version: "0.2.0-rc.2", integrity: "sha512-h7pD397LA8JUD3QMz1IUV5kAg4WD6iVSZnMFrrCnN0wBF5B0PS0BDHT+x7zojLtq3MFfyx3JwpmX7uF12S0glg==", dest: "node_modules/@deepseek-ai/dsh-storage-json" }, + { name: "@deepseek-ai/dsh-subagent", version: "0.2.0-rc.2", integrity: "sha512-33izf4xhq03RzolYUjv223tKmeOBl8fMnvnRN15zZB3GWfNRcBTVUUxuu99rCN8TSRRt5A5ABTwYbObb1Isjqw==", dest: "node_modules/@deepseek-ai/dsh-subagent" }, + { name: "@deepseek-ai/dsh-subagent-fork-in-process", version: "0.2.0-rc.2", integrity: "sha512-nFsdyD8EIIkRmsEkmZbIhE5GUXa9/tPStTyTK0FM/WbJTFSyacD6Os9YkoYxgahCfcdlZ3cr/jY4eXVfr+0g2g==", dest: "node_modules/@deepseek-ai/dsh-subagent-fork-in-process" }, + { name: "@deepseek-ai/dsh-subagent-in-process-driver", version: "0.2.0-rc.2", integrity: "sha512-6ZYAipEyviSo4WlAesVM1DWBkLYQVZw/A8lFWOSVJjl5qOb3q4buZcW/Xy7XKw/forwNSkqaPPvJ/s0kdu1iCw==", dest: "node_modules/@deepseek-ai/dsh-subagent-in-process-driver" }, + { name: "@deepseek-ai/dsh-subagent-spawn-in-process", version: "0.2.0-rc.2", integrity: "sha512-7qOuPyeMwaZ2/bFqYnMA6oNLYP+divyV+FlD2PeScDiAcKBI6ZXEhs3wUcT7C04o4zmSXEoalHvlJGAVYUA0jw==", dest: "node_modules/@deepseek-ai/dsh-subagent-spawn-in-process" }, + { name: "@deepseek-ai/dsh-subprocess", version: "0.2.0-rc.2", integrity: "sha512-81ULZG0xg2ZKgrs+R+JY8okUwLp8jjsboR+QsMUMf5WFaJ2PueJ+krbhODB2enLx3MUyMX/wR6msnzi14ZNSAA==", dest: "node_modules/@deepseek-ai/dsh-subprocess" }, + { name: "@deepseek-ai/dsh-subprocess-local", version: "0.2.0-rc.2", integrity: "sha512-RKEhReGv6bAOHNeMd9kBwY1mQSuhm0OEiK+wnXkOD8CvesYaYXNUmtoIf9VJdrRhG5DF35gVNQAN79Si9d/BHw==", dest: "node_modules/@deepseek-ai/dsh-subprocess-local" }, + { name: "@deepseek-ai/dsh-system-prompt", version: "0.2.0-rc.2", integrity: "sha512-ZZNk2gkXFV8CIT0IOZXS+pFaxNVJaRknYyH2vc4ZgZAiHKT+RqUYNr8e1F5Kp0AaN0DNlcTkjOGP5MCxeXfDjg==", dest: "node_modules/@deepseek-ai/dsh-system-prompt" }, + { name: "@deepseek-ai/dsh-terminal", version: "0.2.0-rc.2", integrity: "sha512-AwyXx3wIsn9sVPNQsxsMQnnXk6WRGeNR3WrzWmg3Arpatbh/w9YTQZbvRKeGsETFDe62lHZ3BT8HJ+echqHurw==", dest: "node_modules/@deepseek-ai/dsh-terminal" }, + { name: "@deepseek-ai/dsh-terminal-bash", version: "0.2.0-rc.2", integrity: "sha512-lUavM/UyNaJOcqW6lZlKk3Yro8FO7pA7tSPmP5VTws53jx/zMgX/oKQCraQUBGjStyYPzrcYJEGjEaYx3kYxFQ==", dest: "node_modules/@deepseek-ai/dsh-terminal-bash" }, + { name: "@deepseek-ai/dsh-time-context", version: "0.2.0-rc.2", integrity: "sha512-BI9WBy77/NaHdfGz1UIfWQw9AqPXQYF25CCF9jWwiemdFOfERKJbrQooBtI319dQC+kjvItRHMEgWe0EuhMJ/A==", dest: "node_modules/@deepseek-ai/dsh-time-context" }, + { name: "@deepseek-ai/dsh-timeout", version: "0.2.0-rc.2", integrity: "sha512-NDob8b8DJDB/sDPz3P7xhrkxOh1O9FbN1EZRKsxP4fuTfp4hrQU7aekYS5qZENFKoR8dBJMTh/zcEBw4m31glQ==", dest: "node_modules/@deepseek-ai/dsh-timeout" }, + { name: "@deepseek-ai/dsh-tmux-context", version: "0.2.0-rc.2", integrity: "sha512-UbHEhxenMyd89imH9rJi02Mw5xPMgWEz2r1lOmicAIDRcYg7OTzsZWkIG9DPIbeJIglriTEKl76Gw85PhTBL4A==", dest: "node_modules/@deepseek-ai/dsh-tmux-context" }, + { name: "@deepseek-ai/dsh-token-meter", version: "0.2.0-rc.2", integrity: "sha512-ivkxlbk/bl8t8jxPt62a60U4lE7AxlADelxq91u1dd01oSt3+Y5XBDWDKEVjfhISKyfO4qYHo3MvY6zkU7f3gw==", dest: "node_modules/@deepseek-ai/dsh-token-meter" }, + { name: "@deepseek-ai/dsh-tool-ask-user", version: "0.2.0-rc.2", integrity: "sha512-fRvU7SClHhUKfHnXP7SJitZFgEO4af4Y9kVLBoG+9RpATGINl+PSGChCM6zyz2EI4v0yS0bHsYILwQk82xjsMA==", dest: "node_modules/@deepseek-ai/dsh-tool-ask-user" }, + { name: "@deepseek-ai/dsh-tool-bash", version: "0.2.0-rc.2", integrity: "sha512-0yjnxm5C7yqX/XWJYFXZVBWXrM6E/6FnjOjt7sN8Itsb5eSHXCz9e5XpKXpLSAPbzq8Kh49yFOw2ZUJRBkOHyw==", dest: "node_modules/@deepseek-ai/dsh-tool-bash" }, + { name: "@deepseek-ai/dsh-tool-bash-persistent", version: "0.2.0-rc.2", integrity: "sha512-R7QzTQsYoTbS/rioRjoiXqJblhq7Noo8sWoI4Y53yYq9/1uF21mdBQzZGMTqB3v/lAYwawSfkEzfxIjzahgMHg==", dest: "node_modules/@deepseek-ai/dsh-tool-bash-persistent" }, + { name: "@deepseek-ai/dsh-tool-call-timeout-policy", version: "0.2.0-rc.2", integrity: "sha512-rZae/XGLoK5kzJ4LYwA4SQOEp0wmxgJKIzhcYDWEfL1y4JiqHJS+GKvjbXZWyOpMeeTga+hKeHjcI5rRB99xUA==", dest: "node_modules/@deepseek-ai/dsh-tool-call-timeout-policy" }, + { name: "@deepseek-ai/dsh-tool-cordis", version: "0.2.0-rc.2", integrity: "sha512-KVUah6qgv/mjIRcIXM33SOyy/My+3yDOt1Kb+5GlY77EG4TOIhGlH0MksQDaHXyiGbRU+y1RWDMHi0gHf3Umew==", dest: "node_modules/@deepseek-ai/dsh-tool-cordis" }, + { name: "@deepseek-ai/dsh-tool-fs", version: "0.2.0-rc.2", integrity: "sha512-QDtVmZoc84iDwrM4ftMDwzuttQd5dXu93NMeas5cSsUvptnW4CiPrMOkYswRXmSry5WRWn7Gk0lSRJ1bpynwiQ==", dest: "node_modules/@deepseek-ai/dsh-tool-fs" }, + { name: "@deepseek-ai/dsh-tool-fs-search", version: "0.2.0-rc.2", integrity: "sha512-2og9HzR1w99kXJbZ4miuIVPdfE3lYXWmBETAQeTZzLmPlKU5G6H9CbGq9lPAQ/lvqHDElJdolH9EO+j+zoFfcQ==", dest: "node_modules/@deepseek-ai/dsh-tool-fs-search" }, + { name: "@deepseek-ai/dsh-tool-goal", version: "0.2.0-rc.2", integrity: "sha512-UeMd6NocvpXMU+jT0ujY/jU6S9SVSYY7H7oMnspBmWSPNdlh7eYHkQbQN9af7SWEhaDKBq5rsYPIOsYiSs2bZQ==", dest: "node_modules/@deepseek-ai/dsh-tool-goal" }, + { name: "@deepseek-ai/dsh-tool-jobs", version: "0.2.0-rc.2", integrity: "sha512-6mqWCkYm+XExCfJbix+pcJ2qcQLNTUtNZQOmfV1IFmpT4j0pGju6b4GbiKaS26yDPegIz71ZW2/tXWzijIsjyg==", dest: "node_modules/@deepseek-ai/dsh-tool-jobs" }, + { name: "@deepseek-ai/dsh-tool-present", version: "0.2.0-rc.2", integrity: "sha512-B2Qro2ji4NWqTIuBj8gsIB8rs+I84o5l/r1N7RetKN3yqaiH6sGOUOed/jBa8frvv4dx+jcXWOcfPpzEtOo2Cw==", dest: "node_modules/@deepseek-ai/dsh-tool-present" }, + { name: "@deepseek-ai/dsh-tool-pwsh", version: "0.2.0-rc.2", integrity: "sha512-kFL84s7zQSRd2IquZl2LK7g56x4MUWSilSWLoRVwGTTQoW3RMFGjAsMZ9ZmtGjdLGrLeCnBwiXucwswTeqYCmw==", dest: "node_modules/@deepseek-ai/dsh-tool-pwsh" }, + { name: "@deepseek-ai/dsh-tool-pwsh-persistent", version: "0.2.0-rc.2", integrity: "sha512-rfDTDgAWFH0SVPDMKtn0Cg1gTwsmNbPBw5K26S9cwtFaGxlSaGHPL+lTa2RmQwtTkZoDXdbNG4JmnvzIDxY1CQ==", dest: "node_modules/@deepseek-ai/dsh-tool-pwsh-persistent" }, + { name: "@deepseek-ai/dsh-tool-ralph", version: "0.2.0-rc.2", integrity: "sha512-071tBiqv9EosR2YORosCq4guAhhEV+kB0P/JBKtejeRX4VpH2kR8TY0Y8mmKbjzWdBEncUPsmIqxPtxHbcr1Og==", dest: "node_modules/@deepseek-ai/dsh-tool-ralph" }, + { name: "@deepseek-ai/dsh-tool-skill", version: "0.2.0-rc.2", integrity: "sha512-gPD5isAk3AP8oerJ+KiEpZgZ/UAp5g/obSqDJmJrUYzWJ6TYzdY9xFZgb2k8TYDDX7nBM/K5kS7hfRxhH9aerQ==", dest: "node_modules/@deepseek-ai/dsh-tool-skill" }, + { name: "@deepseek-ai/dsh-tool-str-replace-editor", version: "0.2.0-rc.2", integrity: "sha512-NDvuS4kmHFTdYNb5j/h/KwEGl4/CIB/mgQsraYj2gMvAcLz7SKfzyLHiliWFdFP48TnSRAS1JhMmNcQ0TN+T1A==", dest: "node_modules/@deepseek-ai/dsh-tool-str-replace-editor" }, + { name: "@deepseek-ai/dsh-tool-subagent", version: "0.2.0-rc.2", integrity: "sha512-SKfjMFctni9IRFrvLAsr8V/pEBaV1gLOERGAG73fqdqbn4KoizMFCWP3WiKir9/gyDWzzQ2RQg53O9snnEo1Aw==", dest: "node_modules/@deepseek-ai/dsh-tool-subagent" }, + { name: "@deepseek-ai/dsh-tool-subagent-control", version: "0.2.0-rc.2", integrity: "sha512-qVSnUssL+16M/PW3Vre3UFNoqLq3C14DZ9QzqOQgw6s1FAW1WvF9rzJuIYO/8MFy0g+/+f2nXWzOHD/2Gwylnw==", dest: "node_modules/@deepseek-ai/dsh-tool-subagent-control" }, + { name: "@deepseek-ai/dsh-tool-todo", version: "0.2.0-rc.2", integrity: "sha512-B3Yu/1gyFvbzsaYCJdCXj022HEBqJZwKL7fO2Txw1xnDDLgBS79B+NVSYDwxgHGYL7LXbtCyD+8zOyvtc6iItA==", dest: "node_modules/@deepseek-ai/dsh-tool-todo" }, + { name: "@deepseek-ai/dsh-tool-web", version: "0.2.0-rc.2", integrity: "sha512-NBH1e06QsDAPGPBpCjp8jr1rv+YX173vyXQ+ENT8IChHFN43S5uNZbzr/EoVTcJ4uAw3OamGXVtD7lU7uF46Jg==", dest: "node_modules/@deepseek-ai/dsh-tool-web" }, + { name: "@deepseek-ai/dsh-tool-workflow", version: "0.2.0-rc.2", integrity: "sha512-4p4XTet7bLRj2K5ccE2w/+WT15nRvRl9iFMCPv8X9wZB9ymhd/C4DFOp7wmpDMs5NqedsPrsCK7Wi4vXxO+xKQ==", dest: "node_modules/@deepseek-ai/dsh-tool-workflow" }, + { name: "@deepseek-ai/dsh-tool-workspace-dependencies", version: "0.2.0-rc.2", integrity: "sha512-5YAtIlVwA3RM1/aGTmTzU4YxIPlzVlKzShvbKk/tmj3WPuZJTWFAr9mTkATMwSyP9IRZPYevWeAwVzkerIF0qQ==", dest: "node_modules/@deepseek-ai/dsh-tool-workspace-dependencies" }, + { name: "@deepseek-ai/dsh-tools", version: "0.2.0-rc.2", integrity: "sha512-vquUz8PjHWE4zaS3wH70IpYjL441p2UlUcG8TN2yJZN1RhDkuiHum4bWCsjEPyWLS/aB1QJvzdXC2EK/PRkbsQ==", dest: "node_modules/@deepseek-ai/dsh-tools" }, + { name: "@deepseek-ai/dsh-typert-loader", version: "0.2.0-rc.2", integrity: "sha512-A9jxiG4fuXcU54PG2yqtD9LZe5ikpW1RzWy3VrQDea4U84Lh9Eyp2Flsj2xz8l5V7UD88JqI/CfHnjAGVRsbGA==", dest: "node_modules/@deepseek-ai/dsh-typert-loader" }, + { name: "@deepseek-ai/dsh-typert-protocol", version: "0.2.0-rc.2", integrity: "sha512-95RvIDcVac2BWdv1IxN6yKlRV+8eEvkofqSxV+d0r8x1kx2EIWEsbdxz6C+coYIm+8e03MiN+rwOt8J7sLfe7Q==", dest: "node_modules/@deepseek-ai/dsh-typert-protocol" }, + { name: "@deepseek-ai/dsh-typert-registry", version: "0.2.0-rc.2", integrity: "sha512-Hjepcu0cDTH4rz/SB121SVozg9ix79NBB+HNr0jW0GSHG9O24kNDyufAJD2/S4B97KVN+1nM0T8k1Dx2JSOEWQ==", dest: "node_modules/@deepseek-ai/dsh-typert-registry" }, + { name: "@deepseek-ai/dsh-user-approval", version: "0.2.0-rc.2", integrity: "sha512-fZMfDp4IeWZMwAKEQkuAYCiGRrwoVWNObvAbpdmQNUavjfYCtwwduWqYQz+5lMQq8vENdczBj7cxnO/pOQ1oZQ==", dest: "node_modules/@deepseek-ai/dsh-user-approval" }, + { name: "@deepseek-ai/dsh-user-questions", version: "0.2.0-rc.2", integrity: "sha512-NrfPt/DBCbkK/+sSSaHT3kG5lA71mnpBbxTDsL9/eS/hVntT+IdthVIZy9tPiuBxCnq1N6iPO874zHlAYa6qCQ==", dest: "node_modules/@deepseek-ai/dsh-user-questions" }, + { name: "@deepseek-ai/dsh-util-code-language", version: "0.2.0-rc.2", integrity: "sha512-MYp8KlKWKgwxRfwwMbji4zweDZxVJ1smaneMAKjJvexDc9v+C40o1pJL5Ch/atny8a7O4aiBM1uSvC4bo7/S3g==", dest: "node_modules/@deepseek-ai/dsh-util-code-language" }, + { name: "@deepseek-ai/dsh-util-crypto", version: "0.2.0-rc.2", integrity: "sha512-5OvvmepY69uXTagUMlnoHqg7euI4ZMifLgfdV8xZO20OslWGGiRCkJbZRyDtcJG9GsXWz9UimfWmUu52zKXJ5w==", dest: "node_modules/@deepseek-ai/dsh-util-crypto" }, + { name: "@deepseek-ai/dsh-util-time", version: "0.2.0-rc.2", integrity: "sha512-x+b6PJ7BQ5HnNs0wa+eojmwkveR5X77VzhfKJ8p7ndB0TAdFGBshji30nxNjn/8aNWMdE90gsIvbtazsrGZn+w==", dest: "node_modules/@deepseek-ai/dsh-util-time" }, + { name: "@deepseek-ai/dsh-util-values", version: "0.2.0-rc.2", integrity: "sha512-qgpsbgiZABuE9UvgNaVo9b2HiWwLeU93CTl9PFXqE0jN8ap1ALxzQsLGvr/q2MJuWDYqnFBg60XnqnY8ZxPWEg==", dest: "node_modules/@deepseek-ai/dsh-util-values" }, + { name: "@deepseek-ai/dsh-util-workspace-path", version: "0.2.0-rc.2", integrity: "sha512-pjjpi+hN29dVf9HMitxo5gUAXKNdYcJ75vNVjKp2T6sdBy0wxcMKlfddu/bYx/xDL3teNBhh17EH7w1asYNNZQ==", dest: "node_modules/@deepseek-ai/dsh-util-workspace-path" }, + { name: "@deepseek-ai/dsh-web", version: "0.2.0-rc.2", integrity: "sha512-d44eM9mMqGnQUGsjqUc6k1G9QrC0w+TWx6Cw6I1iXJkVw5LZ/hpVVzsuCqck8GGS8+GK20kqjGUJSyomfEgd1A==", dest: "node_modules/@deepseek-ai/dsh-web" }, + { name: "@deepseek-ai/dsh-web-app", version: "0.2.0-rc.2", integrity: "sha512-pCIMPLfTKVfY942dP4eJSDVw7iUw86pemzfOr/e5DWP7CdCKTfvA82kP0RJAKJcyKJd8s679hqtCue/p4P20Dg==", dest: "node_modules/@deepseek-ai/dsh-web-app" }, + { name: "@deepseek-ai/dsh-web-fetch-http", version: "0.2.0-rc.2", integrity: "sha512-PJLMAXv0nGdi/wdbzjcEIoaADvUNiGEXnQuF3vaeUzyplal0W1fou4r4klMsHf6aXwMZSXOdkKBocTlIk1U4uw==", dest: "node_modules/@deepseek-ai/dsh-web-fetch-http" }, + { name: "@deepseek-ai/dsh-web-frontend", version: "0.2.0-rc.2", integrity: "sha512-FpxbRvWwWyawsoP3bnErQizR5P2aOwAOwDZcc3YQX+BrQVPkQd3d06w3nLv8Fyo+zeTA+pnlBd2JFTLwlaVVzQ==", dest: "node_modules/@deepseek-ai/dsh-web-frontend" }, + { name: "@deepseek-ai/dsh-web-search-deepseek", version: "0.2.0-rc.2", integrity: "sha512-WZUPkdO80qbwPatgl5TfRvMRm02L2UELjRYhizNF8Z0RszO85UJdB04PSKXfKxOvjMKRwTPBsbG0JAdBbLpkqg==", dest: "node_modules/@deepseek-ai/dsh-web-search-deepseek" }, + { name: "@deepseek-ai/dsh-webhook", version: "0.2.0-rc.2", integrity: "sha512-sEmiIwKh8nXbdaIOWmXRuTiOUfRDVZENWKxJ+b7r35JKZz3h8k3KuskGm9OjvVbEIAhl0Ka+s1UpvH8JwJLZNg==", dest: "node_modules/@deepseek-ai/dsh-webhook" }, + { name: "@deepseek-ai/dsh-webhook-github", version: "0.2.0-rc.2", integrity: "sha512-QK1KTS4yfWTWKgccEoI7Ei5hIJUz4jUgPXXeGwXHq0gSoyeW0JEAuK2n5HIzHbMAaj9HW2C01oXl3QSLmb7v8w==", dest: "node_modules/@deepseek-ai/dsh-webhook-github" }, + { name: "@deepseek-ai/dsh-win32-process", version: "0.2.0-rc.2", integrity: "sha512-MzzPCWqGFnLe0eiTNrdsy5qGprXV9K2U31D6W8XuyQ/5RVG4dLyI1xiXRnc+cqq8SASgxh0D/hM4wy+I6qNkRQ==", dest: "node_modules/@deepseek-ai/dsh-win32-process" }, + { name: "@deepseek-ai/dsh-workflow", version: "0.2.0-rc.2", integrity: "sha512-kvRw3d+x+clns+HrknZ6EDy32OEhKTmngS2LBuL7vjQl3XjEbM8QhnxbDW3NaRbEvZ5w2/+2GZqlo0bU/w6Cxw==", dest: "node_modules/@deepseek-ai/dsh-workflow" }, + { name: "@deepseek-ai/dsh-workflow-ptc", version: "0.2.0-rc.2", integrity: "sha512-p/oqiVTlUiNO+qh8XJaJ0/DL7iEA4RFRHfGM2w4XiLwZycmDux9Z7RyAy2QuB2a3euDTejJuEhzkCO+v/oveHQ==", dest: "node_modules/@deepseek-ai/dsh-workflow-ptc" }, + { name: "@deepseek-ai/dsh-workspace", version: "0.2.0-rc.2", integrity: "sha512-Dvu+lzziMr5vpz9+G+qMabg9rJxqViFdNlz8ch56/zDp4tmwY3hnk2JZ4OuuiLHYUuUeM34ic1H5758IL3YKnA==", dest: "node_modules/@deepseek-ai/dsh-workspace" }, + { name: "@deepseek-ai/dsh-workspace-changes", version: "0.2.0-rc.2", integrity: "sha512-f1ukSyQSDJPt90daOSHz9S+cZ6L1Boq14ePTX0rUBbTGCMllRcyKHH74ODGzxPm7XEw1joWzQGeWOzSMEP+w0Q==", dest: "node_modules/@deepseek-ai/dsh-workspace-changes" }, + { name: "@deepseek-ai/libreoffice-kit", version: "0.1.5", integrity: "sha512-H12xtUsAyl70zFeQ5pk5GGRc3N1+6zn+DVAcqwlguI6EvqopBGP3xkUmePU7g5f6ydYlDZLWedHT9lTSL7zLxA==", dest: "node_modules/@deepseek-ai/libreoffice-kit" }, + { name: "@deepseek-ai/libreoffice-kit-darwin-arm64", version: "0.1.5", integrity: "sha512-SjeXmyaTevEq2TxK7reb1rhCrQZ4QOXmXt/qEwfQD5Fx3odU0ILx2uiXN+nphSCQ95LFCzrElHGgv2c7a824yg==", dest: "node_modules/@deepseek-ai/libreoffice-kit-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "@deepseek-ai/libreoffice-kit-darwin-x64", version: "0.1.5", integrity: "sha512-vuz2tTpH1Edk75+DISwg/TXdQ3BNSNSHoVnWVqxqbGMgrrK9trLOw2+0X7mjT1naGO00Zc1qkyQ4if3kx5XjqQ==", dest: "node_modules/@deepseek-ai/libreoffice-kit-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "@deepseek-ai/libreoffice-kit-wasm", version: "0.1.5", integrity: "sha512-V+pu5xJsKhVD4AU1xbFlMWY91svK9ZIC2JsNOph9kWp/arF/KQcuytt76bcbozJqPbE8o0n04lyh0m3QW5RYSA==", dest: "node_modules/@deepseek-ai/libreoffice-kit-wasm", optional: true, os: ["linux"] }, + { name: "@deepseek-ai/libreoffice-kit-win32-arm64", version: "0.1.5", integrity: "sha512-Av3aFfNLaVxfffu0JXP5mqfmsCU3gQtlUH9UD+zdXl8ON06ukVAmu7LqNyuKAz/68WoOMTQ+YBlVQukgDRKd/A==", dest: "node_modules/@deepseek-ai/libreoffice-kit-win32-arm64", optional: true, os: ["win32"], cpu: ["arm64"] }, + { name: "@deepseek-ai/libreoffice-kit-win32-x64", version: "0.1.5", integrity: "sha512-uKuDGZdofxuW4iRmUh8b3+XWU28JeOCYMTAONzo7tEHIq00DV2cARcgUYiTP7gUH49tH4A/RyPMOVEBzK7qjjw==", dest: "node_modules/@deepseek-ai/libreoffice-kit-win32-x64", optional: true, os: ["win32"], cpu: ["x64"] }, + { name: "@deepseek-ai/node-addon-system", version: "0.1.2", integrity: "sha512-EFn8K+mXIXiw6s3rxX+cgp2hZTEAQdVIsURhrXnBxycSXvtQ1EQpsSVzoNKtKAQI0I0VqkEcVEjHzS/PeaGsvw==", dest: "node_modules/@deepseek-ai/node-addon-system" }, + { name: "@deepseek-ai/node-addon-system-darwin-arm64", version: "0.1.2", integrity: "sha512-IR0cx8um19mLCZaJ+H5PLblKr6Eg3PWvVo8eTQBr/SwH2nh5tM9CD9/5fHweNS9Pjt15UdFlGqnvLSd/w+O6Rw==", dest: "node_modules/@deepseek-ai/node-addon-system-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "@deepseek-ai/node-addon-system-darwin-x64", version: "0.1.2", integrity: "sha512-XDbmquNapk9aT28y4EKn9lbONVr9YNs1NM/GKH1Gi5gUhjOT9wgRaTv72FJdNaVIInbPAYbPoyn7/y+MzQMNNg==", dest: "node_modules/@deepseek-ai/node-addon-system-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "@deepseek-ai/node-addon-system-linux-arm64", version: "0.1.2", integrity: "sha512-Z/DQtqgEYzjBzb2ocHGjMzx51W7xDILkJKKj89nyErr8gZMNiLs+JNL1uKzJqc3VLZB+vYCPaHGyQ3oX6EzEmA==", dest: "node_modules/@deepseek-ai/node-addon-system-linux-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "@deepseek-ai/node-addon-system-linux-x64", version: "0.1.2", integrity: "sha512-S2aPVHvYCpNCppCFyNlooMYuTB7ucK5lvD9oXQQ42v5Z2s5AoaiCdjz9r2l+ED2rI5oS1x0cUZmKjJH2dxV0pg==", dest: "node_modules/@deepseek-ai/node-addon-system-linux-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "@deepseek-ai/schemastery", version: "3.18.4", integrity: "sha512-SSXO6tYuyrIqKVbmOnIq0s+riUywYzouFMcnBluHF9n4KMo2G8HvEzhCYj6pj2617/glOjbJuVInJ9hfONsjkg==", dest: "node_modules/@deepseek-ai/schemastery" }, + { name: "@earendil-works/pi-ai", version: "0.87.1", integrity: "sha512-X/3PfQBnnoeVdO9Cv8zHghUMglzlgNZYGNzoPnbRoGnHl3Rw3TlA2UKSUB7BRHUOxMryHXYa8dnjWZlbRheDZA==", dest: "node_modules/@earendil-works/pi-ai" }, + { name: "https-proxy-agent", version: "9.1.0", integrity: "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", dest: "node_modules/@earendil-works/pi-ai/node_modules/https-proxy-agent" }, + { name: "agent-base", version: "9.0.0", integrity: "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", dest: "node_modules/@earendil-works/pi-ai/node_modules/https-proxy-agent/node_modules/agent-base" }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/@earendil-works/pi-ai/node_modules/https-proxy-agent/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/@earendil-works/pi-ai/node_modules/https-proxy-agent/node_modules/debug/node_modules/ms" }, + { name: "@earendil-works/pi-telemetry", version: "0.87.1", integrity: "sha512-MC6TRQH5lgMXpcN+Vku2WMI2T8BsiUPzMQHGo81uqFZD3/9O79WWJAysEDGuzduP6R4tvtgwMLwmqIxynM10JQ==", dest: "node_modules/@earendil-works/pi-telemetry" }, + { name: "@emnapi/runtime", version: "1.11.3", integrity: "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", dest: "node_modules/@emnapi/runtime", optional: true }, + { name: "@eslint-community/regexpp", version: "4.12.2", integrity: "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", dest: "node_modules/@eslint-community/regexpp" }, + { name: "@google/genai", version: "2.21.0", integrity: "sha512-+PDtco2/Z0ONdzCGekCoCT+O1VJS9xJQNN4XzQpXG/t3El/SWWMkCWlFRO1KmivOHPa4Q0VjUYu1HBKCZ/v33Q==", dest: "node_modules/@google/genai" }, + { name: "@hono/node-server", version: "2.1.1", integrity: "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==", dest: "node_modules/@hono/node-server", optional: true }, + { name: "@img/colour", version: "1.1.0", integrity: "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", dest: "node_modules/@img/colour" }, + { name: "@img/sharp-darwin-arm64", version: "0.35.5", integrity: "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", dest: "node_modules/@img/sharp-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "@img/sharp-darwin-x64", version: "0.35.5", integrity: "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", dest: "node_modules/@img/sharp-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "@img/sharp-freebsd-wasm32", version: "0.35.5", integrity: "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", dest: "node_modules/@img/sharp-freebsd-wasm32", optional: true, os: ["freebsd"] }, + { name: "@img/sharp-libvips-darwin-arm64", version: "1.3.4", integrity: "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", dest: "node_modules/@img/sharp-libvips-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "@img/sharp-libvips-darwin-x64", version: "1.3.4", integrity: "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", dest: "node_modules/@img/sharp-libvips-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "@img/sharp-libvips-linux-arm", version: "1.3.4", integrity: "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", dest: "node_modules/@img/sharp-libvips-linux-arm", optional: true, os: ["linux"], cpu: ["arm"] }, + { name: "@img/sharp-libvips-linux-arm64", version: "1.3.4", integrity: "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", dest: "node_modules/@img/sharp-libvips-linux-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "@img/sharp-libvips-linux-ppc64", version: "1.3.4", integrity: "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", dest: "node_modules/@img/sharp-libvips-linux-ppc64", optional: true, os: ["linux"], cpu: ["ppc64"] }, + { name: "@img/sharp-libvips-linux-riscv64", version: "1.3.4", integrity: "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", dest: "node_modules/@img/sharp-libvips-linux-riscv64", optional: true, os: ["linux"], cpu: ["riscv64"] }, + { name: "@img/sharp-libvips-linux-s390x", version: "1.3.4", integrity: "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", dest: "node_modules/@img/sharp-libvips-linux-s390x", optional: true, os: ["linux"], cpu: ["s390x"] }, + { name: "@img/sharp-libvips-linux-x64", version: "1.3.4", integrity: "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", dest: "node_modules/@img/sharp-libvips-linux-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "@img/sharp-libvips-linuxmusl-arm64", version: "1.3.4", integrity: "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", dest: "node_modules/@img/sharp-libvips-linuxmusl-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "@img/sharp-libvips-linuxmusl-x64", version: "1.3.4", integrity: "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", dest: "node_modules/@img/sharp-libvips-linuxmusl-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "@img/sharp-linux-arm", version: "0.35.5", integrity: "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", dest: "node_modules/@img/sharp-linux-arm", optional: true, os: ["linux"], cpu: ["arm"] }, + { name: "@img/sharp-linux-arm64", version: "0.35.5", integrity: "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", dest: "node_modules/@img/sharp-linux-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "@img/sharp-linux-ppc64", version: "0.35.5", integrity: "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", dest: "node_modules/@img/sharp-linux-ppc64", optional: true, os: ["linux"], cpu: ["ppc64"] }, + { name: "@img/sharp-linux-riscv64", version: "0.35.5", integrity: "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", dest: "node_modules/@img/sharp-linux-riscv64", optional: true, os: ["linux"], cpu: ["riscv64"] }, + { name: "@img/sharp-linux-s390x", version: "0.35.5", integrity: "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", dest: "node_modules/@img/sharp-linux-s390x", optional: true, os: ["linux"], cpu: ["s390x"] }, + { name: "@img/sharp-linux-x64", version: "0.35.5", integrity: "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", dest: "node_modules/@img/sharp-linux-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "@img/sharp-linuxmusl-arm64", version: "0.35.5", integrity: "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", dest: "node_modules/@img/sharp-linuxmusl-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "@img/sharp-linuxmusl-x64", version: "0.35.5", integrity: "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", dest: "node_modules/@img/sharp-linuxmusl-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "@img/sharp-wasm32", version: "0.35.5", integrity: "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", dest: "node_modules/@img/sharp-wasm32", optional: true }, + { name: "@img/sharp-webcontainers-wasm32", version: "0.35.5", integrity: "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", dest: "node_modules/@img/sharp-webcontainers-wasm32", optional: true, cpu: ["wasm32"] }, + { name: "@img/sharp-win32-arm64", version: "0.35.5", integrity: "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", dest: "node_modules/@img/sharp-win32-arm64", optional: true, os: ["win32"], cpu: ["arm64"] }, + { name: "@img/sharp-win32-ia32", version: "0.35.5", integrity: "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", dest: "node_modules/@img/sharp-win32-ia32", optional: true, os: ["win32"], cpu: ["ia32"] }, + { name: "@img/sharp-win32-x64", version: "0.35.5", integrity: "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", dest: "node_modules/@img/sharp-win32-x64", optional: true, os: ["win32"], cpu: ["x64"] }, + { name: "@joplin/turndown-plugin-gfm", version: "1.0.68", integrity: "sha512-m8DfAQNC/V7g0j5H6Jv60WhekBBjodD+zTPGrU+g2m+ux/z8ZX07KQIl6kaAmbKwfvsQhC04op52g63I78sVgg==", dest: "node_modules/@joplin/turndown-plugin-gfm" }, + { name: "@js-temporal/polyfill", version: "0.5.1", integrity: "sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ==", dest: "node_modules/@js-temporal/polyfill" }, + { name: "@keyv/serialize", version: "1.1.1", integrity: "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", dest: "node_modules/@keyv/serialize" }, + { name: "@koromix/koffi-darwin-arm64", version: "3.1.1", integrity: "sha512-+Dl0zQDh1Wb55AWOn9hp7K30qgkODvrvN+ZNkFOh81Q0oFX/rpJQtocgjAuYk2zFAcajSeVDumkcHMPwnKSXzA==", dest: "node_modules/@koromix/koffi-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "@koromix/koffi-darwin-x64", version: "3.1.1", integrity: "sha512-cDFAKn1qdZBFLrp7dAc9QUDw3l4xAhTJbOdPWWb0LxssVicUdHcRCLZGrDsmPW2tpH6LGNNeLgqRpAoD2Mo8iA==", dest: "node_modules/@koromix/koffi-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "@koromix/koffi-freebsd-arm64", version: "3.1.1", integrity: "sha512-zaP7FJISI/scQW9Wa5QicY3a09WmtKBWSbmC+5nfCqPzwWe7Hx2so74Er7mPsDfCiMMR0Ya+evKbJQDkfyXicg==", dest: "node_modules/@koromix/koffi-freebsd-arm64", optional: true, os: ["freebsd"], cpu: ["arm64"] }, + { name: "@koromix/koffi-freebsd-ia32", version: "3.1.1", integrity: "sha512-7GejVb688TLM8rbjfc0oezJrATxZc0dn801xWEDJekN2DgmRXu7HquGqWQ6z3NeSq7ZxEggz4T3xtlbCysQapA==", dest: "node_modules/@koromix/koffi-freebsd-ia32", optional: true, os: ["freebsd"], cpu: ["ia32"] }, + { name: "@koromix/koffi-freebsd-x64", version: "3.1.1", integrity: "sha512-XLiCFP9OFCyOoGTjAimtDKLhzhfo34WcP1ShVWxRzNCWDGjfz8BYjwd69cp/cDSUXZbxamqs4+/6vmkePq9wxA==", dest: "node_modules/@koromix/koffi-freebsd-x64", optional: true, os: ["freebsd"], cpu: ["x64"] }, + { name: "@koromix/koffi-linux-arm64", version: "3.1.1", integrity: "sha512-HA9xINK7G4dRAkpfnBWD9VfuyIBgW1SuK+KPHjksUwRMOnhgqP8J/JqgrAzdzcDiefGBkqEacIP776OUwz7knQ==", dest: "node_modules/@koromix/koffi-linux-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "@koromix/koffi-linux-ia32", version: "3.1.1", integrity: "sha512-jG7IFytmP8K5Qtbx0ro0ZeuX3JjSsLxmYhq+nmXDdrtOAlxIsWGynuiDLS6Jk3vOchVii2m6Y2f/L3GLG2fG5A==", dest: "node_modules/@koromix/koffi-linux-ia32", optional: true, os: ["linux"], cpu: ["ia32"] }, + { name: "@koromix/koffi-linux-loong64", version: "3.1.1", integrity: "sha512-CIsT1cNnih8FuU52Me/IVlJBpH28SQfoDeYPctJswgJzaARktusF7m4MUbtR1PBDjuquCVM4/vFyNdOzfPonvA==", dest: "node_modules/@koromix/koffi-linux-loong64", optional: true, os: ["linux"], cpu: ["loong64"] }, + { name: "@koromix/koffi-linux-riscv64", version: "3.1.1", integrity: "sha512-9D6RmqeKsSvs3U6jILJU9PcAjMwKKyn7yLxNBb5k6z9PCoUoGJ3/BrhXAX0qjrLLwEiIpP/hS/40RuXvH8Lc3Q==", dest: "node_modules/@koromix/koffi-linux-riscv64", optional: true, os: ["linux"], cpu: ["riscv64"] }, + { name: "@koromix/koffi-linux-x64", version: "3.1.1", integrity: "sha512-pyTcX5fePeYbt7TZAwRby69wdlRx3PT+g15ra5IYdat/Pgh3qAKEYeZ+uu7WpPGOy43p/oSRqqZoa2kORzozlA==", dest: "node_modules/@koromix/koffi-linux-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "@koromix/koffi-openbsd-ia32", version: "3.1.1", integrity: "sha512-iPnPzvG2HOfdzaiG1drdkt86sAqmTPDv9mAf+5gL7mRzkeeQC88EVGboRy7eXwdXn7R+v0ntA3iQxdHrBn6yXw==", dest: "node_modules/@koromix/koffi-openbsd-ia32", optional: true, os: ["openbsd"], cpu: ["ia32"] }, + { name: "@koromix/koffi-openbsd-x64", version: "3.1.1", integrity: "sha512-/Xqc3R0SVoMCYjMPZnJ9bULtRo364+dKmnQhfDrI83tSpxUHRw7HRNf12vBeL+hPgKxSBjtMpWfQ/ZIyVyLFag==", dest: "node_modules/@koromix/koffi-openbsd-x64", optional: true, os: ["openbsd"], cpu: ["x64"] }, + { name: "@koromix/koffi-win32-arm64", version: "3.1.1", integrity: "sha512-JhqHauEwQvdcWUERxrV5HH/DT9W7hY1A1eU6/o8tB+yck+D3kt5elpRDBt9KjpW6h+vHPy3V0sjDvO0CXyabTA==", dest: "node_modules/@koromix/koffi-win32-arm64", optional: true, os: ["win32"], cpu: ["arm64"] }, + { name: "@koromix/koffi-win32-ia32", version: "3.1.1", integrity: "sha512-ZRuyYmlGS/rCc966qqs0qREXDW4FRdul7rDF1VgSWHbVmdc196PUgUT+blq/GjZgTwqzeEXtMRgM+cU8krHjvA==", dest: "node_modules/@koromix/koffi-win32-ia32", optional: true, os: ["win32"], cpu: ["ia32"] }, + { name: "@koromix/koffi-win32-x64", version: "3.1.1", integrity: "sha512-KqHPmvj6QILhNyI/To8QSihHsijeVGIYYPBOUnXEpcnH2LuLbargY4Hd6dDeTN3Z90uUUxN+1FWz1UnhVzFOiA==", dest: "node_modules/@koromix/koffi-win32-x64", optional: true, os: ["win32"], cpu: ["x64"] }, + { name: "@mixmark-io/domino", version: "2.2.0", integrity: "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", dest: "node_modules/@mixmark-io/domino" }, + { name: "@modelcontextprotocol/client", version: "2.0.0", integrity: "sha512-8f1OghQ2rjzIOfqgUCP+8GiUWqRs89njoWLNqAe8kWmDePv3s1fZXseej+QXemssEuuOvLLmLO/kqM3IQHtISw==", dest: "node_modules/@modelcontextprotocol/client" }, + { name: "@modelcontextprotocol/core", version: "2.0.0", integrity: "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==", dest: "node_modules/@modelcontextprotocol/core" }, + { name: "@modelcontextprotocol/sdk", version: "1.30.0", integrity: "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", dest: "node_modules/@modelcontextprotocol/sdk", optional: true }, + { name: "content-type", version: "1.0.5", integrity: "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", dest: "node_modules/@modelcontextprotocol/sdk/node_modules/content-type", optional: true }, + { name: "@octokit/openapi-types", version: "29.0.1", integrity: "sha512-9qWOMFNxxLokERcms42rU0PTLqQmVs7g5E41TI4mCOxmpFayD1rfC7XxOL55cG9MBZLFlC31BrR37myMKardwg==", dest: "node_modules/@octokit/openapi-types" }, + { name: "@octokit/openapi-webhooks-types", version: "12.1.0", integrity: "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", dest: "node_modules/@octokit/openapi-webhooks-types" }, + { name: "@octokit/request-error", version: "7.1.2", integrity: "sha512-XZRuT3xZ84D3gYErI1DZvhJ33dCWVV6uzBtWkaBB4TvA/L6eOeTZodxLFVB44bBEEo3vEx7y00UfX1tBLrtLRg==", dest: "node_modules/@octokit/request-error" }, + { name: "@octokit/types", version: "18.0.0", integrity: "sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==", dest: "node_modules/@octokit/types" }, + { name: "@octokit/webhooks", version: "14.2.0", integrity: "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", dest: "node_modules/@octokit/webhooks" }, + { name: "@octokit/webhooks-methods", version: "6.0.0", integrity: "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", dest: "node_modules/@octokit/webhooks-methods" }, + { name: "@opentelemetry/api", version: "1.9.1", integrity: "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", dest: "node_modules/@opentelemetry/api" }, + { name: "@opentelemetry/api-logs", version: "0.220.0", integrity: "sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==", dest: "node_modules/@opentelemetry/api-logs" }, + { name: "@opentelemetry/core", version: "2.11.0", integrity: "sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==", dest: "node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/otlp-exporter-base", version: "0.220.0", integrity: "sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ==", dest: "node_modules/@opentelemetry/otlp-exporter-base" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/otlp-transformer", version: "0.220.0", integrity: "sha512-lXGrv7KXZ0gNH9SVNUaa6vv6phVYGvJxfXAlMbzbakiXru75f5MZl8Z7oqiMMQD77riVHJCFlQvbZs/VVN2/4A==", dest: "node_modules/@opentelemetry/otlp-transformer" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/resources", version: "2.9.0", integrity: "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==", dest: "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/resources", version: "2.11.0", integrity: "sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==", dest: "node_modules/@opentelemetry/resources" }, + { name: "@opentelemetry/sdk-logs", version: "0.220.0", integrity: "sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA==", dest: "node_modules/@opentelemetry/sdk-logs" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/resources", version: "2.9.0", integrity: "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==", dest: "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/sdk-metrics", version: "2.9.0", integrity: "sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q==", dest: "node_modules/@opentelemetry/sdk-metrics" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/resources", version: "2.9.0", integrity: "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==", dest: "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/sdk-trace", version: "2.9.0", integrity: "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==", dest: "node_modules/@opentelemetry/sdk-trace" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/resources", version: "2.9.0", integrity: "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==", dest: "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/resources" }, + { name: "@opentelemetry/core", version: "2.9.0", integrity: "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", dest: "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core" }, + { name: "@opentelemetry/semantic-conventions", version: "1.43.0", integrity: "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", dest: "node_modules/@opentelemetry/semantic-conventions" }, + { name: "@protobufjs/aspromise", version: "1.1.2", integrity: "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", dest: "node_modules/@protobufjs/aspromise" }, + { name: "@protobufjs/base64", version: "1.1.2", integrity: "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", dest: "node_modules/@protobufjs/base64" }, + { name: "@protobufjs/codegen", version: "2.0.5", integrity: "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", dest: "node_modules/@protobufjs/codegen" }, + { name: "@protobufjs/eventemitter", version: "1.1.1", integrity: "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", dest: "node_modules/@protobufjs/eventemitter" }, + { name: "@protobufjs/fetch", version: "1.1.1", integrity: "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", dest: "node_modules/@protobufjs/fetch" }, + { name: "@protobufjs/float", version: "1.0.2", integrity: "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", dest: "node_modules/@protobufjs/float" }, + { name: "@protobufjs/path", version: "1.1.2", integrity: "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", dest: "node_modules/@protobufjs/path" }, + { name: "@protobufjs/pool", version: "1.1.0", integrity: "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", dest: "node_modules/@protobufjs/pool" }, + { name: "@protobufjs/utf8", version: "1.1.2", integrity: "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", dest: "node_modules/@protobufjs/utf8" }, + { name: "@sec-ant/readable-stream", version: "0.4.1", integrity: "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", dest: "node_modules/@sec-ant/readable-stream" }, + { name: "@sindresorhus/is", version: "7.2.0", integrity: "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", dest: "node_modules/@sindresorhus/is" }, + { name: "@sindresorhus/merge-streams", version: "4.0.0", integrity: "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", dest: "node_modules/@sindresorhus/merge-streams" }, + { name: "@smithy/core", version: "3.35.1", integrity: "sha512-i4YPS4B6ts7bjn7UwLnGjiZdprOvHvgGobFZsYK3GIY3E5hIqtj0rReU69BcTpGp+fvtraSNXeG1l+jtJvF55w==", dest: "node_modules/@smithy/core" }, + { name: "@smithy/credential-provider-imds", version: "4.5.2", integrity: "sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==", dest: "node_modules/@smithy/credential-provider-imds" }, + { name: "@smithy/fetch-http-handler", version: "5.8.0", integrity: "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==", dest: "node_modules/@smithy/fetch-http-handler" }, + { name: "@smithy/node-http-handler", version: "4.12.1", integrity: "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==", dest: "node_modules/@smithy/node-http-handler" }, + { name: "@smithy/signature-v4", version: "5.7.4", integrity: "sha512-tHy0K0VtqNd5Y7Y41h0a0Lhh0L1GzC08dTWg0F7vRJWFtTENg7IZikf3wQkanYIRdb7ngoIPMTmqgUi401fEeQ==", dest: "node_modules/@smithy/signature-v4" }, + { name: "@smithy/types", version: "4.19.0", integrity: "sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q==", dest: "node_modules/@smithy/types" }, + { name: "@stablelib/base64", version: "1.0.1", integrity: "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==", dest: "node_modules/@stablelib/base64" }, + { name: "@standard-schema/spec", version: "1.1.0", integrity: "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", dest: "node_modules/@standard-schema/spec" }, + { name: "@swc/helpers", version: "0.5.23", integrity: "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", dest: "node_modules/@swc/helpers" }, + { name: "@types/http-cache-semantics", version: "4.2.0", integrity: "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", dest: "node_modules/@types/http-cache-semantics" }, + { name: "@types/node", version: "22.20.1", integrity: "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", dest: "node_modules/@types/node" }, + { name: "@types/retry", version: "0.12.0", integrity: "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", dest: "node_modules/@types/retry" }, + { name: "@vscode/ripgrep", version: "1.18.0", integrity: "sha512-ns5lWe44tSfbTMbVUsyB+I1819PVSw4AdpgK0RNkzfWfwy6+3IUNSxwSrfTno1/oWaS/hERNz+XLWVyga2aJBQ==", dest: "node_modules/@vscode/ripgrep" }, + { name: "@vscode/ripgrep-darwin-arm64", version: "1.18.0", integrity: "sha512-r3ktHSvbFycQNF6sl7sNDPocpsI7J+mEzh1IaZFkY0spm3k2Z9t8hPAeOK7+p0l6p6/swkQC14XWX01low+94Q==", dest: "node_modules/@vscode/ripgrep-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "@vscode/ripgrep-darwin-x64", version: "1.18.0", integrity: "sha512-25b4gWbL138dGuQU244ebCKKc0q05ULBMoFSz9oAEUHNeqK/lOJViDS7DRvbDazzAzSEdan391Znks/R5mkaTQ==", dest: "node_modules/@vscode/ripgrep-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "@vscode/ripgrep-linux-arm", version: "1.18.0", integrity: "sha512-GDAvufNDHu8zqLEmXstalQF0Wh6wQvdsBi/Vg3Yi3CK4a8XoFXqqXVEHEZ9xQz3t0NfoSEc9JbvK9DDS6FxyxQ==", dest: "node_modules/@vscode/ripgrep-linux-arm", optional: true, os: ["linux"], cpu: ["arm"] }, + { name: "@vscode/ripgrep-linux-arm64", version: "1.18.0", integrity: "sha512-lQ/5zTG++U0E3IhVgS4EPTTn/U4okncaRMM5GOFfOYZywS4nuD31GhkHbNYlDk5CuDC68+hYJ0/eQeyCKJDA+g==", dest: "node_modules/@vscode/ripgrep-linux-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "@vscode/ripgrep-linux-ia32", version: "1.18.0", integrity: "sha512-YWLkSUtFd4Jh5EepIhA9RJSfv3uMAVMo+2rBIGHPBnvgLrZciIs2cDKei1/p6Wc/aCzUoHyMAg2R6tw4ZCBKGg==", dest: "node_modules/@vscode/ripgrep-linux-ia32", optional: true, os: ["linux"], cpu: ["ia32"] }, + { name: "@vscode/ripgrep-linux-ppc64", version: "1.18.0", integrity: "sha512-quXVY8fwQ8O/lvU1yrSqSl3jlUzysRSb+AfUfCL/tRtphxsKlFvPAejryZ6vg4Bgvn8XL74xb4qMCDmWgYrT5w==", dest: "node_modules/@vscode/ripgrep-linux-ppc64", optional: true, os: ["linux"], cpu: ["ppc64"] }, + { name: "@vscode/ripgrep-linux-riscv64", version: "1.18.0", integrity: "sha512-f5kBQBrWfQt8Q7OhSORuNDei5dkYagBj3y4jImSUXGMy8B/Ke7SltSRcUtjPv166FAFfHCAmWuZp3+cWnX2/Vw==", dest: "node_modules/@vscode/ripgrep-linux-riscv64", optional: true, os: ["linux"], cpu: ["riscv64"] }, + { name: "@vscode/ripgrep-linux-s390x", version: "1.18.0", integrity: "sha512-rTOcJFGGcl2c07RUOWUo4U1ndnemKhY6A9hnMB18uk7jSgJc0d/QLBGWMWpumdtoJtpizn/wIv5mXIisJukusQ==", dest: "node_modules/@vscode/ripgrep-linux-s390x", optional: true, os: ["linux"], cpu: ["s390x"] }, + { name: "@vscode/ripgrep-linux-x64", version: "1.18.0", integrity: "sha512-mQ3bVrUpnD2vs7QT0vX90Lt0cnUq467uFtEktIdsJJmW296RoSULRGqWgzG1AKxyBpNDD6l4ZO4qKf6SgyC23Q==", dest: "node_modules/@vscode/ripgrep-linux-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "@vscode/ripgrep-win32-arm64", version: "1.18.0", integrity: "sha512-vfTIjq1OHnzUjxZcHVQAMbnggp8dpGf+0QKFOZHwWPqFwXxQC8eCWM+5NUdoJ6yrElCeMzoUTXoK/LdZaniB+Q==", dest: "node_modules/@vscode/ripgrep-win32-arm64", optional: true, os: ["win32"], cpu: ["arm64"] }, + { name: "@vscode/ripgrep-win32-ia32", version: "1.18.0", integrity: "sha512-//rfAE+BOw5AC2EMmepmiE36jUuevtQYNQqqlw1s3m9FlRxjxEut97RkRPHAu9BG4mSojatZx+kXZXNdyI9caQ==", dest: "node_modules/@vscode/ripgrep-win32-ia32", optional: true, os: ["win32"], cpu: ["ia32"] }, + { name: "@vscode/ripgrep-win32-x64", version: "1.18.0", integrity: "sha512-KNPvtElldqILHdnAetujPaowkNbpqJy3ssIGGN6F6Kve9Qi+nNLI2DN01O83JjCEVQbCzl8Ov3QZ9Eov3BR8Dg==", dest: "node_modules/@vscode/ripgrep-win32-x64", optional: true, os: ["win32"], cpu: ["x64"] }, + { name: "@xterm/addon-serialize", version: "0.14.0", integrity: "sha512-uteyTU1EkrQa2Ux6P/uFl2fzmXI46jy5uoQMKEOM0fKTyiW7cSn0WrFenHm5vO5uEXX/GpwW/FgILvv3r0WbkA==", dest: "node_modules/@xterm/addon-serialize" }, + { name: "@xterm/headless", version: "6.0.0", integrity: "sha512-5Yj1QINYCyzrZtf8OFIHi47iQtI+0qYFPHmouEfG8dHNxbZ9Tb9YGSuLcsEwj9Z+OL75GJqPyJbyoFer80a2Hw==", dest: "node_modules/@xterm/headless" }, + { name: "accepts", version: "2.0.0", integrity: "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", dest: "node_modules/accepts", optional: true }, + { name: "negotiator", version: "1.1.0", integrity: "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", dest: "node_modules/accepts/node_modules/negotiator" }, + { name: "agent-base", version: "7.1.4", integrity: "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", dest: "node_modules/agent-base" }, + { name: "ajv", version: "8.20.0", integrity: "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", dest: "node_modules/ajv" }, + { name: "ajv-formats", version: "3.0.1", integrity: "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", dest: "node_modules/ajv-formats", optional: true }, + { name: "argparse", version: "2.0.1", integrity: "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", dest: "node_modules/argparse" }, + { name: "base64-js", version: "1.5.1", integrity: "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", dest: "node_modules/base64-js" }, + { name: "bignumber.js", version: "9.3.1", integrity: "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", dest: "node_modules/bignumber.js" }, + { name: "body-parser", version: "2.3.0", integrity: "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", dest: "node_modules/body-parser", optional: true }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/body-parser/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/body-parser/node_modules/debug/node_modules/ms" }, + { name: "bowser", version: "2.14.1", integrity: "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", dest: "node_modules/bowser" }, + { name: "brotli", version: "1.3.3", integrity: "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", dest: "node_modules/brotli" }, + { name: "buffer-equal-constant-time", version: "1.0.1", integrity: "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", dest: "node_modules/buffer-equal-constant-time" }, + { name: "bundle-name", version: "4.1.1", integrity: "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", dest: "node_modules/bundle-name" }, + { name: "byte-counter", version: "0.1.0", integrity: "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", dest: "node_modules/byte-counter" }, + { name: "bytes", version: "3.1.2", integrity: "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", dest: "node_modules/bytes" }, + { name: "cacheable-lookup", version: "7.0.0", integrity: "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", dest: "node_modules/cacheable-lookup" }, + { name: "cacheable-request", version: "13.0.19", integrity: "sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg==", dest: "node_modules/cacheable-request" }, + { name: "call-bind-apply-helpers", version: "1.0.2", integrity: "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", dest: "node_modules/call-bind-apply-helpers", optional: true }, + { name: "call-bound", version: "1.0.4", integrity: "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", dest: "node_modules/call-bound", optional: true }, + { name: "chokidar", version: "4.0.3", integrity: "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", dest: "node_modules/chokidar" }, + { name: "clone", version: "2.1.2", integrity: "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", dest: "node_modules/clone" }, + { name: "commander", version: "15.0.0", integrity: "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", dest: "node_modules/commander" }, + { name: "compressible", version: "2.0.18", integrity: "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", dest: "node_modules/compressible" }, + { name: "compression", version: "1.8.2", integrity: "sha512-o8vI5RE5A6EVVOd9o41jKp41aJom+QTEO/Bx8MYNjexMo/Bv2WOjUfZr+aL0WnYSgymUy6zeguqLTsIhV0gMvQ==", dest: "node_modules/compression" }, + { name: "content-disposition", version: "1.1.0", integrity: "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", dest: "node_modules/content-disposition", optional: true }, + { name: "content-type", version: "2.1.0", integrity: "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", dest: "node_modules/content-type" }, + { name: "cookie", version: "0.7.2", integrity: "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", dest: "node_modules/cookie", optional: true }, + { name: "cookie-signature", version: "1.2.2", integrity: "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", dest: "node_modules/cookie-signature", optional: true }, + { name: "cors", version: "2.8.6", integrity: "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", dest: "node_modules/cors", optional: true }, + { name: "cross-spawn", version: "7.0.6", integrity: "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", dest: "node_modules/cross-spawn" }, + { name: "data-uri-to-buffer", version: "4.0.1", integrity: "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", dest: "node_modules/data-uri-to-buffer" }, + { name: "debug", version: "2.6.9", integrity: "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", dest: "node_modules/debug" }, + { name: "decompress-response", version: "10.0.0", integrity: "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", dest: "node_modules/decompress-response" }, + { name: "default-browser", version: "5.5.1", integrity: "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", dest: "node_modules/default-browser" }, + { name: "default-browser-id", version: "5.0.1", integrity: "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", dest: "node_modules/default-browser-id" }, + { name: "define-lazy-prop", version: "3.0.0", integrity: "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", dest: "node_modules/define-lazy-prop" }, + { name: "depd", version: "2.0.0", integrity: "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", dest: "node_modules/depd", optional: true }, + { name: "destroy", version: "1.2.0", integrity: "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", dest: "node_modules/destroy" }, + { name: "detect-libc", version: "2.1.2", integrity: "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", dest: "node_modules/detect-libc" }, + { name: "dfa", version: "1.2.0", integrity: "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", dest: "node_modules/dfa" }, + { name: "diff", version: "9.0.0", integrity: "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", dest: "node_modules/diff" }, + { name: "dunder-proto", version: "1.0.1", integrity: "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", dest: "node_modules/dunder-proto", optional: true }, + { name: "ecdsa-sig-formatter", version: "1.0.11", integrity: "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", dest: "node_modules/ecdsa-sig-formatter" }, + { name: "ee-first", version: "1.1.1", integrity: "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", dest: "node_modules/ee-first", optional: true }, + { name: "encodeurl", version: "2.0.0", integrity: "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", dest: "node_modules/encodeurl", optional: true }, + { name: "es-define-property", version: "1.0.1", integrity: "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", dest: "node_modules/es-define-property", optional: true }, + { name: "es-errors", version: "1.3.0", integrity: "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", dest: "node_modules/es-errors", optional: true }, + { name: "es-object-atoms", version: "1.1.2", integrity: "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", dest: "node_modules/es-object-atoms", optional: true }, + { name: "escape-html", version: "1.0.3", integrity: "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", dest: "node_modules/escape-html", optional: true }, + { name: "etag", version: "1.8.1", integrity: "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", dest: "node_modules/etag", optional: true }, + { name: "eventsource", version: "3.0.7", integrity: "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", dest: "node_modules/eventsource" }, + { name: "eventsource-parser", version: "3.1.1", integrity: "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", dest: "node_modules/eventsource-parser" }, + { name: "execa", version: "10.0.1", integrity: "sha512-ge98qjkRK4IB7tL7Ju/6qmm5LHoH1eEMt5FNZrz3f4UIYhF28lggX20z3FaX1sgc67msLEn0N0BscOs29iuwyw==", dest: "node_modules/execa" }, + { name: "express", version: "5.2.1", integrity: "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", dest: "node_modules/express", optional: true }, + { name: "express-rate-limit", version: "8.6.2", integrity: "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", dest: "node_modules/express-rate-limit", optional: true }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/express-rate-limit/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/express-rate-limit/node_modules/debug/node_modules/ms" }, + { name: "content-type", version: "1.0.5", integrity: "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", dest: "node_modules/express/node_modules/content-type", optional: true }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/express/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/express/node_modules/debug/node_modules/ms" }, + { name: "extend", version: "3.0.2", integrity: "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", dest: "node_modules/extend" }, + { name: "fast-deep-equal", version: "3.1.3", integrity: "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", dest: "node_modules/fast-deep-equal" }, + { name: "fast-sha256", version: "1.3.0", integrity: "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", dest: "node_modules/fast-sha256" }, + { name: "fast-uri", version: "3.1.5", integrity: "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", dest: "node_modules/fast-uri" }, + { name: "fetch-blob", version: "3.2.0", integrity: "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", dest: "node_modules/fetch-blob" }, + { name: "fflate", version: "0.8.2", integrity: "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", dest: "node_modules/fflate" }, + { name: "figures", version: "6.1.0", integrity: "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", dest: "node_modules/figures" }, + { name: "finalhandler", version: "2.1.1", integrity: "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", dest: "node_modules/finalhandler", optional: true }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/finalhandler/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/finalhandler/node_modules/debug/node_modules/ms" }, + { name: "fontkit", version: "2.0.4", integrity: "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", dest: "node_modules/fontkit" }, + { name: "form-data-encoder", version: "4.1.0", integrity: "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", dest: "node_modules/form-data-encoder" }, + { name: "formdata-polyfill", version: "4.0.10", integrity: "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", dest: "node_modules/formdata-polyfill" }, + { name: "forwarded", version: "0.2.0", integrity: "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", dest: "node_modules/forwarded", optional: true }, + { name: "fresh", version: "2.0.0", integrity: "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", dest: "node_modules/fresh", optional: true }, + { name: "function-bind", version: "1.1.2", integrity: "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", dest: "node_modules/function-bind", optional: true }, + { name: "gaxios", version: "7.3.1", integrity: "sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==", dest: "node_modules/gaxios" }, + { name: "gcp-metadata", version: "8.1.2", integrity: "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", dest: "node_modules/gcp-metadata" }, + { name: "get-intrinsic", version: "1.3.0", integrity: "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", dest: "node_modules/get-intrinsic", optional: true }, + { name: "get-proto", version: "1.0.1", integrity: "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", dest: "node_modules/get-proto", optional: true }, + { name: "get-stream", version: "9.0.1", integrity: "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", dest: "node_modules/get-stream" }, + { name: "google-auth-library", version: "10.9.1", integrity: "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==", dest: "node_modules/google-auth-library" }, + { name: "google-logging-utils", version: "1.1.3", integrity: "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", dest: "node_modules/google-logging-utils" }, + { name: "gopd", version: "1.2.0", integrity: "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", dest: "node_modules/gopd", optional: true }, + { name: "got", version: "14.6.6", integrity: "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", dest: "node_modules/got" }, + { name: "has-symbols", version: "1.1.0", integrity: "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", dest: "node_modules/has-symbols", optional: true }, + { name: "hasown", version: "2.0.4", integrity: "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", dest: "node_modules/hasown", optional: true }, + { name: "hono", version: "4.13.3", integrity: "sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw==", dest: "node_modules/hono", optional: true }, + { name: "http-cache-semantics", version: "4.3.0", integrity: "sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==", dest: "node_modules/http-cache-semantics" }, + { name: "http-errors", version: "2.0.1", integrity: "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", dest: "node_modules/http-errors", optional: true }, + { name: "http-proxy-agent", version: "9.1.0", integrity: "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==", dest: "node_modules/http-proxy-agent" }, + { name: "agent-base", version: "9.0.0", integrity: "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", dest: "node_modules/http-proxy-agent/node_modules/agent-base" }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/http-proxy-agent/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/http-proxy-agent/node_modules/debug/node_modules/ms" }, + { name: "http2-wrapper", version: "2.2.1", integrity: "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", dest: "node_modules/http2-wrapper" }, + { name: "https-proxy-agent", version: "7.0.6", integrity: "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", dest: "node_modules/https-proxy-agent" }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/https-proxy-agent/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/https-proxy-agent/node_modules/debug/node_modules/ms" }, + { name: "human-signals", version: "8.0.1", integrity: "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", dest: "node_modules/human-signals" }, + { name: "iconv-lite", version: "0.7.3", integrity: "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", dest: "node_modules/iconv-lite", optional: true }, + { name: "inherits", version: "2.0.4", integrity: "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", dest: "node_modules/inherits", optional: true }, + { name: "ip-address", version: "10.5.0", integrity: "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", dest: "node_modules/ip-address", optional: true }, + { name: "ipaddr.js", version: "2.5.0", integrity: "sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==", dest: "node_modules/ipaddr.js" }, + { name: "is-docker", version: "3.0.0", integrity: "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", dest: "node_modules/is-docker" }, + { name: "is-in-ssh", version: "1.0.0", integrity: "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", dest: "node_modules/is-in-ssh" }, + { name: "is-inside-container", version: "1.0.0", integrity: "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", dest: "node_modules/is-inside-container" }, + { name: "is-plain-obj", version: "4.1.0", integrity: "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", dest: "node_modules/is-plain-obj" }, + { name: "is-promise", version: "4.0.0", integrity: "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", dest: "node_modules/is-promise", optional: true }, + { name: "is-stream", version: "4.0.1", integrity: "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", dest: "node_modules/is-stream" }, + { name: "is-unicode-supported", version: "2.1.0", integrity: "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", dest: "node_modules/is-unicode-supported" }, + { name: "is-wsl", version: "3.1.1", integrity: "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", dest: "node_modules/is-wsl" }, + { name: "isexe", version: "2.0.0", integrity: "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", dest: "node_modules/isexe" }, + { name: "jose", version: "6.2.10", integrity: "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==", dest: "node_modules/jose" }, + { name: "js-tokens", version: "4.0.0", integrity: "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", dest: "node_modules/js-tokens" }, + { name: "js-yaml", version: "4.3.2", integrity: "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", dest: "node_modules/js-yaml" }, + { name: "jsbi", version: "4.3.2", integrity: "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==", dest: "node_modules/jsbi" }, + { name: "json-bigint", version: "1.0.0", integrity: "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", dest: "node_modules/json-bigint" }, + { name: "json-schema-to-ts", version: "3.1.1", integrity: "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", dest: "node_modules/json-schema-to-ts" }, + { name: "json-schema-traverse", version: "1.0.0", integrity: "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", dest: "node_modules/json-schema-traverse" }, + { name: "json-schema-typed", version: "8.0.2", integrity: "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", dest: "node_modules/json-schema-typed", optional: true }, + { name: "jwa", version: "2.0.1", integrity: "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", dest: "node_modules/jwa" }, + { name: "jws", version: "4.0.1", integrity: "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", dest: "node_modules/jws" }, + { name: "keyv", version: "5.6.0", integrity: "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", dest: "node_modules/keyv" }, + { name: "koffi", version: "3.1.1", integrity: "sha512-mRX6AMeeKCxSOeOopqAcLAl5jcNvge7NAG8l7rF/8gGJATI0tdHFYjteIdE0mGOtWdsrJOij+PjnP8Q9c1gwgA==", dest: "node_modules/koffi" }, + { name: "long", version: "5.3.2", integrity: "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", dest: "node_modules/long" }, + { name: "lowercase-keys", version: "3.0.0", integrity: "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", dest: "node_modules/lowercase-keys" }, + { name: "math-intrinsics", version: "1.1.0", integrity: "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", dest: "node_modules/math-intrinsics", optional: true }, + { name: "media-typer", version: "1.1.1", integrity: "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", dest: "node_modules/media-typer", optional: true }, + { name: "merge-descriptors", version: "2.0.0", integrity: "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", dest: "node_modules/merge-descriptors", optional: true }, + { name: "mime-db", version: "1.54.0", integrity: "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", dest: "node_modules/mime-db" }, + { name: "mime-types", version: "3.0.2", integrity: "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", dest: "node_modules/mime-types" }, + { name: "mimic-response", version: "4.0.0", integrity: "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", dest: "node_modules/mimic-response" }, + { name: "ms", version: "2.0.0", integrity: "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", dest: "node_modules/ms" }, + { name: "negotiator", version: "0.6.4", integrity: "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", dest: "node_modules/negotiator" }, + { name: "node-addon-api", version: "7.1.1", integrity: "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", dest: "node_modules/node-addon-api" }, + { name: "node-addon-native-custom-loader", version: "0.1.7", integrity: "sha512-mny2aBXuqWZLu8xFg0Azk6HZd8tlEBbpkOMhideAY3OABE9tp38VeKo8/sw5g/qeYAAdE8oEmsmeJ5IBJd6YHg==", dest: "node_modules/node-addon-native-custom-loader" }, + { name: "node-addon-require-builtin", version: "0.1.7", integrity: "sha512-2/yiwaMEpIJdrsjwY/09IoLMLKJtyJGlPhtJd80a+B4x0+SYsnAorg5GlDyJHfTb/UgiIYzbNOgL3HHrigFaAQ==", dest: "node_modules/node-addon-require-builtin" }, + { name: "node-addon-require-builtin-darwin-arm64", version: "0.1.7", integrity: "sha512-3n5SgmD6S4lCyeFPumbwfUh+YLssWiSF8GuToHdr00hBPhDikyzHCy2UV5qJUTDNNtUpfw9QuFijsC+ulnvmog==", dest: "node_modules/node-addon-require-builtin-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "node-addon-require-builtin-darwin-x64", version: "0.1.7", integrity: "sha512-ZelNDiBgGH//ZHw6FCv4VdWUxV2YwdZNa0za7nOJIYodGcow0rJX6san45iOI73/gd2qtyKBOrHgylDjnBblbg==", dest: "node_modules/node-addon-require-builtin-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "node-addon-require-builtin-linux-arm64-gnu", version: "0.1.7", integrity: "sha512-osAdFdxBUeciYOAIMxxIZzVyPK73zex7xJvSAyfDPyY8cTxhGZVZGQnB0ZtZEy3TRQQ2psjWhu5HbcHXIXotXw==", dest: "node_modules/node-addon-require-builtin-linux-arm64-gnu", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "node-addon-require-builtin-linux-arm64-musl", version: "0.1.7", integrity: "sha512-pN027xk8o64/i1evlncK3VoPGdnflHzMgD+MQ+vApMpu2U6XKc9KAqKiImTpMd+mtGxElkkhD/AXNybF0MscZw==", dest: "node_modules/node-addon-require-builtin-linux-arm64-musl", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "node-addon-require-builtin-linux-x64-gnu", version: "0.1.7", integrity: "sha512-HedJA3MGD7I3rH/mPuPIaGTTtSm61L5uHv/90xHPy0tHGlP5cxC9Dt9l/5iwIrTE04LrT0woiG8Ef2Eg2sRyuA==", dest: "node_modules/node-addon-require-builtin-linux-x64-gnu", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "node-addon-require-builtin-linux-x64-musl", version: "0.1.7", integrity: "sha512-4SkkvMTQqwFRkNzWp8Jc+1e/wMzA893YYX6lhRFFXWcb+igpXq/KD92JEWI0RHr9rrQkwF51/9odyt0Jk9WnDA==", dest: "node_modules/node-addon-require-builtin-linux-x64-musl", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "node-addon-require-builtin-win32-arm64-msvc", version: "0.1.7", integrity: "sha512-nooBYRrieUMClXU3HBM+9yfOEXC0EJS3kFGJzu7oXocOgADKmAwt3xpF3YunjnyN9bty9/QaoZRlHG5EBX4Usg==", dest: "node_modules/node-addon-require-builtin-win32-arm64-msvc", optional: true, os: ["win32"], cpu: ["arm64"] }, + { name: "node-addon-require-builtin-win32-ia32-msvc", version: "0.1.7", integrity: "sha512-i3/cymlUwzReJTtFLC75m+Gabi1RWa4ym4KgVThGLySy4/EJ0QldTv5VWHg3i7HP/g8gIWXwFrxTFk5v2DGchA==", dest: "node_modules/node-addon-require-builtin-win32-ia32-msvc", optional: true, os: ["win32"], cpu: ["ia32"] }, + { name: "node-addon-require-builtin-win32-x64-msvc", version: "0.1.7", integrity: "sha512-iwYELawC0J+nKFTIfJumU53VzTVDshSFUZCU6oUb4Uw+JAfsXCCA2WaSQbtmHng6ub0HEFqWgfh/Wp+qsEVtNg==", dest: "node_modules/node-addon-require-builtin-win32-x64-msvc", optional: true, os: ["win32"], cpu: ["x64"] }, + { name: "node-domexception", version: "1.0.0", integrity: "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", dest: "node_modules/node-domexception" }, + { name: "node-fetch", version: "3.3.2", integrity: "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", dest: "node_modules/node-fetch" }, + { name: "node-pty", version: "1.2.0-beta.15", integrity: "sha512-vORSzHXi4Ofl7HemVWpuudLqCPdaQb4LfpRCUpE5HPxhp4JYscl8zZwxh11p26v2wvW24WMwnMfLjhRLixrfxA==", dest: "node_modules/node-pty" }, + { name: "normalize-url", version: "8.1.1", integrity: "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", dest: "node_modules/normalize-url" }, + { name: "npm-run-path", version: "6.0.0", integrity: "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", dest: "node_modules/npm-run-path" }, + { name: "path-key", version: "4.0.0", integrity: "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", dest: "node_modules/npm-run-path/node_modules/path-key" }, + { name: "object-assign", version: "4.1.1", integrity: "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", dest: "node_modules/object-assign", optional: true }, + { name: "object-inspect", version: "1.13.4", integrity: "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", dest: "node_modules/object-inspect", optional: true }, + { name: "on-finished", version: "2.4.1", integrity: "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", dest: "node_modules/on-finished", optional: true }, + { name: "on-headers", version: "1.1.0", integrity: "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", dest: "node_modules/on-headers" }, + { name: "once", version: "1.4.0", integrity: "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", dest: "node_modules/once", optional: true }, + { name: "open", version: "11.0.4", integrity: "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", dest: "node_modules/open" }, + { name: "openai", version: "6.40.0", integrity: "sha512-MWtTjd/gQt4jpbji61NTgFWJLoY/PdRJ6wG9/ZDRMYNMlBKrCrSlkLI+KgHP1vR1qT6LKSAyAqIxno6lcK9JiA==", dest: "node_modules/openai" }, + { name: "p-cancelable", version: "4.0.1", integrity: "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", dest: "node_modules/p-cancelable" }, + { name: "p-retry", version: "4.6.2", integrity: "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", dest: "node_modules/p-retry" }, + { name: "pako", version: "0.2.9", integrity: "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", dest: "node_modules/pako" }, + { name: "parse-ms", version: "4.0.0", integrity: "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", dest: "node_modules/parse-ms" }, + { name: "parseurl", version: "1.3.3", integrity: "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", dest: "node_modules/parseurl", optional: true }, + { name: "partial-json", version: "0.1.7", integrity: "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==", dest: "node_modules/partial-json" }, + { name: "path-key", version: "3.1.1", integrity: "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", dest: "node_modules/path-key" }, + { name: "path-to-regexp", version: "8.4.2", integrity: "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", dest: "node_modules/path-to-regexp", optional: true }, + { name: "picocolors", version: "1.1.1", integrity: "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", dest: "node_modules/picocolors" }, + { name: "picomatch", version: "4.0.5", integrity: "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", dest: "node_modules/picomatch" }, + { name: "pkce-challenge", version: "5.0.1", integrity: "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", dest: "node_modules/pkce-challenge" }, + { name: "powershell-utils", version: "0.2.1", integrity: "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", dest: "node_modules/powershell-utils" }, + { name: "pretty-ms", version: "9.3.1", integrity: "sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==", dest: "node_modules/pretty-ms" }, + { name: "protobufjs", version: "7.6.6", integrity: "sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==", dest: "node_modules/protobufjs" }, + { name: "proxy-addr", version: "2.0.7", integrity: "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", dest: "node_modules/proxy-addr", optional: true }, + { name: "ipaddr.js", version: "1.9.1", integrity: "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", dest: "node_modules/proxy-addr/node_modules/ipaddr.js", optional: true }, + { name: "proxy-agent-negotiate", version: "1.1.0", integrity: "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", dest: "node_modules/proxy-agent-negotiate" }, + { name: "qs", version: "6.15.3", integrity: "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", dest: "node_modules/qs", optional: true }, + { name: "quick-lru", version: "5.1.1", integrity: "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", dest: "node_modules/quick-lru" }, + { name: "range-parser", version: "1.3.0", integrity: "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", dest: "node_modules/range-parser", optional: true }, + { name: "raw-body", version: "3.0.2", integrity: "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", dest: "node_modules/raw-body", optional: true }, + { name: "readdirp", version: "4.1.2", integrity: "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", dest: "node_modules/readdirp" }, + { name: "require-from-string", version: "2.0.2", integrity: "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", dest: "node_modules/require-from-string" }, + { name: "resolve-alpn", version: "1.2.1", integrity: "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", dest: "node_modules/resolve-alpn" }, + { name: "resolve.exports", version: "2.0.3", integrity: "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", dest: "node_modules/resolve.exports" }, + { name: "responselike", version: "4.0.2", integrity: "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", dest: "node_modules/responselike" }, + { name: "restructure", version: "3.0.2", integrity: "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", dest: "node_modules/restructure" }, + { name: "retry", version: "0.13.1", integrity: "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", dest: "node_modules/retry" }, + { name: "router", version: "2.2.0", integrity: "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", dest: "node_modules/router", optional: true }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/router/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/router/node_modules/debug/node_modules/ms" }, + { name: "run-applescript", version: "7.1.0", integrity: "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", dest: "node_modules/run-applescript" }, + { name: "safe-buffer", version: "5.2.1", integrity: "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", dest: "node_modules/safe-buffer" }, + { name: "safer-buffer", version: "2.1.2", integrity: "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", dest: "node_modules/safer-buffer", optional: true }, + { name: "saxes", version: "6.0.0", integrity: "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", dest: "node_modules/saxes" }, + { name: "semver", version: "7.8.5", integrity: "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", dest: "node_modules/semver" }, + { name: "send", version: "1.2.1", integrity: "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", dest: "node_modules/send", optional: true }, + { name: "debug", version: "4.4.3", integrity: "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", dest: "node_modules/send/node_modules/debug" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/send/node_modules/debug/node_modules/ms" }, + { name: "ms", version: "2.1.3", integrity: "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", dest: "node_modules/send/node_modules/ms" }, + { name: "serve-static", version: "2.2.1", integrity: "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", dest: "node_modules/serve-static", optional: true }, + { name: "setprototypeof", version: "1.2.0", integrity: "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", dest: "node_modules/setprototypeof", optional: true }, + { name: "sharp", version: "0.35.5", integrity: "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", dest: "node_modules/sharp" }, + { name: "shebang-command", version: "2.0.0", integrity: "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", dest: "node_modules/shebang-command" }, + { name: "shebang-regex", version: "3.0.0", integrity: "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", dest: "node_modules/shebang-regex" }, + { name: "sherpa-onnx-darwin-arm64", version: "1.13.8", integrity: "sha512-FPNgJMgnWVl/KhRTIhG3KL3A4Om63Rn4YKXc9/uHY7SzLcvqLJLc/h7UBWJwduXvv7K18t5NpxHR6XgXn4sjWw==", dest: "node_modules/sherpa-onnx-darwin-arm64", optional: true, os: ["darwin"], cpu: ["arm64"] }, + { name: "sherpa-onnx-darwin-x64", version: "1.13.8", integrity: "sha512-7BLRpjM6w4f9W46/nmkmq8lEKUayhebvcpslCVQ+6QN2uReYlZEMDZlSpXMjme+hUFrPfRz8P3UNq8ep/4d19g==", dest: "node_modules/sherpa-onnx-darwin-x64", optional: true, os: ["darwin"], cpu: ["x64"] }, + { name: "sherpa-onnx-linux-arm64", version: "1.13.8", integrity: "sha512-Tlg7a70b/Wge3OF8IgTHF9jhSVCsLyKQKhwc4BsJ5A+dL/SrFtGBjzuHp4XeLhiiOT7afCxX5PdSn/D4c8Lnuw==", dest: "node_modules/sherpa-onnx-linux-arm64", optional: true, os: ["linux"], cpu: ["arm64"] }, + { name: "sherpa-onnx-linux-x64", version: "1.13.8", integrity: "sha512-6plnhjagsSeTntCgnlag86hWbs/uZE9Crms1LgOb68/1nKsIQjMd+WG519m+aPwT6TrsBOiEMzrx41t8sL5L5g==", dest: "node_modules/sherpa-onnx-linux-x64", optional: true, os: ["linux"], cpu: ["x64"] }, + { name: "sherpa-onnx-node", version: "1.13.8", integrity: "sha512-MsDMBdhLFTZ1GwvcGSSQhnS7g/EA8OMH6IYysCVUOM7j8Icty9KRc0E6YT1A5fWBsZwRfKOeh88QC95aRvS8ag==", dest: "node_modules/sherpa-onnx-node" }, + { name: "sherpa-onnx-win-ia32", version: "1.13.8", integrity: "sha512-H0Ojln9hfvM+pxWqW0cnjB/XK8/JPq4/k0IWu2JpY5Z458M3zv+XC3Hu+wmot3AoH/K1Bgt23n/tTKtPV9x8qg==", dest: "node_modules/sherpa-onnx-win-ia32", optional: true, os: ["win32"], cpu: ["ia32"] }, + { name: "sherpa-onnx-win-x64", version: "1.13.8", integrity: "sha512-oZF1c9VPOKtMwn83Bboc5XSWL+76BRoyB3eUuVnCknBKxwSULZU2Foia9VHWzU+n4I12rPsP6z6H9Rp1hD9o8g==", dest: "node_modules/sherpa-onnx-win-x64", optional: true, os: ["win32"], cpu: ["x64"] }, + { name: "side-channel", version: "1.1.1", integrity: "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", dest: "node_modules/side-channel", optional: true }, + { name: "side-channel-list", version: "1.0.1", integrity: "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", dest: "node_modules/side-channel-list", optional: true }, + { name: "side-channel-map", version: "1.0.1", integrity: "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", dest: "node_modules/side-channel-map", optional: true }, + { name: "side-channel-weakmap", version: "1.0.2", integrity: "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", dest: "node_modules/side-channel-weakmap", optional: true }, + { name: "signal-exit", version: "4.1.0", integrity: "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", dest: "node_modules/signal-exit" }, + { name: "standardwebhooks", version: "1.0.0", integrity: "sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==", dest: "node_modules/standardwebhooks" }, + { name: "statuses", version: "2.0.2", integrity: "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", dest: "node_modules/statuses", optional: true }, + { name: "strip-final-newline", version: "4.0.0", integrity: "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", dest: "node_modules/strip-final-newline" }, + { name: "tiny-inflate", version: "1.0.3", integrity: "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", dest: "node_modules/tiny-inflate" }, + { name: "toidentifier", version: "1.0.1", integrity: "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", dest: "node_modules/toidentifier", optional: true }, + { name: "ts-algebra", version: "2.0.0", integrity: "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", dest: "node_modules/ts-algebra" }, + { name: "tslib", version: "2.8.1", integrity: "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", dest: "node_modules/tslib" }, + { name: "turndown", version: "7.2.4", integrity: "sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==", dest: "node_modules/turndown" }, + { name: "type-fest", version: "4.41.0", integrity: "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", dest: "node_modules/type-fest" }, + { name: "type-is", version: "2.1.0", integrity: "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", dest: "node_modules/type-is", optional: true }, + { name: "typebox", version: "1.3.27", integrity: "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA==", dest: "node_modules/typebox" }, + { name: "undici", version: "8.10.0", integrity: "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", dest: "node_modules/undici" }, + { name: "undici-types", version: "6.21.0", integrity: "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", dest: "node_modules/undici-types" }, + { name: "unicode-properties", version: "1.4.1", integrity: "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", dest: "node_modules/unicode-properties" }, + { name: "unicode-trie", version: "2.0.0", integrity: "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", dest: "node_modules/unicode-trie" }, + { name: "unicorn-magic", version: "0.3.0", integrity: "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", dest: "node_modules/unicorn-magic" }, + { name: "unpipe", version: "1.0.0", integrity: "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", dest: "node_modules/unpipe", optional: true }, + { name: "vary", version: "1.1.2", integrity: "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", dest: "node_modules/vary" }, + { name: "web-streams-polyfill", version: "3.3.3", integrity: "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", dest: "node_modules/web-streams-polyfill" }, + { name: "which", version: "2.0.2", integrity: "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", dest: "node_modules/which" }, + { name: "which-command", version: "0.1.0", integrity: "sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==", dest: "node_modules/which-command" }, + { name: "wrappy", version: "1.0.2", integrity: "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", dest: "node_modules/wrappy", optional: true }, + { name: "ws", version: "8.22.0", integrity: "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", dest: "node_modules/ws" }, + { name: "wsl-utils", version: "1.0.1", integrity: "sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==", dest: "node_modules/wsl-utils" }, + { name: "xmlchars", version: "2.2.0", integrity: "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", dest: "node_modules/xmlchars" }, + { name: "yaml", version: "2.9.1", integrity: "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", dest: "node_modules/yaml" }, + { name: "yoctocolors", version: "2.2.0", integrity: "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", dest: "node_modules/yoctocolors" }, + { name: "zod", version: "4.6.5", integrity: "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", dest: "node_modules/zod" }, + { name: "zod-to-json-schema", version: "3.25.2", integrity: "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", dest: "node_modules/zod-to-json-schema", optional: true }, +]; diff --git a/packages/agent-host/src/generated/platformPackages.ts b/packages/agent-host/src/generated/platformPackages.ts index b66ef4a2..c18debf6 100644 --- a/packages/agent-host/src/generated/platformPackages.ts +++ b/packages/agent-host/src/generated/platformPackages.ts @@ -11,6 +11,15 @@ export const PLATFORM_PACKAGES: Readonly> = { "@anthropic-ai/claude-agent-sdk-linux-x64-musl": { version: "0.3.283", integrity: "sha512-T0T8mR7MSe7bVI96tmeK7DgUy2xhG8CZD1i0nCC2C05sSmkDDn/OYgNqpGPxJbo8Ic0Psxd7TOmngQYqPKWtpA==" }, "@anthropic-ai/claude-agent-sdk-win32-arm64": { version: "0.3.283", integrity: "sha512-hZjyeIgZpALMvYq2QfyPzl4AZzOVRUoU8NOB82Z3cVXLcEvQJXJN03Hp3XNsuBq5YMUoSUJAffMannhM7UqVmg==" }, "@anthropic-ai/claude-agent-sdk-win32-x64": { version: "0.3.283", integrity: "sha512-h5eZxFxk6f1LPSuUOoBH9fslhL9ncywdZN5Qw9XmWuijHYTfevXuoza5nm6N98O+hmSykJ8NjC3/muhONDvzBg==" }, + "@deepseek-ai/libreoffice-kit-darwin-arm64": { version: "0.1.5", integrity: "sha512-SjeXmyaTevEq2TxK7reb1rhCrQZ4QOXmXt/qEwfQD5Fx3odU0ILx2uiXN+nphSCQ95LFCzrElHGgv2c7a824yg==" }, + "@deepseek-ai/libreoffice-kit-darwin-x64": { version: "0.1.5", integrity: "sha512-vuz2tTpH1Edk75+DISwg/TXdQ3BNSNSHoVnWVqxqbGMgrrK9trLOw2+0X7mjT1naGO00Zc1qkyQ4if3kx5XjqQ==" }, + "@deepseek-ai/libreoffice-kit-wasm": { version: "0.1.5", integrity: "sha512-V+pu5xJsKhVD4AU1xbFlMWY91svK9ZIC2JsNOph9kWp/arF/KQcuytt76bcbozJqPbE8o0n04lyh0m3QW5RYSA==" }, + "@deepseek-ai/libreoffice-kit-win32-arm64": { version: "0.1.5", integrity: "sha512-Av3aFfNLaVxfffu0JXP5mqfmsCU3gQtlUH9UD+zdXl8ON06ukVAmu7LqNyuKAz/68WoOMTQ+YBlVQukgDRKd/A==" }, + "@deepseek-ai/libreoffice-kit-win32-x64": { version: "0.1.5", integrity: "sha512-uKuDGZdofxuW4iRmUh8b3+XWU28JeOCYMTAONzo7tEHIq00DV2cARcgUYiTP7gUH49tH4A/RyPMOVEBzK7qjjw==" }, + "@deepseek-ai/node-addon-system-darwin-arm64": { version: "0.1.2", integrity: "sha512-IR0cx8um19mLCZaJ+H5PLblKr6Eg3PWvVo8eTQBr/SwH2nh5tM9CD9/5fHweNS9Pjt15UdFlGqnvLSd/w+O6Rw==" }, + "@deepseek-ai/node-addon-system-darwin-x64": { version: "0.1.2", integrity: "sha512-XDbmquNapk9aT28y4EKn9lbONVr9YNs1NM/GKH1Gi5gUhjOT9wgRaTv72FJdNaVIInbPAYbPoyn7/y+MzQMNNg==" }, + "@deepseek-ai/node-addon-system-linux-arm64": { version: "0.1.2", integrity: "sha512-Z/DQtqgEYzjBzb2ocHGjMzx51W7xDILkJKKj89nyErr8gZMNiLs+JNL1uKzJqc3VLZB+vYCPaHGyQ3oX6EzEmA==" }, + "@deepseek-ai/node-addon-system-linux-x64": { version: "0.1.2", integrity: "sha512-S2aPVHvYCpNCppCFyNlooMYuTB7ucK5lvD9oXQQ42v5Z2s5AoaiCdjz9r2l+ED2rI5oS1x0cUZmKjJH2dxV0pg==" }, "@esbuild/aix-ppc64": { version: "0.25.12", integrity: "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==" }, "@esbuild/android-arm": { version: "0.25.12", integrity: "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==" }, "@esbuild/android-arm64": { version: "0.25.12", integrity: "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==" }, @@ -37,6 +46,46 @@ export const PLATFORM_PACKAGES: Readonly> = { "@esbuild/win32-arm64": { version: "0.25.12", integrity: "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==" }, "@esbuild/win32-ia32": { version: "0.25.12", integrity: "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==" }, "@esbuild/win32-x64": { version: "0.25.12", integrity: "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==" }, + "@img/sharp-darwin-arm64": { version: "0.35.5", integrity: "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==" }, + "@img/sharp-darwin-x64": { version: "0.35.5", integrity: "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==" }, + "@img/sharp-freebsd-wasm32": { version: "0.35.5", integrity: "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==" }, + "@img/sharp-libvips-darwin-arm64": { version: "1.3.4", integrity: "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==" }, + "@img/sharp-libvips-darwin-x64": { version: "1.3.4", integrity: "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==" }, + "@img/sharp-libvips-linux-arm": { version: "1.3.4", integrity: "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==" }, + "@img/sharp-libvips-linux-arm64": { version: "1.3.4", integrity: "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==" }, + "@img/sharp-libvips-linux-ppc64": { version: "1.3.4", integrity: "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==" }, + "@img/sharp-libvips-linux-riscv64": { version: "1.3.4", integrity: "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==" }, + "@img/sharp-libvips-linux-s390x": { version: "1.3.4", integrity: "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==" }, + "@img/sharp-libvips-linux-x64": { version: "1.3.4", integrity: "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==" }, + "@img/sharp-libvips-linuxmusl-arm64": { version: "1.3.4", integrity: "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==" }, + "@img/sharp-libvips-linuxmusl-x64": { version: "1.3.4", integrity: "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==" }, + "@img/sharp-linux-arm": { version: "0.35.5", integrity: "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==" }, + "@img/sharp-linux-arm64": { version: "0.35.5", integrity: "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==" }, + "@img/sharp-linux-ppc64": { version: "0.35.5", integrity: "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==" }, + "@img/sharp-linux-riscv64": { version: "0.35.5", integrity: "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==" }, + "@img/sharp-linux-s390x": { version: "0.35.5", integrity: "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==" }, + "@img/sharp-linux-x64": { version: "0.35.5", integrity: "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==" }, + "@img/sharp-linuxmusl-arm64": { version: "0.35.5", integrity: "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==" }, + "@img/sharp-linuxmusl-x64": { version: "0.35.5", integrity: "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==" }, + "@img/sharp-webcontainers-wasm32": { version: "0.35.5", integrity: "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==" }, + "@img/sharp-win32-arm64": { version: "0.35.5", integrity: "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==" }, + "@img/sharp-win32-ia32": { version: "0.35.5", integrity: "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==" }, + "@img/sharp-win32-x64": { version: "0.35.5", integrity: "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==" }, + "@koromix/koffi-darwin-arm64": { version: "3.1.1", integrity: "sha512-+Dl0zQDh1Wb55AWOn9hp7K30qgkODvrvN+ZNkFOh81Q0oFX/rpJQtocgjAuYk2zFAcajSeVDumkcHMPwnKSXzA==" }, + "@koromix/koffi-darwin-x64": { version: "3.1.1", integrity: "sha512-cDFAKn1qdZBFLrp7dAc9QUDw3l4xAhTJbOdPWWb0LxssVicUdHcRCLZGrDsmPW2tpH6LGNNeLgqRpAoD2Mo8iA==" }, + "@koromix/koffi-freebsd-arm64": { version: "3.1.1", integrity: "sha512-zaP7FJISI/scQW9Wa5QicY3a09WmtKBWSbmC+5nfCqPzwWe7Hx2so74Er7mPsDfCiMMR0Ya+evKbJQDkfyXicg==" }, + "@koromix/koffi-freebsd-ia32": { version: "3.1.1", integrity: "sha512-7GejVb688TLM8rbjfc0oezJrATxZc0dn801xWEDJekN2DgmRXu7HquGqWQ6z3NeSq7ZxEggz4T3xtlbCysQapA==" }, + "@koromix/koffi-freebsd-x64": { version: "3.1.1", integrity: "sha512-XLiCFP9OFCyOoGTjAimtDKLhzhfo34WcP1ShVWxRzNCWDGjfz8BYjwd69cp/cDSUXZbxamqs4+/6vmkePq9wxA==" }, + "@koromix/koffi-linux-arm64": { version: "3.1.1", integrity: "sha512-HA9xINK7G4dRAkpfnBWD9VfuyIBgW1SuK+KPHjksUwRMOnhgqP8J/JqgrAzdzcDiefGBkqEacIP776OUwz7knQ==" }, + "@koromix/koffi-linux-ia32": { version: "3.1.1", integrity: "sha512-jG7IFytmP8K5Qtbx0ro0ZeuX3JjSsLxmYhq+nmXDdrtOAlxIsWGynuiDLS6Jk3vOchVii2m6Y2f/L3GLG2fG5A==" }, + "@koromix/koffi-linux-loong64": { version: "3.1.1", integrity: "sha512-CIsT1cNnih8FuU52Me/IVlJBpH28SQfoDeYPctJswgJzaARktusF7m4MUbtR1PBDjuquCVM4/vFyNdOzfPonvA==" }, + "@koromix/koffi-linux-riscv64": { version: "3.1.1", integrity: "sha512-9D6RmqeKsSvs3U6jILJU9PcAjMwKKyn7yLxNBb5k6z9PCoUoGJ3/BrhXAX0qjrLLwEiIpP/hS/40RuXvH8Lc3Q==" }, + "@koromix/koffi-linux-x64": { version: "3.1.1", integrity: "sha512-pyTcX5fePeYbt7TZAwRby69wdlRx3PT+g15ra5IYdat/Pgh3qAKEYeZ+uu7WpPGOy43p/oSRqqZoa2kORzozlA==" }, + "@koromix/koffi-openbsd-ia32": { version: "3.1.1", integrity: "sha512-iPnPzvG2HOfdzaiG1drdkt86sAqmTPDv9mAf+5gL7mRzkeeQC88EVGboRy7eXwdXn7R+v0ntA3iQxdHrBn6yXw==" }, + "@koromix/koffi-openbsd-x64": { version: "3.1.1", integrity: "sha512-/Xqc3R0SVoMCYjMPZnJ9bULtRo364+dKmnQhfDrI83tSpxUHRw7HRNf12vBeL+hPgKxSBjtMpWfQ/ZIyVyLFag==" }, + "@koromix/koffi-win32-arm64": { version: "3.1.1", integrity: "sha512-JhqHauEwQvdcWUERxrV5HH/DT9W7hY1A1eU6/o8tB+yck+D3kt5elpRDBt9KjpW6h+vHPy3V0sjDvO0CXyabTA==" }, + "@koromix/koffi-win32-ia32": { version: "3.1.1", integrity: "sha512-ZRuyYmlGS/rCc966qqs0qREXDW4FRdul7rDF1VgSWHbVmdc196PUgUT+blq/GjZgTwqzeEXtMRgM+cU8krHjvA==" }, + "@koromix/koffi-win32-x64": { version: "3.1.1", integrity: "sha512-KqHPmvj6QILhNyI/To8QSihHsijeVGIYYPBOUnXEpcnH2LuLbargY4Hd6dDeTN3Z90uUUxN+1FWz1UnhVzFOiA==" }, "@napi-rs/lzma-linux-x64-gnu": { version: "1.5.1", integrity: "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==" }, "@rollup/rollup-android-arm-eabi": { version: "4.62.5", integrity: "sha512-jfkGfTwhQpsiSckPF8r9bU3pn3vyd72NlWaO+TgEO6WPSDnUhXzrNYCHBMOYj0ACaUgjm6eERLF+XV9a6RstoA==" }, "@rollup/rollup-android-arm64": { version: "4.62.5", integrity: "sha512-oGVqyQlxnrz9/ty89oHpU857VUHEl5/Xu4R2lS+aivCTrNnSsbiENzTnNaBsjxH0CNWGPhzHArOLFwo+oKXveA==" }, @@ -63,7 +112,28 @@ export const PLATFORM_PACKAGES: Readonly> = { "@rollup/rollup-win32-ia32-msvc": { version: "4.62.5", integrity: "sha512-KanvAZrPKbDBFwrgiU9yEVpQoox9QPV1WZOXX7HudJQY+eSlu82CtWxDU8WtuRRvtN5EGkLczkd6Y6DTcvm9wA==" }, "@rollup/rollup-win32-x64-gnu": { version: "4.62.5", integrity: "sha512-1aC3UEWTtRl3RK3VpDJ/Tqk1XI4SLTmXIthAq6wRWo8XiSXJNd+VprJM4/1P4+i6HIaFEFlVi9sTTziniD2tOQ==" }, "@rollup/rollup-win32-x64-msvc": { version: "4.62.5", integrity: "sha512-/gDJaRs4gl0NPIwqCz+6PkpmhhjRAD2j6P4rSNHBzUkO3naEx2mIU0pRle1vUNRQ7mE/+8OOeXLTv/J56FKiQg==" }, + "@vscode/ripgrep-darwin-arm64": { version: "1.18.0", integrity: "sha512-r3ktHSvbFycQNF6sl7sNDPocpsI7J+mEzh1IaZFkY0spm3k2Z9t8hPAeOK7+p0l6p6/swkQC14XWX01low+94Q==" }, + "@vscode/ripgrep-darwin-x64": { version: "1.18.0", integrity: "sha512-25b4gWbL138dGuQU244ebCKKc0q05ULBMoFSz9oAEUHNeqK/lOJViDS7DRvbDazzAzSEdan391Znks/R5mkaTQ==" }, + "@vscode/ripgrep-linux-arm": { version: "1.18.0", integrity: "sha512-GDAvufNDHu8zqLEmXstalQF0Wh6wQvdsBi/Vg3Yi3CK4a8XoFXqqXVEHEZ9xQz3t0NfoSEc9JbvK9DDS6FxyxQ==" }, + "@vscode/ripgrep-linux-arm64": { version: "1.18.0", integrity: "sha512-lQ/5zTG++U0E3IhVgS4EPTTn/U4okncaRMM5GOFfOYZywS4nuD31GhkHbNYlDk5CuDC68+hYJ0/eQeyCKJDA+g==" }, + "@vscode/ripgrep-linux-ia32": { version: "1.18.0", integrity: "sha512-YWLkSUtFd4Jh5EepIhA9RJSfv3uMAVMo+2rBIGHPBnvgLrZciIs2cDKei1/p6Wc/aCzUoHyMAg2R6tw4ZCBKGg==" }, + "@vscode/ripgrep-linux-ppc64": { version: "1.18.0", integrity: "sha512-quXVY8fwQ8O/lvU1yrSqSl3jlUzysRSb+AfUfCL/tRtphxsKlFvPAejryZ6vg4Bgvn8XL74xb4qMCDmWgYrT5w==" }, + "@vscode/ripgrep-linux-riscv64": { version: "1.18.0", integrity: "sha512-f5kBQBrWfQt8Q7OhSORuNDei5dkYagBj3y4jImSUXGMy8B/Ke7SltSRcUtjPv166FAFfHCAmWuZp3+cWnX2/Vw==" }, + "@vscode/ripgrep-linux-s390x": { version: "1.18.0", integrity: "sha512-rTOcJFGGcl2c07RUOWUo4U1ndnemKhY6A9hnMB18uk7jSgJc0d/QLBGWMWpumdtoJtpizn/wIv5mXIisJukusQ==" }, + "@vscode/ripgrep-linux-x64": { version: "1.18.0", integrity: "sha512-mQ3bVrUpnD2vs7QT0vX90Lt0cnUq467uFtEktIdsJJmW296RoSULRGqWgzG1AKxyBpNDD6l4ZO4qKf6SgyC23Q==" }, + "@vscode/ripgrep-win32-arm64": { version: "1.18.0", integrity: "sha512-vfTIjq1OHnzUjxZcHVQAMbnggp8dpGf+0QKFOZHwWPqFwXxQC8eCWM+5NUdoJ6yrElCeMzoUTXoK/LdZaniB+Q==" }, + "@vscode/ripgrep-win32-ia32": { version: "1.18.0", integrity: "sha512-//rfAE+BOw5AC2EMmepmiE36jUuevtQYNQqqlw1s3m9FlRxjxEut97RkRPHAu9BG4mSojatZx+kXZXNdyI9caQ==" }, + "@vscode/ripgrep-win32-x64": { version: "1.18.0", integrity: "sha512-KNPvtElldqILHdnAetujPaowkNbpqJy3ssIGGN6F6Kve9Qi+nNLI2DN01O83JjCEVQbCzl8Ov3QZ9Eov3BR8Dg==" }, "fsevents": { version: "2.3.3", integrity: "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" }, + "node-addon-require-builtin-darwin-arm64": { version: "0.1.7", integrity: "sha512-3n5SgmD6S4lCyeFPumbwfUh+YLssWiSF8GuToHdr00hBPhDikyzHCy2UV5qJUTDNNtUpfw9QuFijsC+ulnvmog==" }, + "node-addon-require-builtin-darwin-x64": { version: "0.1.7", integrity: "sha512-ZelNDiBgGH//ZHw6FCv4VdWUxV2YwdZNa0za7nOJIYodGcow0rJX6san45iOI73/gd2qtyKBOrHgylDjnBblbg==" }, + "node-addon-require-builtin-linux-arm64-gnu": { version: "0.1.7", integrity: "sha512-osAdFdxBUeciYOAIMxxIZzVyPK73zex7xJvSAyfDPyY8cTxhGZVZGQnB0ZtZEy3TRQQ2psjWhu5HbcHXIXotXw==" }, + "node-addon-require-builtin-linux-arm64-musl": { version: "0.1.7", integrity: "sha512-pN027xk8o64/i1evlncK3VoPGdnflHzMgD+MQ+vApMpu2U6XKc9KAqKiImTpMd+mtGxElkkhD/AXNybF0MscZw==" }, + "node-addon-require-builtin-linux-x64-gnu": { version: "0.1.7", integrity: "sha512-HedJA3MGD7I3rH/mPuPIaGTTtSm61L5uHv/90xHPy0tHGlP5cxC9Dt9l/5iwIrTE04LrT0woiG8Ef2Eg2sRyuA==" }, + "node-addon-require-builtin-linux-x64-musl": { version: "0.1.7", integrity: "sha512-4SkkvMTQqwFRkNzWp8Jc+1e/wMzA893YYX6lhRFFXWcb+igpXq/KD92JEWI0RHr9rrQkwF51/9odyt0Jk9WnDA==" }, + "node-addon-require-builtin-win32-arm64-msvc": { version: "0.1.7", integrity: "sha512-nooBYRrieUMClXU3HBM+9yfOEXC0EJS3kFGJzu7oXocOgADKmAwt3xpF3YunjnyN9bty9/QaoZRlHG5EBX4Usg==" }, + "node-addon-require-builtin-win32-ia32-msvc": { version: "0.1.7", integrity: "sha512-i3/cymlUwzReJTtFLC75m+Gabi1RWa4ym4KgVThGLySy4/EJ0QldTv5VWHg3i7HP/g8gIWXwFrxTFk5v2DGchA==" }, + "node-addon-require-builtin-win32-x64-msvc": { version: "0.1.7", integrity: "sha512-iwYELawC0J+nKFTIfJumU53VzTVDshSFUZCU6oUb4Uw+JAfsXCCA2WaSQbtmHng6ub0HEFqWgfh/Wp+qsEVtNg==" }, "opencode-ai": { version: "1.18.32", integrity: "sha512-SCrZWdq44y/EoH2+fE4HLcXS+DzpVqHPzmXk3p2RrufYy8LWvpfhRhKtijb5ktvx8r94ScqToqwHxR0BwS65OQ==" }, "opencode-darwin-arm64": { version: "1.18.32", integrity: "sha512-sDsHk/A6FNqeN5NuAiII6AAhi4pJIFcIY0S2yjG9gToIIVaqrQRaHQ6g0kpoVqTiMci8tvaND6tWD4eDT3ahFw==" }, "opencode-darwin-x64": { version: "1.18.32", integrity: "sha512-ZO/4GTJV/q2jlZ8apN1OfgTdD4m9bkdgLsEWYYDK6O8eTljIFgwhRMrJw1ozucU/D6lLQsA3CX/sS56UtlsTjQ==" }, @@ -77,4 +147,10 @@ export const PLATFORM_PACKAGES: Readonly> = { "opencode-windows-arm64": { version: "1.18.32", integrity: "sha512-AFXHn/kYnbsR/5N7Bm5ysv1vjDkQMaJQxPxJeF1OgGoQV48yBXPLIzhTijbt6IsipNBQxdb6xC0yANefpDSD9Q==" }, "opencode-windows-x64": { version: "1.18.32", integrity: "sha512-9uy0owugtP9nkuylzN9+O9zWUIxt4X+KYwsREVk4G27PCfxccj+xIT7yxO9hCVtrF+DVgiJ59xDpiANE9UZrrQ==" }, "opencode-windows-x64-baseline": { version: "1.18.32", integrity: "sha512-pXhJumlv2/g/ubgbfW5VtCnLEfdXw2RZO0j1uVhYVtCCYNjioJUPeLT1oMRF06VbkCo1UuLRfwEFqeFXD59N+A==" }, + "sherpa-onnx-darwin-arm64": { version: "1.13.8", integrity: "sha512-FPNgJMgnWVl/KhRTIhG3KL3A4Om63Rn4YKXc9/uHY7SzLcvqLJLc/h7UBWJwduXvv7K18t5NpxHR6XgXn4sjWw==" }, + "sherpa-onnx-darwin-x64": { version: "1.13.8", integrity: "sha512-7BLRpjM6w4f9W46/nmkmq8lEKUayhebvcpslCVQ+6QN2uReYlZEMDZlSpXMjme+hUFrPfRz8P3UNq8ep/4d19g==" }, + "sherpa-onnx-linux-arm64": { version: "1.13.8", integrity: "sha512-Tlg7a70b/Wge3OF8IgTHF9jhSVCsLyKQKhwc4BsJ5A+dL/SrFtGBjzuHp4XeLhiiOT7afCxX5PdSn/D4c8Lnuw==" }, + "sherpa-onnx-linux-x64": { version: "1.13.8", integrity: "sha512-6plnhjagsSeTntCgnlag86hWbs/uZE9Crms1LgOb68/1nKsIQjMd+WG519m+aPwT6TrsBOiEMzrx41t8sL5L5g==" }, + "sherpa-onnx-win-ia32": { version: "1.13.8", integrity: "sha512-H0Ojln9hfvM+pxWqW0cnjB/XK8/JPq4/k0IWu2JpY5Z458M3zv+XC3Hu+wmot3AoH/K1Bgt23n/tTKtPV9x8qg==" }, + "sherpa-onnx-win-x64": { version: "1.13.8", integrity: "sha512-oZF1c9VPOKtMwn83Bboc5XSWL+76BRoyB3eUuVnCknBKxwSULZU2Foia9VHWzU+n4I12rPsP6z6H9Rp1hD9o8g==" }, }; diff --git a/packages/agent-host/src/lockfilePins.ts b/packages/agent-host/src/lockfilePins.ts index b0f85fbc..a2863e4b 100644 --- a/packages/agent-host/src/lockfilePins.ts +++ b/packages/agent-host/src/lockfilePins.ts @@ -1,54 +1,248 @@ /** - * The exact version and sha512 of every platform-specific package in - * pnpm-lock.yaml — the packages a driver may download on demand instead of - * the release archives shipping them (see agentInstall.ts). A package is - * platform-specific when its lockfile entry declares `os` or `cpu`; the - * lockfile lists those for every platform, installed here or not. + * The exact version and sha512 of every package pnpm-lock.yaml pins for the + * agents the host runs — the packages a driver may download on demand + * instead of the release archives shipping them (see agentInstall.ts). * - * The result is checked in as src/generated/platformPackages.ts so the built - * host carries the pins without the lockfile; a test regenerates it and - * fails on drift. + * Two shapes are generated: + * + * - platform packages: the lockfile entries that declare `os` or `cpu` + * (a CLI's per-platform binary). Collected wholesale, whatever the + * platform — the driver picks its own entry at run time. + * - a package tree: the full dependency closure of one root package (the + * DeepSeek Harness runtime, a pure-JS CLI whose ~90 packages must all be + * present for it to boot). Each entry names the node_modules/ spot it + * occupies, so a package the closure needs at two versions still + * resolves the way pnpm resolved it (one variant at the root, the other + * nested under its consumer). Platform-gated entries (a wasm fallback, a + * darwin-only binary) stay in the pins with their gates; the installer + * skips the ones that do not match the machine it runs on. + * + * The results are checked in as src/generated/*.ts so the built host carries + * the pins without the lockfile; a test regenerates them and fails on drift. */ +import { load } from 'js-yaml'; export interface PackagePin { version: string; integrity: string; } -/** Read the pins out of a pnpm-lock.yaml (lockfile format 9). */ -export function platformPackages(lockfile: string): Record { - const lines = lockfile.split(/\r?\n/); - const start = lines.indexOf('packages:'); - if (start < 0) throw new Error('pnpm-lock.yaml has no packages section'); +/** One package of an installable dependency tree, at the spot it must be + * laid down for Node to resolve it the way pnpm resolved the lockfile. */ +export interface TreePackageEntry { + name: string; + version: string; + integrity: string; + /** Install path under the tree's node_modules/, `/`-separated. A package + * the closure needs at two versions lives once at the root (the variant + * required paths reach) and nested under each parent that needs the + * other — Node then resolves each consumer's version, as pnpm did. */ + dest: string; + /** Reached only through optionalDependencies: skipped when its platform + * gates do not match, and not fatal when it cannot be fetched. */ + optional?: boolean; + os?: string[]; + cpu?: string[]; + libc?: string[]; +} + +interface LockfileEntry { + version?: string; + resolution?: { integrity?: unknown }; + dependencies?: Record; + optionalDependencies?: Record; + os?: unknown; + cpu?: unknown; + libc?: unknown; +} + +interface Lockfile { + importers?: Record; devDependencies?: Record }>; + packages?: Record; + snapshots?: Record; +} + +/** Parse pnpm-lock.yaml (format 9). Throws on anything but a document. */ +function parseLockfile(lockfile: string): Lockfile { + const doc = load(lockfile); + if (!doc || typeof doc !== 'object') throw new Error('pnpm-lock.yaml is not a YAML document'); + return doc as Lockfile; +} + +function stringArray(value: unknown): string[] | undefined { + if (!Array.isArray(value) || value.length === 0) return undefined; + const items = value.filter((v): v is string => typeof v === 'string'); + return items.length === value.length ? items : undefined; +} + +/** `name@version`, possibly with pnpm's trailing `(peer@…)…` resolution + * suffix — never part of the identity we resolve by. */ +function stripPeerSuffix(id: string): string { + const cut = id.indexOf('('); + return cut < 0 ? id : id.slice(0, cut); +} +/** A lockfile key `name@spec` split at the last `@` (a scoped name carries + * its own; the spec never does). */ +function splitKey(key: string): { name: string; spec: string } { + const at = key.lastIndexOf('@'); + if (at <= 0) throw new Error(`pnpm-lock.yaml entry '${key}' is not name@spec`); + return { name: key.slice(0, at), spec: key.slice(at + 1) }; +} + +/** Read the pins out of a pnpm-lock.yaml (lockfile format 9): exactly the + * entries that declare `os` or `cpu`. Two versions of one name is an error + * — a driver could not tell them apart. */ +export function platformPackages(lockfile: string): Record { + const packages = parseLockfile(lockfile).packages ?? {}; const pins: Record = {}; - let entry: { name: string; version: string; integrity?: string; platform: boolean } | null = null; - const flush = (): void => { - if (!entry?.platform || !entry.integrity) return; - const previous = pins[entry.name]; - if (previous && previous.version !== entry.version) { - throw new Error(`pnpm-lock.yaml holds two versions of ${entry.name} (${previous.version}, ${entry.version})`); + for (const [key, entry] of Object.entries(packages)) { + if (!entry.os && !entry.cpu) continue; + const { name, spec } = splitKey(stripPeerSuffix(key)); + const integrity = typeof entry.resolution?.integrity === 'string' ? entry.resolution.integrity : undefined; + if (!integrity) continue; + const version = entry.version ?? spec; + const previous = pins[name]; + if (previous && previous.version !== version) { + throw new Error(`pnpm-lock.yaml holds two versions of ${name} (${previous.version}, ${version})`); } - pins[entry.name] = { version: entry.version, integrity: entry.integrity }; + pins[name] = { version, integrity }; + } + return pins; +} + +/** + * The dependency closure of `root` as pinned for one importer, every entry + * at its exact resolved version and sha512 with the node_modules/ spot it + * must occupy. Walks the `snapshots:` graph (where format 9 records resolved + * dependency versions, with peer-suffix ids) and falls back to a package's + * own entry when it has no snapshot. + * + * A name the closure needs at two versions is laid out the way npm itself + * does it: one variant at the root (preferring a variant required paths + * reach, so it is never skippable while something needs it), the others + * nested under each parent that requires them. Fails loudly on anything it + * cannot place: a snapshot id ambiguous across peer contexts, a dependency + * with no pinned entry, or a pathological graph. + */ +export function packageTree(lockfile: string, importer: string, root: string): TreePackageEntry[] { + const doc = parseLockfile(lockfile); + const packages = doc.packages ?? {}; + const snapshots = doc.snapshots ?? {}; + + const rootDep = doc.importers?.[importer]?.devDependencies?.[root] ?? doc.importers?.[importer]?.dependencies?.[root]; + const rootVersion = typeof rootDep?.version === 'string' ? stripPeerSuffix(rootDep.version) : undefined; + if (!rootVersion) throw new Error(`pnpm-lock.yaml does not pin ${root} for the ${importer} importer`); + + /** The lockfile's view of one resolved package: its metadata entry plus + * the dependency graph format 9 records in `snapshots:` once any peer is + * involved (a package's own entry otherwise). */ + const resolve = (name: string, spec: string): LockfileEntry => { + const key = `${name}@${spec}`; + const entry = packages[key]; + if (!entry || typeof entry.resolution?.integrity !== 'string') { + throw new Error(`pnpm-lock.yaml has no pinned entry for ${key}`); + } + // Two snapshots of one base key mean two peer contexts resolved it + // differently; a flat tree serves one, so refuse to guess. + const variants = Object.keys(snapshots).filter((k) => k === key || k.startsWith(`${key}(`)); + if (variants.length > 1) { + throw new Error(`pnpm-lock.yaml holds ${variants.length} peer resolutions of ${key}; the tree installer serves one`); + } + return variants.length === 1 ? snapshots[variants[0]!]! : entry; }; - for (const line of lines.slice(start + 1)) { - if (/^\S/.test(line)) break; // the next top-level section - const key = /^ {2}'?([^\s']+)'?:\s*$/.exec(line); - if (key?.[1]) { - flush(); - const id = key[1]; - const at = id.lastIndexOf('@'); - entry = { name: id.slice(0, at), version: id.slice(at + 1), platform: false }; - continue; + /** Walk the graph from the root, recording for every node key + * (`name@spec`) the parent nodes an edge into it comes from. With + * optional edges followed: every consumer (that is where a nested + * variant lives). Without them: the required-edge parents, whose absence + * for a reached node marks the package optional. */ + const walk = (withOptional: boolean): Map> => { + const parents = new Map>(); + const visited = new Set(); + const stack: Array<[string, string]> = [[root, rootVersion]]; + while (stack.length > 0) { + const [name, spec] = stack.pop()!; + const key = `${name}@${spec}`; + if (!parents.has(key)) parents.set(key, new Set()); + if (visited.has(key)) continue; + visited.add(key); + const graph = resolve(name, spec); + const edges = withOptional ? { ...graph.dependencies, ...graph.optionalDependencies } : graph.dependencies; + for (const [dep, id] of Object.entries(edges ?? {})) { + const depSpec = stripPeerSuffix(id); + const depKey = `${dep}@${depSpec}`; + let set = parents.get(depKey); + if (!set) { + set = new Set(); + parents.set(depKey, set); + } + set.add(key); + stack.push([dep, depSpec]); + } } - if (!entry) continue; - const integrity = /^ {4}resolution: \{integrity: ([^\s,}]+)/.exec(line); - if (integrity?.[1]) entry.integrity = integrity[1]; - if (/^ {4}(os|cpu): /.test(line)) entry.platform = true; + return parents; + }; + + const reachable = walk(true); + const requiredParents = walk(false); + + /** The one spec of each name that sits at the root of node_modules: a + * variant required paths reach when there is one (never skippable while + * something needs it), else the first sorted — deterministic either way. */ + const flatSpec = new Map(); + const byName = new Map(); + for (const key of reachable.keys()) { + const at = key.lastIndexOf('@'); + const name = key.slice(0, at); + byName.set(name, [...(byName.get(name) ?? []), key.slice(at + 1)]); } - flush(); - return pins; + for (const [name, specs] of byName) { + const sorted = [...specs].sort(); + flatSpec.set(name, sorted.find((spec) => requiredParents.has(`${name}@${spec}`)) ?? sorted[0]!); + } + + /** Every install path a node occupies: the root slot for the flat variant, + * else nested under each parent — itself at every path the parent takes. */ + const locations = (key: string, seen = new Set()): string[] => { + if (seen.has(key)) throw new Error(`pnpm-lock.yaml has a dependency cycle through ${key}`); + seen.add(key); + const at = key.lastIndexOf('@'); + const name = key.slice(0, at); + if (flatSpec.get(name) === key.slice(at + 1)) return [`node_modules/${name}`]; + const spots: string[] = []; + for (const parent of reachable.get(key) ?? []) { + for (const spot of locations(parent, new Set(seen))) spots.push(`${spot}/node_modules/${name}`); + } + return [...new Set(spots)]; + }; + + const entries: TreePackageEntry[] = []; + for (const key of reachable.keys()) { + const at = key.lastIndexOf('@'); + const name = key.slice(0, at); + const spec = key.slice(at + 1); + const meta = packages[key]!; + const os = stringArray(meta.os); + const cpu = stringArray(meta.cpu); + const libc = stringArray(meta.libc); + for (const dest of locations(key)) { + entries.push({ + name, + version: meta.version ?? spec, + integrity: meta.resolution!.integrity as string, + dest, + ...(key !== `${root}@${rootVersion}` && !requiredParents.has(key) ? { optional: true } : {}), + ...(os ? { os } : {}), + ...(cpu ? { cpu } : {}), + ...(libc ? { libc } : {}), + }); + } + } + if (entries.length > 2000) { + throw new Error(`the closure of ${root} places ${entries.length} packages; refusing a tree this pathological`); + } + return entries.sort((a, b) => (a.dest < b.dest ? -1 : a.dest > b.dest ? 1 : 0)); } /** The generated module's source for `pins`. */ @@ -70,3 +264,30 @@ export function renderPlatformPackages(pins: Record): string '', ].join('\n'); } + +/** The generated module's source for the DeepSeek Harness runtime tree. */ +export function renderDshPackages(entries: TreePackageEntry[]): string { + const rows = entries.map((entry) => { + const fields = [ + `name: ${JSON.stringify(entry.name)}`, + `version: ${JSON.stringify(entry.version)}`, + `integrity: ${JSON.stringify(entry.integrity)}`, + `dest: ${JSON.stringify(entry.dest)}`, + ...(entry.optional ? ['optional: true'] : []), + ...(entry.os ? [`os: ${JSON.stringify(entry.os)}`] : []), + ...(entry.cpu ? [`cpu: ${JSON.stringify(entry.cpu)}`] : []), + ...(entry.libc ? [`libc: ${JSON.stringify(entry.libc)}`] : []), + ]; + return ` { ${fields.join(', ')} },`; + }); + return [ + '// Generated from pnpm-lock.yaml by src/lockfilePins.ts — do not edit.', + "// Regenerate with this package's `gen:platform-packages` script.", + "import type { TreePackageEntry } from '../lockfilePins';", + '', + 'export const DSH_PACKAGES: readonly TreePackageEntry[] = [', + ...rows, + '];', + '', + ].join('\n'); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e2810ad..13513d28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.3.283 - version: 0.3.283(@anthropic-ai/sdk@0.120.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5))(zod@4.6.5) + version: 0.3.283(@anthropic-ai/sdk@0.124.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5))(zod@4.6.5) '@opencode-ai/sdk': specifier: ^1.18.32 version: 1.18.32 @@ -20,12 +20,24 @@ importers: specifier: ^4.6.5 version: 4.6.5 devDependencies: + '@agentclientprotocol/sdk': + specifier: ^1.7.0 + version: 1.7.0(zod@4.6.5) + '@deepseek-ai/dsh': + specifier: 0.2.0-rc.2 + version: 0.2.0-rc.2(0f1e5c6ba2281237b4c3df3d203ea37c) + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 '@types/node': specifier: ^22.10.0 version: 22.20.1 esbuild: specifier: ^0.25.0 version: 0.25.12 + js-yaml: + specifier: ^4.2.0 + version: 4.3.2 opencode-ai: specifier: 1.18.32 version: 1.18.32 @@ -34,10 +46,20 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.0 - version: 3.2.7(@types/debug@4.1.13)(@types/node@22.20.1)(jsdom@30.0.1(@noble/hashes@2.0.1)) + version: 3.2.7(@types/debug@4.1.13)(@types/node@22.20.1)(jsdom@30.0.1(@noble/hashes@2.0.1))(yaml@2.9.1) packages: + '@agentclientprotocol/sdk@1.4.0': + resolution: {integrity: sha512-/eufudw+aFY1LKLolT6yFE6UMmYRl7fMJ/DEONSIyR6wI3slHWITBsANRGqXEY8FRzqUxwh7QEaGiZHcJPVThg==} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + '@agentclientprotocol/sdk@1.7.0': + resolution: {integrity: sha512-ZORuxsuEnLjRly7t6Ad7zAsWitjWsyprswyPUHz/yycPb+tTm3DGa8XheaHhRXqX8LS9snuxaYavXSRA50TlHw==} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.283': resolution: {integrity: sha512-UQkROekjufppyB/qrsrU81sM0fcYNWJBEITrGp7NLbOocJZBUR+uVMIx/UHVpe6j81trXPIeRWyfJWgZI17Kxg==} cpu: [arm64] @@ -86,8 +108,8 @@ packages: '@modelcontextprotocol/sdk': ^1.29.0 zod: ^4.0.0 - '@anthropic-ai/sdk@0.120.0': - resolution: {integrity: sha512-ZlvmNFT/iIF6JD13rxbbMWD8nvGR0RaUp6yMQnoc+4Af0YjVVe/bIdW1XSQQsoxXAtg1NaT6Vak0LKFlJ4d37Q==} + '@anthropic-ai/sdk@0.124.0': + resolution: {integrity: sha512-cN5O8i9UVxHeOQAzj/XjshWXG8KiibJDw9OGpH2Z/eR3n/RBxdoLxDJOcfqAJWvjaMDFfHTBADU04hWRJVkDyA==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -103,6 +125,94 @@ packages: resolution: {integrity: sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==} engines: {node: ^22.13.0 || >=24.0.0} + '@aws-sdk/client-bedrock-runtime@3.1127.0': + resolution: {integrity: sha512-IDl/lrPb90aH+pZFHGNDmgH9nAUQj5PlZH1sJ3w7RikctyjHSnY3oNjZhrLoaBoQn/rNK0zsP6OHEqEhj2tdLA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.978.1': + resolution: {integrity: sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.72': + resolution: {integrity: sha512-xTKO/FWJPozTIXbozVnVGoNBhaGba8TBcx+KyUjRVeOlXE+dUc7GTR1cLvu0uTdIdmemzaFbqqCshXeZA1fZew==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.74': + resolution: {integrity: sha512-u91E/hT8f4d1xy0Jl7VG4nVKJ3lxbrZkoBTeSVoJdWBiSEUMwMS/9+e0H/aJVQV//Lt5wuzP+E69v4aRSsNTmw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.973.17': + resolution: {integrity: sha512-ged4KXdBkvIC81bLvNHHuQKdKak/VXhQTR1NWYTTqW0474nlmsxy9O/vlgTIohDDWH3xpBdtVMZRyjb+DnocDA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.79': + resolution: {integrity: sha512-L+Z85anONJd8MaiuraO4wRxATCdEejBZ3K3eymzWI5JPXa9sOS9CkIm72PBKqXKX+Z9p9NGMX5AIMXm0LEflgw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.84': + resolution: {integrity: sha512-oHt854odINVwzwsh+c5x69j0ajm4DbqqqVJ+O1ECsCIZeMDAbzFpXItaqP7UZstJj/ATdTk/KFSH0LaNAgV+kA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.72': + resolution: {integrity: sha512-rLIp2xbMjX/k9/od7APpqq1ZgXXnV0pOL1Th3ZsL8Wu0TRtBsDTVS8iPqcfRFcHakFxPvR04OSTv2ka2qOb/2A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.973.16': + resolution: {integrity: sha512-IGihaJfFZYacJJr/odqILCoK7W/mvrZ7cuK7ECn3sAu4vLC6u0V8bS7mCGbdugJ8Aum2tnvqmx0F2MRFp2rn9g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.78': + resolution: {integrity: sha512-/y9WvNtlcPBGLR0qc1a+9J/xtYZfVczvLUOuXaVWylzttH7ewsxwHtjmiJSolNrVSDorIxHGHMU61CbonRkmwA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/eventstream-handler-node@3.972.35': + resolution: {integrity: sha512-a8xilRoRaalvSPZdfrs0VY3/BPc0uYhXW56Z/k6nmZ5Vk430LHeowf9APIPq8utM3tMJSNGSSuJMlB9YrPsN+A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-eventstream@3.972.30': + resolution: {integrity: sha512-B6gvZlcnRBNWraKgyEjKsbhv+VjtbyHmpU7hmtTHzXpDSxHPpCJnYLpglEOOsF+SFne20DbZC5IVC1aNr2Pb4A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-websocket@3.972.54': + resolution: {integrity: sha512-bhESdru8u8KosziH8jcVta/NM/dNreeRz2+2aU86si5bfBYOiJ6IiqD+9U4URUcU5WJO3Yw+jO3GLDIHlscXMQ==} + engines: {node: '>= 14.0.0'} + + '@aws-sdk/nested-clients@3.997.46': + resolution: {integrity: sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.996.47': + resolution: {integrity: sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.1127.0': + resolution: {integrity: sha512-Dv2TMWBshJ+tF6ahs2Sy5bh4Iabsd4GAQqVvE9XZmYmnoaVbpS2QKIKE/HRacc7bTtbjEEvP+laGzHvHlf1CiQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.1138.0': + resolution: {integrity: sha512-GpyAr0DD63YOEmYFM6Df+gJuIgC92MMTiBK4FTKfxii5MJ9ge20epR7LyroulscYlG89J+ZB2ivFDPjvfQhzdw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.974.6': + resolution: {integrity: sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/xml-builder@3.972.41': + resolution: {integrity: sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.3.0': + resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} + engines: {node: '>=18.0.0'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} @@ -147,1221 +257,8066 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@deepseek-ai/cordis-plugin-group@1.0.4': + resolution: {integrity: sha512-/7tuY5pMQetHava4v6QUeOa4CwZA+mleNvbIoj+iqEmzkYUtlXbLqhzJIcbnDa/Hxgr1jaCwROrI77nuLyeCFg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] + '@deepseek-ai/cordis-plugin-include@1.0.9': + resolution: {integrity: sha512-Xmekm7u5Kpeym6nABL4T1/Mg6aQYFZxsipB0WycmCctvX1DqAv8nCFwRmg2XMx/f7EbZgNEbXQwJfabcMu8zxQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] + '@deepseek-ai/cordis-plugin-loader@1.0.5': + resolution: {integrity: sha512-200huL2ttWcjyeYllvPYn+qMR7I89qy8MhZasbHltPzB/KMrSfsyoCYKdCGc5KqPGj5iJugcmibQzjINMO9I+Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + node-addon-require-builtin: ^0.1.6 + peerDependenciesMeta: + node-addon-require-builtin: + optional: true - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] + '@deepseek-ai/cordis-plugin-timer@1.1.6': + resolution: {integrity: sha512-/nZC7G637LIDF8G+lhF4OSXl1uFRuNAZqv1x11CDGLSjUpmIayePfzABEGTDEKAY+IBivg2DIXBr/sjjaLZxqg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + '@deepseek-ai/cordis@4.0.4': + resolution: {integrity: sha512-obgyxqWAmFn3Re8kvsuUnyW+ihrz6eJCnJO4fh1cQzDtmPYz/zzVeUkH9R94I0OwSVOocK67Kgakm04j/oQXzg==} + hasBin: true + peerDependencies: + '@deepseek-ai/cordis-plugin-include': ~1.0.9 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-include': + optional: true + '@deepseek-ai/cordis-plugin-loader': + optional: true - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] + '@deepseek-ai/cosmokit@1.8.5': + resolution: {integrity: sha512-LXsrlem9z8dq4sLflj2yuCuYX7KqhdzF5hZly3eZyuTo8d6oDSOXuEgC5DbQWKW+lksm6zmOutQLsP/ma6wR6A==} - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + '@deepseek-ai/dsh-acp-app@0.2.0-rc.2': + resolution: {integrity: sha512-4eL+Cj/kGKvf1VSEE8NFmrh+uELCUUAFesaFh0NMTxUWO9HP8f71qjkWvNl2tUcNCP9DiIxSzNTmV1PPCZ0ovw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + '@deepseek-ai/dsh-acp@0.2.0-rc.2': + resolution: {integrity: sha512-UbejJaK2DycmUbIw+N3LCdcENeD7I3fgs5xvieHQNUjEK4PKnmv8Z2em+74FG2ltKZs9l77PL3AWO0d4KcfPJg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-mcp-client': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-token-meter': + optional: true - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + '@deepseek-ai/dsh-agent-default-model@0.2.0-rc.2': + resolution: {integrity: sha512-m0obV++p2V7nJp0X/04VntPisDUcNQfuyV+AuG9XhUxdm3tvFvBtY6wgNjAcqE2GMLwFVnZovCnO7GqnhBbB8A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@deepseek-ai/dsh-agent-instructions@0.2.0-rc.2': + resolution: {integrity: sha512-jasnwitU5efx5WT8X0OBapbdfssUdo+YpK7aquN7tSItCgVodN5RmGjm83zNw9awvlXjVlt7QMYeRcFUfZrZ6Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-agent-loop@0.2.0-rc.2': + resolution: {integrity: sha512-Ayi1L7s1LIJAq3iCCRFDCGM9Y2lriGlV6nblIYXhKrq+J8bUFQtOdfBYNE1N39WcYb3CwSvTNHDtzZ4oW6MZ6A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2': + resolution: {integrity: sha512-Awdhxsnm85ZrQASUc/fLpBHnggAnI2ar7RIJL++Lcy04Hx9q/INqJlFfCKVL68ugZGh14iJNy5/OM+ZfcmbjUw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-include': ~1.0.9 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-settings': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-agent-preset@0.2.0-rc.2': + resolution: {integrity: sha512-hrRWLO0ow0lVWqDL0nWPPZqsjUR+J05JgDoTuz1qJrpvGbXMykayOx+ZkKWy64ErkqW2pMIgT4JGYeOPoH7kmA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2 - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] + '@deepseek-ai/dsh-agent-tool-presentation@0.2.0-rc.2': + resolution: {integrity: sha512-TDoipfVMvuuwZglKn8eW3oVCRcMb10A1SPgj8xn753F6IWo4sDnlQ5I3/+xZ5lNfWowKJcQlBCobokHSAs/TIg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] + '@deepseek-ai/dsh-agent@0.2.0-rc.2': + resolution: {integrity: sha512-CUkbU+c1G0ETXkpoLkpAFo5midz66FQGtlgQOP9pzvU9H3zJQVl4H5LrhhGVbEXKLFgdbtQiOynEW8hpWn3y0Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2 + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-workspace': + optional: true - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] + '@deepseek-ai/dsh-anonymous-user-id@0.2.0-rc.2': + resolution: {integrity: sha512-/VDAUjcv/xj+iPDrTTt6rC/+jo8r/H8WXEQPmjbB8W9q/cDnlp3KzM87Dy/6jT085G7a3BjsXTk0K6Bol0AcTg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] + '@deepseek-ai/dsh-api-account-controller@0.2.0-rc.2': + resolution: {integrity: sha512-auwEoRLEBcWbtdxpEoeQjeQ72dk9igh/fNJHEVPbmDLK7oXR+Yxn+hTxoT3v4IsLfQjKKljeEN4zz6aNgdbqjw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] + '@deepseek-ai/dsh-api-gateway@0.2.0-rc.2': + resolution: {integrity: sha512-syeclzuoVpGor6JyDHcxg2Iwy9oeM76y4dK8abY19x1s/eMgJMCO3kL/IeKPg+d0Go7aHPTEyWRvCmfkA35U1g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2 - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] + '@deepseek-ai/dsh-api-job-controller@0.2.0-rc.2': + resolution: {integrity: sha512-AAAi3SaeLUHyz/qbY5iiGnU9T+d44z82b5oyQaf6HdU8tnHe7dJsO/y2YRRB52AuS+KWpXpwka1qW5XT8/9N6g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-api-remotes@0.2.0-rc.2': + resolution: {integrity: sha512-mfDctTtpM26rS5O0upviPofuyiiNCkaSgRifc5wgaCiBPJ5rG1FE2lxMQSfUiBASs7s+xXR5JVZlDrrZCzYTLg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + '@deepseek-ai/dsh-api-session-controller@0.2.0-rc.2': + resolution: {integrity: sha512-WDmk1aWOHbzIKRRt7rtHDxSupw/XLB+BgMyKHlzB7QGinXrK/Dnht6JIdgE1iSShnf1RNANGAGh2G94VzDpl5Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-default-model': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2 + '@deepseek-ai/dsh-api-gateway': 0.2.0-rc.2 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-file-upload': 0.2.0-rc.2 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-file-reference': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-native-command': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection-cache': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2 + '@deepseek-ai/dsh-settings': 0.2.0-rc.2 + '@deepseek-ai/dsh-skill': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-registry': 0.2.0-rc.2 + '@deepseek-ai/dsh-util-time': 0.2.0-rc.2 + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2 + '@deepseek-ai/dsh-util-workspace-path': 0.2.0-rc.2 + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-session-persistence': + optional: true + '@deepseek-ai/dsh-session-projection-cache': + optional: true + '@deepseek-ai/dsh-settings': + optional: true - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + '@deepseek-ai/dsh-api-settings-controller@0.2.0-rc.2': + resolution: {integrity: sha512-+tWsZLldhUVPwEKhz3o/oYVMEjnFndYwaDJnpN5PqeuEctU3PgZ/xYd5QxH44Ob/g5ROokHAkUWP8wER7+EwWA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-native-command': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-settings': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-api-terminal-controller@0.2.0-rc.2': + resolution: {integrity: sha512-Cn+kZR2kHG2JH+e5eU2J7aS31c4UUGNcEkSfUizJ5SPLEa413qyFKlvVMU0DhITpljJSarpxrG6tfGqsF6mX1A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + '@deepseek-ai/dsh-api-workspace-controller@0.2.0-rc.2': + resolution: {integrity: sha512-3CoKQUgGxJ8yH++j/HurB4ZTrVLMZXS0cMm8Fb3ZaMB1dTseroaMoepvnBtzJF1hQx6YArNu8XvXO5qPRA6Fgg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-api-gateway': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-directory-picker': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2 + + '@deepseek-ai/dsh-api-workspace-files@0.2.0-rc.2': + resolution: {integrity: sha512-X2mKXzaWOjTv2rBvZl4GyKsB63ZUHJZaq9KX2r+yaMJfguxMkWMCx0to6bdp2BPrzaD826X1D672hFY6Ps/0jA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + '@deepseek-ai/dsh-app-boot@0.2.0-rc.2': + resolution: {integrity: sha512-WvgNhBHSj85Z7u9vC1oQr9C7yZQ/L/JS+eVK4bueWEkaoqdEna504V5bi7qtWXxAz5JkeVZTy1sX86p8XG7LJg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-group': ~1.0.4 + '@deepseek-ai/cordis-plugin-include': ~1.0.9 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + + '@deepseek-ai/dsh-atomic-write@0.2.0-rc.2': + resolution: {integrity: sha512-CezxdPmADDnOyG/ed9R18In/NifnLgu8hfJEjTBKxd7kbu0XXenyqnk25jeWD6bJYwu8AWAwcpVFuf438EJPJA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + '@deepseek-ai/dsh-attachment-local@0.2.0-rc.2': + resolution: {integrity: sha512-VDyHGvKoN59D+3t3rwkZYNFJJJ1PbCV/6z9ngL5lErd1H98NqmFqFzGgGypGPvBGdmi42ckhVldBPq8ZJWzKcA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] + '@deepseek-ai/dsh-attachment@0.2.0-rc.2': + resolution: {integrity: sha512-asUDLv+mfb30vjjlQtMI9aBnC+kmPoUxS1ooadhwAd8wssIlLetq97nzC5W1qd0GQGwZtPG/gpljVAMcSwPr1g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + '@deepseek-ai/dsh-authorization@0.2.0-rc.2': + resolution: {integrity: sha512-hcvguIxKa6P5zhb6API9gLNLveQ2H2dXUo8vf2aTzoc9J4madUFltR2suUDfvusgN13qCWtbbUcgWdZt79uVuw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + '@deepseek-ai/dsh-base@0.2.0-rc.2': + resolution: {integrity: sha512-AclHClefnPmUe2qoPrKMUvauA/KelYevYlxFdHLZGcPRqrDH+D21HyrwJmj4f7Iu5OO0IqfjB4zBOkwMp5h1ug==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] + '@deepseek-ai/dsh-bash-local@0.2.0-rc.2': + resolution: {integrity: sha512-38cihtu0JSBfj4GAH8pPX0v2tPDZBcPbgX9CjjMTPbhNRF30C+Ncg5zhJo5weaHQR0RnqOIJVuDHxcJ3yT50gg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 - '@exodus/bytes@1.15.1': - resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@deepseek-ai/dsh-bash-sandbox@0.2.0-rc.2': + resolution: {integrity: sha512-PNTarU5/b5rmkpMVqk5iHq12dktFL68B7dGofWoG9S3xKe7QXTmjQCZXPxyfMqEujtTxDE8HyLcLDE+46Nlchw==} peerDependencies: - '@noble/hashes': ^1.8.0 || ^2.0.0 - peerDependenciesMeta: - '@noble/hashes': - optional: true + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-bash-local': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + + '@deepseek-ai/dsh-brand@0.2.0-rc.2': + resolution: {integrity: sha512-A5XlN4tIgP0qObkYFhcZ7Oz/tM2oESEZqLwS0Qq+sM1ivGx6o4AMPgJdfKQlwLzqk0cMLNtAaVBHfiYoElt4lw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@hono/node-server@2.1.1': - resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==} - engines: {node: '>=20'} + '@deepseek-ai/dsh-chunked-list@0.2.0-rc.2': + resolution: {integrity: sha512-3KJhtGoWL39UIY6dyQ/FNuwRssPzxf3Abe6BuYdGwEh8FJcEG1JgSFIltKL+mfhbp4idV3cF7EnTVutGlurMDw==} peerDependencies: - hono: ^4 + '@deepseek-ai/cordis': ~4.0.4 - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@deepseek-ai/dsh-client-connection@0.2.0-rc.2': + resolution: {integrity: sha512-eL66YSZ0+HlWRzAPGU8jtCLd322WXBoMGN1g1OsM5T7Skqbbo9hSwV1FO3Lm0IcMZR3Y07sGPQBwZwf/l66T3w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 - '@modelcontextprotocol/sdk@1.30.0': - resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-client-file-upload@0.2.0-rc.2': + resolution: {integrity: sha512-+uU8KHjLyHoMpslnRQZp02BtBSSBvRsJdYlH2vnVYE00b86fVtrBOvtzcF3jv1f7b0pYbph5z6ikIH8hvhzdOQ==} peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} - engines: {node: ^22.20 || ^24.12 || >=25} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-client-hmr@0.2.0-rc.2': + resolution: {integrity: sha512-hE/+LDYFelYY5ayisx1UkBVXe7hygvgI7Ts9IyJa7nZNoppsChoZQbf5iHMO/ogS5efeeyy/yS0nKOzJB9RYPw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@noble/hashes@2.0.1': - resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} - engines: {node: '>= 20.19.0'} + '@deepseek-ai/dsh-client-locale@0.2.0-rc.2': + resolution: {integrity: sha512-JdZPMv/8hLOQNxHk1dM6YbNbChB5S6lGaGAPtraP0670i9Tb4dX+yKOAUgkS7nSoO5TYZztXgI1kgcEregRPJA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@opencode-ai/sdk@1.18.32': - resolution: {integrity: sha512-Wi3WtH/cLA3C0ga05lyDb7zac+SzbST9MPwCve1Ffod0xwzHdy9G2gnxvMAR4RBRhKJS32Rgk2cR+fxBhAVSQw==} + '@deepseek-ai/dsh-client-modules@0.2.0-rc.2': + resolution: {integrity: sha512-eDF7dycEl8QJ8CAZTSTz+dZh2PFHsf/ESAsjWjhcHxueLji7LF8/MY54PgU051Ho0V7zQKCAAeFWK2/GyIpgIg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-android-arm-eabi@4.62.5': - resolution: {integrity: sha512-jfkGfTwhQpsiSckPF8r9bU3pn3vyd72NlWaO+TgEO6WPSDnUhXzrNYCHBMOYj0ACaUgjm6eERLF+XV9a6RstoA==} - cpu: [arm] - os: [android] + '@deepseek-ai/dsh-client-product-analytics@0.2.0-rc.2': + resolution: {integrity: sha512-gAxwso7bK4S+5M4KURB/JzUWX55z+gZBSNpzy6dyiIwUg6SZo536hVUjzmb+Tlu72vULgZ4K/uO2zO0d1WcceQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-android-arm64@4.62.5': - resolution: {integrity: sha512-oGVqyQlxnrz9/ty89oHpU857VUHEl5/Xu4R2lS+aivCTrNnSsbiENzTnNaBsjxH0CNWGPhzHArOLFwo+oKXveA==} - cpu: [arm64] - os: [android] + '@deepseek-ai/dsh-client-resources@0.2.0-rc.2': + resolution: {integrity: sha512-fij1KTx7rBMyZHHnghZyXYWGpli9j3KrcfDBq+XhzNY2n5nidoIMIPj647DTajH+CaHFrb7f0Btj2/7Rs0d0Ng==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-darwin-arm64@4.62.5': - resolution: {integrity: sha512-bW7B8xMEq8n99Q3ieEcPRGuphurdZAaFzQc9Efyyw3FL6DZO6pMy9xhdN+kBoD7Sy05xNXSr4OyPPnpkYriS/A==} - cpu: [arm64] - os: [darwin] + '@deepseek-ai/dsh-client-shortcuts@0.2.0-rc.2': + resolution: {integrity: sha512-/mgW9+qbx/XMFODH58vtBsMeZr0lFE4i+mZWqGXfHbmwG9b5POBWi6QQOcCB6tQGE1TPSeiWC8GbCJL7lGAYSg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-darwin-x64@4.62.5': - resolution: {integrity: sha512-YSwBS86QeHOGlrxJ1PSOIZSkzRL/JmKeunhc+lV6M1a6En8QuVCD/T/qIA0J4Gd2Y86RIOBYrLcOUtqGh9+/1w==} - cpu: [x64] - os: [darwin] + '@deepseek-ai/dsh-client-store@0.2.0-rc.2': + resolution: {integrity: sha512-unHIDNnHudDIj05W99m+dVPXLYy7qNvMJ/D5FWb7cov0CbiQvliqbvFeMAU6LzC+u3vTkVJgSMIAwAVdQgYHEA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-freebsd-arm64@4.62.5': - resolution: {integrity: sha512-2fST8lILgl7cKbme/1KDdPCmbXbG+gqoV3bHp19L0ypX/3akYMBVdOunPleRCwonoLnXOZ/0F+Mt/v8POFmfcQ==} - cpu: [arm64] - os: [freebsd] + '@deepseek-ai/dsh-client-ui-agent-preset@0.2.0-rc.2': + resolution: {integrity: sha512-G4d4OFNoqQoLrIHDu4yy0xkvJhtZdTDPAEglmAkfDt03I6ypZxNO/cer6hasDne+gqUw7iwQB35Hvo1Gg1gAFw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-freebsd-x64@4.62.5': - resolution: {integrity: sha512-cpIxQCP9J+EVad0a6LO1kY3ZGODlk80VlI+2I96B8xMcdHZ4pLVhfQ49JFpYqjPF91FFkQWftf57YlDcTiw9yQ==} - cpu: [x64] - os: [freebsd] + '@deepseek-ai/dsh-client-ui-approval@0.2.0-rc.2': + resolution: {integrity: sha512-r85w95YxSwl/VlwAp5G9Y984KetesWGwsoV7ZYt0lV3gAo69GwH05EkUsZr1YmrQGdpu+hHUx4GOc24Qvgdz/g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-arm-gnueabihf@4.62.5': - resolution: {integrity: sha512-r9fGh3eFs3e/udWh5ZjXQtxiYK/xoFxQaYR/cELxac/Udkl5Th+IsFm0CX3Kl9hmUH/we7EoMpjJgeQNnE0+IA==} - cpu: [arm] - os: [linux] + '@deepseek-ai/dsh-client-ui-attachment@0.2.0-rc.2': + resolution: {integrity: sha512-KwJC64HYqhsT/evoYZ2EjueCRWTknwTLVTth2LrL5XXtt5tMkDYDLgr3D/SHbb6gRpmtAgEClskj3kVYJUQ6fw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-arm-musleabihf@4.62.5': - resolution: {integrity: sha512-xdvFdp7OM6KLJviJT2g/YuRSUjnZgGHk4RNgwIbN7X6cPugOucV60DdHXWzsBVCUdrGb6qSXnJQrrAKMmQuj3Q==} - cpu: [arm] - os: [linux] + '@deepseek-ai/dsh-client-ui-brand-official@0.2.0-rc.2': + resolution: {integrity: sha512-R0rHBtD1YWEDU0X7Tu+GvTyj1zqJUkvZmu08wXAyNGlCWvlOWyMNQyBmOjqDM7tBDuNh9yQlKw9WpcHtb0zPGw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-arm64-gnu@4.62.5': - resolution: {integrity: sha512-rRqILAndyzHzP7T9NFQrq+4HFWNhqkqkKur7eiBpfLmz01PO0JKx5Vchu3YllE4YXI/Ftgq/szrDWg5GJ0mI8g==} - cpu: [arm64] - os: [linux] + '@deepseek-ai/dsh-client-ui-chat@0.2.0-rc.2': + resolution: {integrity: sha512-1rsCHGvWNLaO6B6t1fJa8Qsov0OvJC6bnhpyK2NmDCaLu9uzb4dC4DxCH3OzmJwJkEByHrb3j3l9kbpaV+dTCw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-arm64-musl@4.62.5': - resolution: {integrity: sha512-Gf4X3qVMucayUvux6aXXPgXovocSFUC0rrffDuPI/S2nHhNMhjcZxsrAFYCOF350PRreW1XwzFj3CT/3bKsWCw==} - cpu: [arm64] - os: [linux] + '@deepseek-ai/dsh-client-ui-commands@0.2.0-rc.2': + resolution: {integrity: sha512-2bbQT/isVZX+xr+Wd2FA8Wfr3Ltomt3eFapvH8EGU2Ygf9bF+msGVm3DzqfHkTAUcU6C5n6WczzGdmnFUFk33g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-loong64-gnu@4.62.5': - resolution: {integrity: sha512-+s5qA0TNM0qm8PK/a5gt/1Hpx+NV08uSuCncvhziIlQzT6AEV2fnUQo7eBtFTFO0nA9scauvoR2HusfXmQnO4w==} - cpu: [loong64] - os: [linux] + '@deepseek-ai/dsh-client-ui-conversation@0.2.0-rc.2': + resolution: {integrity: sha512-Y1eWKVeh84cbB0fcV0MFOMUHBeptlzBCzsw6xslZS7p1a8l9PeFcjx5ZVTkKFuFMCfwEHWTeV9HcYqWLYH0bhw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-loong64-musl@4.62.5': - resolution: {integrity: sha512-ybb6QvWwWJCbBWqERpc8K3pYVGIrXlG8MEQ8IIuJY6Y9KdHQxoFoNyfkAOtKn1VHu3KuLidXvwrvGR1mEjeWCw==} - cpu: [loong64] - os: [linux] + '@deepseek-ai/dsh-client-ui-cordis@0.2.0-rc.2': + resolution: {integrity: sha512-5ScFoWmk2S0+e4a0ZxthBicpE53edBprpA3j86wdpaYbK6wAQI3nzlTYAvtuIfC+rLIBNm0mQR+GFabKnFJkpA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-ppc64-gnu@4.62.5': - resolution: {integrity: sha512-nZb1DtnOyhCmYvsC8A2CwOkopVg+IS1+fPUa7rMOAXtNw5+lLCLLPqd6XAiNrGtoQKsbvIBOwsHnBH/3wnb4HQ==} - cpu: [ppc64] - os: [linux] + '@deepseek-ai/dsh-client-ui-deliverables@0.2.0-rc.2': + resolution: {integrity: sha512-zsPP0ZB38O+otSib61XM37jUeUWlfXMHMUO3upb2O9Rz0RhAuXyjrk7/0ZLCAtN4q+qawVnLlEMHvwIk10kheg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-ppc64-musl@4.62.5': - resolution: {integrity: sha512-yMbj63Sp89ryrXLWyz+sy+fYD2HpOnMCLGbe4Oa1smclFSUukdtD/BgdiHaAetJNb74URD8U4hM+qG5KVzMEkg==} - cpu: [ppc64] - os: [linux] + '@deepseek-ai/dsh-client-ui-directory-picker-browse@0.2.0-rc.2': + resolution: {integrity: sha512-RxHNr6jUawkQvMLlrwQok6CrFcZKc3TsrJS4UWGGEFZd54D0AtpnhMP5NDVo4mL/LNti6m1VSlL/8nNgMQJa1w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-riscv64-gnu@4.62.5': - resolution: {integrity: sha512-mhoan3OJw2kYV/e1jtIdmvUZgyBFeA6zGWsOswmR0Tg19TQbowZuR+JMLID6spbbBN7Zee2ejrgmy3+FxGrIdA==} - cpu: [riscv64] - os: [linux] + '@deepseek-ai/dsh-client-ui-directory-picker-native@0.2.0-rc.2': + resolution: {integrity: sha512-MaFnBCKvcr4cZ1Zx6QJ3+0+n4JHB3GISNEcYWtvUPmRh1WEZCIx/MOfWdcs0bltMUezGQ7RwV6VB43lxRo3FqA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-riscv64-musl@4.62.5': - resolution: {integrity: sha512-5ZTLmjWbb1VZdjuyhe83K/8QO0/h11midQCBP+X5OYn32ra7eOBoM0ZqtaY4nkgNsYgmdVhMYPoyVPTjUpHf3w==} - cpu: [riscv64] - os: [linux] + '@deepseek-ai/dsh-client-ui-goal@0.2.0-rc.2': + resolution: {integrity: sha512-VmboGx4kq+9EigTdvvbqiekXB0443MpS+sLBBUlr6wREL8kBjiSzkTNYX1XNHMtGXgKJULYTuTIrcaKWK/bftA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-s390x-gnu@4.62.5': - resolution: {integrity: sha512-m53kG+br6PGxOTmgBEM2DHSDs9RVjsyEbUwjJPJGTFm1grWOG8EKJggDCTb60unD4Tjby8fi7/m9XfkEWasVWg==} - cpu: [s390x] - os: [linux] + '@deepseek-ai/dsh-client-ui-input-trigger@0.2.0-rc.2': + resolution: {integrity: sha512-X63sYrlwQflDyzCbT/rBxXJtq9hEmKbzwggYmXQ3x1N+ZgNT3RQsd8Q7D3DWycNHnavoJ3R84smxY+GB6nW7MA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-x64-gnu@4.62.5': - resolution: {integrity: sha512-6RHPJR1g/uvdYU8uXBnfq3nlqyZCP82Fr6NHgfGoaIeSh0YEqnX/x6uA9MmJJbnSH7swqX4F+CkGdUF+6doiQA==} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-client-ui-jobs@0.2.0-rc.2': + resolution: {integrity: sha512-UhiL5YGvHSXXg9PRyOFuqu79XIMsgxCSeGxpiX+mr5JK41mZ9MX4NSDNXh8yyuwzjKQlt/HPpOYuv5uTfaGG0w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-linux-x64-musl@4.62.5': - resolution: {integrity: sha512-xs+OXQtEXgpXT0DmA5+U3qnRZHdCST/5HRQxS8wSPZTUZN/EMWeHuSIod32LQklTBZBV9DyfncKBQ8n5V3eFdw==} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-client-ui-layout@0.2.0-rc.2': + resolution: {integrity: sha512-OZzGxqoAV5zHPgFveJnw599J0j0pWbJiD5c5hdPeLyNMdRdTa2CC2gR7fbn63XGu08O+OruTDXHkCrOVuvkdQw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-openbsd-x64@4.62.5': - resolution: {integrity: sha512-e7hD+sl3s+mcLQDZ8pbudBVsdG6r5yN4w3LqG2TJ8sQHDpblWj5lrJs/3m01Cvlxbt4x13zu5thLjgypgtkYzw==} - cpu: [x64] - os: [openbsd] + '@deepseek-ai/dsh-client-ui-message-feedback@0.2.0-rc.2': + resolution: {integrity: sha512-de4g5/IjIMEUHOGTWr6yqduBkmYfpA0BmqGchqQbsrYvmnvGqOOzo/rkcyC8uq1XIF55HfHEhgqKFmA1R0AwqA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-openharmony-arm64@4.62.5': - resolution: {integrity: sha512-GiyJaCf+WpMub/17aPcKk27QMl5W6f+KhdPTjlFOn5akH5Wa/DCM9Stdx5cDfmasyKB08MqpVQ1uJE2RkkpbXg==} - cpu: [arm64] - os: [openharmony] + '@deepseek-ai/dsh-client-ui-model-selection@0.2.0-rc.2': + resolution: {integrity: sha512-fL6Iyirvk4xOMjbioguxv3E/iAf4AlfqnA9WhEPwdK/0wV7StMKhuAcZkbz2o3kEFHBE98yroyzrbM//yJv4ow==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-win32-arm64-msvc@4.62.5': - resolution: {integrity: sha512-+OQ8U2DdoEfXl8T4Fb18AjmEwbXMerKDKCL8yCPAYhKCEEKoul7rkbeGCBFCbAlaGaa7pmtRTpkAJM2LE/i5FA==} - cpu: [arm64] - os: [win32] + '@deepseek-ai/dsh-client-ui-open-in-app@0.2.0-rc.2': + resolution: {integrity: sha512-T8xjc7I2YAB4iPC4XlmiTFfksKkOPRt7iSX8yWD+rJCjznbqWVS9fiPDI0IaNwrQRf9mR9mGdc14jkHpWcEG3g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-win32-ia32-msvc@4.62.5': - resolution: {integrity: sha512-KanvAZrPKbDBFwrgiU9yEVpQoox9QPV1WZOXX7HudJQY+eSlu82CtWxDU8WtuRRvtN5EGkLczkd6Y6DTcvm9wA==} - cpu: [ia32] - os: [win32] + '@deepseek-ai/dsh-client-ui-permission-presets@0.2.0-rc.2': + resolution: {integrity: sha512-qeawIA9Q2rBpn0wlv7cCpkk0zssb8vR1nhrh0igeXJOHpz27CA3jEwy31pfc9hcR24PAWgXcwfZnqWu00HwRAA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-win32-x64-gnu@4.62.5': - resolution: {integrity: sha512-1aC3UEWTtRl3RK3VpDJ/Tqk1XI4SLTmXIthAq6wRWo8XiSXJNd+VprJM4/1P4+i6HIaFEFlVi9sTTziniD2tOQ==} - cpu: [x64] - os: [win32] + '@deepseek-ai/dsh-client-ui-plan@0.2.0-rc.2': + resolution: {integrity: sha512-uXaj8o+CKLGd56rsl8rfJporCAnzX+XArs5lTRq6DvD7tyO3iah2wy/e3Hsa3RLdv5dz19S6oUqldn/mNxIcEA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@rollup/rollup-win32-x64-msvc@4.62.5': - resolution: {integrity: sha512-/gDJaRs4gl0NPIwqCz+6PkpmhhjRAD2j6P4rSNHBzUkO3naEx2mIU0pRle1vUNRQ7mE/+8OOeXLTv/J56FKiQg==} - cpu: [x64] - os: [win32] + '@deepseek-ai/dsh-client-ui-plugin-manager@0.2.0-rc.2': + resolution: {integrity: sha512-AncAiGUMawllpfnqirmABN7KXwmVEhu0E8ClJvfsLDhEd2oazZ6nk2nUPHHPu1tVKq+e8IbiTHqwpnlDR7mPUA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@stablelib/base64@1.0.1': - resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + '@deepseek-ai/dsh-client-ui-primitives@0.2.0-rc.2': + resolution: {integrity: sha512-Zx/MRT8NH6rYEvPnk4FQaHrADM6Dh1PQCprieqdvKj6yFhD/CJUVjSN08suGF6FPQekfVTJtS0WxY1XbQ5Ed9Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@deepseek-ai/dsh-client-ui-reference@0.2.0-rc.2': + resolution: {integrity: sha512-HCdQto0tHfERzxNSDHZRKYVu+lBPjhfzf0F/rblzda2znMxNE5pjHtFfHZHkaQwUH3lPhFHkuGzP/AvBtamISQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@deepseek-ai/dsh-client-ui-renderer@0.2.0-rc.2': + resolution: {integrity: sha512-vQ/LH4A53K1J/UeF5fQs1Dj8km5cnVos7vO0rmj+pJROhE6Vs7pAAKGz5P2e02t2/2to6+iMDu2+SSITrcYWTQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@deepseek-ai/dsh-client-ui-schedule@0.2.0-rc.2': + resolution: {integrity: sha512-aBWxbwbbrLzqKIi8BU5gc82clY4totY+ikE4ypaanxr8qDgJ/ZOe3SVaZRHWWSAsunLP/rYtsamIRE/2eJDveA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@deepseek-ai/dsh-client-ui-session@0.2.0-rc.2': + resolution: {integrity: sha512-QbavrwYkWqdmR4Be7Bv2tNqf+Gh1LV6+rlDkdukMWvdJFSeAmX9Fsctwn8yqgnPRGEHZUfZIjef8zKXIWexuYQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@deepseek-ai/dsh-client-ui-settings-account@0.2.0-rc.2': + resolution: {integrity: sha512-4Twq6woo7QJshkHu7hXzE0eyDnYCf01iuLfWZftWpLl6olaA6eQBxaRrMyW7YDubYpnTIu6m+1QRGtQ5MARYgw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@types/node@22.20.1': - resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} + '@deepseek-ai/dsh-client-ui-settings-agent-loop@0.2.0-rc.2': + resolution: {integrity: sha512-e3Vx0ZE8jfuNQjaGXggUA+cp8x71VqkYFldd3IeXuMW1w4MeBzo+wbKeCOOf4TCCyvqLTD+x3OD5wVr1lgkjiQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@vitest/expect@3.2.7': - resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} + '@deepseek-ai/dsh-client-ui-settings-general@0.2.0-rc.2': + resolution: {integrity: sha512-LqM4OitgSKe7KDFiyBauVuJ8wvS2G5Vk/BNV1wmYz3oTNyCJXZxdJVP6qijFc4yf1zPXWfEGAufYBdtyYb35WA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@vitest/mocker@3.2.7': - resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + '@deepseek-ai/dsh-client-ui-settings-models@0.2.0-rc.2': + resolution: {integrity: sha512-vZVCHW1PYaPOhlunGL771e2WfkN023CTvZ7ZeiTWX6vkiDloUPCAMCjCl0e/xkbtgSMGvVjquuqGluwxqqIShQ==} peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true + '@deepseek-ai/cordis': ~4.0.4 - '@vitest/pretty-format@3.2.7': - resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} + '@deepseek-ai/dsh-client-ui-settings-plugin-inventory@0.2.0-rc.2': + resolution: {integrity: sha512-oS2EwNGQeNQwSsbZYv7PzuR9byUu905KcVuf4nwaQ/JOJJRfMj7fzpP2wSh6nJ1l11Yjhvvc9TQ6nzmGDmL9jA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@vitest/runner@3.2.7': - resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} + '@deepseek-ai/dsh-client-ui-settings-plugins@0.2.0-rc.2': + resolution: {integrity: sha512-mW/BaxHgKNyO2Q/ePhqFvFziQc0OVU7HUVu5RC0YG6YbT6ZIEsXs8UWrucwgExjcenPDnmW11j89+q1Vi/1YJQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@vitest/snapshot@3.2.7': - resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} + '@deepseek-ai/dsh-client-ui-settings-session-log@0.2.0-rc.2': + resolution: {integrity: sha512-aacrU3GfHkCTB8FFM0yEF2XFHetX7DZz4TWPJeAbMafFpbXi90pLOxY2wg92wehURtTuhNebqa+IYWBldg8sOA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@vitest/spy@3.2.7': - resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} + '@deepseek-ai/dsh-client-ui-settings-shell@0.2.0-rc.2': + resolution: {integrity: sha512-dTEdo5Pbh/M3bi+co7gvKbdTewHakkvwy9ESJVjzq0WD/7qtQT6szbhlBJ+WaDKvRDhxnlcnuXB2u5wyRsKVmg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - '@vitest/utils@3.2.7': - resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + '@deepseek-ai/dsh-client-ui-settings-subagent@0.2.0-rc.2': + resolution: {integrity: sha512-Fk61weXn1Udb0lHSnvmId2rqNtdwg51Gw/Hdk2Upf+D5hGKaeRCv+lsO97Xi83fJaJz+md7OvBnqu9htduZuxg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + '@deepseek-ai/dsh-client-ui-settings-web-search@0.2.0-rc.2': + resolution: {integrity: sha512-vt2Rgf0Z4sx1EE10EJDKQvHjK7xsNEMxrUv2ZUoxA6E8cFtRMD+wGblW7f8s6OwV2pNyAE+hiYePPf1zK24dbg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + '@deepseek-ai/dsh-client-ui-settings@0.2.0-rc.2': + resolution: {integrity: sha512-Kyho8FvRGYb7Ok1t7T429d4Dj/XF8+tE/+MX6T1s41RkXCe7v0sP89i4DUMo6OeUxyE+/uGoAVa5QZXY4O/y+g==} peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + '@deepseek-ai/cordis': ~4.0.4 - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + '@deepseek-ai/dsh-client-ui-shortcuts@0.2.0-rc.2': + resolution: {integrity: sha512-MZtbV4PgYGx7MOUFlwfiWF75sBeLZcds9uHlYTQlHSjkJwJWLnqnT9OYwTVQdfWYs5MBv3Bj5PK1kS8zUO49hg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + '@deepseek-ai/dsh-client-ui-sidebar-browser@0.2.0-rc.2': + resolution: {integrity: sha512-tp5007jcJlcJnnjslpix4XbnbKGpKQjXCzlRKyFdUqcbua7Oqn1ZcIrCM/+gvgd3cOC+ZlAxrmyJQtbulFg4oQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + '@deepseek-ai/dsh-client-ui-sidebar-documentpreview@0.2.0-rc.2': + resolution: {integrity: sha512-0daQxoPZiJ7Jkq3xwVZguqYURtrM4Sa8ghxyVjw7/Kyp5xGZ8+agFAJ7ZovlVramp7LacBc3A6aNlB3aRLlBMA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-client-ui-sidebar-files@0.2.0-rc.2': + resolution: {integrity: sha512-QapGZ5bpiGRFFOT4tw32nJxgkFdTkbEw7qO32vYLkcSdmbuWMETCutVBp77HLGsizB1RtYUtW/Y3IMT3uGb3Xw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-client-ui-sidebar-right@0.2.0-rc.2': + resolution: {integrity: sha512-ocVUP6v3X7vShYeJ5I1Z3t1lDC02hJdZ49/kIRj29Xbe+BIfMY9HSDyUVUUDdijdd3jP8dpmhmbHbDJudwFUtQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + '@deepseek-ai/dsh-client-ui-sidebar-terminal@0.2.0-rc.2': + resolution: {integrity: sha512-W49Incf9cPFQ8Ntpb0S0dUkbn7bdlffbEUASYACxIxPceZc1YVzz7Tp32kTYUEZNJPkyi7E4r3M81wAhSYimmA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-client-ui-sidebar@0.2.0-rc.2': + resolution: {integrity: sha512-qAvv42Jt36dVVHNuuZFUbR5kMofhPmGeFafBcOU1mlmUJitZFf31MFFF34UER3JSnByxwAeHsMx9JMq4k7nA4w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-client-ui-skill@0.2.0-rc.2': + resolution: {integrity: sha512-WJ991QnG+V5Lc9rkpexlgDShO8kCGva0K3mc+VI+6BRJ5tRE6ZFf0hutCax6iyUz/gtaFsxoYs615Uw2jas6sQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-client-ui-slots@0.2.0-rc.2': + resolution: {integrity: sha512-zfILCyG3ijHT7S8+WDXFz4RMxBJtG9A3ngtDBnqcLbD5wzKz8H7E+HC657USa6RgG13C2RGSs73sfKcSs4WtWQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} + '@deepseek-ai/dsh-client-ui-subagent@0.2.0-rc.2': + resolution: {integrity: sha512-n/1dJBhJE/LgC9qFr+sTm70yu8mY/vULcKCZo7rFs1+/GGlycjqBW4NjOF1Rc66QQQRpaMFuWPEGo83RelwiSQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-client-ui-theme@0.2.0-rc.2': + resolution: {integrity: sha512-1pdHD6QfRGalG3BchmvvuVZportaMcSGQ1lwjFlddB2oyZrHk4lsYMYN8l1icQDgB7VrA4cA1VIlYlUfl7qbLw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + '@deepseek-ai/dsh-client-ui-tool@0.2.0-rc.2': + resolution: {integrity: sha512-Obs9FeOoIHWJUszQTY4MbdqAhlxX+lkzpwPpxk36t2pGCfkvaPWDdKwC0oUrTkRZxqYdx7inY8JK/+PZaWPnoA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - content-type@2.1.0: - resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-client-ui-trajectory@0.2.0-rc.2': + resolution: {integrity: sha512-CSN5GnTpg03QysgHL2XW+DKAUea15Sf7a8CKHyHvp/EhtbRMq3JLcvkfx2SV8/d6he9AcJ9wu8++r+S7Qfmm2g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} + '@deepseek-ai/dsh-client-ui-user-questions@0.2.0-rc.2': + resolution: {integrity: sha512-N19AmrBM4BNl2FNOVwi8q48W3utd3IUSdnhRxeDSR6TZRzWcFPlYZx9irt+kFFehsjvKRCnPz3Dv2A/CgCppcQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + '@deepseek-ai/dsh-client-ui-workflow-run@0.2.0-rc.2': + resolution: {integrity: sha512-vwHA+gyGXc9faftXvd5qoxmEy+8C4bWXuTogSs4/bA51hXhpOfFolQxm/C0F9Pq5nTDe926mcwIm/8KK5nTR+w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} + '@deepseek-ai/dsh-client-ui-workspace@0.2.0-rc.2': + resolution: {integrity: sha512-dGKLOFJXBiGDKl+qWMQ0cYF0AT485JMzSk+AUM6/81tZPapJuirxP7Yf5ZFMfsmgQFv6m4jjYlnOc6KcIfUUZQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + '@deepseek-ai/dsh-cmdline@0.2.0-rc.2': + resolution: {integrity: sha512-S4X5fqxjRykgZvfISnw4ta8Kr5YDFUHD73NwD0aUaFbfyhCNFgVSgdZUHVA/a3NmBptIv4Wh+dGM1sI/5DI0yA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 - css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + '@deepseek-ai/dsh-command-compact@0.2.0-rc.2': + resolution: {integrity: sha512-QrDjlw1aU0IV6JUdvD7ZGGBjMScRar1JIzpO7g/9LAKvbDLhuJC8RNU2cnZDGCvcAC4sD87KAzK/x+y5JhUeGQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2 - data-urls@7.0.0: - resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@deepseek-ai/dsh-command-feedback@0.2.0-rc.2': + resolution: {integrity: sha512-O6h7T503zXfKkqgdo5aNDW04oZ1V7owMxsMeU/OGbvlx8Y3RmhgSY2Gyt6UAC2o+6sD0AKWk7fCjm61Ic/FeJg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-anonymous-user-id': 0.2.0-rc.2 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-command-goal@0.2.0-rc.2': + resolution: {integrity: sha512-zAQTumQZorlPoDKt7EnrWkIgIVRpRII/8i+aC1bUasf6l1L5Nua5Sy6g2Mf/ILzMO8eiIt7p3/CPJWbL/tvrEw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-goal': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + '@deepseek-ai/dsh-commands@0.2.0-rc.2': + resolution: {integrity: sha512-pU5oUyOMPDN0yxEjE1wJRInNeC5hs5vJnbOG8MSSfkFov/7Q8hrfwETxZtcRnbrpzzeG19wsvtRz1twkEMKZBA==} peerDependencies: - supports-color: '*' + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-compaction-basic@0.2.0-rc.2': + resolution: {integrity: sha512-5FUfmXUTM04gjnMhWxnpRk2iHY1eUgBBqSFNJFYTxRx5bVV5ZMJH8E5E+Bc1P8Xt0FORxW4y25MhpC+XA0uBow==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2 + '@deepseek-ai/dsh-compaction-tool-result-pruner': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2 peerDependenciesMeta: - supports-color: + '@deepseek-ai/dsh-compaction-tool-result-pruner': optional: true - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + '@deepseek-ai/dsh-compaction-image-offload@0.2.0-rc.2': + resolution: {integrity: sha512-aNX4glTxfengJnr26a8oxHaxjHgBEQxEKaoKXPINlASeBzbsJpCdPyQelTPpn5B/CgRFpw2p7oqlRLwGZjyYoA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + + '@deepseek-ai/dsh-compaction-tool-result-pruner@0.2.0-rc.2': + resolution: {integrity: sha512-FK/nqlznWQm0HBJDQkXB7QjEm5ou01em2is+dbVo+LQJtIMo8V7tUDbjqRiIAOCK3MesxyF0HdG16TkY4M5F7Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2 + + '@deepseek-ai/dsh-compaction@0.2.0-rc.2': + resolution: {integrity: sha512-aghHthiqhFZK5NlX/EJk54UgdBYJesmqHMxLQqwwzdq35kuFAx1ThxyNCEM/d244MG9IvvD0tSVk0Fj4UPx+Mw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + + '@deepseek-ai/dsh-config-editor@0.2.0-rc.2': + resolution: {integrity: sha512-LG/4EyMMBEwcUAsewqn9+6m9+mFeXVGaze0gaz3YOO/bCnJRI/2f4iuejsk/n+yMI9CNczOaIfWT5b3s7zyhfA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-include': ~1.0.9 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2 + '@deepseek-ai/dsh-hmr': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-hmr': + optional: true - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-cordis-client-runner@0.2.0-rc.2': + resolution: {integrity: sha512-5VeQlKRUD2VitlGaDvksOI/bIGGOH4C8E1e+Y5kp+CeFxd1W3IABJkQEhEK90Vv3Gj+2S+ZbDh8n0ydsP7s9hg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-cordis-host-runner@0.2.0-rc.2': + resolution: {integrity: sha512-XbCihVALcsNc/wZlOHTM5IRB1WyMbk753eUPlbtlAxjzRalzXVlnfjw5FFdxjoeavDGC+36k8aZFRtTnnCULBQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-credentials-local@0.2.0-rc.2': + resolution: {integrity: sha512-az83NVgu0COpjrPRAbXs0+evmSznQN1c8tFv/JKVvgcyPeFw5nLK5+0kA2QRBQ2g1p0+1x5H/4XBtr3Lwq/Piw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2 + + '@deepseek-ai/dsh-credentials@0.2.0-rc.2': + resolution: {integrity: sha512-TQlvP0jxXYGy1ZNzh4nVsiCzb8FR9iGarD6BfIZ3LwJC8lDtjSxQHWE8//NYjpn10TIMxmaR4s6niHuJ3JkTOw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + '@deepseek-ai/dsh-deepseek-account-platform@0.2.0-rc.2': + resolution: {integrity: sha512-JX61prldKAfHmsBE7yyVfp7EShGp0PgWvIAmQnUqy3MxZvBB24k2XBZ/UmPk56WvRhHnirGM4pJyipaT/ljdlw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-authorization': 0.2.0-rc.2 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2 + + '@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2': + resolution: {integrity: sha512-hA1Etqs6oFvcRvkwCBP5Zp3lknSc629WyOgudMF/N7DkOsMBsYC+3Qj4hpkoF/G2pWGO7qsXmC3fRwFk17foHg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-agent': + optional: true - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2': + resolution: {integrity: sha512-AAiHShG4cgAtDa2XOe0mI6fTTkxrAI70x29HilYN6ZNss8XzC5tFF/XWlEf6fUx+l98Ohudn5101nhhbENgqkQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} - engines: {node: '>=20.19.0'} + '@deepseek-ai/dsh-deque@0.2.0-rc.2': + resolution: {integrity: sha512-XwZvafZAxyDm2TRnQetEizuczZ1UG7RhO8vmmIUbAdjbRbMA15NOTlJ3d24uw+I8gcSKKkmWl/jwoKYKl/qo/A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-experimental-agent-team-profile@0.2.0-rc.2': + resolution: {integrity: sha512-XmOjwaAoHlmLkN3weOGd6phIdXtc3JaaT927Em32/yeduirVwdlQ9igDwIrpOcmNqi7jH6FldliHHvT3zrVkuQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-experimental-agent-team@0.2.0-rc.2': + resolution: {integrity: sha512-ds9BrnyJ+BAbxaH3J81c/+JJpk8jUtnpzUCyTXxrDW2nZOnFWqdPH/TZKAI1ttCuls218+RF4PPFPbhYaXNl6g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + + '@deepseek-ai/dsh-experimental-api-speech-to-text@0.2.0-rc.2': + resolution: {integrity: sha512-1RUi6flQ368MYEv3ukRFwyGqf9/5WaUfPgbi4/IAI0CaZeER/yBp7AlbaAzVwWo4EVqew0fXNcW95KoUgpHwZA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-experimental-speech-to-text': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + '@deepseek-ai/dsh-experimental-auto-review@0.2.0-rc.2': + resolution: {integrity: sha512-WMGHoNP/vX2TU8PmONeC4ji+DzRH/6LBjo0Sml66Nko9++m0n0+ksL4/DjIcJrBKGSH73gTGsDFNWt9YxO7wyA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-instructions': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-permission-presets': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-experimental-client-ui-agent-team@0.2.0-rc.2': + resolution: {integrity: sha512-xrx4ThE3TbK0gbDcbW3oLLL0NzyP1poTygNeTBwoyY3gwPQZGx+4Q3W7CugGpEjNU2Ie4SZWqGYDN9jauiki3A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-api-session-controller': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-locale': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-conversation': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-primitives': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-renderer': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-slots': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-workspace': 0.2.0-rc.2 + '@deepseek-ai/dsh-experimental-agent-team': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + + '@deepseek-ai/dsh-experimental-client-ui-voice-input@0.2.0-rc.2': + resolution: {integrity: sha512-oDJf2pSeaV+785Rk5le0HBteinB17Lw01EtexH27UWQQombNhOj1ZXs+PH5F/caTGyLaiIt/1Z4+o7e+TIcr0g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-api-gateway': 0.2.0-rc.2 + '@deepseek-ai/dsh-api-remotes': 0.2.0-rc.2 + '@deepseek-ai/dsh-api-session-controller': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-locale': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-store': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-conversation': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-plugin-manager': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-primitives': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-renderer': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-slots': 0.2.0-rc.2 + '@deepseek-ai/dsh-experimental-api-speech-to-text': 0.2.0-rc.2 + '@deepseek-ai/dsh-experimental-speech-to-text': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-experimental-schedule-bundle@0.2.0-rc.2': + resolution: {integrity: sha512-6oGDFceBMAsrKeJfFxByyvXBPE+Obfd0oMCwNYdWesPmRBueuRwj5lwp8BY+v59mQAc3Jzdkx1hZh/E6xRcMng==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-experimental-speech-to-text-sensevoice@0.2.0-rc.2': + resolution: {integrity: sha512-Czz8Vp+p1wPXU0quJ2en7Okhrq5mp2wYxh/ZDjsiYq/Nm6GagNz4ZRYXSyxWZE/yFCv2UQ5gVcVOzp6OKNqxnw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-experimental-speech-to-text': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true + '@deepseek-ai/dsh-experimental-speech-to-text@0.2.0-rc.2': + resolution: {integrity: sha512-p9j8bU00eRlKsVfKK/tYj4Y4tHtuyYV5WSg/zd08g28/07ejUNu0J9vMlw6RzTFHMHqOSGGnsx6ra9IxfvCc2w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-settings': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-loader': + optional: true - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + '@deepseek-ai/dsh-experimental-tool-agent-team@0.2.0-rc.2': + resolution: {integrity: sha512-iwaUH4Ev4jz56iV9Zm1IkY/34c0NoUe3gFDKDzw8UQfy8S87uNoTOR5z4//ycdN0uuHQ01MfP7U0zKkdIuYjoA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-experimental-agent-team': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-experimental-voice-input-bundle@0.2.0-rc.2': + resolution: {integrity: sha512-am08Ylak3AYyX2DYxnfN8zn5t80xl5a5Iys6BJ46Ji7ruF4vD6d4C3SaitEtjNgciPxn41R9B9iWTzYTD/cQhA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + '@deepseek-ai/dsh-file-reference-local@0.2.0-rc.2': + resolution: {integrity: sha512-xrzsF7lrCExK4mdrFXuJM6XeYaZCQoaaqgv1Ab4YbN56N2UcCTHd5rKgFwwRRwauPkeytUAYMoFmXZmTIdhnVA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-file-reference': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-file-reference@0.2.0-rc.2': + resolution: {integrity: sha512-vIjixx03qmWeEoVAhIOFEXyQ7I3UTenWtql8tT0IEQLYp7WRRhMNr7vojpkRO7JPgSgW5tjUIiQvg8/h990GvA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + '@deepseek-ai/dsh-fs-local@0.2.0-rc.2': + resolution: {integrity: sha512-lDzh5VlQsXf3nI+E0+T0weYdH1VAoo+htj6Kwc62P7/Lx+xjnYSLQYTeGeaJR1d8H2iQv2FvlwaDKv60AorKdA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 - eventsource-parser@3.1.1: - resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} - engines: {node: '>=18.0.0'} + '@deepseek-ai/dsh-fs-observation-policy@0.2.0-rc.2': + resolution: {integrity: sha512-YPqpJ+WPhYUHS6PtUN4abjUx/dK6bexUiQdFGeQ81F0CEWbIfxyT1QzadKPvU5PrjxpG5e+UtjoEmAQKSCrsiA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} + '@deepseek-ai/dsh-fs-sandbox@0.2.0-rc.2': + resolution: {integrity: sha512-y1RCQ64FOXzKXsLLHKVcExn8wKVN3klZY+OBeLYpiTEGZemADk6lf/5bNXQP9v6EwXK4bi4FRkTe8vURZMB/HQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs-local': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + + '@deepseek-ai/dsh-fs@0.2.0-rc.2': + resolution: {integrity: sha512-PuVcI7drTwa19Key54DROoqnDFTTFkl8TPlyrTnS3BSnykm+jKbB13ES/PQEJoRunNdQkNZa12jtbUI4BP/EHw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + + '@deepseek-ai/dsh-goal-round-driver@0.2.0-rc.2': + resolution: {integrity: sha512-9J+uUo7+US98xqboK+JPXUF1TIGDwN3BB5AdhiDRDweLi1T3wBefpAHD4+ngM3C2e81MnUHk7FIFmK5IUY4B9A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-goal': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + + '@deepseek-ai/dsh-goal@0.2.0-rc.2': + resolution: {integrity: sha512-dxjUpSl1WAmg6GqO+m9dYGKPAV+whMR+0xqQCoapb8C60FEmeHa2YdopGKKRLziUzB9H5JoDXjtv5HsfuRQRjA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-headless@0.2.0-rc.2': + resolution: {integrity: sha512-qe1X+9fV0bgStRFlegsaXvIV34Y6gP/7Cxlf2MmhRduXtUQhvHAX+OJC8oySCiy1xKGeaFjB3POG3Bh5Er2y4g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-default-model': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2 + + '@deepseek-ai/dsh-hmr@0.2.0-rc.2': + resolution: {integrity: sha512-DyMnylNJ3v8NgtUi13SdVm7Y2Aml4MN0K7gvN+7FDrSD9iCqr0BlPqODxD/XH2EM2AYULxK2ISis7Y5/8gqnfQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-include': ~1.0.9 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/cordis-plugin-timer': ~1.1.6 + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2 + '@deepseek-ai/dsh-cmdline': 0.2.0-rc.2 + + '@deepseek-ai/dsh-home-paths@0.2.0-rc.2': + resolution: {integrity: sha512-n4O5C9pNIVWbBklB5RzSTc3kr9hmUnDlZ6Leqj3TIk+CO593DTAmDGTt0rHMQe8H+1Ur+Jqj9Hqgsug/WRkkvQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} - engines: {node: '>=12.0.0'} + '@deepseek-ai/dsh-hook-protocol@0.2.0-rc.2': + resolution: {integrity: sha512-ew0biR00o9ilXExq71XGYYbC0uJl+sr6Ju/zjzNUf/vXSZEuOMs9I89xA0R82Od8KLPMobPtQIs8YMwTHjiJEQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 - express-rate-limit@8.6.2: - resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==} - engines: {node: '>= 16'} + '@deepseek-ai/dsh-hooks-claude-code@0.2.0-rc.2': + resolution: {integrity: sha512-xMcX3KOeLOdiiA2Kzzo6TZbXmNMtr3xfJdbRu2Z4/MDvOHOxzPW1GUqDKUjpR16dZHZr8pB1Q2YhPlnWij/dXA==} peerDependencies: - express: '>= 4.11' + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-hook-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-hooks-codex@0.2.0-rc.2': + resolution: {integrity: sha512-EtA1KUArcSwiyJqZCclbZ26Mo8+DLpP9JIFevicj40jD/wjBjX3DutFFiEdAxigUi3qgJs7VZKmNQd2yQuTbgQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-hook-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-host-directory-picker-auto@0.2.0-rc.2': + resolution: {integrity: sha512-loiTeinKMrqstd+4GdGV2Odz1rhdCZ4hHtS+oVeK/C/r+EhWK++GiZMWKf2fn06+32QOS4Gi079AlMT0/cuPOg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-client-ui-directory-picker-browse': 0.2.0-rc.2 + '@deepseek-ai/dsh-client-ui-directory-picker-native': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-directory-picker-browse': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-directory-picker-native': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2 + + '@deepseek-ai/dsh-host-directory-picker-browse@0.2.0-rc.2': + resolution: {integrity: sha512-1mWqpuxBRxm4O+fUKpiAYne35MQMDTeerClJhW3pclnO90T5fs/gaaa+np1nDhLdsUMXeZKBvDf0X0KuvdMDEA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} + '@deepseek-ai/dsh-host-directory-picker-native@0.2.0-rc.2': + resolution: {integrity: sha512-p+KJRDaCyiZzCozcdW+M2wtw3uvZ+EBbquaMFy0Z2PL2EacgDWY329nihql2NsziyJ3/EfwP4nya55N6Jn+jfg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + '@deepseek-ai/dsh-host-directory-picker@0.2.0-rc.2': + resolution: {integrity: sha512-qrgr2mgIaLCQJbJnMiVCuDnrGyQUgamjOnC9/K3oUL4YRc6ymNy7SJ5y+6YHtziA1dF81pSmFAA2QPZd2zQDVA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - fast-sha256@1.3.0: - resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + '@deepseek-ai/dsh-host-frontend-static@0.2.0-rc.2': + resolution: {integrity: sha512-8wLpf1rw7gGINGISrHloNaPJDIGUuekqGAlq1bn14BjE2SNd01woy/+xOJgWgu365poefA/xlQ/6hEv3rnsLug==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2 - fast-uri@3.1.5: - resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + '@deepseek-ai/dsh-host-open-in-app@0.2.0-rc.2': + resolution: {integrity: sha512-d/DDm/8s+VjLVx19FyXdn+TDDn+JUqmucU6ZHo7QqQClBndzyL4qvWKjHpRuYLmJDSwlcmsrKIppjdYIm9L9Fw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + '@deepseek-ai/dsh-host-plugin-inventory@0.2.0-rc.2': + resolution: {integrity: sha512-l/ESrOGxkk0aemM4t2b8yV3AvMZQ9oxSmgo4b1FSK3CYeaDoPJHC6iKW41DhmnJ0igdLpVIw+rg7R3KN0DREdg==} peerDependencies: - picomatch: ^3 || ^4 + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 peerDependenciesMeta: - picomatch: + '@deepseek-ai/dsh-agent-preset-registry': optional: true - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} + '@deepseek-ai/dsh-host-product-telemetry-otel@0.2.0-rc.2': + resolution: {integrity: sha512-qwAG4OA9IIILLr8NQwVJ+vBb25WLCSzj0lWM56nCKEir71rRST83DsSfaycR+xghWbJGf8nnJl5Nq9iFYDc0dQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-otel': 0.2.0-rc.2 - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + '@deepseek-ai/dsh-host-webserver@0.2.0-rc.2': + resolution: {integrity: sha512-0zvI44emJMRr928Tfl//cPJlx/hiTGWfD1zaDlXu35eGIgOATFJlTPkJLApJvJOPVPPAlSOSdhI2L+j1TnzStw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-http-proxy@0.2.0-rc.2': + resolution: {integrity: sha512-zIGscCHeW6MUIKrksxhW03McWtKKpaDVVMf877bt51ZPP8p4UG8KmBUqJmX2l3eVoHeuuEyqM5zJSCj5NtSBGg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + '@deepseek-ai/dsh-invariants@0.2.0-rc.2': + resolution: {integrity: sha512-QOVc0HpRsS8ekvprb45FlxieDvgR/cAMaxW289HASjMoV/U/B54FpbkHuPBw4EnTw07/sPkjx2B/23+YqE0cbg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + '@deepseek-ai/dsh-jobs-local@0.2.0-rc.2': + resolution: {integrity: sha512-sNyolYfcNVodxGyoWUM3G0f+numJexMrqwR0HC4x9kvzzZNR1WZV7ca4lCAzlaRSEvY8UPYxKC6Fi4T+MnBkSQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + + '@deepseek-ai/dsh-jobs@0.2.0-rc.2': + resolution: {integrity: sha512-SuCCfXZDabBxsKbHoulXEeQrRSYuOYLSfhvnflQf+CYeb68wggKraejkLyO60LrCGnBJsgCqKIdIKLCUvIeN+g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-workspace': + optional: true - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-launch-environment@0.2.0-rc.2': + resolution: {integrity: sha512-IyhZjJJQ7RVLcKlc4pPPjojOKrr2XCYm7VRpslFq7bvGj3DGt8WMTSCCZUWxCThY2jg6kFF1ujiTGunELfRO6Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-lazy-require@0.2.0-rc.2': + resolution: {integrity: sha512-t6m+13fe+4veaepjGwNu0BLTtqdrSPq+A/zmOzC+7DXgWCBHJ3IxfW2vUlLviKfviwMI4BqQMPv4wHeuJgYFIw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-llm-deepseek-account@0.2.0-rc.2': + resolution: {integrity: sha512-02nSBVyVxfRgZhNa7IHvSb3OMWFWRBTu1jCKMPcOONZx5e4wv8+Adad2vMfPRftEIJg7hFV2RGh/yN/5y02sZQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2 + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm-deepseek': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-loader': + optional: true + '@deepseek-ai/dsh-deepseek-account': + optional: true - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-llm-deepseek-api-key@0.2.0-rc.2': + resolution: {integrity: sha512-F022Y9VK7NE3Z24TqTADgd9Gg3XzuVt8eRPXMRvs6rRDJiZBUCthFcSFAuZ668oTH6If4dC7PNoLgaN7QQVLRA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm-deepseek': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-loader': + optional: true - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2': + resolution: {integrity: sha512-Vk0oz0qAXYLC/tKoGfhRioank4FNX0Xdx8oDYduKL1HDf2tO72X+Nrq7hZaJp9nwvXCcg5TnPRIvE8ETZ98C5g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-anonymous-user-id': 0.2.0-rc.2 + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-loader': + optional: true - hono@4.13.3: - resolution: {integrity: sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw==} - engines: {node: '>=16.9.0'} + '@deepseek-ai/dsh-llm-pi-ai@0.2.0-rc.2': + resolution: {integrity: sha512-8DxCwQNhfQwqNQ6khxyDSh6Pba9PjpnNQqvAz29SF/V86ClZNH5xZuqCdNfU8E426Ec6wti5oUtM+uKohMAe3A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-authorization': 0.2.0-rc.2 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-loader': + optional: true - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@deepseek-ai/dsh-llm-retry@0.2.0-rc.2': + resolution: {integrity: sha512-k992Xuafcz0plUyUHyxABDrB+elh6JYvVtQDnEIjUJkSAc8bbsN7ZcF5fxHFx0zCEoMrxRA7ZqtqxkFTYUiNMA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + + '@deepseek-ai/dsh-llm@0.2.0-rc.2': + resolution: {integrity: sha512-6QFrQn/h0iNqCfPpgQidnHtLSpA99A7ZND/uYKaGSd/4BGP8KBhuRd0w63e9s4u+hfW8jc3j29WKcNLIOeUfcA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-mcp-client@0.2.0-rc.2': + resolution: {integrity: sha512-UqP2sY1r6qAhBPFeuclqrXiMBBxPaCNrXlXRqKxAON7uI1wmZZ0B3/1GmBviQ3/WjjTQlOOkj0su2v4e5DMkug==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-mcp-resources': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-mcp-resources': + optional: true + '@deepseek-ai/dsh-system-prompt': + optional: true - iconv-lite@0.7.3: - resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} - engines: {node: '>=0.10.0'} + '@deepseek-ai/dsh-mcp-resources@0.2.0-rc.2': + resolution: {integrity: sha512-ZP4B0DQPFlFpzUymv7GuZ2rwcyxTJ/xPAhn2r06yPUfUnwVFpcyt32ipOSAds8OnpHm9jEybRX4+lWzE8MK+JA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-system-prompt': + optional: true - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + '@deepseek-ai/dsh-message-feedback@0.2.0-rc.2': + resolution: {integrity: sha512-c6gc3173YL1vIqyLXdj6vcTwXUhPZYOhSyMrOK4Zb5KkrSfGshNo5mG3+BVGd7ZW0vbsMScSGbNG2PXidmUTpw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-command-feedback': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-native-command@0.2.0-rc.2': + resolution: {integrity: sha512-RgjkI2avXHxJFwI7tjb42WTHHd4xL6Ybbg5I12T8qbuW4ph6gzAGcl8UKv7tSFM59yD85i2rnULTiZOzKKSdqw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - ip-address@10.5.0: - resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==} - engines: {node: '>= 12'} + '@deepseek-ai/dsh-office-to-pdf@0.2.0-rc.2': + resolution: {integrity: sha512-Dl0TjqzrrzgQZCLATAvLuoXGOkmJ+deQLsLtL1HZUehN/aTyDI9j42obKPdOwSEHZeUnrdY2SEga+RiqY/J8ag==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + '@deepseek-ai/dsh-otel@0.2.0-rc.2': + resolution: {integrity: sha512-LR1fSfTS2/0D/TYSSinIOu1AXO/iKRbZAnJ5d4un/rlGQKL0caQiCflQ2lo5ryPOIa9pJnIIEGu949xsZY2gIg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + '@deepseek-ai/dsh-output-retention@0.2.0-rc.2': + resolution: {integrity: sha512-+yVL95Om473rZTHIyvjZ6JUyDl2orRpyjXeMSqOzJqh66/sERUfPgCtwMbnH9tzhxTF6nw6cC30I9dxgHEz13w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + '@deepseek-ai/dsh-package-manifest@0.2.0-rc.2': + resolution: {integrity: sha512-CFycoLxUT4g4w1IGjaHi/IjTzTRgnQ2PQVeHHSWoEppD+0NTZ1rHHW3ofkh74ZgQagoeo7n+91Yjl0rDGuWE3g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + '@deepseek-ai/dsh-permission-presets@0.2.0-rc.2': + resolution: {integrity: sha512-7jOAGdhEtRlhXZnJC92Sj+Z689jGcZdI8xMkA64o5GNyTxDcyzmTMwQLa24Jqm0NH5GKj1DHYoKm8LMEmicl0w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + + '@deepseek-ai/dsh-persona@0.2.0-rc.2': + resolution: {integrity: sha512-GfOs+GRlYVN4KHmCmAYal7aONmNQ9Z8m5yLwZKVC2c9tG1TsF2+wU+sHUXU1KrStdF5UDOKoE5qMhz2lPkC6xA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 - jose@6.2.10: - resolution: {integrity: sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==} + '@deepseek-ai/dsh-plan-mode@0.2.0-rc.2': + resolution: {integrity: sha512-Lpjv2GSz7rHijH+RNUwLTLH6AIptf6jUw/VfjiD7jGG0w6kq9KfpNs9WEW+lHeBrIWKGcfUkx47P3nu8uUbVvw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-commands': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-questions': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-commands': + optional: true - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + '@deepseek-ai/dsh-plugin-manager@0.2.0-rc.2': + resolution: {integrity: sha512-WnLDgkj3snW8YnOESlAhHTYerLSZBVEqYlup8XHJBXly2SnOTG6GG11phLvngocSDbhvMI6PB3L2oWkFNTYNFQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-hmr': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-plugin-inventory': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-hmr': + optional: true + '@deepseek-ai/dsh-user-approval': + optional: true - jsdom@30.0.1: - resolution: {integrity: sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==} - engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + '@deepseek-ai/dsh-plugin-package-inventory-deepseek@0.2.0-rc.2': + resolution: {integrity: sha512-aSSwU1KDIodDj0s28C6njtDE8Mz3pIrPh3i7aVu4SHbGkYxhURcrfCtdRREVGnCRBsp0QV6W8qx6ArC2i+DwUA==} peerDependencies: - canvas: ^3.2.3 + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2 + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 peerDependenciesMeta: - canvas: + '@deepseek-ai/dsh-agent-preset-registry': optional: true - json-schema-to-ts@3.1.1: - resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} - engines: {node: '>=16'} + '@deepseek-ai/dsh-ptc-runtime-node@0.2.0-rc.2': + resolution: {integrity: sha512-MYGTCOBFYuD8568j0hm4ChOTX/cBOUk0H1s+xuioRy9NAjjpTz+ybNZUJTYP3+noN5nzinDZfeiRdHqVoFh6YQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-ptc-runtime': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + + '@deepseek-ai/dsh-ptc-runtime@0.2.0-rc.2': + resolution: {integrity: sha512-HR/3h1VFRcNlAAjCtCAxZ4V3F5pViYicXcLBuYLGjzXWpOhr4zKzeFKh9+UMLjsc9XWIarJMoSvxl662nDV/xQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + '@deepseek-ai/dsh-pwsh-local@0.2.0-rc.2': + resolution: {integrity: sha512-WNKHUCDkNeT108RB5o/clJ696K3vp9dw38Ekr23wRlWX1EDyxYmTzRDt7WfWDZoeQ+sh5CguLrUbFoPsOy9uEg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + '@deepseek-ai/dsh-pwsh-sandbox@0.2.0-rc.2': + resolution: {integrity: sha512-V59arHVNWPhPHWZaEtdsl3hQ+9E1dZuqW85aGp5N/Vh2IdvEW99BcKL18jB5o+uZ1eI4PmAQ6HHWDU95ephmyA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-pwsh-local': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + + '@deepseek-ai/dsh-repeat-tool-reminder@0.2.0-rc.2': + resolution: {integrity: sha512-UOtSkw6L8OTUrCofK2t+VDuJTlX6eR/Ppki8lnHyJY4kcqUwiIMQ58SwQlB0shDdrJbMcK6HlpvZBsIEB3wTxQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + '@deepseek-ai/dsh-sandbox-local@0.2.0-rc.2': + resolution: {integrity: sha512-fM1QtkRxeQ498isBeotl0lW+oK/GS0G63cBNvwJJn6686Qzdl+gqwTDPS61L8pFzxRnqhqcXFxzu2tIV3o2zbg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - lru-cache@11.5.2: - resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} - engines: {node: 20 || >=22} + '@deepseek-ai/dsh-sandbox-policy@0.2.0-rc.2': + resolution: {integrity: sha512-0xXVqWw908/V6scohMyyU9SZSiQJYji+S1hMPulcUNLb3iew89d+WPWMIkWQBJRvcJzdQ2ghHwCESRkONXTJnQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + + '@deepseek-ai/dsh-sandbox-windows-acl@0.2.0-rc.2': + resolution: {integrity: sha512-z8blR3g/lIfWd2zR/GjEitXdysNU8NOcPZdILuxoSodBDpkPmKQOHYaH7nzjB1a/S5TxMADgPE1UDXsmJ0zfTA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-skill': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + '@deepseek-ai/dsh-sandbox@0.2.0-rc.2': + resolution: {integrity: sha512-luKF7ey6HRZkGhImqLCB5Npt4f4omDRk1r+x5qQNqqdNOuN9LXciKDMNPfnSbHfKCcqSZbH3sK+APOmKzRAhVA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-schedule@0.2.0-rc.2': + resolution: {integrity: sha512-1eqTxT3gTs0qDynu0r63ciHIAP+tUNgOE964Y7WsfpzOyuE+CyF5FvZhxEdErVp84bakXehePUdKZ6Z+2IVIkw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-api-session-controller': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2 + + '@deepseek-ai/dsh-scope@0.2.0-rc.2': + resolution: {integrity: sha512-066p7Wv74GNWt4xA5Cyvl+7c/i9KrNEDALYh2/hu0VsJPLb4T9He+TY7y1bld9OgungmqyTy1n/cB2ZrVskvxA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + '@deepseek-ai/dsh-sdk-app@0.2.0-rc.2': + resolution: {integrity: sha512-RX2ugii2C1AwJk/n1ajqypelNubOxdMfTNsG+vwTBEtonmjiJ4ACoKLFV/P6+RtyEeKEcveIEO1EmI6yXEjeMw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - media-typer@1.1.1: - resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-sdk-jsonrpc-server@0.2.0-rc.2': + resolution: {integrity: sha512-lNg524lActTvh27Z+FDQOD3n43hzVXe/rN9+q3gGBuUeUkMv+7Hw5TFiDqE6H4VzqAUvuQp8B/0LkChtY2Fi4A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm-deepseek-api-key': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-sdk-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + + '@deepseek-ai/dsh-sdk-minimal@0.2.0-rc.2': + resolution: {integrity: sha512-yGb64ou0LUM9mH0dz4UaX8d+bKp9FAybIIS4IRJVxrWc/K3eCETrFNoSVE3LKmVY/QgUzx15XpVVp6GzdGRx/g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-sdk-protocol@0.2.0-rc.2': + resolution: {integrity: sha512-hs4Kl2x17wAuhSMUWuNpeHvv1mOm+F+A2EQnYu1QmxVux50PR3xHthee7IX/PylpgZybcfBn1JAigKvOFs5GPA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} + '@deepseek-ai/dsh-session-checkpoint-policy@0.2.0-rc.2': + resolution: {integrity: sha512-aymiGTfsQcEmlkeq8X4ybYUjKlJagjwhY7qwj7+85i/EOlU8qSzBF7clYkjJBdtN9CAKBAcAPElbgLtwzqfT4w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-session-format-catalog@0.2.0-rc.2': + resolution: {integrity: sha512-wBGYOqel01uyjVyhKjttJeWH99MyuKaaZRrrlvNa5iLDBTysqKrc5AE5MNx3UvvBFmF6Gi/N8FoycZYWOPL6Ww==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-session-format-v0-to-v1@0.2.0-rc.2': + resolution: {integrity: sha512-PPcfT7txn82/sZnFNxsuxEEUSSdEfBTkNTuOCaiu5ANDMmxUaxOOW6gXt+zBKndGJZRgCR/u9SoAdKv659FSZQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + '@deepseek-ai/dsh-session-format-v1-to-v2@0.2.0-rc.2': + resolution: {integrity: sha512-PBIsz4OBE0wNnapaD87lz6255em24Kn53BKV4K1AqiNH9OWf1+m29TLXs/ICtZ2xigk6TK5H9q6oOVBBmbZyVw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + '@deepseek-ai/dsh-session-format-v2-to-v3@0.2.0-rc.2': + resolution: {integrity: sha512-vrQQ1l3JgPIv/19mhm50FVD40hjro+tAkP3L1PNtGHrbBoYriNWXpR4QDOCQsHdPhg3vpnp9MmARMr8vZzl0Nw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - negotiator@1.1.0: - resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-session-format-v3-to-v4@0.2.0-rc.2': + resolution: {integrity: sha512-UkiNDdGS8cwJKqjvHs52BKi+3NuKhoziz/l0IrDoDYpSdgDfK8HrrXkvIxOi+QaBUgIxNTQzA6tsI+TAIMDsGQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + '@deepseek-ai/dsh-session-format@0.2.0-rc.2': + resolution: {integrity: sha512-qdWtsJt1cLJbUAMCgzRBZ2LyW+XRJpetnle4N/0X/pkmJ9eOM6Y+QqwRQdcEcI4pWuEbPwuq7/HrnqoanVaiwg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-session-log-deepseek@0.2.0-rc.2': + resolution: {integrity: sha512-sfQSvHI+19z1fzw6Fz8kGNHIBnuJ3Fp2HOOF1uSRAypCQaiiIvhcP+1TmDrbix7Dwh1uEcF0A3lqKX92G55ZkQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-session-log-export@0.2.0-rc.2': + resolution: {integrity: sha512-e8Hwf6Cpnv4mWYiN7xFeSwI5qfPhyGhkDF0ln/k+gANwyQltk0hHu1D1aWQ2OTMvMhpJ9i+MlRJH06DA99n26Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + '@deepseek-ai/dsh-session-persistence-jsonl@0.2.0-rc.2': + resolution: {integrity: sha512-iAzXWC8jmiLYjK+wuN/fAKXLniAfClWm0CmEIwSxZnJGVy8c0iy7j5v8UfOqUbwuGfqo5HUWfyLGgxbWH7SG3g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 - opencode-ai@1.18.32: - resolution: {integrity: sha512-SCrZWdq44y/EoH2+fE4HLcXS+DzpVqHPzmXk3p2RrufYy8LWvpfhRhKtijb5ktvx8r94ScqToqwHxR0BwS65OQ==} - os: [darwin, linux, win32] - hasBin: true + '@deepseek-ai/dsh-session-persistence@0.2.0-rc.2': + resolution: {integrity: sha512-2OoRHZYWi5Vy0+1bPU37Y/NTh6uQiZ3VdpvDmW1oCgsapQr2JS/Lbody1gXOMJ1KXglCSLmePgTMC00uKw/UIg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 - opencode-darwin-arm64@1.18.32: - resolution: {integrity: sha512-sDsHk/A6FNqeN5NuAiII6AAhi4pJIFcIY0S2yjG9gToIIVaqrQRaHQ6g0kpoVqTiMci8tvaND6tWD4eDT3ahFw==} - cpu: [arm64] - os: [darwin] + '@deepseek-ai/dsh-session-projection-cache@0.2.0-rc.2': + resolution: {integrity: sha512-w6V+7Xl6drXgTjsfUAY76/dmt+B6WRnNin3Vyf+2Bo+Y2eMjyymlzc3j0+Tz0bH5oaCLD4k5zYKV9sOZEk24Yw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2 - opencode-darwin-x64-baseline@1.18.32: - resolution: {integrity: sha512-xXcVF+98Dk5bm3HXFu7R0xjc6zZSbC5LI7AcTWsnwFZIzOmYMjtCg0MwhEs/FPeMY6aGpl0n6IOS4WlQRXAAcw==} - cpu: [x64] - os: [darwin] + '@deepseek-ai/dsh-session-projection@0.2.0-rc.2': + resolution: {integrity: sha512-caJ+XGjmR8ouws0LrvuXrabrzi21akB2l8CniUHdx4IpT6GkLapFYlWLbjZlDYqEWB3ktR+q32nxW2s+f27GSA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - opencode-darwin-x64@1.18.32: - resolution: {integrity: sha512-ZO/4GTJV/q2jlZ8apN1OfgTdD4m9bkdgLsEWYYDK6O8eTljIFgwhRMrJw1ozucU/D6lLQsA3CX/sS56UtlsTjQ==} - cpu: [x64] - os: [darwin] + '@deepseek-ai/dsh-session-query-sqlite@0.2.0-rc.2': + resolution: {integrity: sha512-LyR/1M40kFBJF8TtidCJLLHNQN07ANWtW8+IISBmH0/XqrfqPGXQGBlxorNEYC+JyJ+QHF8+8ltdThMpdEqdkg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-session-persistence': + optional: true - opencode-linux-arm64-musl@1.18.32: - resolution: {integrity: sha512-G0fHTfilpeJu5VyvBp0H2fl9KnHayePYEibMW1vC0455hQDny+VkFMRKpu6yLYzGbAfjeTqKtRkejrQJD4mLUQ==} - cpu: [arm64] - os: [linux] + '@deepseek-ai/dsh-session-query@0.2.0-rc.2': + resolution: {integrity: sha512-seZkaK6E+L2KVUYbzQ5O3S9kKkINul/1WujXNsE7/9vE4NSg97hJjZxCwqYs81qlEO0Ei3f27+W61EtXOYYoGw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection-cache': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2 + '@deepseek-ai/dsh-tool-todo': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-session-persistence': + optional: true + '@deepseek-ai/dsh-session-projection': + optional: true + '@deepseek-ai/dsh-session-projection-cache': + optional: true - opencode-linux-arm64@1.18.32: - resolution: {integrity: sha512-SDMw716oYxxJ9CWDO5roCpziw98ANwPZSz6L8evUOHkFCq6OU31xZGQwv/T1ROJnoPNJKWODmm1vzS6s6uEgUA==} - cpu: [arm64] - os: [linux] + '@deepseek-ai/dsh-session-reference@0.2.0-rc.2': + resolution: {integrity: sha512-RWiFw97/ydhe9dwiLJwCVTJ78pvEQXZKVu72ZcbIcBZvoD5MUjVy+5dMjwhzVUwqOlaeRYhQZ+XaLZYt0FsEdg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection-cache': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2 + '@deepseek-ai/dsh-spill': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-session-projection-cache': + optional: true + '@deepseek-ai/dsh-spill': + optional: true - opencode-linux-x64-baseline-musl@1.18.32: - resolution: {integrity: sha512-HGa9YBUBdc+qAyC9U8zXUht5qbTufOABOfSwmhukmzl9uMtuGoUovCzilwxytH0mTr/prUT/LAqWcXXoPXjRoA==} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-session-stats@0.2.0-rc.2': + resolution: {integrity: sha512-kA5Yv/FhIbrsFuNuahOPZP28KXbbCnEO6qHAULDvKZ5iO0/MpnriLKeSXRLS657c6DETC25d0I97HBujeNRQgg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 - opencode-linux-x64-baseline@1.18.32: - resolution: {integrity: sha512-XXO4htNdJEoj935NGMYNGjD1M8ZiJPo2u2cQzIyeBjinoClI7iXOHBPw+Twm/ZuzFHKtmI2594bt0GWIwTetkw==} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-session-telemetry-otel@0.2.0-rc.2': + resolution: {integrity: sha512-MIxi5PWmJIkhkPro8DSycrF5TFWgCA+5y0UVHtiHqUN+tXTltAd0OWtG/wAveyaWhbJdsY/jikx0U7YSibcyrg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-anonymous-user-id': 0.2.0-rc.2 + '@deepseek-ai/dsh-command-feedback': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-message-feedback': 0.2.0-rc.2 + '@deepseek-ai/dsh-otel': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-telemetry': 0.2.0-rc.2 + + '@deepseek-ai/dsh-session-telemetry@0.2.0-rc.2': + resolution: {integrity: sha512-L0ST+ZmVYdk2YMzgOZLPZNmhB2htF1HqNahuBJpID2d+XyiWYNy3vXhm/lHPs79FxHKN0XVJUR5mUv//MZK4LQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - opencode-linux-x64-musl@1.18.32: - resolution: {integrity: sha512-ktS7x5Ms+sVMCAb2oRpPKGk10isRjHkwBz6ordNOlx0epx6JQPsTydzJmpLBSdsiFAkfmZoBiYayKDXXU+rwXA==} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-session-title-first-prompt-llm@0.2.0-rc.2': + resolution: {integrity: sha512-72eo8zMep5+okUgUcBCIFhrTVb/5EuR/Ts9W2fbVzSh3+hFC8WKkjKTFrtUMoZeIX9yv2se/R6QC/GH6q0Yjdw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-title-llm': 0.2.0-rc.2 + + '@deepseek-ai/dsh-session-title-llm@0.2.0-rc.2': + resolution: {integrity: sha512-S3WNORrtkrDI6F9NADF2cKdGO8FxS7tvSsf+cxmOu6qJktidRP0/n2O9ePmOX3azZ93Ta/mGNMbPueSs7Dta+Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + + '@deepseek-ai/dsh-session-title@0.2.0-rc.2': + resolution: {integrity: sha512-602qEtmftsQfRzUu4u0sispiHXDGnRGwtS3+isaPmcEDlxETwMjWusatAaGvRIlrl6GGc27mr1IbqxjHWwI5zA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + + '@deepseek-ai/dsh-session-turn-outline@0.2.0-rc.2': + resolution: {integrity: sha512-MMh5n7FpikqC/JkH0M4v+2zO8ezrxonq0XSQ81F7A9lD+eEXGngpspdj/Fatf7l+x9OQpy+BcNqFwlst2i31DA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 - opencode-linux-x64@1.18.32: - resolution: {integrity: sha512-CIatvoyi8V5a56xyw6ZUnsKxB9wqYIZqfNeqUNWhBBY4aENAm907LP0xXAwL6tR0cYbqNl2+Dvx8mOqXIxbDeQ==} - cpu: [x64] - os: [linux] + '@deepseek-ai/dsh-session@0.2.0-rc.2': + resolution: {integrity: sha512-wj+6MeqCYbDcbEvKH3puHyEGdjyu51JwBoN6Ua2tz6griLufDgLM5HpSU40L5xgpbOfrYVhXZs4vRgOrMlFY2g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 - opencode-windows-arm64@1.18.32: - resolution: {integrity: sha512-AFXHn/kYnbsR/5N7Bm5ysv1vjDkQMaJQxPxJeF1OgGoQV48yBXPLIzhTijbt6IsipNBQxdb6xC0yANefpDSD9Q==} - cpu: [arm64] - os: [win32] + '@deepseek-ai/dsh-settings@0.2.0-rc.2': + resolution: {integrity: sha512-Py4ZbCyady6st+h8wlsPJxrAOg9VrT1+tltymnJUiAmdnZjMADZKWec9JrB2KwUuo27R+IbibxzaYQOvnZdUkg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/schemastery': ~3.18.4 + + '@deepseek-ai/dsh-shell-env@0.2.0-rc.2': + resolution: {integrity: sha512-Cl4i32DPSLPra4mt8wBPNVDbV4+mG6UBLGF1EXsmjpj51Xg8slVqPMcs7ThkgesHBG+Fvpbvu4Y0aGhOckcXYw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-shell@0.2.0-rc.2': + resolution: {integrity: sha512-+3uBpxhXSzukUZx7XjdnUVfItj/w4maPQAcDXnVxF8vVt/dHa2NDJBXyYC9fzIA4PnXqVHFURdrhMfFgeD7GJA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 - opencode-windows-x64-baseline@1.18.32: - resolution: {integrity: sha512-pXhJumlv2/g/ubgbfW5VtCnLEfdXw2RZO0j1uVhYVtCCYNjioJUPeLT1oMRF06VbkCo1UuLRfwEFqeFXD59N+A==} - cpu: [x64] - os: [win32] + '@deepseek-ai/dsh-skill-badge@0.2.0-rc.2': + resolution: {integrity: sha512-LbxiwrQIt1DJNdWDpbJxdOqW2rDAjBlMY5RaNxmQv+PPuS2cbpwlO2oFxNP0qmcodu3YPww+t1S5JK7Jsb3dhA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-skill': 0.2.0-rc.2 - opencode-windows-x64@1.18.32: - resolution: {integrity: sha512-9uy0owugtP9nkuylzN9+O9zWUIxt4X+KYwsREVk4G27PCfxccj+xIT7yxO9hCVtrF+DVgiJ59xDpiANE9UZrrQ==} - cpu: [x64] - os: [win32] + '@deepseek-ai/dsh-skill-filesystem@0.2.0-rc.2': + resolution: {integrity: sha512-V/88b4uEFwhCAewQhI/VE7/IvgBkDQb//3/zQjK7xieZ+D9wVpOc5AY8GCcQThZu5aGBnI1gX5ITHPlUHjKUtQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2 + '@deepseek-ai/dsh-skill': 0.2.0-rc.2 - parse5@8.0.1: - resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + '@deepseek-ai/dsh-skill-office@0.2.0-rc.2': + resolution: {integrity: sha512-VCo/orDfkq0tvngJZ9TGfcmnZ1Xud1wrmQdXRiof6DzIu89pEV3q6lfnrnptNynBojKu4dQ1zIChl3jtofamjw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-skill': 0.2.0-rc.2 - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-skill@0.2.0-rc.2': + resolution: {integrity: sha512-3QfzZ6qWfESq1TRoVjEfoBRCTONRLU9aLopKpA7hJg/LZ2GqCgMoSvOwJJL+q2Djbs3oiUyC9qJHRnnN6EacIA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + '@deepseek-ai/dsh-spill-local@0.2.0-rc.2': + resolution: {integrity: sha512-S6OVSa76ngIAk7lT7NymB2tXg/t0GXFodkwTuU/LGu166DmzvLTNlPqvTbxpJw3N1U1M86w5YV7q/DvSOdWCpw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-spill': 0.2.0-rc.2 - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + '@deepseek-ai/dsh-spill-policy@0.2.0-rc.2': + resolution: {integrity: sha512-xuxH8VGxqJHIYlWUcDWvz4HBYswYtm+sfy1Qs31s8YG2E7ATQ58syI78UbSiaTnJqG1TAOZn+YWZyXv1G9KvHQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-spill': 0.2.0-rc.2 + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-spill@0.2.0-rc.2': + resolution: {integrity: sha512-DWcSeURbNzlxMPOtRCzjmM6QTtEzlt7hD26fypE+9guvKPFJ9HUeCg/GQJRfpLbRQqukm4SJroHTSoZitd/t5g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + '@deepseek-ai/dsh-storage-domain@0.2.0-rc.2': + resolution: {integrity: sha512-GHHphcdLUNnFBPY1QOfE3dg6yKenIxB5wpgSNghZ7iG+Ifunwj4tyRUZ6YLKvni3HO9Kog1eIdXlUa9yEux39A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-storage': 0.2.0-rc.2 - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + '@deepseek-ai/dsh-storage-json@0.2.0-rc.2': + resolution: {integrity: sha512-h7pD397LA8JUD3QMz1IUV5kAg4WD6iVSZnMFrrCnN0wBF5B0PS0BDHT+x7zojLtq3MFfyx3JwpmX7uF12S0glg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-storage': 0.2.0-rc.2 - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + '@deepseek-ai/dsh-storage@0.2.0-rc.2': + resolution: {integrity: sha512-tItvFJ1IAurwmZfBdrr8w+GuyLADZXZ01bos06Ma0QmD3+0NNyvo0E9qmYb54TfJ2h5yvRcFosHO1048gzuPPw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} - engines: {node: '>=12'} + '@deepseek-ai/dsh-subagent-fork-in-process@0.2.0-rc.2': + resolution: {integrity: sha512-nFsdyD8EIIkRmsEkmZbIhE5GUXa9/tPStTyTK0FM/WbJTFSyacD6Os9YkoYxgahCfcdlZ3cr/jY4eXVfr+0g2g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent-in-process-driver': 0.2.0-rc.2 + + '@deepseek-ai/dsh-subagent-in-process-driver@0.2.0-rc.2': + resolution: {integrity: sha512-6ZYAipEyviSo4WlAesVM1DWBkLYQVZw/A8lFWOSVJjl5qOb3q4buZcW/Xy7XKw/forwNSkqaPPvJ/s0kdu1iCw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-subagent-spawn-in-process@0.2.0-rc.2': + resolution: {integrity: sha512-7qOuPyeMwaZ2/bFqYnMA6oNLYP+divyV+FlD2PeScDiAcKBI6ZXEhs3wUcT7C04o4zmSXEoalHvlJGAVYUA0jw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent-in-process-driver': 0.2.0-rc.2 - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} + '@deepseek-ai/dsh-subagent@0.2.0-rc.2': + resolution: {integrity: sha512-33izf4xhq03RzolYUjv223tKmeOBl8fMnvnRN15zZB3GWfNRcBTVUUxuu99rCN8TSRRt5A5ABTwYbObb1Isjqw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-permission-presets': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2 + '@deepseek-ai/dsh-settings': '*' + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + '@deepseek-ai/dsh-util-time': 0.2.0-rc.2 + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-agent-preset-registry': + optional: true + '@deepseek-ai/dsh-jobs': + optional: true + '@deepseek-ai/dsh-permission-presets': + optional: true + '@deepseek-ai/dsh-sandbox': + optional: true + '@deepseek-ai/dsh-sandbox-policy': + optional: true + '@deepseek-ai/dsh-session-persistence': + optional: true + '@deepseek-ai/dsh-session-projection': + optional: true + '@deepseek-ai/dsh-session-query': + optional: true + '@deepseek-ai/dsh-settings': + optional: true + '@deepseek-ai/dsh-user-approval': + optional: true + '@deepseek-ai/dsh-workspace': + optional: true - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} - engines: {node: ^10 || ^12 || >=14} + '@deepseek-ai/dsh-subprocess-local@0.2.0-rc.2': + resolution: {integrity: sha512-RKEhReGv6bAOHNeMd9kBwY1mQSuhm0OEiK+wnXkOD8CvesYaYXNUmtoIf9VJdrRhG5DF35gVNQAN79Si9d/BHw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + '@deepseek-ai/dsh-subprocess@0.2.0-rc.2': + resolution: {integrity: sha512-81ULZG0xg2ZKgrs+R+JY8okUwLp8jjsboR+QsMUMf5WFaJ2PueJ+krbhODB2enLx3MUyMX/wR6msnzi14ZNSAA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-http-proxy': 0.2.0-rc.2 - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + '@deepseek-ai/dsh-system-prompt@0.2.0-rc.2': + resolution: {integrity: sha512-ZZNk2gkXFV8CIT0IOZXS+pFaxNVJaRknYyH2vc4ZgZAiHKT+RqUYNr8e1F5Kp0AaN0DNlcTkjOGP5MCxeXfDjg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 - qs@6.15.3: - resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} - engines: {node: '>=0.6'} + '@deepseek-ai/dsh-terminal-bash@0.2.0-rc.2': + resolution: {integrity: sha512-lUavM/UyNaJOcqW6lZlKk3Yro8FO7pA7tSPmP5VTws53jx/zMgX/oKQCraQUBGjStyYPzrcYJEGjEaYx3kYxFQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2 + + '@deepseek-ai/dsh-terminal@0.2.0-rc.2': + resolution: {integrity: sha512-AwyXx3wIsn9sVPNQsxsMQnnXk6WRGeNR3WrzWmg3Arpatbh/w9YTQZbvRKeGsETFDe62lHZ3BT8HJ+echqHurw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 - range-parser@1.3.0: - resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} - engines: {node: '>= 0.6'} + '@deepseek-ai/dsh-time-context@0.2.0-rc.2': + resolution: {integrity: sha512-BI9WBy77/NaHdfGz1UIfWQw9AqPXQYF25CCF9jWwiemdFOfERKJbrQooBtI319dQC+kjvItRHMEgWe0EuhMJ/A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + + '@deepseek-ai/dsh-timeout@0.2.0-rc.2': + resolution: {integrity: sha512-NDob8b8DJDB/sDPz3P7xhrkxOh1O9FbN1EZRKsxP4fuTfp4hrQU7aekYS5qZENFKoR8dBJMTh/zcEBw4m31glQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} + '@deepseek-ai/dsh-tmux-context@0.2.0-rc.2': + resolution: {integrity: sha512-UbHEhxenMyd89imH9rJi02Mw5xPMgWEz2r1lOmicAIDRcYg7OTzsZWkIG9DPIbeJIglriTEKl76Gw85PhTBL4A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + + '@deepseek-ai/dsh-token-meter@0.2.0-rc.2': + resolution: {integrity: sha512-ivkxlbk/bl8t8jxPt62a60U4lE7AxlADelxq91u1dd01oSt3+Y5XBDWDKEVjfhISKyfO4qYHo3MvY6zkU7f3gw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2 + '@deepseek-ai/dsh-compaction-image-offload': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm-retry': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-ask-user@0.2.0-rc.2': + resolution: {integrity: sha512-fRvU7SClHhUKfHnXP7SJitZFgEO4af4Y9kVLBoG+9RpATGINl+PSGChCM6zyz2EI4v0yS0bHsYILwQk82xjsMA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-questions': 0.2.0-rc.2 - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + '@deepseek-ai/dsh-tool-bash-persistent@0.2.0-rc.2': + resolution: {integrity: sha512-R7QzTQsYoTbS/rioRjoiXqJblhq7Noo8sWoI4Y53yYq9/1uF21mdBQzZGMTqB3v/lAYwawSfkEzfxIjzahgMHg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2 + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-bash@0.2.0-rc.2': + resolution: {integrity: sha512-0yjnxm5C7yqX/XWJYFXZVBWXrM6E/6FnjOjt7sN8Itsb5eSHXCz9e5XpKXpLSAPbzq8Kh49yFOw2ZUJRBkOHyw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell-env': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-call-timeout-policy@0.2.0-rc.2': + resolution: {integrity: sha512-rZae/XGLoK5kzJ4LYwA4SQOEp0wmxgJKIzhcYDWEfL1y4JiqHJS+GKvjbXZWyOpMeeTga+hKeHjcI5rRB99xUA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 - rollup@4.62.5: - resolution: {integrity: sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + '@deepseek-ai/dsh-tool-cordis@0.2.0-rc.2': + resolution: {integrity: sha512-KVUah6qgv/mjIRcIXM33SOyy/My+3yDOt1Kb+5GlY77EG4TOIhGlH0MksQDaHXyiGbRU+y1RWDMHi0gHf3Umew==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2 + '@deepseek-ai/dsh-cordis-host-runner': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-fs-search@0.2.0-rc.2': + resolution: {integrity: sha512-2og9HzR1w99kXJbZ4miuIVPdfE3lYXWmBETAQeTZzLmPlKU5G6H9CbGq9lPAQ/lvqHDElJdolH9EO+j+zoFfcQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-spill': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-fs@0.2.0-rc.2': + resolution: {integrity: sha512-QDtVmZoc84iDwrM4ftMDwzuttQd5dXu93NMeas5cSsUvptnW4CiPrMOkYswRXmSry5WRWn7Gk0lSRJ1bpynwiQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-goal@0.2.0-rc.2': + resolution: {integrity: sha512-UeMd6NocvpXMU+jT0ujY/jU6S9SVSYY7H7oMnspBmWSPNdlh7eYHkQbQN9af7SWEhaDKBq5rsYPIOsYiSs2bZQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-goal': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-jobs@0.2.0-rc.2': + resolution: {integrity: sha512-6mqWCkYm+XExCfJbix+pcJ2qcQLNTUtNZQOmfV1IFmpT4j0pGju6b4GbiKaS26yDPegIz71ZW2/tXWzijIsjyg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-present@0.2.0-rc.2': + resolution: {integrity: sha512-B2Qro2ji4NWqTIuBj8gsIB8rs+I84o5l/r1N7RetKN3yqaiH6sGOUOed/jBa8frvv4dx+jcXWOcfPpzEtOo2Cw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-pwsh-persistent@0.2.0-rc.2': + resolution: {integrity: sha512-rfDTDgAWFH0SVPDMKtn0Cg1gTwsmNbPBw5K26S9cwtFaGxlSaGHPL+lTa2RmQwtTkZoDXdbNG4JmnvzIDxY1CQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2 + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-pwsh@0.2.0-rc.2': + resolution: {integrity: sha512-kFL84s7zQSRd2IquZl2LK7g56x4MUWSilSWLoRVwGTTQoW3RMFGjAsMZ9ZmtGjdLGrLeCnBwiXucwswTeqYCmw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell': 0.2.0-rc.2 + '@deepseek-ai/dsh-shell-env': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-ralph@0.2.0-rc.2': + resolution: {integrity: sha512-071tBiqv9EosR2YORosCq4guAhhEV+kB0P/JBKtejeRX4VpH2kR8TY0Y8mmKbjzWdBEncUPsmIqxPtxHbcr1Og==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-workflow': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-skill@0.2.0-rc.2': + resolution: {integrity: sha512-gPD5isAk3AP8oerJ+KiEpZgZ/UAp5g/obSqDJmJrUYzWJ6TYzdY9xFZgb2k8TYDDX7nBM/K5kS7hfRxhH9aerQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-skill': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-str-replace-editor@0.2.0-rc.2': + resolution: {integrity: sha512-NDvuS4kmHFTdYNb5j/h/KwEGl4/CIB/mgQsraYj2gMvAcLz7SKfzyLHiliWFdFP48TnSRAS1JhMmNcQ0TN+T1A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-fs': 0.2.0-rc.2 + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-subagent-control@0.2.0-rc.2': + resolution: {integrity: sha512-qVSnUssL+16M/PW3Vre3UFNoqLq3C14DZ9QzqOQgw6s1FAW1WvF9rzJuIYO/8MFy0g+/+f2nXWzOHD/2Gwylnw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-subagent@0.2.0-rc.2': + resolution: {integrity: sha512-SKfjMFctni9IRFrvLAsr8V/pEBaV1gLOERGAG73fqdqbn4KoizMFCWP3WiKir9/gyDWzzQ2RQg53O9snnEo1Aw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-todo@0.2.0-rc.2': + resolution: {integrity: sha512-B3Yu/1gyFvbzsaYCJdCXj022HEBqJZwKL7fO2Txw1xnDDLgBS79B+NVSYDwxgHGYL7LXbtCyD+8zOyvtc6iItA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-web@0.2.0-rc.2': + resolution: {integrity: sha512-NBH1e06QsDAPGPBpCjp8jr1rv+YX173vyXQ+ENT8IChHFN43S5uNZbzr/EoVTcJ4uAw3OamGXVtD7lU7uF46Jg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-web': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-workflow@0.2.0-rc.2': + resolution: {integrity: sha512-4p4XTet7bLRj2K5ccE2w/+WT15nRvRl9iFMCPv8X9wZB9ymhd/C4DFOp7wmpDMs5NqedsPrsCK7Wi4vXxO+xKQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-workflow': 0.2.0-rc.2 + + '@deepseek-ai/dsh-tool-workspace-dependencies@0.2.0-rc.2': + resolution: {integrity: sha512-5YAtIlVwA3RM1/aGTmTzU4YxIPlzVlKzShvbKk/tmj3WPuZJTWFAr9mTkATMwSyP9IRZPYevWeAwVzkerIF0qQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} + '@deepseek-ai/dsh-tools@0.2.0-rc.2': + resolution: {integrity: sha512-vquUz8PjHWE4zaS3wH70IpYjL441p2UlUcG8TN2yJZN1RhDkuiHum4bWCsjEPyWLS/aB1QJvzdXC2EK/PRkbsQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-ptc-runtime': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2 + + '@deepseek-ai/dsh-typert-loader@0.2.0-rc.2': + resolution: {integrity: sha512-A9jxiG4fuXcU54PG2yqtD9LZe5ikpW1RzWy3VrQDea4U84Lh9Eyp2Flsj2xz8l5V7UD88JqI/CfHnjAGVRsbGA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-typert-registry': 0.2.0-rc.2 - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + '@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2': + resolution: {integrity: sha512-95RvIDcVac2BWdv1IxN6yKlRV+8eEvkofqSxV+d0r8x1kx2EIWEsbdxz6C+coYIm+8e03MiN+rwOt8J7sLfe7Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + '@deepseek-ai/dsh-typert-registry@0.2.0-rc.2': + resolution: {integrity: sha512-Hjepcu0cDTH4rz/SB121SVozg9ix79NBB+HNr0jW0GSHG9O24kNDyufAJD2/S4B97KVN+1nM0T8k1Dx2JSOEWQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} + '@deepseek-ai/dsh-user-approval@0.2.0-rc.2': + resolution: {integrity: sha512-fZMfDp4IeWZMwAKEQkuAYCiGRrwoVWNObvAbpdmQNUavjfYCtwwduWqYQz+5lMQq8vENdczBj7cxnO/pOQ1oZQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 + + '@deepseek-ai/dsh-user-questions@0.2.0-rc.2': + resolution: {integrity: sha512-NrfPt/DBCbkK/+sSSaHT3kG5lA71mnpBbxTDsL9/eS/hVntT+IdthVIZy9tPiuBxCnq1N6iPO874zHlAYa6qCQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-scope': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh-util-code-language@0.2.0-rc.2': + resolution: {integrity: sha512-MYp8KlKWKgwxRfwwMbji4zweDZxVJ1smaneMAKjJvexDc9v+C40o1pJL5Ch/atny8a7O4aiBM1uSvC4bo7/S3g==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} + '@deepseek-ai/dsh-util-crypto@0.2.0-rc.2': + resolution: {integrity: sha512-5OvvmepY69uXTagUMlnoHqg7euI4ZMifLgfdV8xZO20OslWGGiRCkJbZRyDtcJG9GsXWz9UimfWmUu52zKXJ5w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + '@deepseek-ai/dsh-util-time@0.2.0-rc.2': + resolution: {integrity: sha512-x+b6PJ7BQ5HnNs0wa+eojmwkveR5X77VzhfKJ8p7ndB0TAdFGBshji30nxNjn/8aNWMdE90gsIvbtazsrGZn+w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + '@deepseek-ai/dsh-util-values@0.2.0-rc.2': + resolution: {integrity: sha512-qgpsbgiZABuE9UvgNaVo9b2HiWwLeU93CTl9PFXqE0jN8ap1ALxzQsLGvr/q2MJuWDYqnFBg60XnqnY8ZxPWEg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + '@deepseek-ai/dsh-util-workspace-path@0.2.0-rc.2': + resolution: {integrity: sha512-pjjpi+hN29dVf9HMitxo5gUAXKNdYcJ75vNVjKp2T6sdBy0wxcMKlfddu/bYx/xDL3teNBhh17EH7w1asYNNZQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-web-app@0.2.0-rc.2': + resolution: {integrity: sha512-pCIMPLfTKVfY942dP4eJSDVw7iUw86pemzfOr/e5DWP7CdCKTfvA82kP0RJAKJcyKJd8s679hqtCue/p4P20Dg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + '@deepseek-ai/dsh-shell-env': 0.2.0-rc.2 + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2 - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-web-fetch-http@0.2.0-rc.2': + resolution: {integrity: sha512-PJLMAXv0nGdi/wdbzjcEIoaADvUNiGEXnQuF3vaeUzyplal0W1fou4r4klMsHf6aXwMZSXOdkKBocTlIk1U4uw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-http-proxy': 0.2.0-rc.2 + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2 + '@deepseek-ai/dsh-web': 0.2.0-rc.2 - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-web-frontend@0.2.0-rc.2': + resolution: {integrity: sha512-FpxbRvWwWyawsoP3bnErQizR5P2aOwAOwDZcc3YQX+BrQVPkQd3d06w3nLv8Fyo+zeTA+pnlBd2JFTLwlaVVzQ==} - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} + '@deepseek-ai/dsh-web-search-deepseek@0.2.0-rc.2': + resolution: {integrity: sha512-WZUPkdO80qbwPatgl5TfRvMRm02L2UELjRYhizNF8Z0RszO85UJdB04PSKXfKxOvjMKRwTPBsbG0JAdBbLpkqg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2 + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-web': 0.2.0-rc.2 + peerDependenciesMeta: + '@deepseek-ai/dsh-deepseek-account': + optional: true - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + '@deepseek-ai/dsh-web@0.2.0-rc.2': + resolution: {integrity: sha512-d44eM9mMqGnQUGsjqUc6k1G9QrC0w+TWx6Cw6I1iXJkVw5LZ/hpVVzsuCqck8GGS8+GK20kqjGUJSyomfEgd1A==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + '@deepseek-ai/dsh-webhook-github@0.2.0-rc.2': + resolution: {integrity: sha512-QK1KTS4yfWTWKgccEoI7Ei5hIJUz4jUgPXXeGwXHq0gSoyeW0JEAuK2n5HIzHbMAaj9HW2C01oXl3QSLmb7v8w==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2 + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-webhook': 0.2.0-rc.2 + + '@deepseek-ai/dsh-webhook@0.2.0-rc.2': + resolution: {integrity: sha512-sEmiIwKh8nXbdaIOWmXRuTiOUfRDVZENWKxJ+b7r35JKZz3h8k3KuskGm9OjvVbEIAhl0Ka+s1UpvH8JwJLZNg==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-default-model': 0.2.0-rc.2 + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-permission-presets': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2 + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2 + + '@deepseek-ai/dsh-win32-process@0.2.0-rc.2': + resolution: {integrity: sha512-MzzPCWqGFnLe0eiTNrdsy5qGprXV9K2U31D6W8XuyQ/5RVG4dLyI1xiXRnc+cqq8SASgxh0D/hM4wy+I6qNkRQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + '@deepseek-ai/dsh-workflow-ptc@0.2.0-rc.2': + resolution: {integrity: sha512-p/oqiVTlUiNO+qh8XJaJ0/DL7iEA4RFRHfGM2w4XiLwZycmDux9Z7RyAy2QuB2a3euDTejJuEhzkCO+v/oveHQ==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-ptc-runtime': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2 + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + '@deepseek-ai/dsh-workflow': 0.2.0-rc.2 + + '@deepseek-ai/dsh-workflow@0.2.0-rc.2': + resolution: {integrity: sha512-kvRw3d+x+clns+HrknZ6EDy32OEhKTmngS2LBuL7vjQl3XjEbM8QhnxbDW3NaRbEvZ5w2/+2GZqlo0bU/w6Cxw==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-llm': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + + '@deepseek-ai/dsh-workspace-changes@0.2.0-rc.2': + resolution: {integrity: sha512-f1ukSyQSDJPt90daOSHz9S+cZ6L1Boq14ePTX0rUBbTGCMllRcyKHH74ODGzxPm7XEw1joWzQGeWOzSMEP+w0Q==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-agent': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2 + '@deepseek-ai/dsh-tools': 0.2.0-rc.2 + + '@deepseek-ai/dsh-workspace@0.2.0-rc.2': + resolution: {integrity: sha512-Dvu+lzziMr5vpz9+G+qMabg9rJxqViFdNlz8ch56/zDp4tmwY3hnk2JZ4OuuiLHYUuUeM34ic1H5758IL3YKnA==} + peerDependencies: + '@deepseek-ai/cordis': ~4.0.4 + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2 + '@deepseek-ai/dsh-session': 0.2.0-rc.2 + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2 + '@deepseek-ai/dsh-storage': 0.2.0-rc.2 + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2 + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2 + + '@deepseek-ai/dsh@0.2.0-rc.2': + resolution: {integrity: sha512-EAJ3gPNcVt/uv8X19PMm9NkVhWgT7xXNMk0UKCVm+IQ5rpSQOcsMUa0HWlnYYVybKMsccjcRB21vVVsaXQ6IdA==} + hasBin: true - standardwebhooks@1.0.0: - resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + '@deepseek-ai/libreoffice-kit-darwin-arm64@0.1.5': + resolution: {integrity: sha512-SjeXmyaTevEq2TxK7reb1rhCrQZ4QOXmXt/qEwfQD5Fx3odU0ILx2uiXN+nphSCQ95LFCzrElHGgv2c7a824yg==} + engines: {node: '>=22.19.0'} + cpu: [arm64] + os: [darwin] - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} + '@deepseek-ai/libreoffice-kit-darwin-x64@0.1.5': + resolution: {integrity: sha512-vuz2tTpH1Edk75+DISwg/TXdQ3BNSNSHoVnWVqxqbGMgrrK9trLOw2+0X7mjT1naGO00Zc1qkyQ4if3kx5XjqQ==} + engines: {node: '>=22.19.0'} + cpu: [x64] + os: [darwin] - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + '@deepseek-ai/libreoffice-kit-wasm@0.1.5': + resolution: {integrity: sha512-V+pu5xJsKhVD4AU1xbFlMWY91svK9ZIC2JsNOph9kWp/arF/KQcuytt76bcbozJqPbE8o0n04lyh0m3QW5RYSA==} + engines: {node: '>=22.19.0'} + os: [linux] - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + '@deepseek-ai/libreoffice-kit-win32-arm64@0.1.5': + resolution: {integrity: sha512-Av3aFfNLaVxfffu0JXP5mqfmsCU3gQtlUH9UD+zdXl8ON06ukVAmu7LqNyuKAz/68WoOMTQ+YBlVQukgDRKd/A==} + engines: {node: '>=22.19.0'} + cpu: [arm64] + os: [win32] - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + '@deepseek-ai/libreoffice-kit-win32-x64@0.1.5': + resolution: {integrity: sha512-uKuDGZdofxuW4iRmUh8b3+XWU28JeOCYMTAONzo7tEHIq00DV2cARcgUYiTP7gUH49tH4A/RyPMOVEBzK7qjjw==} + engines: {node: '>=22.19.0'} + cpu: [x64] + os: [win32] - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + '@deepseek-ai/libreoffice-kit@0.1.5': + resolution: {integrity: sha512-H12xtUsAyl70zFeQ5pk5GGRc3N1+6zn+DVAcqwlguI6EvqopBGP3xkUmePU7g5f6ydYlDZLWedHT9lTSL7zLxA==} + engines: {node: '>=22.19.0'} + hasBin: true - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + '@deepseek-ai/node-addon-system-darwin-arm64@0.1.2': + resolution: {integrity: sha512-IR0cx8um19mLCZaJ+H5PLblKr6Eg3PWvVo8eTQBr/SwH2nh5tM9CD9/5fHweNS9Pjt15UdFlGqnvLSd/w+O6Rw==} + engines: {node: '>=20'} + cpu: [arm64] + os: [darwin] - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} + '@deepseek-ai/node-addon-system-darwin-x64@0.1.2': + resolution: {integrity: sha512-XDbmquNapk9aT28y4EKn9lbONVr9YNs1NM/GKH1Gi5gUhjOT9wgRaTv72FJdNaVIInbPAYbPoyn7/y+MzQMNNg==} + engines: {node: '>=20'} + cpu: [x64] + os: [darwin] - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + '@deepseek-ai/node-addon-system-linux-arm64@0.1.2': + resolution: {integrity: sha512-Z/DQtqgEYzjBzb2ocHGjMzx51W7xDILkJKKj89nyErr8gZMNiLs+JNL1uKzJqc3VLZB+vYCPaHGyQ3oX6EzEmA==} + engines: {node: '>=20'} + cpu: [arm64] + os: [linux] - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} + '@deepseek-ai/node-addon-system-linux-x64@0.1.2': + resolution: {integrity: sha512-S2aPVHvYCpNCppCFyNlooMYuTB7ucK5lvD9oXQQ42v5Z2s5AoaiCdjz9r2l+ED2rI5oS1x0cUZmKjJH2dxV0pg==} + engines: {node: '>=20'} + cpu: [x64] + os: [linux] - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} + '@deepseek-ai/node-addon-system@0.1.2': + resolution: {integrity: sha512-EFn8K+mXIXiw6s3rxX+cgp2hZTEAQdVIsURhrXnBxycSXvtQ1EQpsSVzoNKtKAQI0I0VqkEcVEjHzS/PeaGsvw==} + engines: {node: '>=20'} - tldts-core@7.4.10: - resolution: {integrity: sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==} + '@deepseek-ai/schemastery@3.18.4': + resolution: {integrity: sha512-SSXO6tYuyrIqKVbmOnIq0s+riUywYzouFMcnBluHF9n4KMo2G8HvEzhCYj6pj2617/glOjbJuVInJ9hfONsjkg==} - tldts@7.4.10: - resolution: {integrity: sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==} + '@earendil-works/pi-ai@0.87.1': + resolution: {integrity: sha512-X/3PfQBnnoeVdO9Cv8zHghUMglzlgNZYGNzoPnbRoGnHl3Rw3TlA2UKSUB7BRHUOxMryHXYa8dnjWZlbRheDZA==} + engines: {node: '>=22.19.0'} hasBin: true - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + '@earendil-works/pi-telemetry@0.87.1': + resolution: {integrity: sha512-MC6TRQH5lgMXpcN+Vku2WMI2T8BsiUPzMQHGo81uqFZD3/9O79WWJAysEDGuzduP6R4tvtgwMLwmqIxynM10JQ==} + engines: {node: '>=22.19.0'} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + + '@google/genai@2.21.0': + resolution: {integrity: sha512-+PDtco2/Z0ONdzCGekCoCT+O1VJS9xJQNN4XzQpXG/t3El/SWWMkCWlFRO1KmivOHPa4Q0VjUYu1HBKCZ/v33Q==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.25.2 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + + '@hono/node-server@2.1.1': + resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.5': + resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.5': + resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-freebsd-wasm32@0.35.5': + resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.4': + resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.4': + resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.4': + resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.3.4': + resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.3.4': + resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.3.4': + resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.3.4': + resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.3.4': + resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.35.5': + resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.35.5': + resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.35.5': + resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.35.5': + resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.35.5': + resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.35.5': + resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.35.5': + resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.35.5': + resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.35.5': + resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.5': + resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.5': + resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.5': + resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.5': + resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] + + '@joplin/turndown-plugin-gfm@1.0.68': + resolution: {integrity: sha512-m8DfAQNC/V7g0j5H6Jv60WhekBBjodD+zTPGrU+g2m+ux/z8ZX07KQIl6kaAmbKwfvsQhC04op52g63I78sVgg==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@js-temporal/polyfill@0.5.1': + resolution: {integrity: sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ==} + engines: {node: '>=12'} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@koromix/koffi-darwin-arm64@3.1.1': + resolution: {integrity: sha512-+Dl0zQDh1Wb55AWOn9hp7K30qgkODvrvN+ZNkFOh81Q0oFX/rpJQtocgjAuYk2zFAcajSeVDumkcHMPwnKSXzA==} + cpu: [arm64] + os: [darwin] + + '@koromix/koffi-darwin-x64@3.1.1': + resolution: {integrity: sha512-cDFAKn1qdZBFLrp7dAc9QUDw3l4xAhTJbOdPWWb0LxssVicUdHcRCLZGrDsmPW2tpH6LGNNeLgqRpAoD2Mo8iA==} + cpu: [x64] + os: [darwin] + + '@koromix/koffi-freebsd-arm64@3.1.1': + resolution: {integrity: sha512-zaP7FJISI/scQW9Wa5QicY3a09WmtKBWSbmC+5nfCqPzwWe7Hx2so74Er7mPsDfCiMMR0Ya+evKbJQDkfyXicg==} + cpu: [arm64] + os: [freebsd] + + '@koromix/koffi-freebsd-ia32@3.1.1': + resolution: {integrity: sha512-7GejVb688TLM8rbjfc0oezJrATxZc0dn801xWEDJekN2DgmRXu7HquGqWQ6z3NeSq7ZxEggz4T3xtlbCysQapA==} + cpu: [ia32] + os: [freebsd] + + '@koromix/koffi-freebsd-x64@3.1.1': + resolution: {integrity: sha512-XLiCFP9OFCyOoGTjAimtDKLhzhfo34WcP1ShVWxRzNCWDGjfz8BYjwd69cp/cDSUXZbxamqs4+/6vmkePq9wxA==} + cpu: [x64] + os: [freebsd] + + '@koromix/koffi-linux-arm64@3.1.1': + resolution: {integrity: sha512-HA9xINK7G4dRAkpfnBWD9VfuyIBgW1SuK+KPHjksUwRMOnhgqP8J/JqgrAzdzcDiefGBkqEacIP776OUwz7knQ==} + cpu: [arm64] + os: [linux] + + '@koromix/koffi-linux-ia32@3.1.1': + resolution: {integrity: sha512-jG7IFytmP8K5Qtbx0ro0ZeuX3JjSsLxmYhq+nmXDdrtOAlxIsWGynuiDLS6Jk3vOchVii2m6Y2f/L3GLG2fG5A==} + cpu: [ia32] + os: [linux] + + '@koromix/koffi-linux-loong64@3.1.1': + resolution: {integrity: sha512-CIsT1cNnih8FuU52Me/IVlJBpH28SQfoDeYPctJswgJzaARktusF7m4MUbtR1PBDjuquCVM4/vFyNdOzfPonvA==} + cpu: [loong64] + os: [linux] + + '@koromix/koffi-linux-riscv64@3.1.1': + resolution: {integrity: sha512-9D6RmqeKsSvs3U6jILJU9PcAjMwKKyn7yLxNBb5k6z9PCoUoGJ3/BrhXAX0qjrLLwEiIpP/hS/40RuXvH8Lc3Q==} + cpu: [riscv64] + os: [linux] + + '@koromix/koffi-linux-x64@3.1.1': + resolution: {integrity: sha512-pyTcX5fePeYbt7TZAwRby69wdlRx3PT+g15ra5IYdat/Pgh3qAKEYeZ+uu7WpPGOy43p/oSRqqZoa2kORzozlA==} + cpu: [x64] + os: [linux] + + '@koromix/koffi-openbsd-ia32@3.1.1': + resolution: {integrity: sha512-iPnPzvG2HOfdzaiG1drdkt86sAqmTPDv9mAf+5gL7mRzkeeQC88EVGboRy7eXwdXn7R+v0ntA3iQxdHrBn6yXw==} + cpu: [ia32] + os: [openbsd] + + '@koromix/koffi-openbsd-x64@3.1.1': + resolution: {integrity: sha512-/Xqc3R0SVoMCYjMPZnJ9bULtRo364+dKmnQhfDrI83tSpxUHRw7HRNf12vBeL+hPgKxSBjtMpWfQ/ZIyVyLFag==} + cpu: [x64] + os: [openbsd] + + '@koromix/koffi-win32-arm64@3.1.1': + resolution: {integrity: sha512-JhqHauEwQvdcWUERxrV5HH/DT9W7hY1A1eU6/o8tB+yck+D3kt5elpRDBt9KjpW6h+vHPy3V0sjDvO0CXyabTA==} + cpu: [arm64] + os: [win32] + + '@koromix/koffi-win32-ia32@3.1.1': + resolution: {integrity: sha512-ZRuyYmlGS/rCc966qqs0qREXDW4FRdul7rDF1VgSWHbVmdc196PUgUT+blq/GjZgTwqzeEXtMRgM+cU8krHjvA==} + cpu: [ia32] + os: [win32] + + '@koromix/koffi-win32-x64@3.1.1': + resolution: {integrity: sha512-KqHPmvj6QILhNyI/To8QSihHsijeVGIYYPBOUnXEpcnH2LuLbargY4Hd6dDeTN3Z90uUUxN+1FWz1UnhVzFOiA==} + cpu: [x64] + os: [win32] + + '@mixmark-io/domino@2.2.0': + resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + + '@modelcontextprotocol/client@2.0.0': + resolution: {integrity: sha512-8f1OghQ2rjzIOfqgUCP+8GiUWqRs89njoWLNqAe8kWmDePv3s1fZXseej+QXemssEuuOvLLmLO/kqM3IQHtISw==} + engines: {node: '>=20'} + + '@modelcontextprotocol/core@2.0.0': + resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==} + engines: {node: '>=20'} + + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} + + '@octokit/openapi-types@29.0.1': + resolution: {integrity: sha512-9qWOMFNxxLokERcms42rU0PTLqQmVs7g5E41TI4mCOxmpFayD1rfC7XxOL55cG9MBZLFlC31BrR37myMKardwg==} + + '@octokit/openapi-webhooks-types@12.1.0': + resolution: {integrity: sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==} + + '@octokit/request-error@7.1.2': + resolution: {integrity: sha512-XZRuT3xZ84D3gYErI1DZvhJ33dCWVV6uzBtWkaBB4TvA/L6eOeTZodxLFVB44bBEEo3vEx7y00UfX1tBLrtLRg==} + engines: {node: '>= 20'} + + '@octokit/types@18.0.0': + resolution: {integrity: sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==} + + '@octokit/webhooks-methods@6.0.0': + resolution: {integrity: sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==} + engines: {node: '>= 20'} + + '@octokit/webhooks@14.2.0': + resolution: {integrity: sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==} + engines: {node: '>= 20'} + + '@opencode-ai/sdk@1.18.32': + resolution: {integrity: sha512-Wi3WtH/cLA3C0ga05lyDb7zac+SzbST9MPwCve1Ffod0xwzHdy9G2gnxvMAR4RBRhKJS32Rgk2cR+fxBhAVSQw==} + + '@opentelemetry/api-logs@0.220.0': + resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@2.11.0': + resolution: {integrity: sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.9.0': + resolution: {integrity: sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/otlp-exporter-base@0.220.0': + resolution: {integrity: sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.220.0': + resolution: {integrity: sha512-lXGrv7KXZ0gNH9SVNUaa6vv6phVYGvJxfXAlMbzbakiXru75f5MZl8Z7oqiMMQD77riVHJCFlQvbZs/VVN2/4A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.11.0': + resolution: {integrity: sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/resources@2.9.0': + resolution: {integrity: sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.220.0': + resolution: {integrity: sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.9.0': + resolution: {integrity: sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.9.0': + resolution: {integrity: sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + + '@rollup/rollup-android-arm-eabi@4.62.5': + resolution: {integrity: sha512-jfkGfTwhQpsiSckPF8r9bU3pn3vyd72NlWaO+TgEO6WPSDnUhXzrNYCHBMOYj0ACaUgjm6eERLF+XV9a6RstoA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.5': + resolution: {integrity: sha512-oGVqyQlxnrz9/ty89oHpU857VUHEl5/Xu4R2lS+aivCTrNnSsbiENzTnNaBsjxH0CNWGPhzHArOLFwo+oKXveA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.5': + resolution: {integrity: sha512-bW7B8xMEq8n99Q3ieEcPRGuphurdZAaFzQc9Efyyw3FL6DZO6pMy9xhdN+kBoD7Sy05xNXSr4OyPPnpkYriS/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.5': + resolution: {integrity: sha512-YSwBS86QeHOGlrxJ1PSOIZSkzRL/JmKeunhc+lV6M1a6En8QuVCD/T/qIA0J4Gd2Y86RIOBYrLcOUtqGh9+/1w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.5': + resolution: {integrity: sha512-2fST8lILgl7cKbme/1KDdPCmbXbG+gqoV3bHp19L0ypX/3akYMBVdOunPleRCwonoLnXOZ/0F+Mt/v8POFmfcQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.5': + resolution: {integrity: sha512-cpIxQCP9J+EVad0a6LO1kY3ZGODlk80VlI+2I96B8xMcdHZ4pLVhfQ49JFpYqjPF91FFkQWftf57YlDcTiw9yQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.5': + resolution: {integrity: sha512-r9fGh3eFs3e/udWh5ZjXQtxiYK/xoFxQaYR/cELxac/Udkl5Th+IsFm0CX3Kl9hmUH/we7EoMpjJgeQNnE0+IA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.62.5': + resolution: {integrity: sha512-xdvFdp7OM6KLJviJT2g/YuRSUjnZgGHk4RNgwIbN7X6cPugOucV60DdHXWzsBVCUdrGb6qSXnJQrrAKMmQuj3Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.62.5': + resolution: {integrity: sha512-rRqILAndyzHzP7T9NFQrq+4HFWNhqkqkKur7eiBpfLmz01PO0JKx5Vchu3YllE4YXI/Ftgq/szrDWg5GJ0mI8g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.62.5': + resolution: {integrity: sha512-Gf4X3qVMucayUvux6aXXPgXovocSFUC0rrffDuPI/S2nHhNMhjcZxsrAFYCOF350PRreW1XwzFj3CT/3bKsWCw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.62.5': + resolution: {integrity: sha512-+s5qA0TNM0qm8PK/a5gt/1Hpx+NV08uSuCncvhziIlQzT6AEV2fnUQo7eBtFTFO0nA9scauvoR2HusfXmQnO4w==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.62.5': + resolution: {integrity: sha512-ybb6QvWwWJCbBWqERpc8K3pYVGIrXlG8MEQ8IIuJY6Y9KdHQxoFoNyfkAOtKn1VHu3KuLidXvwrvGR1mEjeWCw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.62.5': + resolution: {integrity: sha512-nZb1DtnOyhCmYvsC8A2CwOkopVg+IS1+fPUa7rMOAXtNw5+lLCLLPqd6XAiNrGtoQKsbvIBOwsHnBH/3wnb4HQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.62.5': + resolution: {integrity: sha512-yMbj63Sp89ryrXLWyz+sy+fYD2HpOnMCLGbe4Oa1smclFSUukdtD/BgdiHaAetJNb74URD8U4hM+qG5KVzMEkg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.62.5': + resolution: {integrity: sha512-mhoan3OJw2kYV/e1jtIdmvUZgyBFeA6zGWsOswmR0Tg19TQbowZuR+JMLID6spbbBN7Zee2ejrgmy3+FxGrIdA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.62.5': + resolution: {integrity: sha512-5ZTLmjWbb1VZdjuyhe83K/8QO0/h11midQCBP+X5OYn32ra7eOBoM0ZqtaY4nkgNsYgmdVhMYPoyVPTjUpHf3w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.62.5': + resolution: {integrity: sha512-m53kG+br6PGxOTmgBEM2DHSDs9RVjsyEbUwjJPJGTFm1grWOG8EKJggDCTb60unD4Tjby8fi7/m9XfkEWasVWg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.62.5': + resolution: {integrity: sha512-6RHPJR1g/uvdYU8uXBnfq3nlqyZCP82Fr6NHgfGoaIeSh0YEqnX/x6uA9MmJJbnSH7swqX4F+CkGdUF+6doiQA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.62.5': + resolution: {integrity: sha512-xs+OXQtEXgpXT0DmA5+U3qnRZHdCST/5HRQxS8wSPZTUZN/EMWeHuSIod32LQklTBZBV9DyfncKBQ8n5V3eFdw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.62.5': + resolution: {integrity: sha512-e7hD+sl3s+mcLQDZ8pbudBVsdG6r5yN4w3LqG2TJ8sQHDpblWj5lrJs/3m01Cvlxbt4x13zu5thLjgypgtkYzw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.5': + resolution: {integrity: sha512-GiyJaCf+WpMub/17aPcKk27QMl5W6f+KhdPTjlFOn5akH5Wa/DCM9Stdx5cDfmasyKB08MqpVQ1uJE2RkkpbXg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.5': + resolution: {integrity: sha512-+OQ8U2DdoEfXl8T4Fb18AjmEwbXMerKDKCL8yCPAYhKCEEKoul7rkbeGCBFCbAlaGaa7pmtRTpkAJM2LE/i5FA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.5': + resolution: {integrity: sha512-KanvAZrPKbDBFwrgiU9yEVpQoox9QPV1WZOXX7HudJQY+eSlu82CtWxDU8WtuRRvtN5EGkLczkd6Y6DTcvm9wA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.5': + resolution: {integrity: sha512-1aC3UEWTtRl3RK3VpDJ/Tqk1XI4SLTmXIthAq6wRWo8XiSXJNd+VprJM4/1P4+i6HIaFEFlVi9sTTziniD2tOQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.5': + resolution: {integrity: sha512-/gDJaRs4gl0NPIwqCz+6PkpmhhjRAD2j6P4rSNHBzUkO3naEx2mIU0pRle1vUNRQ7mE/+8OOeXLTv/J56FKiQg==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@smithy/core@3.35.1': + resolution: {integrity: sha512-i4YPS4B6ts7bjn7UwLnGjiZdprOvHvgGobFZsYK3GIY3E5hIqtj0rReU69BcTpGp+fvtraSNXeG1l+jtJvF55w==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.5.2': + resolution: {integrity: sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.8.0': + resolution: {integrity: sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.12.1': + resolution: {integrity: sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.7.4': + resolution: {integrity: sha512-tHy0K0VtqNd5Y7Y41h0a0Lhh0L1GzC08dTWg0F7vRJWFtTENg7IZikf3wQkanYIRdb7ngoIPMTmqgUi401fEeQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.19.0': + resolution: {integrity: sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q==} + engines: {node: '>=18.0.0'} + + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@vitest/expect@3.2.7': + resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} + + '@vitest/mocker@3.2.7': + resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.7': + resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} + + '@vitest/runner@3.2.7': + resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} + + '@vitest/snapshot@3.2.7': + resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} + + '@vitest/spy@3.2.7': + resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} + + '@vitest/utils@3.2.7': + resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + + '@vscode/ripgrep-darwin-arm64@1.18.0': + resolution: {integrity: sha512-r3ktHSvbFycQNF6sl7sNDPocpsI7J+mEzh1IaZFkY0spm3k2Z9t8hPAeOK7+p0l6p6/swkQC14XWX01low+94Q==} + cpu: [arm64] + os: [darwin] + + '@vscode/ripgrep-darwin-x64@1.18.0': + resolution: {integrity: sha512-25b4gWbL138dGuQU244ebCKKc0q05ULBMoFSz9oAEUHNeqK/lOJViDS7DRvbDazzAzSEdan391Znks/R5mkaTQ==} + cpu: [x64] + os: [darwin] + + '@vscode/ripgrep-linux-arm64@1.18.0': + resolution: {integrity: sha512-lQ/5zTG++U0E3IhVgS4EPTTn/U4okncaRMM5GOFfOYZywS4nuD31GhkHbNYlDk5CuDC68+hYJ0/eQeyCKJDA+g==} + cpu: [arm64] + os: [linux] + + '@vscode/ripgrep-linux-arm@1.18.0': + resolution: {integrity: sha512-GDAvufNDHu8zqLEmXstalQF0Wh6wQvdsBi/Vg3Yi3CK4a8XoFXqqXVEHEZ9xQz3t0NfoSEc9JbvK9DDS6FxyxQ==} + cpu: [arm] + os: [linux] + + '@vscode/ripgrep-linux-ia32@1.18.0': + resolution: {integrity: sha512-YWLkSUtFd4Jh5EepIhA9RJSfv3uMAVMo+2rBIGHPBnvgLrZciIs2cDKei1/p6Wc/aCzUoHyMAg2R6tw4ZCBKGg==} + cpu: [ia32] + os: [linux] + + '@vscode/ripgrep-linux-ppc64@1.18.0': + resolution: {integrity: sha512-quXVY8fwQ8O/lvU1yrSqSl3jlUzysRSb+AfUfCL/tRtphxsKlFvPAejryZ6vg4Bgvn8XL74xb4qMCDmWgYrT5w==} + cpu: [ppc64] + os: [linux] + + '@vscode/ripgrep-linux-riscv64@1.18.0': + resolution: {integrity: sha512-f5kBQBrWfQt8Q7OhSORuNDei5dkYagBj3y4jImSUXGMy8B/Ke7SltSRcUtjPv166FAFfHCAmWuZp3+cWnX2/Vw==} + cpu: [riscv64] + os: [linux] + + '@vscode/ripgrep-linux-s390x@1.18.0': + resolution: {integrity: sha512-rTOcJFGGcl2c07RUOWUo4U1ndnemKhY6A9hnMB18uk7jSgJc0d/QLBGWMWpumdtoJtpizn/wIv5mXIisJukusQ==} + cpu: [s390x] + os: [linux] + + '@vscode/ripgrep-linux-x64@1.18.0': + resolution: {integrity: sha512-mQ3bVrUpnD2vs7QT0vX90Lt0cnUq467uFtEktIdsJJmW296RoSULRGqWgzG1AKxyBpNDD6l4ZO4qKf6SgyC23Q==} + cpu: [x64] + os: [linux] + + '@vscode/ripgrep-win32-arm64@1.18.0': + resolution: {integrity: sha512-vfTIjq1OHnzUjxZcHVQAMbnggp8dpGf+0QKFOZHwWPqFwXxQC8eCWM+5NUdoJ6yrElCeMzoUTXoK/LdZaniB+Q==} + cpu: [arm64] + os: [win32] + + '@vscode/ripgrep-win32-ia32@1.18.0': + resolution: {integrity: sha512-//rfAE+BOw5AC2EMmepmiE36jUuevtQYNQqqlw1s3m9FlRxjxEut97RkRPHAu9BG4mSojatZx+kXZXNdyI9caQ==} + cpu: [ia32] + os: [win32] + + '@vscode/ripgrep-win32-x64@1.18.0': + resolution: {integrity: sha512-KNPvtElldqILHdnAetujPaowkNbpqJy3ssIGGN6F6Kve9Qi+nNLI2DN01O83JjCEVQbCzl8Ov3QZ9Eov3BR8Dg==} + cpu: [x64] + os: [win32] + + '@vscode/ripgrep@1.18.0': + resolution: {integrity: sha512-ns5lWe44tSfbTMbVUsyB+I1819PVSw4AdpgK0RNkzfWfwy6+3IUNSxwSrfTno1/oWaS/hERNz+XLWVyga2aJBQ==} + + '@xterm/addon-serialize@0.14.0': + resolution: {integrity: sha512-uteyTU1EkrQa2Ux6P/uFl2fzmXI46jy5uoQMKEOM0fKTyiW7cSn0WrFenHm5vO5uEXX/GpwW/FgILvv3r0WbkA==} + + '@xterm/headless@6.0.0': + resolution: {integrity: sha512-5Yj1QINYCyzrZtf8OFIHi47iQtI+0qYFPHmouEfG8dHNxbZ9Tb9YGSuLcsEwj9Z+OL75GJqPyJbyoFer80a2Hw==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + bundle-name@4.1.1: + resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==} + engines: {node: '>=18'} + + byte-counter@0.1.0: + resolution: {integrity: sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==} + engines: {node: '>=20'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@13.0.19: + resolution: {integrity: sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg==} + engines: {node: '>=18'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.2: + resolution: {integrity: sha512-o8vI5RE5A6EVVOd9o41jKp41aJom+QTEO/Bx8MYNjexMo/Bv2WOjUfZr+aL0WnYSgymUy6zeguqLTsIhV0gMvQ==} + engines: {node: '>= 0.8.0'} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + decompress-response@10.0.0: + resolution: {integrity: sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==} + engines: {node: '>=20'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} + engines: {node: '>=0.3.1'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + execa@10.0.1: + resolution: {integrity: sha512-ge98qjkRK4IB7tL7Ju/6qmm5LHoH1eEMt5FNZrz3f4UIYhF28lggX20z3FaX1sgc67msLEn0N0BscOs29iuwyw==} + engines: {node: '>=22'} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.6.2: + resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gaxios@7.3.1: + resolution: {integrity: sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==} + engines: {node: '>=18'} + + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + google-auth-library@10.9.1: + resolution: {integrity: sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==} + engines: {node: '>=18'} + + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@14.6.6: + resolution: {integrity: sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==} + engines: {node: '>=20'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.3: + resolution: {integrity: sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw==} + engines: {node: '>=16.9.0'} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + http-cache-semantics@4.3.0: + resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@9.1.0: + resolution: {integrity: sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==} + engines: {node: '>= 20'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + https-proxy-agent@9.1.0: + resolution: {integrity: sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==} + engines: {node: '>= 20'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.5.0: + resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.5.0: + resolution: {integrity: sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==} + engines: {node: '>= 10'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jose@6.2.10: + resolution: {integrity: sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsbi@4.3.2: + resolution: {integrity: sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==} + + jsdom@30.0.1: + resolution: {integrity: sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + peerDependencies: + canvas: ^3.2.3 + peerDependenciesMeta: + canvas: + optional: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + + koffi@3.1.1: + resolution: {integrity: sha512-mRX6AMeeKCxSOeOopqAcLAl5jcNvge7NAG8l7rF/8gGJATI0tdHFYjteIdE0mGOtWdsrJOij+PjnP8Q9c1gwgA==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-addon-native-custom-loader@0.1.7: + resolution: {integrity: sha512-mny2aBXuqWZLu8xFg0Azk6HZd8tlEBbpkOMhideAY3OABE9tp38VeKo8/sw5g/qeYAAdE8oEmsmeJ5IBJd6YHg==} + engines: {node: '>=20'} + + node-addon-require-builtin-darwin-arm64@0.1.7: + resolution: {integrity: sha512-3n5SgmD6S4lCyeFPumbwfUh+YLssWiSF8GuToHdr00hBPhDikyzHCy2UV5qJUTDNNtUpfw9QuFijsC+ulnvmog==} + engines: {node: '>=20'} + cpu: [arm64] + os: [darwin] + + node-addon-require-builtin-darwin-x64@0.1.7: + resolution: {integrity: sha512-ZelNDiBgGH//ZHw6FCv4VdWUxV2YwdZNa0za7nOJIYodGcow0rJX6san45iOI73/gd2qtyKBOrHgylDjnBblbg==} + engines: {node: '>=20'} + cpu: [x64] + os: [darwin] + + node-addon-require-builtin-linux-arm64-gnu@0.1.7: + resolution: {integrity: sha512-osAdFdxBUeciYOAIMxxIZzVyPK73zex7xJvSAyfDPyY8cTxhGZVZGQnB0ZtZEy3TRQQ2psjWhu5HbcHXIXotXw==} + engines: {node: '>=20'} + cpu: [arm64] + os: [linux] + + node-addon-require-builtin-linux-arm64-musl@0.1.7: + resolution: {integrity: sha512-pN027xk8o64/i1evlncK3VoPGdnflHzMgD+MQ+vApMpu2U6XKc9KAqKiImTpMd+mtGxElkkhD/AXNybF0MscZw==} + engines: {node: '>=20'} + cpu: [arm64] + os: [linux] + + node-addon-require-builtin-linux-x64-gnu@0.1.7: + resolution: {integrity: sha512-HedJA3MGD7I3rH/mPuPIaGTTtSm61L5uHv/90xHPy0tHGlP5cxC9Dt9l/5iwIrTE04LrT0woiG8Ef2Eg2sRyuA==} + engines: {node: '>=20'} + cpu: [x64] + os: [linux] + + node-addon-require-builtin-linux-x64-musl@0.1.7: + resolution: {integrity: sha512-4SkkvMTQqwFRkNzWp8Jc+1e/wMzA893YYX6lhRFFXWcb+igpXq/KD92JEWI0RHr9rrQkwF51/9odyt0Jk9WnDA==} + engines: {node: '>=20'} + cpu: [x64] + os: [linux] + + node-addon-require-builtin-win32-arm64-msvc@0.1.7: + resolution: {integrity: sha512-nooBYRrieUMClXU3HBM+9yfOEXC0EJS3kFGJzu7oXocOgADKmAwt3xpF3YunjnyN9bty9/QaoZRlHG5EBX4Usg==} + engines: {node: '>=20'} + cpu: [arm64] + os: [win32] + + node-addon-require-builtin-win32-ia32-msvc@0.1.7: + resolution: {integrity: sha512-i3/cymlUwzReJTtFLC75m+Gabi1RWa4ym4KgVThGLySy4/EJ0QldTv5VWHg3i7HP/g8gIWXwFrxTFk5v2DGchA==} + engines: {node: '>=20 <23'} + cpu: [ia32] + os: [win32] + + node-addon-require-builtin-win32-x64-msvc@0.1.7: + resolution: {integrity: sha512-iwYELawC0J+nKFTIfJumU53VzTVDshSFUZCU6oUb4Uw+JAfsXCCA2WaSQbtmHng6ub0HEFqWgfh/Wp+qsEVtNg==} + engines: {node: '>=20'} + cpu: [x64] + os: [win32] + + node-addon-require-builtin@0.1.7: + resolution: {integrity: sha512-2/yiwaMEpIJdrsjwY/09IoLMLKJtyJGlPhtJd80a+B4x0+SYsnAorg5GlDyJHfTb/UgiIYzbNOgL3HHrigFaAQ==} + engines: {node: '>=20'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-pty@1.2.0-beta.15: + resolution: {integrity: sha512-vORSzHXi4Ofl7HemVWpuudLqCPdaQb4LfpRCUpE5HPxhp4JYscl8zZwxh11p26v2wvW24WMwnMfLjhRLixrfxA==} + + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@11.0.4: + resolution: {integrity: sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==} + engines: {node: '>=20'} + + openai@6.40.0: + resolution: {integrity: sha512-MWtTjd/gQt4jpbji61NTgFWJLoY/PdRJ6wG9/ZDRMYNMlBKrCrSlkLI+KgHP1vR1qT6LKSAyAqIxno6lcK9JiA==} + peerDependencies: + ws: ^8.18.0 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + opencode-ai@1.18.32: + resolution: {integrity: sha512-SCrZWdq44y/EoH2+fE4HLcXS+DzpVqHPzmXk3p2RrufYy8LWvpfhRhKtijb5ktvx8r94ScqToqwHxR0BwS65OQ==} + os: [darwin, linux, win32] + hasBin: true + + opencode-darwin-arm64@1.18.32: + resolution: {integrity: sha512-sDsHk/A6FNqeN5NuAiII6AAhi4pJIFcIY0S2yjG9gToIIVaqrQRaHQ6g0kpoVqTiMci8tvaND6tWD4eDT3ahFw==} + cpu: [arm64] + os: [darwin] + + opencode-darwin-x64-baseline@1.18.32: + resolution: {integrity: sha512-xXcVF+98Dk5bm3HXFu7R0xjc6zZSbC5LI7AcTWsnwFZIzOmYMjtCg0MwhEs/FPeMY6aGpl0n6IOS4WlQRXAAcw==} + cpu: [x64] + os: [darwin] + + opencode-darwin-x64@1.18.32: + resolution: {integrity: sha512-ZO/4GTJV/q2jlZ8apN1OfgTdD4m9bkdgLsEWYYDK6O8eTljIFgwhRMrJw1ozucU/D6lLQsA3CX/sS56UtlsTjQ==} + cpu: [x64] + os: [darwin] + + opencode-linux-arm64-musl@1.18.32: + resolution: {integrity: sha512-G0fHTfilpeJu5VyvBp0H2fl9KnHayePYEibMW1vC0455hQDny+VkFMRKpu6yLYzGbAfjeTqKtRkejrQJD4mLUQ==} + cpu: [arm64] + os: [linux] + + opencode-linux-arm64@1.18.32: + resolution: {integrity: sha512-SDMw716oYxxJ9CWDO5roCpziw98ANwPZSz6L8evUOHkFCq6OU31xZGQwv/T1ROJnoPNJKWODmm1vzS6s6uEgUA==} + cpu: [arm64] + os: [linux] + + opencode-linux-x64-baseline-musl@1.18.32: + resolution: {integrity: sha512-HGa9YBUBdc+qAyC9U8zXUht5qbTufOABOfSwmhukmzl9uMtuGoUovCzilwxytH0mTr/prUT/LAqWcXXoPXjRoA==} + cpu: [x64] + os: [linux] + + opencode-linux-x64-baseline@1.18.32: + resolution: {integrity: sha512-XXO4htNdJEoj935NGMYNGjD1M8ZiJPo2u2cQzIyeBjinoClI7iXOHBPw+Twm/ZuzFHKtmI2594bt0GWIwTetkw==} + cpu: [x64] + os: [linux] + + opencode-linux-x64-musl@1.18.32: + resolution: {integrity: sha512-ktS7x5Ms+sVMCAb2oRpPKGk10isRjHkwBz6ordNOlx0epx6JQPsTydzJmpLBSdsiFAkfmZoBiYayKDXXU+rwXA==} + cpu: [x64] + os: [linux] + + opencode-linux-x64@1.18.32: + resolution: {integrity: sha512-CIatvoyi8V5a56xyw6ZUnsKxB9wqYIZqfNeqUNWhBBY4aENAm907LP0xXAwL6tR0cYbqNl2+Dvx8mOqXIxbDeQ==} + cpu: [x64] + os: [linux] + + opencode-windows-arm64@1.18.32: + resolution: {integrity: sha512-AFXHn/kYnbsR/5N7Bm5ysv1vjDkQMaJQxPxJeF1OgGoQV48yBXPLIzhTijbt6IsipNBQxdb6xC0yANefpDSD9Q==} + cpu: [arm64] + os: [win32] + + opencode-windows-x64-baseline@1.18.32: + resolution: {integrity: sha512-pXhJumlv2/g/ubgbfW5VtCnLEfdXw2RZO0j1uVhYVtCCYNjioJUPeLT1oMRF06VbkCo1UuLRfwEFqeFXD59N+A==} + cpu: [x64] + os: [win32] + + opencode-windows-x64@1.18.32: + resolution: {integrity: sha512-9uy0owugtP9nkuylzN9+O9zWUIxt4X+KYwsREVk4G27PCfxccj+xIT7yxO9hCVtrF+DVgiJ59xDpiANE9UZrrQ==} + cpu: [x64] + os: [win32] + + p-cancelable@4.0.1: + resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} + engines: {node: '>=14.16'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + partial-json@0.1.7: + resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.2.1: + resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} + engines: {node: '>=20'} + + pretty-ms@9.3.1: + resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} + engines: {node: '>=18'} + + protobufjs@7.6.6: + resolution: {integrity: sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent-negotiate@1.1.0: + resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} + engines: {node: '>= 20'} + peerDependencies: + kerberos: ^2.0.0 + peerDependenciesMeta: + kerberos: + optional: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + responselike@4.0.2: + resolution: {integrity: sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==} + engines: {node: '>=20'} + + restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + rollup@4.62.5: + resolution: {integrity: sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.35.5: + resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + sherpa-onnx-darwin-arm64@1.13.8: + resolution: {integrity: sha512-FPNgJMgnWVl/KhRTIhG3KL3A4Om63Rn4YKXc9/uHY7SzLcvqLJLc/h7UBWJwduXvv7K18t5NpxHR6XgXn4sjWw==} + cpu: [arm64] + os: [darwin] + + sherpa-onnx-darwin-x64@1.13.8: + resolution: {integrity: sha512-7BLRpjM6w4f9W46/nmkmq8lEKUayhebvcpslCVQ+6QN2uReYlZEMDZlSpXMjme+hUFrPfRz8P3UNq8ep/4d19g==} + cpu: [x64] + os: [darwin] + + sherpa-onnx-linux-arm64@1.13.8: + resolution: {integrity: sha512-Tlg7a70b/Wge3OF8IgTHF9jhSVCsLyKQKhwc4BsJ5A+dL/SrFtGBjzuHp4XeLhiiOT7afCxX5PdSn/D4c8Lnuw==} + cpu: [arm64] + os: [linux] + + sherpa-onnx-linux-x64@1.13.8: + resolution: {integrity: sha512-6plnhjagsSeTntCgnlag86hWbs/uZE9Crms1LgOb68/1nKsIQjMd+WG519m+aPwT6TrsBOiEMzrx41t8sL5L5g==} + cpu: [x64] + os: [linux] + + sherpa-onnx-node@1.13.8: + resolution: {integrity: sha512-MsDMBdhLFTZ1GwvcGSSQhnS7g/EA8OMH6IYysCVUOM7j8Icty9KRc0E6YT1A5fWBsZwRfKOeh88QC95aRvS8ag==} + + sherpa-onnx-win-ia32@1.13.8: + resolution: {integrity: sha512-H0Ojln9hfvM+pxWqW0cnjB/XK8/JPq4/k0IWu2JpY5Z458M3zv+XC3Hu+wmot3AoH/K1Bgt23n/tTKtPV9x8qg==} + cpu: [ia32] + os: [win32] + + sherpa-onnx-win-x64@1.13.8: + resolution: {integrity: sha512-oZF1c9VPOKtMwn83Bboc5XSWL+76BRoyB3eUuVnCknBKxwSULZU2Foia9VHWzU+n4I12rPsP6z6H9Rp1hD9o8g==} + cpu: [x64] + os: [win32] + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + standardwebhooks@1.0.0: + resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tldts-core@7.4.10: + resolution: {integrity: sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==} + + tldts@7.4.10: + resolution: {integrity: sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==} + hasBin: true + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + turndown@7.2.4: + resolution: {integrity: sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==} + engines: {node: '>=18', npm: '>=9'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typebox@1.3.27: + resolution: {integrity: sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@8.10.0: + resolution: {integrity: sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==} + engines: {node: '>=22.19.0'} + + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.7: + resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.7 + '@vitest/ui': 3.2.7 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + whatwg-url@17.1.0: + resolution: {integrity: sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==} + engines: {node: ^22.14.0 || >=24.0.0} + + which-command@0.1.0: + resolution: {integrity: sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==} + engines: {node: '>=22'} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@1.0.1: + resolution: {integrity: sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==} + engines: {node: '>=20'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + +snapshots: + + '@agentclientprotocol/sdk@1.4.0(zod@4.6.5)': + dependencies: + zod: 4.6.5 + + '@agentclientprotocol/sdk@1.7.0(zod@4.6.5)': + dependencies: + zod: 4.6.5 + + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.283': + optional: true + + '@anthropic-ai/claude-agent-sdk@0.3.283(@anthropic-ai/sdk@0.124.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5))(zod@4.6.5)': + dependencies: + '@anthropic-ai/sdk': 0.124.0(zod@4.6.5) + '@modelcontextprotocol/sdk': 1.30.0(zod@4.6.5) + zod: 4.6.5 + optionalDependencies: + '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.283 + '@anthropic-ai/claude-agent-sdk-darwin-x64': 0.3.283 + '@anthropic-ai/claude-agent-sdk-linux-arm64': 0.3.283 + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.3.283 + '@anthropic-ai/claude-agent-sdk-linux-x64': 0.3.283 + '@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.3.283 + '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.283 + '@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.283 + + '@anthropic-ai/sdk@0.124.0(zod@4.6.5)': + dependencies: + json-schema-to-ts: 3.1.1 + standardwebhooks: 1.0.0 + optionalDependencies: + zod: 4.6.5 + + '@asamuzakjp/css-color@6.0.7': + dependencies: + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + lru-cache: 11.5.2 + optional: true + + '@asamuzakjp/dom-selector@8.3.2': + dependencies: + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 + optional: true + + '@aws-sdk/client-bedrock-runtime@3.1127.0': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/credential-provider-node': 3.972.84 + '@aws-sdk/eventstream-handler-node': 3.972.35 + '@aws-sdk/middleware-eventstream': 3.972.30 + '@aws-sdk/middleware-websocket': 3.972.54 + '@aws-sdk/token-providers': 3.1127.0 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/core@3.978.1': + dependencies: + '@aws-sdk/types': 3.974.6 + '@aws-sdk/xml-builder': 3.972.41 + '@aws/lambda-invoke-store': 0.3.0 + '@smithy/core': 3.35.1 + '@smithy/signature-v4': 5.7.4 + '@smithy/types': 4.19.0 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.72': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.74': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.973.17': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/credential-provider-env': 3.972.72 + '@aws-sdk/credential-provider-http': 3.972.74 + '@aws-sdk/credential-provider-login': 3.972.79 + '@aws-sdk/credential-provider-process': 3.972.72 + '@aws-sdk/credential-provider-sso': 3.973.16 + '@aws-sdk/credential-provider-web-identity': 3.972.78 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/credential-provider-imds': 4.5.2 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-login@3.972.79': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-node@3.972.84': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.72 + '@aws-sdk/credential-provider-http': 3.972.74 + '@aws-sdk/credential-provider-ini': 3.973.17 + '@aws-sdk/credential-provider-process': 3.972.72 + '@aws-sdk/credential-provider-sso': 3.973.16 + '@aws-sdk/credential-provider-web-identity': 3.972.78 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/credential-provider-imds': 4.5.2 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.972.72': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.973.16': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/token-providers': 3.1138.0 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-web-identity@3.972.78': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/eventstream-handler-node@3.972.35': + dependencies: + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-eventstream@3.972.30': + dependencies: + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-websocket@3.972.54': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/signature-v4': 5.7.4 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.997.46': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/signature-v4-multi-region': 3.996.47 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.996.47': + dependencies: + '@aws-sdk/types': 3.974.6 + '@smithy/signature-v4': 5.7.4 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1127.0': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1138.0': + dependencies: + '@aws-sdk/core': 3.978.1 + '@aws-sdk/nested-clients': 3.997.46 + '@aws-sdk/types': 3.974.6 + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/types@3.974.6': + dependencies: + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.41': + dependencies: + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.3.0': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/runtime@7.29.7': {} + + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + optional: true + + '@csstools/color-helpers@6.1.1': + optional: true + + '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + optional: true + + '@csstools/css-color-parser@4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.1.1 + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + optional: true + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + optional: true + + '@csstools/css-syntax-patches-for-csstree@1.1.8(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + optional: true + + '@csstools/css-tokenizer@4.0.0': + optional: true + + '@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + + '@deepseek-ai/cordis-plugin-include@1.0.9(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/cosmokit': 1.8.5 + js-yaml: 4.3.2 + + '@deepseek-ai/cordis-plugin-loader@1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cosmokit': 1.8.5 + '@deepseek-ai/schemastery': 3.18.4 + optionalDependencies: + node-addon-require-builtin: 0.1.7 + + '@deepseek-ai/cordis-plugin-timer@1.1.6(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cosmokit': 1.8.5 + + '@deepseek-ai/cordis@4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)': + dependencies: + '@deepseek-ai/cosmokit': 1.8.5 + '@standard-schema/spec': 1.1.0 + optionalDependencies: + '@deepseek-ai/cordis-plugin-include': 1.0.9(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + + '@deepseek-ai/cosmokit@1.8.5': {} + + '@deepseek-ai/dsh-acp-app@0.2.0-rc.2(3eab894774abc6548931023b847da072)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-acp': 0.2.0-rc.2(0bd929bef664db3893aad48c38a74693) + '@deepseek-ai/dsh-cmdline': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + commander: 15.0.0 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-loader' + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-attachment' + - '@deepseek-ai/dsh-llm' + - '@deepseek-ai/dsh-mcp-client' + - '@deepseek-ai/dsh-session' + - '@deepseek-ai/dsh-session-persistence' + - '@deepseek-ai/dsh-token-meter' + - '@deepseek-ai/dsh-user-approval' + - zod + + '@deepseek-ai/dsh-acp@0.2.0-rc.2(0bd929bef664db3893aad48c38a74693)': + dependencies: + '@agentclientprotocol/sdk': 1.4.0(zod@4.6.5) + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-mcp-client': 0.2.0-rc.2(4f0df4fd67df1f951ab027e4a0172f10) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + optionalDependencies: + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523) + transitivePeerDependencies: + - zod + + '@deepseek-ai/dsh-agent-default-model@0.2.0-rc.2(5a5f69dac67942c6551ebcc62d37d3ac)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-config-editor': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-app-boot@0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-hmr@0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-include' + - '@deepseek-ai/cordis-plugin-loader' + - '@deepseek-ai/dsh-app-boot' + - '@deepseek-ai/dsh-hmr' + + '@deepseek-ai/dsh-agent-instructions@0.2.0-rc.2(db65c17a76a6040365a522863f221c25)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-agent-loop@0.2.0-rc.2(0c5ce3d184ce320f0d23631770cc12ac)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-include': 1.0.9(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-settings': 0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + js-yaml: 4.3.2 + zod: 4.6.5 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-group' + - '@deepseek-ai/dsh-home-paths' + - '@deepseek-ai/dsh-launch-environment' + + '@deepseek-ai/dsh-agent-preset@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-agent-tool-presentation@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + optionalDependencies: + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + + '@deepseek-ai/dsh-anonymous-user-id@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-api-account-controller@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + zod: 4.6.5 + + '@deepseek-ai/dsh-api-gateway@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-deque': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + ws: 8.22.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@deepseek-ai/dsh-api-job-controller@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-api-remotes@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-deque': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-api-session-controller@0.2.0-rc.2(17d7a38790346cf58761755423db9cf6)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-agent-default-model': 0.2.0-rc.2(5a5f69dac67942c6551ebcc62d37d3ac) + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + '@deepseek-ai/dsh-api-gateway': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-client-file-upload': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-deque': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-file-reference': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50)) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-native-command': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-typert-registry': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-time': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-workspace-path': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + '@deepseek-ai/schemastery': 3.18.4 + mime-types: 3.0.2 + zod: 4.6.5 + optionalDependencies: + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session-projection-cache': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-storage-domain@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-settings': 0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd) + + '@deepseek-ai/dsh-api-settings-controller@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-native-command@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-native-command': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-settings': 0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-api-terminal-controller@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-deque': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-lazy-require': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + '@xterm/addon-serialize': 0.14.0 + '@xterm/headless': 6.0.0 + zod: 4.6.5 + + '@deepseek-ai/dsh-api-workspace-controller@0.2.0-rc.2(7b1cc3b3e03980f49f8901a2ede23841)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-api-gateway': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-deque': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-host-directory-picker': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-native-command': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-api-workspace-files@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-deque': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-app-boot@0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-group': 1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/cordis-plugin-include': 1.0.9(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-package-manifest': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@eslint-community/regexpp': 4.12.2 + ajv: 8.20.0 + js-yaml: 4.3.2 + node-addon-require-builtin: 0.1.7 + resolve.exports: 2.0.3 + semver: 7.8.5 + + '@deepseek-ai/dsh-atomic-write@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-attachment-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@types/node@22.20.1)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-lazy-require': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + sharp: 0.35.5(@types/node@22.20.1) + transitivePeerDependencies: + - '@types/node' + + '@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-authorization@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-base@0.2.0-rc.2(e87e4a509fd42d963fd62fe9a19b068d)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-timer': 1.1.6(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-agent-default-model': 0.2.0-rc.2(5a5f69dac67942c6551ebcc62d37d3ac) + '@deepseek-ai/dsh-agent-instructions': 0.2.0-rc.2(db65c17a76a6040365a522863f221c25) + '@deepseek-ai/dsh-agent-loop': 0.2.0-rc.2(0c5ce3d184ce320f0d23631770cc12ac) + '@deepseek-ai/dsh-api-gateway': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-attachment-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@types/node@22.20.1) + '@deepseek-ai/dsh-authorization': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-bash-sandbox': 0.2.0-rc.2(46d1da74335fdb84a85cef9fdec52573) + '@deepseek-ai/dsh-command-compact': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-commands@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f)) + '@deepseek-ai/dsh-command-feedback': 0.2.0-rc.2(312c5a868ca31b765736358d4dd7834b) + '@deepseek-ai/dsh-command-goal': 0.2.0-rc.2(07b85e24432aeb6ad4bd75aa585cd3c3) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-compaction-basic': 0.2.0-rc.2(760980f6c53b9f9729550073c2cbbc3e) + '@deepseek-ai/dsh-compaction-image-offload': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-compaction-tool-result-pruner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-token-meter@0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523)) + '@deepseek-ai/dsh-config-editor': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-app-boot@0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-hmr@0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e)) + '@deepseek-ai/dsh-credentials-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-atomic-write@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-deepseek-account-platform': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-authorization@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-fs-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))) + '@deepseek-ai/dsh-fs-observation-policy': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))) + '@deepseek-ai/dsh-fs-sandbox': 0.2.0-rc.2(0b1f1d1c43ed7223d021a7bc2480be4c) + '@deepseek-ai/dsh-goal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-goal-round-driver': 0.2.0-rc.2(5c3900aa9f9541b387be984f36df13ce) + '@deepseek-ai/dsh-hmr': 0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e) + '@deepseek-ai/dsh-jobs-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-jobs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm-deepseek-account': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm-deepseek-api-key': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm-pi-ai': 0.2.0-rc.2(842fd1c1a6c4ff412c4429d02528cc1c) + '@deepseek-ai/dsh-llm-retry': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-mcp-resources': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-otel': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-permission-presets': 0.2.0-rc.2(448ef37bda4bdf9586ac4f04627fa819) + '@deepseek-ai/dsh-plan-mode': 0.2.0-rc.2(06634474cb0f88d42acff6017c793812) + '@deepseek-ai/dsh-plugin-manager': 0.2.0-rc.2(e2feab0f8dc72d84d677efa8a24873fd) + '@deepseek-ai/dsh-plugin-package-inventory-deepseek': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-ptc-runtime-node': 0.2.0-rc.2(602792dfa7721b6d1559156618c13f33) + '@deepseek-ai/dsh-pwsh-sandbox': 0.2.0-rc.2(ca41ba58d4d939c5ee782fb330f5d055) + '@deepseek-ai/dsh-repeat-tool-reminder': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-sandbox-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-checkpoint-policy': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-session-log-deepseek': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-persistence-jsonl': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-projection-cache': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-storage-domain@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-query-sqlite': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-query@0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-telemetry-otel': 0.2.0-rc.2(701bd9cabaf02d328ff5afb0e5aecf5f) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-title-first-prompt-llm': 0.2.0-rc.2(250b28a4e3502a43c4cf27b9e7fcae12) + '@deepseek-ai/dsh-settings': 0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd) + '@deepseek-ai/dsh-shell-env': 0.2.0-rc.2(2953c72f9ae4319fab608de446fbd4ea) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-skill-badge': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-skill-filesystem': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-spill-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-spill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-spill-policy': 0.2.0-rc.2(e98a47328d48f82655041b962fcbd6c2) + '@deepseek-ai/dsh-storage': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-storage-json': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-subagent-fork-in-process': 0.2.0-rc.2(ce1467095c38829bb40d353fd3638d13) + '@deepseek-ai/dsh-subagent-spawn-in-process': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-subagent-in-process-driver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd)) + '@deepseek-ai/dsh-subprocess-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523) + '@deepseek-ai/dsh-tool-bash': 0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0) + '@deepseek-ai/dsh-tool-call-timeout-policy': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-fs': 0.2.0-rc.2(bf0da04cc963a4827c7c5eca38b096b0) + '@deepseek-ai/dsh-tool-fs-search': 0.2.0-rc.2(dd915b1c3d0ea66ee534758c47dc32c7) + '@deepseek-ai/dsh-tool-goal': 0.2.0-rc.2(0cbb55cbe546d8bf5341776ccf28bbfc) + '@deepseek-ai/dsh-tool-jobs': 0.2.0-rc.2(f3945ee8fcbc3a4f4103e8ae4bee1d5e) + '@deepseek-ai/dsh-tool-present': 0.2.0-rc.2(c36f844b60a72d86908982aee736ca61) + '@deepseek-ai/dsh-tool-pwsh': 0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0) + '@deepseek-ai/dsh-tool-ralph': 0.2.0-rc.2(53655b90538bfc69350fb2b5c78e6d70) + '@deepseek-ai/dsh-tool-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-subagent': 0.2.0-rc.2(9d8de5ed31573fa7fe44b3535f76fbc8) + '@deepseek-ai/dsh-tool-subagent-control': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-todo': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-web': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tool-workflow': 0.2.0-rc.2(d642948f5ad5138419d570351a3a7620) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-typert-loader': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-typert-registry@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-typert-registry': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-user-questions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-web': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-web-fetch-http': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-web-search-deepseek': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-workflow-ptc': 0.2.0-rc.2(bdb5ff3b22107a69c834ceb000f872ea) + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-group' + - '@deepseek-ai/cordis-plugin-include' + - '@deepseek-ai/cordis-plugin-loader' + - '@deepseek-ai/dsh-agent-preset-registry' + - '@deepseek-ai/dsh-anonymous-user-id' + - '@deepseek-ai/dsh-app-boot' + - '@deepseek-ai/dsh-atomic-write' + - '@deepseek-ai/dsh-attachment' + - '@deepseek-ai/dsh-bash-local' + - '@deepseek-ai/dsh-brand' + - '@deepseek-ai/dsh-client-connection' + - '@deepseek-ai/dsh-cmdline' + - '@deepseek-ai/dsh-compaction' + - '@deepseek-ai/dsh-credentials' + - '@deepseek-ai/dsh-deepseek-account' + - '@deepseek-ai/dsh-fs' + - '@deepseek-ai/dsh-home-paths' + - '@deepseek-ai/dsh-host-plugin-inventory' + - '@deepseek-ai/dsh-host-webserver' + - '@deepseek-ai/dsh-http-proxy' + - '@deepseek-ai/dsh-invariants' + - '@deepseek-ai/dsh-jobs' + - '@deepseek-ai/dsh-launch-environment' + - '@deepseek-ai/dsh-llm-deepseek' + - '@deepseek-ai/dsh-message-feedback' + - '@deepseek-ai/dsh-output-retention' + - '@deepseek-ai/dsh-ptc-runtime' + - '@deepseek-ai/dsh-pwsh-local' + - '@deepseek-ai/dsh-sandbox' + - '@deepseek-ai/dsh-scope' + - '@deepseek-ai/dsh-session-persistence' + - '@deepseek-ai/dsh-session-query' + - '@deepseek-ai/dsh-session-telemetry' + - '@deepseek-ai/dsh-session-title-llm' + - '@deepseek-ai/dsh-shell' + - '@deepseek-ai/dsh-spill' + - '@deepseek-ai/dsh-subagent-in-process-driver' + - '@deepseek-ai/dsh-subprocess' + - '@deepseek-ai/dsh-timeout' + - '@deepseek-ai/dsh-typert-protocol' + - '@deepseek-ai/dsh-util-time' + - '@deepseek-ai/dsh-util-values' + - '@deepseek-ai/dsh-workflow' + - '@deepseek-ai/dsh-workspace' + - '@deepseek-ai/schemastery' + - '@modelcontextprotocol/sdk' + - '@opentelemetry/api' + - '@types/node' + - bufferutil + - kerberos + - node-addon-require-builtin + - supports-color + - utf-8-validate + - ws + - zod + + '@deepseek-ai/dsh-bash-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-bash-sandbox@0.2.0-rc.2(46d1da74335fdb84a85cef9fdec52573)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-bash-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-chunked-list@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + zod: 4.6.5 + + '@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + transitivePeerDependencies: + - '@deepseek-ai/dsh-invariants' + + '@deepseek-ai/dsh-client-file-upload@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + zod: 4.6.5 + + '@deepseek-ai/dsh-client-hmr@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-locale@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-modules@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-product-analytics@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-client-resources@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-shortcuts@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-util-crypto': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-store@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-agent-preset@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-approval@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-brand-official@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-chat@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-commands@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-conversation@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-cordis@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-deliverables@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-client-ui-directory-picker-browse@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-directory-picker-native@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-goal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-input-trigger@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-jobs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-layout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-message-feedback@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-model-selection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-open-in-app@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-permission-presets@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-plan@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-plugin-manager@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-client-ui-primitives@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-reference@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-renderer@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-schedule@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-settings-agent-loop@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings-general@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-settings-models@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-settings-plugin-inventory@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings-plugins@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings-session-log@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings-subagent@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings-web-search@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-settings@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-shortcuts@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-sidebar-browser@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-sidebar-documentpreview@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-sidebar-files@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-sidebar-right@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-sidebar-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-sidebar@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-slots@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-subagent@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-theme@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-client-ui-tool@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-trajectory@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-user-questions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-workflow-run@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-client-ui-workspace@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-cmdline@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + + '@deepseek-ai/dsh-command-compact@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-commands@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f) + + '@deepseek-ai/dsh-command-feedback@0.2.0-rc.2(312c5a868ca31b765736358d4dd7834b)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-anonymous-user-id': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + zod: 4.6.5 + + '@deepseek-ai/dsh-command-goal@0.2.0-rc.2(07b85e24432aeb6ad4bd75aa585cd3c3)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-goal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-commands@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-crypto': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + zod: 4.6.5 + + '@deepseek-ai/dsh-compaction-basic@0.2.0-rc.2(760980f6c53b9f9729550073c2cbbc3e)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + optionalDependencies: + '@deepseek-ai/dsh-compaction-tool-result-pruner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-token-meter@0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523)) + + '@deepseek-ai/dsh-compaction-image-offload@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-compaction-tool-result-pruner@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-token-meter@0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-config-editor@0.2.0-rc.2(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-app-boot@0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-hmr@0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-include': 1.0.9(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + js-yaml: 4.3.2 + yaml: 2.9.1 + optionalDependencies: + '@deepseek-ai/dsh-hmr': 0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e) + + '@deepseek-ai/dsh-cordis-client-runner@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-cordis-host-runner@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-credentials-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-atomic-write@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + chokidar: 4.0.3 + yaml: 2.9.1 + + '@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-deepseek-account-platform@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-authorization@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-authorization': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + optionalDependencies: + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + + '@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-deque@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-experimental-agent-team-profile@0.2.0-rc.2(e94d261d4ecd324adcfb9fbaf5cd6657)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-experimental-agent-team': 0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd) + '@deepseek-ai/dsh-experimental-client-ui-agent-team': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-api-session-controller@0.2.0-rc.2(17d7a38790346cf58761755423db9cf6))(@deepseek-ai/dsh-client-locale@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-conversation@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-primitives@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-renderer@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-slots@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-workspace@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-experimental-agent-team@0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-experimental-tool-agent-team': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-experimental-agent-team@0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + transitivePeerDependencies: + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-api-session-controller' + - '@deepseek-ai/dsh-client-locale' + - '@deepseek-ai/dsh-client-ui-conversation' + - '@deepseek-ai/dsh-client-ui-primitives' + - '@deepseek-ai/dsh-client-ui-renderer' + - '@deepseek-ai/dsh-client-ui-session' + - '@deepseek-ai/dsh-client-ui-slots' + - '@deepseek-ai/dsh-client-ui-workspace' + - '@deepseek-ai/dsh-invariants' + - '@deepseek-ai/dsh-llm' + - '@deepseek-ai/dsh-session' + - '@deepseek-ai/dsh-session-persistence' + - '@deepseek-ai/dsh-session-projection' + - '@deepseek-ai/dsh-subagent' + - '@deepseek-ai/dsh-system-prompt' + - '@deepseek-ai/dsh-tools' + + '@deepseek-ai/dsh-experimental-agent-team@0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-experimental-api-speech-to-text@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-experimental-speech-to-text@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-experimental-speech-to-text': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-experimental-auto-review@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-instructions@0.2.0-rc.2(db65c17a76a6040365a522863f221c25))(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-permission-presets@0.2.0-rc.2(448ef37bda4bdf9586ac4f04627fa819))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-agent-instructions': 0.2.0-rc.2(db65c17a76a6040365a522863f221c25) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-permission-presets': 0.2.0-rc.2(448ef37bda4bdf9586ac4f04627fa819) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-experimental-client-ui-agent-team@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-api-session-controller@0.2.0-rc.2(17d7a38790346cf58761755423db9cf6))(@deepseek-ai/dsh-client-locale@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-conversation@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-primitives@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-renderer@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-slots@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-workspace@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-experimental-agent-team@0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-api-session-controller': 0.2.0-rc.2(17d7a38790346cf58761755423db9cf6) + '@deepseek-ai/dsh-client-locale': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-conversation': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-primitives': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-renderer': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-slots': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-workspace': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-experimental-agent-team': 0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-experimental-client-ui-voice-input@0.2.0-rc.2(5f9a965c4fbd0756e05bb9d214c2e7a9)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-api-gateway': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-api-remotes': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-api-session-controller': 0.2.0-rc.2(17d7a38790346cf58761755423db9cf6) + '@deepseek-ai/dsh-client-locale': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-store': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-conversation': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-plugin-manager': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-primitives': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-renderer': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-slots': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-experimental-api-speech-to-text': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-experimental-speech-to-text@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-experimental-speech-to-text': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-experimental-schedule-bundle@0.2.0-rc.2(d94e37e62f9d1585dac823dae67dd0c3)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-client-ui-schedule': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-schedule': 0.2.0-rc.2(d94e37e62f9d1585dac823dae67dd0c3) + '@deepseek-ai/dsh-time-context': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + transitivePeerDependencies: + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-api-session-controller' + - '@deepseek-ai/dsh-brand' + - '@deepseek-ai/dsh-invariants' + - '@deepseek-ai/dsh-llm' + - '@deepseek-ai/dsh-session' + - '@deepseek-ai/dsh-session-persistence' + - '@deepseek-ai/dsh-session-projection' + - '@deepseek-ai/dsh-storage-domain' + - '@deepseek-ai/dsh-tools' + - '@deepseek-ai/dsh-typert-protocol' + - '@deepseek-ai/dsh-workspace' + + '@deepseek-ai/dsh-experimental-speech-to-text-sensevoice@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-experimental-speech-to-text@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-experimental-speech-to-text': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + sherpa-onnx-node: 1.13.8 + zod: 4.6.5 + + '@deepseek-ai/dsh-experimental-speech-to-text@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-settings': 0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd) + '@deepseek-ai/schemastery': 3.18.4 + optionalDependencies: + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + + '@deepseek-ai/dsh-experimental-tool-agent-team@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-experimental-agent-team@0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-experimental-agent-team': 0.2.0-rc.2(0fa4e91be5b2667e066cc94f9b9381cd) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-experimental-voice-input-bundle@0.2.0-rc.2(811b2f3cf7d7be197ed11cede1cd35be)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-experimental-api-speech-to-text': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-experimental-speech-to-text@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-experimental-client-ui-voice-input': 0.2.0-rc.2(5f9a965c4fbd0756e05bb9d214c2e7a9) + '@deepseek-ai/dsh-experimental-speech-to-text': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)) + '@deepseek-ai/dsh-experimental-speech-to-text-sensevoice': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-experimental-speech-to-text@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-loader' + - '@deepseek-ai/dsh-api-gateway' + - '@deepseek-ai/dsh-api-remotes' + - '@deepseek-ai/dsh-api-session-controller' + - '@deepseek-ai/dsh-client-locale' + - '@deepseek-ai/dsh-client-store' + - '@deepseek-ai/dsh-client-ui-conversation' + - '@deepseek-ai/dsh-client-ui-plugin-manager' + - '@deepseek-ai/dsh-client-ui-primitives' + - '@deepseek-ai/dsh-client-ui-renderer' + - '@deepseek-ai/dsh-client-ui-session' + - '@deepseek-ai/dsh-client-ui-slots' + - '@deepseek-ai/dsh-session' + - '@deepseek-ai/dsh-settings' + - '@deepseek-ai/dsh-subprocess' + - '@deepseek-ai/dsh-typert-protocol' + + '@deepseek-ai/dsh-file-reference-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-file-reference@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50)))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-file-reference': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50)) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-file-reference@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + + '@deepseek-ai/dsh-fs-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/schemastery': 3.18.4 + chokidar: 4.0.3 + koffi: 3.1.1 + + '@deepseek-ai/dsh-fs-observation-policy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + + '@deepseek-ai/dsh-fs-sandbox@0.2.0-rc.2(0b1f1d1c43ed7223d021a7bc2480be4c)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-fs-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + + '@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + + '@deepseek-ai/dsh-goal-round-driver@0.2.0-rc.2(5c3900aa9f9541b387be984f36df13ce)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-goal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-goal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-headless@0.2.0-rc.2(6093e1c2a51168486a1b897a7243c136)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-agent-default-model': 0.2.0-rc.2(5a5f69dac67942c6551ebcc62d37d3ac) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-cmdline': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + commander: 15.0.0 + + '@deepseek-ai/dsh-hmr@0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e)': + dependencies: + '@babel/code-frame': 7.29.7 + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-include': 1.0.9(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/cordis-plugin-timer': 1.1.6(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-cmdline': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + chokidar: 4.0.3 + picomatch: 4.0.5 + + '@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-hook-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-hooks-claude-code@0.2.0-rc.2(f1e10911154f393dbf08d1860c64ec13)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-hook-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-hooks-codex@0.2.0-rc.2(34d94fbe2070cca0b5939dfeb86df3d7)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-hook-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-host-directory-picker-auto@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-ui-directory-picker-browse@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-directory-picker-native@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-host-directory-picker-browse@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-host-directory-picker-native@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-client-ui-directory-picker-browse': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-directory-picker-native': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-host-directory-picker-browse': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-host-directory-picker-native': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-host-directory-picker-browse@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-host-directory-picker': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-host-directory-picker-native@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-host-directory-picker': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-native-command': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + koffi: 3.1.1 + + '@deepseek-ai/dsh-host-directory-picker@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-host-frontend-static@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-host-open-in-app@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-native-command': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 + transitivePeerDependencies: + - '@deepseek-ai/dsh-http-proxy' + + '@deepseek-ai/dsh-host-plugin-inventory@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + zod: 4.6.5 + optionalDependencies: + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + + '@deepseek-ai/dsh-host-product-telemetry-otel@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-otel@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@opentelemetry/api@1.9.1)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-otel': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - '@opentelemetry/api' + + '@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + compression: 1.8.2 + negotiator: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + undici: 8.10.0 + + '@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-jobs-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-jobs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-jobs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + optionalDependencies: + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + + '@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-lazy-require@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-llm-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm-deepseek': 0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5) + optionalDependencies: + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + + '@deepseek-ai/dsh-llm-deepseek-api-key@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm-deepseek': 0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5) + '@deepseek-ai/schemastery': 3.18.4 + optionalDependencies: + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + + '@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cosmokit': 1.8.5 + '@deepseek-ai/dsh-anonymous-user-id': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + eventsource-parser: 3.1.1 + optionalDependencies: + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + + '@deepseek-ai/dsh-llm-pi-ai@0.2.0-rc.2(842fd1c1a6c4ff412c4429d02528cc1c)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-authorization': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + '@earendil-works/pi-ai': 0.87.1(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5))(ws@8.22.0)(zod@4.6.5) + optionalDependencies: + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - kerberos + - supports-color + - utf-8-validate + - ws + - zod + + '@deepseek-ai/dsh-llm-retry@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-crypto': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-mcp-client@0.2.0-rc.2(4f0df4fd67df1f951ab027e4a0172f10)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + '@modelcontextprotocol/client': 2.0.0 + optionalDependencies: + '@deepseek-ai/dsh-mcp-resources': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-mcp-resources@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + optionalDependencies: + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-message-feedback@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-command-feedback@0.2.0-rc.2(312c5a868ca31b765736358d4dd7834b))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-command-feedback': 0.2.0-rc.2(312c5a868ca31b765736358d4dd7834b) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-native-command@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-office-to-pdf@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/libreoffice-kit': 0.1.5 + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-otel@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.1) + got: 14.6.6 + + '@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-package-manifest@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + + '@deepseek-ai/dsh-permission-presets@0.2.0-rc.2(448ef37bda4bdf9586ac4f04627fa819)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-persona@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-plan-mode@0.2.0-rc.2(06634474cb0f88d42acff6017c793812)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-user-questions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + zod: 4.6.5 + optionalDependencies: + '@deepseek-ai/dsh-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + + '@deepseek-ai/dsh-plugin-manager@0.2.0-rc.2(e2feab0f8dc72d84d677efa8a24873fd)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-host-plugin-inventory': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + execa: 10.0.1 + yaml: 2.9.1 + zod: 4.6.5 + optionalDependencies: + '@deepseek-ai/dsh-hmr': 0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-group' + - '@deepseek-ai/cordis-plugin-include' + - '@deepseek-ai/dsh-home-paths' + - '@deepseek-ai/dsh-launch-environment' + - '@deepseek-ai/dsh-system-prompt' + + '@deepseek-ai/dsh-plugin-package-inventory-deepseek@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/schemastery': 3.18.4 + optionalDependencies: + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + + '@deepseek-ai/dsh-ptc-runtime-node@0.2.0-rc.2(602792dfa7721b6d1559156618c13f33)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-ptc-runtime': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-ptc-runtime@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + + '@deepseek-ai/dsh-pwsh-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-pwsh-sandbox@0.2.0-rc.2(ca41ba58d4d939c5ee782fb330f5d055)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-pwsh-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-repeat-tool-reminder@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + ? '@deepseek-ai/dsh-sandbox-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))' + : dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-windows-acl': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/node-addon-system': 0.1.2 + '@deepseek-ai/schemastery': 3.18.4 + transitivePeerDependencies: + - '@deepseek-ai/dsh-skill' + - '@deepseek-ai/dsh-subprocess' + + '@deepseek-ai/dsh-sandbox-policy@0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-sandbox-windows-acl@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-lazy-require': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-win32-process': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + koffi: 3.1.1 + yaml: 2.9.1 + + '@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-schedule@0.2.0-rc.2(d94e37e62f9d1585dac823dae67dd0c3)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-api-session-controller': 0.2.0-rc.2(17d7a38790346cf58761755423db9cf6) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + '@deepseek-ai/schemastery': 3.18.4 + '@js-temporal/polyfill': 0.5.1 + zod: 4.6.5 + + '@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-sdk-app@0.2.0-rc.2(03bb94ce7552de7a2b600f636f52bf66)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-cmdline': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sdk-jsonrpc-server': 0.2.0-rc.2(8e1209127ab97b37a9166dc021148fcb) + '@deepseek-ai/dsh-skill-office': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-tool-workspace-dependencies': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/schemastery': 3.18.4 + commander: 15.0.0 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-loader' + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-attachment' + - '@deepseek-ai/dsh-llm' + - '@deepseek-ai/dsh-llm-deepseek-api-key' + - '@deepseek-ai/dsh-scope' + - '@deepseek-ai/dsh-sdk-protocol' + - '@deepseek-ai/dsh-session' + - '@deepseek-ai/dsh-skill' + - '@deepseek-ai/dsh-subagent' + - '@deepseek-ai/dsh-tools' + + '@deepseek-ai/dsh-sdk-jsonrpc-server@0.2.0-rc.2(8e1209127ab97b37a9166dc021148fcb)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm-deepseek-api-key': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-sdk-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-sdk-minimal@0.2.0-rc.2(f56cc2554c5175f953df7ec5b7ced9ac)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-timer': 1.1.6(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-agent-loop': 0.2.0-rc.2(0c5ce3d184ce320f0d23631770cc12ac) + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-jobs-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-jobs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm-deepseek-api-key': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm-deepseek@0.2.0-rc.2(92203fffa8eb22d3bf471936e9f2add5))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm-retry': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-mcp-resources': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-plugin-package-inventory-deepseek': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-sdk-app': 0.2.0-rc.2(03bb94ce7552de7a2b600f636f52bf66) + '@deepseek-ai/dsh-sdk-jsonrpc-server': 0.2.0-rc.2(8e1209127ab97b37a9166dc021148fcb) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-log-deepseek': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-persistence-jsonl': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subprocess-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-terminal-bash': 0.2.0-rc.2(55caffe2f8b8e11a16534e49dcff31fa) + '@deepseek-ai/dsh-tool-bash-persistent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-pwsh-persistent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-loader' + - '@deepseek-ai/dsh-agent-preset-registry' + - '@deepseek-ai/dsh-attachment' + - '@deepseek-ai/dsh-brand' + - '@deepseek-ai/dsh-compaction' + - '@deepseek-ai/dsh-credentials' + - '@deepseek-ai/dsh-jobs' + - '@deepseek-ai/dsh-launch-environment' + - '@deepseek-ai/dsh-llm-deepseek' + - '@deepseek-ai/dsh-output-retention' + - '@deepseek-ai/dsh-ptc-runtime' + - '@deepseek-ai/dsh-sandbox' + - '@deepseek-ai/dsh-sdk-protocol' + - '@deepseek-ai/dsh-session-persistence' + - '@deepseek-ai/dsh-shell' + - '@deepseek-ai/dsh-skill' + - '@deepseek-ai/dsh-subagent' + - '@deepseek-ai/dsh-subprocess' + - '@deepseek-ai/dsh-timeout' + - '@deepseek-ai/dsh-typert-protocol' + - '@deepseek-ai/dsh-user-approval' + - '@deepseek-ai/dsh-util-values' + - '@deepseek-ai/dsh-workspace' + + '@deepseek-ai/dsh-sdk-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + + '@deepseek-ai/dsh-session-checkpoint-policy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + + '@deepseek-ai/dsh-session-format-catalog@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-compaction-image-offload': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-format': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v0-to-v1': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v1-to-v2': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v2-to-v3': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v3-to-v4': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + transitivePeerDependencies: + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-compaction' + - '@deepseek-ai/dsh-llm' + + '@deepseek-ai/dsh-session-format-v0-to-v1@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-session-format': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-session-format-v1-to-v2@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v0-to-v1': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-session-format-v2-to-v3@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-session-format': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v0-to-v1': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v1-to-v2': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-session-format-v3-to-v4@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-session-format': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-v2-to-v3': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-session-format@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-session-log-deepseek@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-deepseek-llm-api-extensions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-deepseek-llm-api-extensions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-session-log-export@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-format': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 + fflate: 0.8.3 + + '@deepseek-ai/dsh-session-persistence-jsonl@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-format': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-format-catalog': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-format-v3-to-v4': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/node-addon-system': 0.1.2 + '@deepseek-ai/schemastery': 3.18.4 + koffi: 3.1.1 + transitivePeerDependencies: + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-compaction' + + '@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-session-projection-cache@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-storage-domain@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + zod: 4.6.5 + + '@deepseek-ai/dsh-session-query-sqlite@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-query@0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a) + '@deepseek-ai/schemastery': 3.18.4 + optionalDependencies: + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + + '@deepseek-ai/dsh-session-query@0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-format-catalog': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-tool-todo': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + optionalDependencies: + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-projection-cache': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-storage-domain@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + transitivePeerDependencies: + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-compaction' + + '@deepseek-ai/dsh-session-reference@0.2.0-rc.2(0dc156114279a06e0d9ff6f93bc9a800)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + optionalDependencies: + '@deepseek-ai/dsh-session-projection-cache': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-storage-domain@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-spill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + + '@deepseek-ai/dsh-session-stats@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + zod: 4.6.5 + + '@deepseek-ai/dsh-session-telemetry-otel@0.2.0-rc.2(701bd9cabaf02d328ff5afb0e5aecf5f)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-anonymous-user-id': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-command-feedback': 0.2.0-rc.2(312c5a868ca31b765736358d4dd7834b) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-message-feedback': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-command-feedback@0.2.0-rc.2(312c5a868ca31b765736358d4dd7834b))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-otel': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-telemetry': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - '@opentelemetry/api' + + '@deepseek-ai/dsh-session-telemetry@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-session-title-first-prompt-llm@0.2.0-rc.2(250b28a4e3502a43c4cf27b9e7fcae12)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-title-llm': 0.2.0-rc.2(bbf66c23e9c9aedeb1638110589e00a4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-session-title-llm@0.2.0-rc.2(bbf66c23e9c9aedeb1638110589e00a4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-session-title@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + + '@deepseek-ai/dsh-session-turn-outline@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + zod: 4.6.5 + + '@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/cosmokit': 1.8.5 + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-config-editor': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-app-boot@0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-hmr@0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e)) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + yaml: 2.9.1 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-include' + - '@deepseek-ai/dsh-app-boot' + - '@deepseek-ai/dsh-hmr' + - node-addon-require-builtin - tough-cookie@6.0.2: - resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} - engines: {node: '>=16'} + '@deepseek-ai/dsh-shell-env@0.2.0-rc.2(2953c72f9ae4319fab608de446fbd4ea)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} + '@deepseek-ai/dsh-skill-badge@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) - ts-algebra@2.0.0: - resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + '@deepseek-ai/dsh-skill-filesystem@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/schemastery': 3.18.4 + chokidar: 5.0.0 + yaml: 2.9.1 + + '@deepseek-ai/dsh-skill-office@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/libreoffice-kit': 0.1.5 + '@deepseek-ai/schemastery': 3.18.4 + yaml: 2.9.1 - type-is@2.1.0: - resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} - engines: {node: '>= 18'} + '@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true + '@deepseek-ai/dsh-spill-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-spill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-spill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + '@deepseek-ai/dsh-spill-policy@0.2.0-rc.2(e98a47328d48f82655041b962fcbd6c2)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-spill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-spill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) - undici@8.10.0: - resolution: {integrity: sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==} - engines: {node: '>=22.19.0'} + '@deepseek-ai/dsh-storage-domain@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-storage': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-storage-json@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-storage': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + '@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true + '@deepseek-ai/dsh-subagent-fork-in-process@0.2.0-rc.2(ce1467095c38829bb40d353fd3638d13)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-subagent-in-process-driver': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-subagent-in-process-driver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + + ? '@deepseek-ai/dsh-subagent-spawn-in-process@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-subagent-in-process-driver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))' + : dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-subagent-in-process-driver': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-chunked-list': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-time': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 + optionalDependencies: + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)) + '@deepseek-ai/dsh-permission-presets': 0.2.0-rc.2(448ef37bda4bdf9586ac4f04627fa819) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-query': 0.2.0-rc.2(093c3b12bd31afc31258095e32e4c97a) + '@deepseek-ai/dsh-settings': 0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + + '@deepseek-ai/dsh-subprocess-local@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-lazy-require': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-win32-process': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + koffi: 3.1.1 + node-pty: 1.2.0-beta.15 + + '@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-http-proxy': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) - vite@6.4.3: - resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true + '@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 - vitest@3.2.7: - resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.7 - '@vitest/ui': 3.2.7 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + '@deepseek-ai/dsh-terminal-bash@0.2.0-rc.2(55caffe2f8b8e11a16534e49dcff31fa)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-lazy-require': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-pwsh-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 + '@xterm/headless': 6.0.0 + transitivePeerDependencies: + - '@deepseek-ai/dsh-shell' + - '@deepseek-ai/dsh-timeout' - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) - webidl-conversions@8.0.1: - resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} - engines: {node: '>=20'} + '@deepseek-ai/dsh-time-context@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 - whatwg-mimetype@5.0.0: - resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} - engines: {node: '>=20'} + '@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) - whatwg-url@16.0.1: - resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@deepseek-ai/dsh-tmux-context@0.2.0-rc.2(f2d0c7f6aa622330a5fea56045222636)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 - whatwg-url@17.1.0: - resolution: {integrity: sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==} - engines: {node: ^22.14.0 || >=24.0.0} + '@deepseek-ai/dsh-token-meter@0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-compaction': 0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f) + '@deepseek-ai/dsh-compaction-image-offload': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm-retry': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@deepseek-ai/dsh-tool-ask-user@0.2.0-rc.2(16d4e17cbc6c9ea80d47d8f776e8cc2a)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-user-questions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true + '@deepseek-ai/dsh-tool-bash-persistent@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-bash@0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-shell-env': 0.2.0-rc.2(2953c72f9ae4319fab608de446fbd4ea) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-call-timeout-policy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + '@deepseek-ai/dsh-tool-cordis@0.2.0-rc.2(f3eb14784d21fa49f11ef7713c709520)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-cordis-host-runner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + + '@deepseek-ai/dsh-tool-fs-search@0.2.0-rc.2(dd915b1c3d0ea66ee534758c47dc32c7)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-spill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + '@vscode/ripgrep': 1.18.0 + + '@deepseek-ai/dsh-tool-fs@0.2.0-rc.2(bf0da04cc963a4827c7c5eca38b096b0)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-util-code-language': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + diff: 9.0.0 + + '@deepseek-ai/dsh-tool-goal@0.2.0-rc.2(0cbb55cbe546d8bf5341776ccf28bbfc)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-goal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-jobs@0.2.0-rc.2(f3945ee8fcbc3a4f4103e8ae4bee1d5e)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-present@0.2.0-rc.2(c36f844b60a72d86908982aee736ca61)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-pwsh-persistent@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-pwsh@0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-shell-env': 0.2.0-rc.2(2953c72f9ae4319fab608de446fbd4ea) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-ralph@0.2.0-rc.2(53655b90538bfc69350fb2b5c78e6d70)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-workflow': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-str-replace-editor@0.2.0-rc.2(fb7a984ee5f4492b406b5e634ed15d88)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-fs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-output-retention': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-subagent-control@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + + '@deepseek-ai/dsh-tool-subagent@0.2.0-rc.2(9d8de5ed31573fa7fe44b3535f76fbc8)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} + '@deepseek-ai/dsh-tool-todo@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + '@deepseek-ai/dsh-tool-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-web': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 + '@joplin/turndown-plugin-gfm': 1.0.68 + turndown: 7.2.4 + + '@deepseek-ai/dsh-tool-workflow@0.2.0-rc.2(d642948f5ad5138419d570351a3a7620)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-workflow': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-tool-workspace-dependencies@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 + '@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-ptc-runtime': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-user-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-typert-loader@0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-typert-registry@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-typert-registry': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 - zod@4.6.5: - resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + '@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) -snapshots: + '@deepseek-ai/dsh-typert-registry@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + zod: 4.6.5 - '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.283': - optional: true + '@deepseek-ai/dsh-user-approval@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-user-questions@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-scope': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + zod: 4.6.5 - '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.283': - optional: true + '@deepseek-ai/dsh-util-code-language@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.283': - optional: true + '@deepseek-ai/dsh-util-crypto@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) - '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.283': - optional: true + '@deepseek-ai/dsh-util-time@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) - '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.283': - optional: true + '@deepseek-ai/dsh-util-values@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) - '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.283': - optional: true + '@deepseek-ai/dsh-util-workspace-path@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.283': - optional: true + '@deepseek-ai/dsh-web-app@0.2.0-rc.2(c5fcdf652f38fa3edb61e30a93f32e73)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/dsh-agent-instructions': 0.2.0-rc.2(db65c17a76a6040365a522863f221c25) + '@deepseek-ai/dsh-agent-preset': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e)) + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + '@deepseek-ai/dsh-agent-tool-presentation': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-api-account-controller': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-api-job-controller': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-api-remotes': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-api-session-controller': 0.2.0-rc.2(17d7a38790346cf58761755423db9cf6) + '@deepseek-ai/dsh-api-settings-controller': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-native-command@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-settings@0.2.0-rc.2(836b22df0e7e5f7a9240cc4e2ca4a3dd))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-api-terminal-controller': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-api-workspace-controller': 0.2.0-rc.2(7b1cc3b3e03980f49f8901a2ede23841) + '@deepseek-ai/dsh-api-workspace-files': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-client-connection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-client-file-upload': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-client-hmr': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-locale': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-modules': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-product-analytics': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-resources': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-shortcuts': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-agent-preset': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-approval': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-attachment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-brand-official': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-chat': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-commands': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-conversation': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-cordis': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-deliverables': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-directory-picker-browse': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-directory-picker-native': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-goal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-input-trigger': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-jobs': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-layout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-message-feedback': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-model-selection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-open-in-app': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-permission-presets': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-plan': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-plugin-manager': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-reference': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-renderer': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-account': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-agent-loop': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-general': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-models': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-plugin-inventory': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-plugins': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-session-log': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-shell': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-subagent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-settings-web-search': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-shortcuts': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-sidebar': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-sidebar-browser': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-sidebar-documentpreview': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-sidebar-files': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-sidebar-right': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-sidebar-terminal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-subagent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-theme': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-tool': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-trajectory': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-user-questions': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-workflow-run': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-workspace': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-cmdline': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-command-compact': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-commands@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f)) + '@deepseek-ai/dsh-command-goal': 0.2.0-rc.2(07b85e24432aeb6ad4bd75aa585cd3c3) + '@deepseek-ai/dsh-compaction-basic': 0.2.0-rc.2(760980f6c53b9f9729550073c2cbbc3e) + '@deepseek-ai/dsh-compaction-tool-result-pruner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-token-meter@0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523)) + '@deepseek-ai/dsh-cordis-client-runner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-cordis-host-runner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-file-reference': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50)) + '@deepseek-ai/dsh-file-reference-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-file-reference@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50)))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-host-directory-picker-auto': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-ui-directory-picker-browse@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-client-ui-directory-picker-native@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-host-directory-picker-browse@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-host-directory-picker-native@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-host-directory-picker-browse': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-host-directory-picker-native': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-host-frontend-static': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-client-connection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-host-open-in-app': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-host-plugin-inventory': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-host-product-telemetry-otel': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-otel@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@opentelemetry/api@1.9.1) + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-message-feedback': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-command-feedback@0.2.0-rc.2(312c5a868ca31b765736358d4dd7834b))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-office-to-pdf': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-persona': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-plan-mode': 0.2.0-rc.2(06634474cb0f88d42acff6017c793812) + '@deepseek-ai/dsh-plugin-manager': 0.2.0-rc.2(e2feab0f8dc72d84d677efa8a24873fd) + '@deepseek-ai/dsh-session-log-export': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session-persistence@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-reference': 0.2.0-rc.2(0dc156114279a06e0d9ff6f93bc9a800) + '@deepseek-ai/dsh-session-stats': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-turn-outline': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-shell-env': 0.2.0-rc.2(2953c72f9ae4319fab608de446fbd4ea) + '@deepseek-ai/dsh-skill-filesystem': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-system-prompt': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-terminal-bash': 0.2.0-rc.2(55caffe2f8b8e11a16534e49dcff31fa) + '@deepseek-ai/dsh-tool-ask-user': 0.2.0-rc.2(16d4e17cbc6c9ea80d47d8f776e8cc2a) + '@deepseek-ai/dsh-tool-bash': 0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0) + '@deepseek-ai/dsh-tool-bash-persistent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-cordis': 0.2.0-rc.2(f3eb14784d21fa49f11ef7713c709520) + '@deepseek-ai/dsh-tool-fs': 0.2.0-rc.2(bf0da04cc963a4827c7c5eca38b096b0) + '@deepseek-ai/dsh-tool-fs-search': 0.2.0-rc.2(dd915b1c3d0ea66ee534758c47dc32c7) + '@deepseek-ai/dsh-tool-goal': 0.2.0-rc.2(0cbb55cbe546d8bf5341776ccf28bbfc) + '@deepseek-ai/dsh-tool-jobs': 0.2.0-rc.2(f3945ee8fcbc3a4f4103e8ae4bee1d5e) + '@deepseek-ai/dsh-tool-present': 0.2.0-rc.2(c36f844b60a72d86908982aee736ca61) + '@deepseek-ai/dsh-tool-pwsh': 0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0) + '@deepseek-ai/dsh-tool-pwsh-persistent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-ralph': 0.2.0-rc.2(53655b90538bfc69350fb2b5c78e6d70) + '@deepseek-ai/dsh-tool-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-subagent': 0.2.0-rc.2(9d8de5ed31573fa7fe44b3535f76fbc8) + '@deepseek-ai/dsh-tool-subagent-control': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-todo': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-web': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tool-workflow': 0.2.0-rc.2(d642948f5ad5138419d570351a3a7620) + '@deepseek-ai/dsh-web-frontend': 0.2.0-rc.2 + '@deepseek-ai/dsh-workflow-ptc': 0.2.0-rc.2(bdb5ff3b22107a69c834ceb000f872ea) + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + '@deepseek-ai/dsh-workspace-changes': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/schemastery': 3.18.4 + commander: 15.0.0 + open: 11.0.4 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-group' + - '@deepseek-ai/cordis-plugin-include' + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-agent-default-model' + - '@deepseek-ai/dsh-api-gateway' + - '@deepseek-ai/dsh-attachment' + - '@deepseek-ai/dsh-brand' + - '@deepseek-ai/dsh-command-feedback' + - '@deepseek-ai/dsh-commands' + - '@deepseek-ai/dsh-compaction' + - '@deepseek-ai/dsh-credentials' + - '@deepseek-ai/dsh-deepseek-account' + - '@deepseek-ai/dsh-fs' + - '@deepseek-ai/dsh-goal' + - '@deepseek-ai/dsh-hmr' + - '@deepseek-ai/dsh-home-paths' + - '@deepseek-ai/dsh-host-directory-picker' + - '@deepseek-ai/dsh-http-proxy' + - '@deepseek-ai/dsh-invariants' + - '@deepseek-ai/dsh-jobs' + - '@deepseek-ai/dsh-llm' + - '@deepseek-ai/dsh-native-command' + - '@deepseek-ai/dsh-otel' + - '@deepseek-ai/dsh-output-retention' + - '@deepseek-ai/dsh-ptc-runtime' + - '@deepseek-ai/dsh-sandbox' + - '@deepseek-ai/dsh-sandbox-policy' + - '@deepseek-ai/dsh-scope' + - '@deepseek-ai/dsh-session' + - '@deepseek-ai/dsh-session-persistence' + - '@deepseek-ai/dsh-session-projection' + - '@deepseek-ai/dsh-session-projection-cache' + - '@deepseek-ai/dsh-session-query' + - '@deepseek-ai/dsh-session-title' + - '@deepseek-ai/dsh-settings' + - '@deepseek-ai/dsh-shell' + - '@deepseek-ai/dsh-skill' + - '@deepseek-ai/dsh-spill' + - '@deepseek-ai/dsh-storage' + - '@deepseek-ai/dsh-storage-domain' + - '@deepseek-ai/dsh-subagent' + - '@deepseek-ai/dsh-timeout' + - '@deepseek-ai/dsh-token-meter' + - '@deepseek-ai/dsh-tools' + - '@deepseek-ai/dsh-typert-protocol' + - '@deepseek-ai/dsh-typert-registry' + - '@deepseek-ai/dsh-user-approval' + - '@deepseek-ai/dsh-user-questions' + - '@deepseek-ai/dsh-util-time' + - '@deepseek-ai/dsh-util-values' + - '@deepseek-ai/dsh-util-workspace-path' + - '@deepseek-ai/dsh-web' + - '@deepseek-ai/dsh-workflow' + - '@opentelemetry/api' + - supports-color - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.283': - optional: true + '@deepseek-ai/dsh-web-fetch-http@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-http-proxy': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-timeout': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-web': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 + ipaddr.js: 2.5.0 + undici: 8.10.0 + + '@deepseek-ai/dsh-web-frontend@0.2.0-rc.2': {} - '@anthropic-ai/claude-agent-sdk@0.3.283(@anthropic-ai/sdk@0.120.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5))(zod@4.6.5)': + '@deepseek-ai/dsh-web-search-deepseek@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-deepseek-account@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))': dependencies: - '@anthropic-ai/sdk': 0.120.0(zod@4.6.5) - '@modelcontextprotocol/sdk': 1.30.0(zod@4.6.5) - zod: 4.6.5 + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-web': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/schemastery': 3.18.4 optionalDependencies: - '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.283 - '@anthropic-ai/claude-agent-sdk-darwin-x64': 0.3.283 - '@anthropic-ai/claude-agent-sdk-linux-arm64': 0.3.283 - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.3.283 - '@anthropic-ai/claude-agent-sdk-linux-x64': 0.3.283 - '@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.3.283 - '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.283 - '@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.283 + '@deepseek-ai/dsh-deepseek-account': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) - '@anthropic-ai/sdk@0.120.0(zod@4.6.5)': + '@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))': dependencies: - json-schema-to-ts: 3.1.1 - standardwebhooks: 1.0.0 - optionalDependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-webhook-github@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-webhook@0.2.0-rc.2(68b1ac335b32e9c1e8a588772a7e889f))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-credentials': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-host-webserver': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-webhook': 0.2.0-rc.2(68b1ac335b32e9c1e8a588772a7e889f) + '@deepseek-ai/schemastery': 3.18.4 + '@octokit/webhooks': 14.2.0 + + '@deepseek-ai/dsh-webhook@0.2.0-rc.2(68b1ac335b32e9c1e8a588772a7e889f)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-agent-default-model': 0.2.0-rc.2(5a5f69dac67942c6551ebcc62d37d3ac) + '@deepseek-ai/dsh-agent-preset-registry': 0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-permission-presets': 0.2.0-rc.2(448ef37bda4bdf9586ac4f04627fa819) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-title': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-workspace': 0.2.0-rc.2(0af55daf1da1f010142729c9967a6080) + + '@deepseek-ai/dsh-win32-process@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-lazy-require': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + koffi: 3.1.1 + + '@deepseek-ai/dsh-workflow-ptc@0.2.0-rc.2(bdb5ff3b22107a69c834ceb000f872ea)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-ptc-runtime': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))) + '@deepseek-ai/dsh-sandbox': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-sandbox-policy': 0.2.0-rc.2(7345bc8a170f7b239da92d7a0e490765) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subagent': 0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/dsh-util-values': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-workflow': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/schemastery': 3.18.4 + + '@deepseek-ai/dsh-workflow@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-llm': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + + '@deepseek-ai/dsh-workspace-changes@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-agent': 0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-subprocess': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-tools': 0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755) + '@deepseek-ai/schemastery': 3.18.4 + diff: 9.0.0 + + '@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)': + dependencies: + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/dsh-brand': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-invariants': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-session': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-session-persistence': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-storage': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-storage-domain': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-storage@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-typert-protocol': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) zod: 4.6.5 - '@asamuzakjp/css-color@6.0.7': + '@deepseek-ai/dsh@0.2.0-rc.2(0f1e5c6ba2281237b4c3df3d203ea37c)': dependencies: - '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - lru-cache: 11.5.2 + '@deepseek-ai/cordis': 4.0.4(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5) + '@deepseek-ai/cordis-plugin-include': 1.0.9(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/cordis-plugin-loader': 1.0.5(@deepseek-ai/cordis@4.0.4)(node-addon-require-builtin@0.1.7) + '@deepseek-ai/cordis-plugin-timer': 1.1.6(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-acp-app': 0.2.0-rc.2(3eab894774abc6548931023b847da072) + '@deepseek-ai/dsh-agent-instructions': 0.2.0-rc.2(db65c17a76a6040365a522863f221c25) + '@deepseek-ai/dsh-agent-preset': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-preset-registry@0.2.0-rc.2(1737a92140deaad04e6dcaa0b75a0c5e)) + '@deepseek-ai/dsh-agent-tool-presentation': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-app-boot': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-group@1.0.4(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/cordis-plugin-include@1.0.9)(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-launch-environment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-atomic-write': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-base': 0.2.0-rc.2(e87e4a509fd42d963fd62fe9a19b068d) + '@deepseek-ai/dsh-client-ui-agent-preset': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-client-ui-cordis': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-cmdline': 0.2.0-rc.2(@deepseek-ai/cordis-plugin-loader@1.0.5)(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-command-compact': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-commands@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-attachment@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f)) + '@deepseek-ai/dsh-command-goal': 0.2.0-rc.2(07b85e24432aeb6ad4bd75aa585cd3c3) + '@deepseek-ai/dsh-compaction-basic': 0.2.0-rc.2(760980f6c53b9f9729550073c2cbbc3e) + '@deepseek-ai/dsh-compaction-tool-result-pruner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-compaction@0.2.0-rc.2(18afa85921a99d09ed8136a02952d28f))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-token-meter@0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523)) + '@deepseek-ai/dsh-cordis-client-runner': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-experimental-agent-team-profile': 0.2.0-rc.2(e94d261d4ecd324adcfb9fbaf5cd6657) + '@deepseek-ai/dsh-experimental-auto-review': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent-instructions@0.2.0-rc.2(db65c17a76a6040365a522863f221c25))(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-permission-presets@0.2.0-rc.2(448ef37bda4bdf9586ac4f04627fa819))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-experimental-schedule-bundle': 0.2.0-rc.2(d94e37e62f9d1585dac823dae67dd0c3) + '@deepseek-ai/dsh-experimental-voice-input-bundle': 0.2.0-rc.2(811b2f3cf7d7be197ed11cede1cd35be) + '@deepseek-ai/dsh-fs-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))) + '@deepseek-ai/dsh-goal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-typert-protocol@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-goal-round-driver': 0.2.0-rc.2(5c3900aa9f9541b387be984f36df13ce) + '@deepseek-ai/dsh-headless': 0.2.0-rc.2(6093e1c2a51168486a1b897a7243c136) + '@deepseek-ai/dsh-hmr': 0.2.0-rc.2(acf33c6a147b9f2be564086f152da09e) + '@deepseek-ai/dsh-home-paths': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-hooks-claude-code': 0.2.0-rc.2(f1e10911154f393dbf08d1860c64ec13) + '@deepseek-ai/dsh-hooks-codex': 0.2.0-rc.2(34d94fbe2070cca0b5939dfeb86df3d7) + '@deepseek-ai/dsh-http-proxy': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-jobs-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-jobs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-workspace@0.2.0-rc.2(0af55daf1da1f010142729c9967a6080)))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-launch-environment': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4) + '@deepseek-ai/dsh-mcp-client': 0.2.0-rc.2(4f0df4fd67df1f951ab027e4a0172f10) + '@deepseek-ai/dsh-mcp-resources': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-persona': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-plan-mode': 0.2.0-rc.2(06634474cb0f88d42acff6017c793812) + '@deepseek-ai/dsh-plugin-manager': 0.2.0-rc.2(e2feab0f8dc72d84d677efa8a24873fd) + '@deepseek-ai/dsh-pwsh-local': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-shell@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subprocess@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-http-proxy@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-pwsh-sandbox': 0.2.0-rc.2(ca41ba58d4d939c5ee782fb330f5d055) + '@deepseek-ai/dsh-schedule': 0.2.0-rc.2(d94e37e62f9d1585dac823dae67dd0c3) + '@deepseek-ai/dsh-sdk-app': 0.2.0-rc.2(03bb94ce7552de7a2b600f636f52bf66) + '@deepseek-ai/dsh-sdk-minimal': 0.2.0-rc.2(f56cc2554c5175f953df7ec5b7ced9ac) + '@deepseek-ai/dsh-session-projection': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-session-reference': 0.2.0-rc.2(0dc156114279a06e0d9ff6f93bc9a800) + '@deepseek-ai/dsh-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-skill-filesystem': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-fs@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-sandbox@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))))(@deepseek-ai/dsh-home-paths@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-skill-office': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-terminal': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)) + '@deepseek-ai/dsh-terminal-bash': 0.2.0-rc.2(55caffe2f8b8e11a16534e49dcff31fa) + '@deepseek-ai/dsh-time-context': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))) + '@deepseek-ai/dsh-tmux-context': 0.2.0-rc.2(f2d0c7f6aa622330a5fea56045222636) + '@deepseek-ai/dsh-token-meter': 0.2.0-rc.2(42d33da5a9a545c3948e11174b60d523) + '@deepseek-ai/dsh-tool-ask-user': 0.2.0-rc.2(16d4e17cbc6c9ea80d47d8f776e8cc2a) + '@deepseek-ai/dsh-tool-bash': 0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0) + '@deepseek-ai/dsh-tool-bash-persistent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-cordis': 0.2.0-rc.2(f3eb14784d21fa49f11ef7713c709520) + '@deepseek-ai/dsh-tool-fs': 0.2.0-rc.2(bf0da04cc963a4827c7c5eca38b096b0) + '@deepseek-ai/dsh-tool-fs-search': 0.2.0-rc.2(dd915b1c3d0ea66ee534758c47dc32c7) + '@deepseek-ai/dsh-tool-goal': 0.2.0-rc.2(0cbb55cbe546d8bf5341776ccf28bbfc) + '@deepseek-ai/dsh-tool-jobs': 0.2.0-rc.2(f3945ee8fcbc3a4f4103e8ae4bee1d5e) + '@deepseek-ai/dsh-tool-present': 0.2.0-rc.2(c36f844b60a72d86908982aee736ca61) + '@deepseek-ai/dsh-tool-pwsh': 0.2.0-rc.2(a632ae4dffe8177db68afb0fa35acac0) + '@deepseek-ai/dsh-tool-pwsh-persistent': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-output-retention@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-terminal@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-brand@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-timeout@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-ralph': 0.2.0-rc.2(53655b90538bfc69350fb2b5c78e6d70) + '@deepseek-ai/dsh-tool-skill': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-skill@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-str-replace-editor': 0.2.0-rc.2(fb7a984ee5f4492b406b5e634ed15d88) + '@deepseek-ai/dsh-tool-subagent': 0.2.0-rc.2(9d8de5ed31573fa7fe44b3535f76fbc8) + '@deepseek-ai/dsh-tool-subagent-control': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-subagent@0.2.0-rc.2(80b7d44467fffec2ca5e1216806852fd))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-todo': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-agent@0.2.0-rc.2(fee0e653b72a3883e0f0da2d9a46bb50))(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session-projection@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-tool-web': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-system-prompt@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755))(@deepseek-ai/dsh-web@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-llm@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))) + '@deepseek-ai/dsh-tool-workflow': 0.2.0-rc.2(d642948f5ad5138419d570351a3a7620) + '@deepseek-ai/dsh-tool-workspace-dependencies': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-tools@0.2.0-rc.2(52b5a8ab481be2b3d891c22a71641755)) + '@deepseek-ai/dsh-web-app': 0.2.0-rc.2(c5fcdf652f38fa3edb61e30a93f32e73) + '@deepseek-ai/dsh-webhook': 0.2.0-rc.2(68b1ac335b32e9c1e8a588772a7e889f) + '@deepseek-ai/dsh-webhook-github': 0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-credentials@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)))(@deepseek-ai/dsh-host-webserver@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))(@deepseek-ai/dsh-session@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-scope@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4)(@deepseek-ai/dsh-invariants@0.2.0-rc.2(@deepseek-ai/cordis@4.0.4))))(@deepseek-ai/dsh-webhook@0.2.0-rc.2(68b1ac335b32e9c1e8a588772a7e889f)) + '@deepseek-ai/dsh-workflow-ptc': 0.2.0-rc.2(bdb5ff3b22107a69c834ceb000f872ea) + '@deepseek-ai/schemastery': 3.18.4 + commander: 15.0.0 + js-yaml: 4.3.2 + node-addon-require-builtin: 0.1.7 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-group' + - '@deepseek-ai/dsh-agent' + - '@deepseek-ai/dsh-agent-default-model' + - '@deepseek-ai/dsh-agent-preset-registry' + - '@deepseek-ai/dsh-anonymous-user-id' + - '@deepseek-ai/dsh-api-gateway' + - '@deepseek-ai/dsh-api-remotes' + - '@deepseek-ai/dsh-api-session-controller' + - '@deepseek-ai/dsh-attachment' + - '@deepseek-ai/dsh-bash-local' + - '@deepseek-ai/dsh-brand' + - '@deepseek-ai/dsh-client-connection' + - '@deepseek-ai/dsh-client-locale' + - '@deepseek-ai/dsh-client-store' + - '@deepseek-ai/dsh-client-ui-conversation' + - '@deepseek-ai/dsh-client-ui-plugin-manager' + - '@deepseek-ai/dsh-client-ui-primitives' + - '@deepseek-ai/dsh-client-ui-renderer' + - '@deepseek-ai/dsh-client-ui-session' + - '@deepseek-ai/dsh-client-ui-slots' + - '@deepseek-ai/dsh-client-ui-workspace' + - '@deepseek-ai/dsh-command-feedback' + - '@deepseek-ai/dsh-commands' + - '@deepseek-ai/dsh-compaction' + - '@deepseek-ai/dsh-compaction-image-offload' + - '@deepseek-ai/dsh-cordis-host-runner' + - '@deepseek-ai/dsh-credentials' + - '@deepseek-ai/dsh-deepseek-account' + - '@deepseek-ai/dsh-fs' + - '@deepseek-ai/dsh-hook-protocol' + - '@deepseek-ai/dsh-host-directory-picker' + - '@deepseek-ai/dsh-host-plugin-inventory' + - '@deepseek-ai/dsh-host-webserver' + - '@deepseek-ai/dsh-invariants' + - '@deepseek-ai/dsh-jobs' + - '@deepseek-ai/dsh-llm' + - '@deepseek-ai/dsh-llm-deepseek' + - '@deepseek-ai/dsh-llm-deepseek-api-key' + - '@deepseek-ai/dsh-llm-retry' + - '@deepseek-ai/dsh-message-feedback' + - '@deepseek-ai/dsh-native-command' + - '@deepseek-ai/dsh-otel' + - '@deepseek-ai/dsh-output-retention' + - '@deepseek-ai/dsh-permission-presets' + - '@deepseek-ai/dsh-ptc-runtime' + - '@deepseek-ai/dsh-sandbox' + - '@deepseek-ai/dsh-sandbox-policy' + - '@deepseek-ai/dsh-scope' + - '@deepseek-ai/dsh-sdk-protocol' + - '@deepseek-ai/dsh-session' + - '@deepseek-ai/dsh-session-persistence' + - '@deepseek-ai/dsh-session-projection-cache' + - '@deepseek-ai/dsh-session-query' + - '@deepseek-ai/dsh-session-telemetry' + - '@deepseek-ai/dsh-session-title' + - '@deepseek-ai/dsh-session-title-llm' + - '@deepseek-ai/dsh-settings' + - '@deepseek-ai/dsh-shell' + - '@deepseek-ai/dsh-shell-env' + - '@deepseek-ai/dsh-spill' + - '@deepseek-ai/dsh-storage' + - '@deepseek-ai/dsh-storage-domain' + - '@deepseek-ai/dsh-subagent' + - '@deepseek-ai/dsh-subagent-in-process-driver' + - '@deepseek-ai/dsh-subprocess' + - '@deepseek-ai/dsh-system-prompt' + - '@deepseek-ai/dsh-timeout' + - '@deepseek-ai/dsh-tools' + - '@deepseek-ai/dsh-typert-protocol' + - '@deepseek-ai/dsh-typert-registry' + - '@deepseek-ai/dsh-user-approval' + - '@deepseek-ai/dsh-user-questions' + - '@deepseek-ai/dsh-util-time' + - '@deepseek-ai/dsh-util-values' + - '@deepseek-ai/dsh-util-workspace-path' + - '@deepseek-ai/dsh-web' + - '@deepseek-ai/dsh-workflow' + - '@deepseek-ai/dsh-workspace' + - '@modelcontextprotocol/sdk' + - '@opentelemetry/api' + - '@types/node' + - bufferutil + - kerberos + - supports-color + - utf-8-validate + - ws + - zod + + '@deepseek-ai/libreoffice-kit-darwin-arm64@0.1.5': optional: true - '@asamuzakjp/dom-selector@8.3.2': - dependencies: - bidi-js: 1.0.3 - css-tree: 3.2.1 - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.2 + '@deepseek-ai/libreoffice-kit-darwin-x64@0.1.5': optional: true - '@babel/runtime@7.29.7': {} + '@deepseek-ai/libreoffice-kit-wasm@0.1.5': + optional: true - '@bramus/specificity@2.4.2': - dependencies: - css-tree: 3.2.1 + '@deepseek-ai/libreoffice-kit-win32-arm64@0.1.5': optional: true - '@csstools/color-helpers@6.1.1': + '@deepseek-ai/libreoffice-kit-win32-x64@0.1.5': optional: true - '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@deepseek-ai/libreoffice-kit@0.1.5': dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + fflate: 0.8.2 + fontkit: 2.0.4 + koffi: 3.1.1 + saxes: 6.0.0 + optionalDependencies: + '@deepseek-ai/libreoffice-kit-darwin-arm64': 0.1.5 + '@deepseek-ai/libreoffice-kit-darwin-x64': 0.1.5 + '@deepseek-ai/libreoffice-kit-wasm': 0.1.5 + '@deepseek-ai/libreoffice-kit-win32-arm64': 0.1.5 + '@deepseek-ai/libreoffice-kit-win32-x64': 0.1.5 + + '@deepseek-ai/node-addon-system-darwin-arm64@0.1.2': optional: true - '@csstools/css-color-parser@4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/color-helpers': 6.1.1 - '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@deepseek-ai/node-addon-system-darwin-x64@0.1.2': optional: true - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-tokenizer': 4.0.0 + '@deepseek-ai/node-addon-system-linux-arm64@0.1.2': optional: true - '@csstools/css-syntax-patches-for-csstree@1.1.8(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 + '@deepseek-ai/node-addon-system-linux-x64@0.1.2': optional: true - '@csstools/css-tokenizer@4.0.0': + '@deepseek-ai/node-addon-system@0.1.2': + optionalDependencies: + '@deepseek-ai/node-addon-system-darwin-arm64': 0.1.2 + '@deepseek-ai/node-addon-system-darwin-x64': 0.1.2 + '@deepseek-ai/node-addon-system-linux-arm64': 0.1.2 + '@deepseek-ai/node-addon-system-linux-x64': 0.1.2 + + '@deepseek-ai/schemastery@3.18.4': + dependencies: + '@deepseek-ai/cosmokit': 1.8.5 + '@standard-schema/spec': 1.1.0 + + '@earendil-works/pi-ai@0.87.1(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5))(ws@8.22.0)(zod@4.6.5)': + dependencies: + '@anthropic-ai/sdk': 0.124.0(zod@4.6.5) + '@aws-sdk/client-bedrock-runtime': 3.1127.0 + '@earendil-works/pi-telemetry': 0.87.1 + '@google/genai': 2.21.0(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5)) + '@smithy/node-http-handler': 4.12.1 + http-proxy-agent: 9.1.0 + https-proxy-agent: 9.1.0 + openai: 6.40.0(ws@8.22.0)(zod@4.6.5) + partial-json: 0.1.7 + typebox: 1.3.27 + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - kerberos + - supports-color + - utf-8-validate + - ws + - zod + + '@earendil-works/pi-telemetry@0.87.1': {} + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 optional: true '@esbuild/aix-ppc64@0.25.12': @@ -1442,17 +8397,207 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true + '@eslint-community/regexpp@4.12.2': {} + '@exodus/bytes@1.15.1(@noble/hashes@2.0.1)': optionalDependencies: '@noble/hashes': 2.0.1 optional: true + '@google/genai@2.21.0(@modelcontextprotocol/sdk@1.30.0(zod@4.6.5))': + dependencies: + google-auth-library: 10.9.1 + p-retry: 4.6.2 + protobufjs: 7.6.6 + ws: 8.22.0 + optionalDependencies: + '@modelcontextprotocol/sdk': 1.30.0(zod@4.6.5) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@hono/node-server@2.1.1(hono@4.13.3)': dependencies: hono: 4.13.3 + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.4 + optional: true + + '@img/sharp-darwin-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.4 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.4': + optional: true + + '@img/sharp-linux-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.4 + optional: true + + '@img/sharp-linux-arm@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.4 + optional: true + + '@img/sharp-linux-ppc64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.4 + optional: true + + '@img/sharp-linux-riscv64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.4 + optional: true + + '@img/sharp-linux-s390x@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.4 + optional: true + + '@img/sharp-linux-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + optional: true + + '@img/sharp-wasm32@0.35.5': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.5': + dependencies: + '@img/sharp-wasm32': 0.35.5 + optional: true + + '@img/sharp-win32-arm64@0.35.5': + optional: true + + '@img/sharp-win32-ia32@0.35.5': + optional: true + + '@img/sharp-win32-x64@0.35.5': + optional: true + + '@joplin/turndown-plugin-gfm@1.0.68': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@js-temporal/polyfill@0.5.1': + dependencies: + jsbi: 4.3.2 + + '@keyv/serialize@1.1.1': {} + + '@koromix/koffi-darwin-arm64@3.1.1': + optional: true + + '@koromix/koffi-darwin-x64@3.1.1': + optional: true + + '@koromix/koffi-freebsd-arm64@3.1.1': + optional: true + + '@koromix/koffi-freebsd-ia32@3.1.1': + optional: true + + '@koromix/koffi-freebsd-x64@3.1.1': + optional: true + + '@koromix/koffi-linux-arm64@3.1.1': + optional: true + + '@koromix/koffi-linux-ia32@3.1.1': + optional: true + + '@koromix/koffi-linux-loong64@3.1.1': + optional: true + + '@koromix/koffi-linux-riscv64@3.1.1': + optional: true + + '@koromix/koffi-linux-x64@3.1.1': + optional: true + + '@koromix/koffi-openbsd-ia32@3.1.1': + optional: true + + '@koromix/koffi-openbsd-x64@3.1.1': + optional: true + + '@koromix/koffi-win32-arm64@3.1.1': + optional: true + + '@koromix/koffi-win32-ia32@3.1.1': + optional: true + + '@koromix/koffi-win32-x64@3.1.1': + optional: true + + '@mixmark-io/domino@2.2.0': {} + + '@modelcontextprotocol/client@2.0.0': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + jose: 6.2.10 + pkce-challenge: 5.0.1 + zod: 4.6.5 + + '@modelcontextprotocol/core@2.0.0': + dependencies: + zod: 4.6.5 + '@modelcontextprotocol/sdk@1.30.0(zod@4.6.5)': dependencies: '@hono/node-server': 2.1.1(hono@4.13.3) @@ -1481,10 +8626,117 @@ snapshots: '@noble/hashes@2.0.1': optional: true + '@octokit/openapi-types@29.0.1': {} + + '@octokit/openapi-webhooks-types@12.1.0': {} + + '@octokit/request-error@7.1.2': + dependencies: + '@octokit/types': 18.0.0 + + '@octokit/types@18.0.0': + dependencies: + '@octokit/openapi-types': 29.0.1 + + '@octokit/webhooks-methods@6.0.0': {} + + '@octokit/webhooks@14.2.0': + dependencies: + '@octokit/openapi-webhooks-types': 12.1.0 + '@octokit/request-error': 7.1.2 + '@octokit/webhooks-methods': 6.0.0 + '@opencode-ai/sdk@1.18.32': dependencies: cross-spawn: 7.0.6 + '@opentelemetry/api-logs@0.220.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/otlp-exporter-base@0.220.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-transformer@0.220.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.11.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/resources@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.220.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-trace@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.43.0': {} + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.2': {} + '@rollup/rollup-android-arm-eabi@4.62.5': optional: true @@ -1560,8 +8812,53 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.5': optional: true + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/is@7.2.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@smithy/core@3.35.1': + dependencies: + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.5.2': + dependencies: + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.8.0': + dependencies: + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.12.1': + dependencies: + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.7.4': + dependencies: + '@smithy/core': 3.35.1 + '@smithy/types': 4.19.0 + tslib: 2.8.1 + + '@smithy/types@4.19.0': + dependencies: + tslib: 2.8.1 + '@stablelib/base64@1.0.1': {} + '@standard-schema/spec@1.1.0': {} + + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -1576,6 +8873,10 @@ snapshots: '@types/estree@1.0.9': {} + '@types/http-cache-semantics@4.2.0': {} + + '@types/js-yaml@4.0.9': {} + '@types/ms@2.1.0': optional: true @@ -1583,6 +8884,8 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/retry@0.12.0': {} + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 @@ -1591,13 +8894,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.7(vite@6.4.3(@types/node@22.20.1))': + '@vitest/mocker@3.2.7(vite@6.4.3(@types/node@22.20.1)(yaml@2.9.1))': dependencies: '@vitest/spy': 3.2.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.3(@types/node@22.20.1) + vite: 6.4.3(@types/node@22.20.1)(yaml@2.9.1) '@vitest/pretty-format@3.2.7': dependencies: @@ -1609,27 +8912,86 @@ snapshots: pathe: 2.0.3 strip-literal: 3.1.0 - '@vitest/snapshot@3.2.7': - dependencies: - '@vitest/pretty-format': 3.2.7 - magic-string: 0.30.21 - pathe: 2.0.3 + '@vitest/snapshot@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.7': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + '@vscode/ripgrep-darwin-arm64@1.18.0': + optional: true + + '@vscode/ripgrep-darwin-x64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-arm64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-arm@1.18.0': + optional: true + + '@vscode/ripgrep-linux-ia32@1.18.0': + optional: true + + '@vscode/ripgrep-linux-ppc64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-riscv64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-s390x@1.18.0': + optional: true + + '@vscode/ripgrep-linux-x64@1.18.0': + optional: true - '@vitest/spy@3.2.7': - dependencies: - tinyspy: 4.0.4 + '@vscode/ripgrep-win32-arm64@1.18.0': + optional: true - '@vitest/utils@3.2.7': - dependencies: - '@vitest/pretty-format': 3.2.7 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@vscode/ripgrep-win32-ia32@1.18.0': + optional: true + + '@vscode/ripgrep-win32-x64@1.18.0': + optional: true + + '@vscode/ripgrep@1.18.0': + optionalDependencies: + '@vscode/ripgrep-darwin-arm64': 1.18.0 + '@vscode/ripgrep-darwin-x64': 1.18.0 + '@vscode/ripgrep-linux-arm': 1.18.0 + '@vscode/ripgrep-linux-arm64': 1.18.0 + '@vscode/ripgrep-linux-ia32': 1.18.0 + '@vscode/ripgrep-linux-ppc64': 1.18.0 + '@vscode/ripgrep-linux-riscv64': 1.18.0 + '@vscode/ripgrep-linux-s390x': 1.18.0 + '@vscode/ripgrep-linux-x64': 1.18.0 + '@vscode/ripgrep-win32-arm64': 1.18.0 + '@vscode/ripgrep-win32-ia32': 1.18.0 + '@vscode/ripgrep-win32-x64': 1.18.0 + + '@xterm/addon-serialize@0.14.0': {} + + '@xterm/headless@6.0.0': {} accepts@2.0.0: dependencies: mime-types: 3.0.2 negotiator: 1.1.0 + agent-base@7.1.4: {} + + agent-base@9.0.0: {} + ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -1641,13 +9003,19 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + argparse@2.0.1: {} + assertion-error@2.0.1: {} + base64-js@1.5.1: {} + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 optional: true + bignumber.js@9.3.1: {} + body-parser@2.3.0: dependencies: bytes: 3.1.2 @@ -1662,10 +9030,36 @@ snapshots: transitivePeerDependencies: - supports-color + bowser@2.14.1: {} + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + buffer-equal-constant-time@1.0.1: {} + + bundle-name@4.1.1: + dependencies: + run-applescript: 7.1.0 + + byte-counter@0.1.0: {} + bytes@3.1.2: {} cac@6.7.14: {} + cacheable-lookup@7.0.0: {} + + cacheable-request@13.0.19: + dependencies: + '@types/http-cache-semantics': 4.2.0 + get-stream: 9.0.1 + http-cache-semantics: 4.3.0 + keyv: 5.6.0 + mimic-response: 4.0.0 + normalize-url: 8.1.1 + responselike: 4.0.2 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -1686,6 +9080,35 @@ snapshots: check-error@2.1.3: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + + clone@2.1.2: {} + + commander@15.0.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.2: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + destroy: 1.2.0 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -1713,6 +9136,8 @@ snapshots: source-map-js: 1.2.1 optional: true + data-uri-to-buffer@4.0.1: {} + data-urls@7.0.0(@noble/hashes@2.0.1): dependencies: whatwg-mimetype: 5.0.0 @@ -1721,6 +9146,10 @@ snapshots: - '@noble/hashes' optional: true + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.4.3: dependencies: ms: 2.1.3 @@ -1728,16 +9157,41 @@ snapshots: decimal.js@10.6.0: optional: true + decompress-response@10.0.0: + dependencies: + mimic-response: 4.0.0 + deep-eql@5.0.2: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.1: + dependencies: + bundle-name: 4.1.1 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + depd@2.0.0: {} + destroy@1.2.0: {} + + detect-libc@2.1.2: {} + + dfa@1.2.0: {} + + diff@9.0.0: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + ee-first@1.1.1: {} encodeurl@2.0.0: {} @@ -1798,6 +9252,21 @@ snapshots: dependencies: eventsource-parser: 3.1.1 + execa@10.0.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.1 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + which-command: 0.1.0 + yoctocolors: 2.2.0 + expect-type@1.4.0: {} express-rate-limit@8.6.2(express@5.2.1): @@ -1841,6 +9310,8 @@ snapshots: transitivePeerDependencies: - supports-color + extend@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-sha256@1.3.0: {} @@ -1851,6 +9322,19 @@ snapshots: optionalDependencies: picomatch: 4.0.5 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fflate@0.8.2: {} + + fflate@0.8.3: {} + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -1862,6 +9346,24 @@ snapshots: transitivePeerDependencies: - supports-color + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.23 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + form-data-encoder@4.1.0: {} + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fresh@2.0.0: {} @@ -1871,6 +9373,22 @@ snapshots: function-bind@1.1.2: {} + gaxios@7.3.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + + gcp-metadata@8.1.2: + dependencies: + gaxios: 7.3.1 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -1889,8 +9407,41 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + google-auth-library@10.9.1: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.3.1 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + + google-logging-utils@1.1.3: {} + gopd@1.2.0: {} + got@14.6.6: + dependencies: + '@sindresorhus/is': 7.2.0 + byte-counter: 0.1.0 + cacheable-lookup: 7.0.0 + cacheable-request: 13.0.19 + decompress-response: 10.0.0 + form-data-encoder: 4.1.0 + http2-wrapper: 2.2.1 + keyv: 5.6.0 + lowercase-keys: 3.0.0 + p-cancelable: 4.0.1 + responselike: 4.0.2 + type-fest: 4.41.0 + has-symbols@1.1.0: {} hasown@2.0.4: @@ -1906,6 +9457,8 @@ snapshots: - '@noble/hashes' optional: true + http-cache-semantics@4.3.0: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -1914,6 +9467,38 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + http-proxy-agent@9.1.0: + dependencies: + agent-base: 9.0.0 + debug: 4.4.3 + proxy-agent-negotiate: 1.1.0 + transitivePeerDependencies: + - kerberos + - supports-color + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@9.1.0: + dependencies: + agent-base: 9.0.0 + debug: 4.4.3 + proxy-agent-negotiate: 1.1.0 + transitivePeerDependencies: + - kerberos + - supports-color + + human-signals@8.0.1: {} + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 @@ -1924,17 +9509,45 @@ snapshots: ipaddr.js@1.9.1: {} + ipaddr.js@2.5.0: {} + + is-docker@3.0.0: {} + + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: optional: true is-promise@4.0.0: {} + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isexe@2.0.0: {} jose@6.2.10: {} + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsbi@4.3.2: {} + jsdom@30.0.1(@noble/hashes@2.0.1): dependencies: '@asamuzakjp/css-color': 6.0.7 @@ -1962,6 +9575,10 @@ snapshots: - '@noble/hashes' optional: true + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + json-schema-to-ts@3.1.1: dependencies: '@babel/runtime': 7.29.7 @@ -1971,8 +9588,45 @@ snapshots: json-schema-typed@8.0.2: {} + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + + koffi@3.1.1: + optionalDependencies: + '@koromix/koffi-darwin-arm64': 3.1.1 + '@koromix/koffi-darwin-x64': 3.1.1 + '@koromix/koffi-freebsd-arm64': 3.1.1 + '@koromix/koffi-freebsd-ia32': 3.1.1 + '@koromix/koffi-freebsd-x64': 3.1.1 + '@koromix/koffi-linux-arm64': 3.1.1 + '@koromix/koffi-linux-ia32': 3.1.1 + '@koromix/koffi-linux-loong64': 3.1.1 + '@koromix/koffi-linux-riscv64': 3.1.1 + '@koromix/koffi-linux-x64': 3.1.1 + '@koromix/koffi-openbsd-ia32': 3.1.1 + '@koromix/koffi-openbsd-x64': 3.1.1 + '@koromix/koffi-win32-arm64': 3.1.1 + '@koromix/koffi-win32-ia32': 3.1.1 + '@koromix/koffi-win32-x64': 3.1.1 + + long@5.3.2: {} + loupe@3.2.1: {} + lowercase-keys@3.0.0: {} + lru-cache@11.5.2: optional: true @@ -1995,14 +9649,102 @@ snapshots: dependencies: mime-db: 1.54.0 + mimic-response@4.0.0: {} + + ms@2.0.0: {} + ms@2.1.3: {} nanoid@3.3.18: {} + negotiator@0.6.4: {} + negotiator@1.1.0: dependencies: content-type: 2.1.0 + node-addon-api@7.1.1: {} + + node-addon-native-custom-loader@0.1.7: {} + + node-addon-require-builtin-darwin-arm64@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-darwin-x64@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-linux-arm64-gnu@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-linux-arm64-musl@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-linux-x64-gnu@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-linux-x64-musl@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-win32-arm64-msvc@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-win32-ia32-msvc@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin-win32-x64-msvc@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optional: true + + node-addon-require-builtin@0.1.7: + dependencies: + node-addon-native-custom-loader: 0.1.7 + optionalDependencies: + node-addon-require-builtin-darwin-arm64: 0.1.7 + node-addon-require-builtin-darwin-x64: 0.1.7 + node-addon-require-builtin-linux-arm64-gnu: 0.1.7 + node-addon-require-builtin-linux-arm64-musl: 0.1.7 + node-addon-require-builtin-linux-x64-gnu: 0.1.7 + node-addon-require-builtin-linux-x64-musl: 0.1.7 + node-addon-require-builtin-win32-arm64-msvc: 0.1.7 + node-addon-require-builtin-win32-ia32-msvc: 0.1.7 + node-addon-require-builtin-win32-x64-msvc: 0.1.7 + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-pty@1.2.0-beta.15: + dependencies: + node-addon-api: 7.1.1 + + normalize-url@8.1.1: {} + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -2011,10 +9753,26 @@ snapshots: dependencies: ee-first: 1.1.1 + on-headers@1.1.0: {} + once@1.4.0: dependencies: wrappy: 1.0.2 + open@11.0.4: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.2.1 + wsl-utils: 1.0.1 + + openai@6.40.0(ws@8.22.0)(zod@4.6.5): + optionalDependencies: + ws: 8.22.0 + zod: 4.6.5 + opencode-ai@1.18.32: optionalDependencies: opencode-darwin-arm64: 1.18.32 @@ -2066,6 +9824,17 @@ snapshots: opencode-windows-x64@1.18.32: optional: true + p-cancelable@4.0.1: {} + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + pako@0.2.9: {} + + parse-ms@4.0.0: {} + parse5@8.0.1: dependencies: entities: 8.0.0 @@ -2073,8 +9842,12 @@ snapshots: parseurl@1.3.3: {} + partial-json@0.1.7: {} + path-key@3.1.1: {} + path-key@4.0.0: {} + path-to-regexp@8.4.2: {} pathe@2.0.3: {} @@ -2093,11 +9866,33 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.2.1: {} + + pretty-ms@9.3.1: + dependencies: + parse-ms: 4.0.0 + + protobufjs@7.6.6: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 22.20.1 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent-negotiate@1.1.0: {} + punycode@2.3.1: optional: true @@ -2106,6 +9901,8 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 + quick-lru@5.1.1: {} + range-parser@1.3.0: {} raw-body@3.0.2: @@ -2115,8 +9912,24 @@ snapshots: iconv-lite: 0.7.3 unpipe: 1.0.0 + readdirp@4.1.2: {} + + readdirp@5.1.1: {} + require-from-string@2.0.2: {} + resolve-alpn@1.2.1: {} + + resolve.exports@2.0.3: {} + + responselike@4.0.2: + dependencies: + lowercase-keys: 3.0.0 + + restructure@3.0.2: {} + + retry@0.13.1: {} + rollup@4.62.5: dependencies: '@types/estree': 1.0.9 @@ -2159,12 +9972,17 @@ snapshots: transitivePeerDependencies: - supports-color + run-applescript@7.1.0: {} + + safe-buffer@5.2.1: {} + safer-buffer@2.1.2: {} saxes@6.0.0: dependencies: xmlchars: 2.2.0 - optional: true + + semver@7.8.5: {} send@1.2.1: dependencies: @@ -2193,12 +10011,72 @@ snapshots: setprototypeof@1.2.0: {} + sharp@0.35.5(@types/node@22.20.1): + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.5 + '@img/sharp-darwin-x64': 0.35.5 + '@img/sharp-freebsd-wasm32': 0.35.5 + '@img/sharp-libvips-darwin-arm64': 1.3.4 + '@img/sharp-libvips-darwin-x64': 1.3.4 + '@img/sharp-libvips-linux-arm': 1.3.4 + '@img/sharp-libvips-linux-arm64': 1.3.4 + '@img/sharp-libvips-linux-ppc64': 1.3.4 + '@img/sharp-libvips-linux-riscv64': 1.3.4 + '@img/sharp-libvips-linux-s390x': 1.3.4 + '@img/sharp-libvips-linux-x64': 1.3.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.4 + '@img/sharp-linux-arm': 0.35.5 + '@img/sharp-linux-arm64': 0.35.5 + '@img/sharp-linux-ppc64': 0.35.5 + '@img/sharp-linux-riscv64': 0.35.5 + '@img/sharp-linux-s390x': 0.35.5 + '@img/sharp-linux-x64': 0.35.5 + '@img/sharp-linuxmusl-arm64': 0.35.5 + '@img/sharp-linuxmusl-x64': 0.35.5 + '@img/sharp-webcontainers-wasm32': 0.35.5 + '@img/sharp-win32-arm64': 0.35.5 + '@img/sharp-win32-ia32': 0.35.5 + '@img/sharp-win32-x64': 0.35.5 + '@types/node': 22.20.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + sherpa-onnx-darwin-arm64@1.13.8: + optional: true + + sherpa-onnx-darwin-x64@1.13.8: + optional: true + + sherpa-onnx-linux-arm64@1.13.8: + optional: true + + sherpa-onnx-linux-x64@1.13.8: + optional: true + + sherpa-onnx-node@1.13.8: + optionalDependencies: + sherpa-onnx-darwin-arm64: 1.13.8 + sherpa-onnx-darwin-x64: 1.13.8 + sherpa-onnx-linux-arm64: 1.13.8 + sherpa-onnx-linux-x64: 1.13.8 + sherpa-onnx-win-ia32: 1.13.8 + sherpa-onnx-win-x64: 1.13.8 + + sherpa-onnx-win-ia32@1.13.8: + optional: true + + sherpa-onnx-win-x64@1.13.8: + optional: true + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 @@ -2229,6 +10107,8 @@ snapshots: siginfo@2.0.0: {} + signal-exit@4.1.0: {} + source-map-js@1.2.1: {} stackback@0.0.2: {} @@ -2242,6 +10122,8 @@ snapshots: std-env@3.10.0: {} + strip-final-newline@4.0.0: {} + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 @@ -2249,6 +10131,8 @@ snapshots: symbol-tree@3.2.4: optional: true + tiny-inflate@1.0.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -2286,30 +10170,51 @@ snapshots: ts-algebra@2.0.0: {} + tslib@2.8.1: {} + + turndown@7.2.4: + dependencies: + '@mixmark-io/domino': 2.2.0 + + type-fest@4.41.0: {} + type-is@2.1.0: dependencies: content-type: 2.1.0 media-typer: 1.1.1 mime-types: 3.0.2 + typebox@1.3.27: {} + typescript@5.9.3: {} undici-types@6.21.0: {} - undici@8.10.0: - optional: true + undici@8.10.0: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unicorn-magic@0.3.0: {} unpipe@1.0.0: {} vary@1.1.2: {} - vite-node@3.2.4(@types/node@22.20.1): + vite-node@3.2.4(@types/node@22.20.1)(yaml@2.9.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.3(@types/node@22.20.1) + vite: 6.4.3(@types/node@22.20.1)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - jiti @@ -2324,7 +10229,7 @@ snapshots: - tsx - yaml - vite@6.4.3(@types/node@22.20.1): + vite@6.4.3(@types/node@22.20.1)(yaml@2.9.1): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.5) @@ -2335,12 +10240,13 @@ snapshots: optionalDependencies: '@types/node': 22.20.1 fsevents: 2.3.3 + yaml: 2.9.1 - vitest@3.2.7(@types/debug@4.1.13)(@types/node@22.20.1)(jsdom@30.0.1(@noble/hashes@2.0.1)): + vitest@3.2.7(@types/debug@4.1.13)(@types/node@22.20.1)(jsdom@30.0.1(@noble/hashes@2.0.1))(yaml@2.9.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(vite@6.4.3(@types/node@22.20.1)) + '@vitest/mocker': 3.2.7(vite@6.4.3(@types/node@22.20.1)(yaml@2.9.1)) '@vitest/pretty-format': 3.2.7 '@vitest/runner': 3.2.7 '@vitest/snapshot': 3.2.7 @@ -2358,8 +10264,8 @@ snapshots: tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.3(@types/node@22.20.1) - vite-node: 3.2.4(@types/node@22.20.1) + vite: 6.4.3(@types/node@22.20.1)(yaml@2.9.1) + vite-node: 3.2.4(@types/node@22.20.1)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 @@ -2384,6 +10290,8 @@ snapshots: xml-name-validator: 5.0.0 optional: true + web-streams-polyfill@3.3.3: {} + webidl-conversions@8.0.1: optional: true @@ -2408,6 +10316,8 @@ snapshots: - '@noble/hashes' optional: true + which-command@0.1.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -2419,11 +10329,21 @@ snapshots: wrappy@1.0.2: {} + ws@8.22.0: {} + + wsl-utils@1.0.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.2.1 + xml-name-validator@5.0.0: optional: true - xmlchars@2.2.0: - optional: true + xmlchars@2.2.0: {} + + yaml@2.9.1: {} + + yoctocolors@2.2.0: {} zod-to-json-schema@3.25.2(zod@4.6.5): dependencies: From 2d8de4039b700680d364a51cd4b3978dd30b3483 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:38 +0200 Subject: [PATCH 02/22] feat(agent-host): the DeepSeek Harness driver over ACP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A third agent next to Claude Code and OpenCode, on by default. The harness's `acp` profile is the one interface it exposes that has everything an interactive client needs — prompts, cancellation, one-shot permission asks, and a model/reasoning selection that can change mid-session; its `sdk` profile has none of the last three, and `headless` is one-shot. The driver speaks that protocol directly (`acp.ts`: JSON-RPC over the child's newline-delimited stdio, typed by the ACP schema package through a type-only import, so nothing of it ships). One `dsh --profile acp` process serves every session started in the SAME environment, and an environment is the unit because a session's provider binding is: a session bound to a gateway needs a base URL and a token the native session must not have, so a binding change means a different process rather than one connection carrying two sets of credentials. The runtime is fetched as the host starts, like the other agents', so the first session finds it ready instead of waiting on a download. Two places where the agent's own answer differs from its siblings: it has no modes, so `ask`/`default` are this driver's own (every permission to the phone, or auto-approve), and its result updates carry no diff, so a file change is reconstructed from the call's arguments. What the surface does not have is advertised as absent: no questions, no background tasks, no subscription usage. The context meter does, over the harness's own usage updates, and a provider binding reaches the child as `DEEPSEEK_BASE_URL` and `DEEPSEEK_API_KEY` with the vendor namespace dropped from the inherited environment. MCP servers and plugins are the harness's own configuration files: rows in the profile's patch layer (a delimited block this driver owns) and `dsh plugin --profile acp` for packages. `src/provider.ts` takes the base-URL rule two drivers now apply. Co-Authored-By: Claude Code --- packages/agent-host/package.json | 2 +- packages/agent-host/src/drivers/claude/env.ts | 20 +- .../__tests__/deepseek-adapter.test.ts | 291 +++++++ .../deepseek/__tests__/deepseekAcp.test.ts | 208 +++++ .../deepseek/__tests__/deepseekDriver.test.ts | 697 +++++++++++++++++ .../deepseek/__tests__/deepseekEnv.test.ts | 118 +++ .../deepseek/__tests__/deepseekMcp.test.ts | 196 +++++ .../__tests__/deepseekPlugins.test.ts | 221 ++++++ .../drivers/deepseek/__tests__/fakeHarness.ts | 342 +++++++++ .../agent-host/src/drivers/deepseek/acp.ts | 270 +++++++ .../src/drivers/deepseek/adapter.ts | 215 ++++++ .../agent-host/src/drivers/deepseek/driver.ts | 721 ++++++++++++++++++ .../agent-host/src/drivers/deepseek/env.ts | 104 +++ .../src/drivers/deepseek/install.ts | 33 + .../agent-host/src/drivers/deepseek/mcp.ts | 333 ++++++++ .../src/drivers/deepseek/plugins.ts | 266 +++++++ .../src/drivers/deepseek/runtime.ts | 456 +++++++++++ packages/agent-host/src/main.ts | 50 +- packages/agent-host/src/net.ts | 7 + packages/agent-host/src/provider.ts | 26 + packages/agent-host/src/tools.ts | 24 + pnpm-lock.yaml | 7 +- 22 files changed, 4582 insertions(+), 25 deletions(-) create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseekAcp.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseekEnv.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseekMcp.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseekPlugins.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/fakeHarness.ts create mode 100644 packages/agent-host/src/drivers/deepseek/acp.ts create mode 100644 packages/agent-host/src/drivers/deepseek/adapter.ts create mode 100644 packages/agent-host/src/drivers/deepseek/driver.ts create mode 100644 packages/agent-host/src/drivers/deepseek/env.ts create mode 100644 packages/agent-host/src/drivers/deepseek/install.ts create mode 100644 packages/agent-host/src/drivers/deepseek/mcp.ts create mode 100644 packages/agent-host/src/drivers/deepseek/plugins.ts create mode 100644 packages/agent-host/src/drivers/deepseek/runtime.ts create mode 100644 packages/agent-host/src/provider.ts diff --git a/packages/agent-host/package.json b/packages/agent-host/package.json index 6968a723..a89275dc 100644 --- a/packages/agent-host/package.json +++ b/packages/agent-host/package.json @@ -13,6 +13,7 @@ "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.3.283", "@opencode-ai/sdk": "^1.18.32", + "js-yaml": "^4.2.0", "zod": "^4.6.5" }, "devDependencies": { @@ -21,7 +22,6 @@ "@types/js-yaml": "^4.0.9", "@types/node": "^22.10.0", "esbuild": "^0.25.0", - "js-yaml": "^4.2.0", "opencode-ai": "1.18.32", "typescript": "^5.7.0", "vitest": "^3.0.0" diff --git a/packages/agent-host/src/drivers/claude/env.ts b/packages/agent-host/src/drivers/claude/env.ts index 2c512bd0..910b5049 100644 --- a/packages/agent-host/src/drivers/claude/env.ts +++ b/packages/agent-host/src/drivers/claude/env.ts @@ -3,28 +3,12 @@ * credentials and the session's provider binding, turned into the variables * the CLI reads. The returned objects carry SECRETS — never log them. */ +import { isValidProviderBaseUrl, PROVIDER_BASE_URL_ERROR } from '../../provider'; import type { ProviderBinding, StartSession } from '../../types'; export const ANTHROPIC_API_KEY_CREDENTIAL = 'anthropic_api_key'; -/** The message shown when a base URL is refused (the bridge shows the same). */ -export const PROVIDER_BASE_URL_ERROR = - 'Base URL must be https:// (http:// is allowed only for localhost, 127.0.0.1 or [::1])'; - -/** https anywhere, or http ONLY on loopback — a local model server has no - * cert and its traffic never leaves the machine; anything else is a network - * hop carrying a bearer token. */ -export function isValidProviderBaseUrl(raw: string): boolean { - let url: URL; - try { - url = new URL(raw); - } catch { - return false; - } - if (url.protocol === 'https:') return url.host !== ''; - if (url.protocol !== 'http:') return false; - return ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname.toLowerCase()); -} +export { isValidProviderBaseUrl, PROVIDER_BASE_URL_ERROR }; /** * The env-name namespaces the Claude Code CLI (and the cloud SDKs it embeds) diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts new file mode 100644 index 00000000..4191138f --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts @@ -0,0 +1,291 @@ +/** + * deepseekUpdateToEntries and toolCallDiffs — the DeepSeek Harness + * translator, in the style of sdk-adapter.test.ts and opencode-adapter.test.ts. + * + * The updates are the ones the harness's own ACP module sends: assistant + * messages and thoughts, generic tool call lifecycles whose kind is always + * `other` and whose title is the tool's name, and usage. Nothing else — no + * plans, no modes, no commands — which the last case covers. + */ +import { describe, expect, it } from 'vitest'; +import type { SessionUpdate } from '@agentclientprotocol/sdk'; +import type { DiffLine, OutputEntry } from '../../../types'; +import { deepseekUpdateToEntries, toolCallDiffs, type ToolCallMemory } from '../adapter'; + +type EntryOf = Extract; + +function entries(update: unknown, calls: ToolCallMemory = new Map()): OutputEntry[] { + return deepseekUpdateToEntries(update as SessionUpdate, calls); +} + +/** The call one update reports, ready for its result. */ +function started(name: string, input: Record = {}, calls: ToolCallMemory = new Map()): ToolCallMemory { + entries({ sessionUpdate: 'tool_call', toolCallId: 'c1', title: name, kind: 'other', status: 'in_progress', rawInput: input }, calls); + return calls; +} + +const text = (update: unknown): string => (entries(update)[0] as EntryOf<'text'>).text; + +describe('messages', () => { + it('renders an agent message chunk as agent text', () => { + expect(entries({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'Done.' } })).toEqual([ + { entryType: 'text', role: 'agent', text: 'Done.', timestamp: expect.any(String) }, + ]); + }); + + it('drops an empty chunk', () => { + expect(entries({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: '' } })).toEqual([]); + }); + + it('renders a thought as thinking', () => { + expect(entries({ sessionUpdate: 'agent_thought_chunk', content: { type: 'text', text: 'hmm' } })).toEqual([ + { entryType: 'thinking', text: 'hmm', timestamp: expect.any(String) }, + ]); + }); + + it('ignores the updates the harness never sends over ACP', () => { + // The automation profile carries no plans, commands, modes or terminal + // callbacks; a client must not invent entries for them. + expect(entries({ sessionUpdate: 'plan', entries: [{ content: 'x', status: 'pending', priority: 'low' }] })).toEqual([]); + expect(entries({ sessionUpdate: 'available_commands_update', availableCommands: [] })).toEqual([]); + expect(entries({ sessionUpdate: 'current_mode_update', currentModeId: 'plan' })).toEqual([]); + }); +}); + +describe('tool calls', () => { + it('summarizes a command, with its whole text as the call input', () => { + const call = entries({ + sessionUpdate: 'tool_call', + toolCallId: 'c1', + title: 'bash', + kind: 'other', + status: 'in_progress', + rawInput: { command: 'npm ci\nnpm test', description: 'Install and test' }, + })[0] as EntryOf<'tool_call'>; + expect(call).toMatchObject({ entryType: 'tool_call', callId: 'c1', toolName: 'bash', kind: 'execute', title: 'npm ci…' }); + expect(call.input).toBe('npm ci\nnpm test'); + }); + + it('uses the ACP name when the harness sends one', () => { + const call = entries({ + sessionUpdate: 'tool_call', + toolCallId: 'c1', + title: 'Running the tests', + name: 'bash', + kind: 'other', + status: 'in_progress', + rawInput: { command: 'npm test' }, + })[0] as EntryOf<'tool_call'>; + expect(call.toolName).toBe('bash'); + expect(call.kind).toBe('execute'); + }); + + it('names the file a read touches and leaves a single-path input out', () => { + const call = entries({ + sessionUpdate: 'tool_call', + toolCallId: 'c1', + title: 'read', + kind: 'other', + status: 'in_progress', + rawInput: { file_path: 'src/main.ts' }, + })[0] as EntryOf<'tool_call'>; + expect(call).toMatchObject({ kind: 'read', title: 'src/main.ts', locations: ['src/main.ts'] }); + expect(call.input).toBeUndefined(); + }); + + it('reads str_replace_editor\'s own path as its location', () => { + const call = entries({ + sessionUpdate: 'tool_call', + toolCallId: 'c1', + title: 'str_replace_editor', + kind: 'other', + status: 'in_progress', + rawInput: { command: 'str_replace', path: '/repo/a.py', old_str: 'x', new_str: 'y' }, + })[0] as EntryOf<'tool_call'>; + expect(call).toMatchObject({ kind: 'edit', title: 'str_replace /repo/a.py', locations: ['/repo/a.py'] }); + }); + + it('shows a checklist a todo call wrote, and no input for it', () => { + const call = entries({ + sessionUpdate: 'tool_call', + toolCallId: 'c1', + title: 'todo_write', + kind: 'other', + status: 'in_progress', + rawInput: { todos: [{ content: 'Ship it', status: 'in_progress' }] }, + }); + expect(call[0]).toMatchObject({ entryType: 'tool_call', kind: 'think' }); + expect((call[0] as EntryOf<'tool_call'>).input).toBeUndefined(); + expect(call[1]).toEqual({ + entryType: 'todos', + callId: 'c1', + items: [{ text: 'Ship it', status: 'in_progress' }], + timestamp: expect.any(String), + }); + }); + + it('keeps the tool name of an MCP tool', () => { + const call = entries({ + sessionUpdate: 'tool_call', + toolCallId: 'c1', + title: 'mcp__github__create_issue', + kind: 'other', + status: 'in_progress', + rawInput: { title: 'a bug' }, + })[0] as EntryOf<'tool_call'>; + expect(call.toolName).toBe('mcp__github__create_issue'); + expect(call.kind).toBe('other'); + }); +}); + +describe('tool results', () => { + it('renders a completed call and forgets it', () => { + const calls = started('bash', { command: 'ls' }); + const result = entries( + { + sessionUpdate: 'tool_call_update', + toolCallId: 'c1', + status: 'completed', + content: [{ type: 'content', content: { type: 'text', text: 'a.ts\nb.ts' } }], + }, + calls, + ); + expect(result).toEqual([ + { entryType: 'tool_result', callId: 'c1', text: 'a.ts\nb.ts', timestamp: expect.any(String) }, + ]); + expect(calls.size).toBe(0); + }); + + it('marks a failed call', () => { + const calls = started('bash', { command: 'ls' }); + const result = entries( + { + sessionUpdate: 'tool_call_update', + toolCallId: 'c1', + status: 'failed', + content: [{ type: 'content', content: { type: 'text', text: 'not found' } }], + }, + calls, + )[0] as EntryOf<'tool_result'>; + expect(result).toMatchObject({ entryType: 'tool_result', text: 'not found', isError: true }); + }); + + it('shows an image result as a placeholder', () => { + const calls = started('read_image', { file_path: 'a.png' }); + const result = entries( + { + sessionUpdate: 'tool_call_update', + toolCallId: 'c1', + status: 'completed', + content: [{ type: 'content', content: { type: 'image', data: 'AAAA', mimeType: 'image/png' } }], + }, + calls, + ); + expect((result[0] as EntryOf<'tool_result'>).text).toBe('[image]'); + }); + + it('shows nothing for a progress update', () => { + const calls = started('bash', { command: 'ls' }); + expect( + entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'in_progress', content: [] }, calls), + ).toEqual([]); + expect(calls.size).toBe(1); + }); + + it('renders a result whose call was never seen', () => { + const result = entries({ + sessionUpdate: 'tool_call_update', + toolCallId: 'gone', + status: 'completed', + content: [{ type: 'content', content: { type: 'text', text: 'orphan' } }], + }); + expect(result).toEqual([{ entryType: 'tool_result', callId: 'gone', text: 'orphan', timestamp: expect.any(String) }]); + }); +}); + +describe('file changes', () => { + const diffOf = (parsed: OutputEntry[]): { path: string; lines: DiffLine[]; truncated?: boolean } => { + const diff = parsed.find((entry): entry is EntryOf<'diff'> => entry.entryType === 'diff')!; + return { path: diff.path, lines: diff.lines, ...(diff.truncated ? { truncated: true } : {}) }; + }; + + it('shows an edit as the replaced text', () => { + const calls = started('edit', { file_path: 'a.ts', old_string: 'one', new_string: 'two' }); + const result = entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'completed', content: [] }, calls); + expect(diffOf(result)).toEqual({ + path: 'a.ts', + lines: [ + { type: 'del', text: 'one' }, + { type: 'add', text: 'two' }, + ], + }); + }); + + it('shows a write as all additions', () => { + const calls = started('write', { file_path: 'new.ts', content: 'a\nb' }); + const result = entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'completed', content: [] }, calls); + expect(diffOf(result).lines).toEqual([ + { type: 'add', text: 'a' }, + { type: 'add', text: 'b' }, + ]); + }); + + it('follows what str_replace_editor was asked to do', () => { + const create = started('str_replace_editor', { command: 'create', path: '/repo/a.py', file_text: 'print(1)' }); + expect( + diffOf(entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'completed', content: [] }, create)).lines, + ).toEqual([{ type: 'add', text: 'print(1)' }]); + + const replace = started('str_replace_editor', { command: 'str_replace', path: '/repo/a.py', old_str: 'x', new_str: 'y' }); + expect( + diffOf(entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'completed', content: [] }, replace)).lines, + ).toEqual([ + { type: 'del', text: 'x' }, + { type: 'add', text: 'y' }, + ]); + + const view = started('str_replace_editor', { command: 'view', path: '/repo/a.py' }); + expect(entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'completed', content: [] }, view)).toHaveLength(1); + }); + + it('shows nothing for a failed change', () => { + const calls = started('edit', { file_path: 'a.ts', old_string: 'one', new_string: 'two' }); + const result = entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'failed', content: [] }, calls); + expect(result.map((entry) => entry.entryType)).toEqual(['tool_result']); + }); + + it('bounds a change to the wire cap', () => { + const long = Array.from({ length: 250 }, (_, i) => `line ${i}`).join('\n'); + const calls = started('write', { file_path: 'big.ts', content: long }); + const diff = diffOf(entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'completed', content: [] }, calls)); + expect(diff.truncated).toBe(true); + expect(diff.lines).toHaveLength(200); + }); + + it('truncates a very long line', () => { + const calls = started('write', { file_path: 'wide.ts', content: 'x'.repeat(600) }); + const diff = diffOf(entries({ sessionUpdate: 'tool_call_update', toolCallId: 'c1', status: 'completed', content: [] }, calls)); + expect(diff.lines[0]!.text).toHaveLength(501); + expect(diff.lines[0]!.text.endsWith('…')).toBe(true); + }); +}); + +describe('toolCallDiffs', () => { + it('reads nothing out of a tool that changes no file', () => { + expect(toolCallDiffs('bash', { command: 'ls' })).toEqual([]); + expect(toolCallDiffs('edit', {})).toEqual([]); + expect(toolCallDiffs('write', { file_path: 'a.ts' })).toEqual([]); + }); + + it('accepts the path a Claude-shaped editor uses', () => { + expect(toolCallDiffs('write', { path: '/a/b.ts', file_text: 'x' })).toEqual([ + { path: '/a/b.ts', lines: [{ type: 'add', text: 'x' }] }, + ]); + }); +}); + +describe('text helper', () => { + it('reads the text of a chunk', () => { + expect(text({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'hello' } })).toBe('hello'); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekAcp.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekAcp.test.ts new file mode 100644 index 00000000..45b846a6 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekAcp.test.ts @@ -0,0 +1,208 @@ +/** + * The ACP wire client: what the driver sends and receives over the harness's + * stdio. The harness itself is the fake in fakeHarness.ts; here the peer is + * whatever a test writes, which is how the wire's own cases (a malformed + * line, a reply to nothing, a message split across chunks, the child going + * away) are covered. + */ +import { PassThrough } from 'node:stream'; +import { describe, expect, it, vi } from 'vitest'; +import { AcpClient, AcpRequestError } from '../acp'; + +interface Wire { + client: AcpClient; + /** Everything the client wrote, in order. */ + sent: Array>; + /** The last request the client wrote. */ + last(): Record; + /** One message from the agent. */ + reply(message: unknown): void; + /** One raw line from the agent. */ + raw(line: string): void; + /** End the agent's output, as a dead process does. */ + end(): void; + logs: string[]; +} + +function wire(): Wire { + const out = new PassThrough(); + const incoming = new PassThrough(); + const logs: string[] = []; + const sent: Array> = []; + out.on('data', (chunk: Buffer) => { + for (const line of chunk.toString().split('\n')) if (line.trim() !== '') sent.push(JSON.parse(line)); + }); + const client = new AcpClient({ stdin: out, stdout: incoming, log: (line) => logs.push(line) }); + incoming.resume(); + return { + client, + sent, + logs, + last: () => sent[sent.length - 1]!, + reply: (message) => incoming.write(`${JSON.stringify(message)}\n`), + raw: (line) => incoming.write(line), + end: () => incoming.end(), + }; +} + +/** A client whose initialize has already been answered. */ +async function connected(): Promise { + const w = wire(); + const initialized = w.client.request('initialize', { protocolVersion: 1 }); + w.reply({ jsonrpc: '2.0', id: w.last().id, result: { protocolVersion: 1, agentCapabilities: {} } }); + await initialized; + return w; +} + +describe('requests', () => { + it('writes one JSON-RPC request per line and waits for its reply', async () => { + const w = await connected(); + const pending = w.client.request('session/new', { cwd: '/work', mcpServers: [] }); + expect(w.last()).toEqual({ jsonrpc: '2.0', id: expect.any(Number), method: 'session/new', params: { cwd: '/work', mcpServers: [] } }); + w.reply({ jsonrpc: '2.0', id: w.last().id, result: { sessionId: 's1', configOptions: [] } }); + expect(await pending).toEqual({ sessionId: 's1', configOptions: [] }); + }); + + it('matches replies to their own request, whichever order they arrive in', async () => { + const w = await connected(); + const first = w.client.request('session/list', {}); + const firstId = w.last().id; + const second = w.client.request('session/list', {}); + const secondId = w.last().id; + w.reply({ jsonrpc: '2.0', id: secondId, result: { sessions: [{ sessionId: 's2', cwd: '/b' }] } }); + w.reply({ jsonrpc: '2.0', id: firstId, result: { sessions: [] } }); + expect(await first).toEqual({ sessions: [] }); + expect(await second).toEqual({ sessions: [{ sessionId: 's2', cwd: '/b' }] }); + }); + + it('refuses with the agent’s own error', async () => { + const w = await connected(); + const pending = w.client.request('session/resume', { sessionId: 'gone', cwd: '/work' }); + w.reply({ jsonrpc: '2.0', id: w.last().id, error: { code: -32602, message: 'Invalid params: session is not resumable: gone' } }); + await expect(pending).rejects.toBeInstanceOf(AcpRequestError); + await expect(pending.catch((error: AcpRequestError) => [error.code, error.message])).resolves.toEqual([ + -32602, + 'Invalid params: session is not resumable: gone', + ]); + }); + + it('gives up on a request that is never answered', async () => { + const w = await connected(); + await expect(w.client.request('session/new', { cwd: '/work', mcpServers: [] }, { timeoutMs: 5 })).rejects.toThrow(/did not answer within 5ms/); + }); + + it('sends a notification without waiting for anything', async () => { + const w = await connected(); + w.client.notify('session/cancel', { sessionId: 's1' }); + expect(w.last()).toEqual({ jsonrpc: '2.0', method: 'session/cancel', params: { sessionId: 's1' } }); + }); +}); + +describe('messages from the agent', () => { + it('hands a notification to its handler', async () => { + const w = await connected(); + const updates = vi.fn(); + w.client.on('session/update', updates); + w.reply({ jsonrpc: '2.0', method: 'session/update', params: { sessionId: 's1', update: { sessionUpdate: 'agent_message_chunk' } } }); + expect(updates).toHaveBeenCalledWith({ sessionId: 's1', update: { sessionUpdate: 'agent_message_chunk' } }); + }); + + it('answers a request the agent makes', async () => { + const w = await connected(); + w.client.onRequest('session/request_permission', async () => ({ outcome: { outcome: 'selected', optionId: 'allow-once' } }) as const); + w.reply({ jsonrpc: '2.0', id: 77, method: 'session/request_permission', params: { sessionId: 's1', toolCall: { toolCallId: 'c1' }, options: [] } }); + await vi.waitFor(() => expect(w.sent.some((message) => message.id === 77 && message.result !== undefined)).toBe(true)); + expect(w.sent.find((message) => message.id === 77)?.result).toEqual({ outcome: { outcome: 'selected', optionId: 'allow-once' } }); + }); + + it('refuses a request it has no handler for, rather than leaving the agent waiting', async () => { + const w = await connected(); + w.reply({ jsonrpc: '2.0', id: 78, method: 'fs/read_text_file', params: { sessionId: 's1', path: '/x' } }); + await vi.waitFor(() => expect(w.sent.some((message) => message.id === 78)).toBe(true)); + expect(w.sent.find((message) => message.id === 78)?.error).toEqual({ code: -32601, message: 'Method not found: fs/read_text_file' }); + }); + + it('turns a handler failure into an error reply', async () => { + const w = await connected(); + w.client.onRequest('session/request_permission', async () => { + throw new Error('the phone is gone'); + }); + w.reply({ jsonrpc: '2.0', id: 79, method: 'session/request_permission', params: { sessionId: 's1', toolCall: {}, options: [] } }); + await vi.waitFor(() => expect(w.sent.some((message) => message.id === 79)).toBe(true)); + expect(w.sent.find((message) => message.id === 79)?.error).toEqual({ code: -32603, message: 'the phone is gone' }); + }); + + it('survives a handler that throws synchronously', async () => { + const w = await connected(); + w.client.on('session/update', () => { + throw new Error('bad update'); + }); + w.reply({ jsonrpc: '2.0', method: 'session/update', params: { sessionId: 's1', update: {} } }); + expect(w.logs.some((line) => /session\/update handler failed: bad update/.test(line))).toBe(true); + expect(w.client.isOpen).toBe(true); + }); +}); + +describe('the wire itself', () => { + it('drops a line that is not JSON and keeps going', async () => { + const w = await connected(); + w.raw('not json at all\n'); + expect(w.logs.some((line) => /dropped a malformed line/.test(line))).toBe(true); + const pending = w.client.request('session/list', {}); + w.reply({ jsonrpc: '2.0', id: w.last().id, result: { sessions: [] } }); + expect(await pending).toEqual({ sessions: [] }); + }); + + it('drops a message that is not an object, and a reply to nothing', async () => { + const w = await connected(); + w.raw('"just a string"\n'); + w.reply({ jsonrpc: '2.0', id: 4242, result: {} }); + expect(w.logs.some((line) => /dropped a non-object message/.test(line))).toBe(true); + expect(w.logs.some((line) => /dropped a reply to unknown request 4242/.test(line))).toBe(true); + }); + + it('reads a message split across chunks, and tolerates CRLF', async () => { + const w = new PassThrough(); + const incoming = new PassThrough(); + const client = new AcpClient({ stdin: w, stdout: incoming, log: () => {} }); + const updates = vi.fn(); + client.on('session/update', updates); + const line = `${JSON.stringify({ jsonrpc: '2.0', method: 'session/update', params: { sessionId: 's1' } })}\r\n`; + incoming.write(line.slice(0, 20)); + incoming.write(line.slice(20)); + expect(updates).toHaveBeenCalledWith({ sessionId: 's1' }); + }); + + it('refuses anything once the agent is gone', async () => { + const w = await connected(); + const pending = w.client.request('session/list', {}); + w.end(); + await expect(pending).rejects.toThrow(/closed its output/); + expect(await w.client.closed).toEqual({ error: 'the agent closed its output' }); + expect(w.client.isOpen).toBe(false); + expect(() => w.client.notify('session/cancel', { sessionId: 's1' })).toThrow(/closed its output/); + }); + + it('reports an error the transport itself raised', async () => { + const w = await connected(); + w.client.on('session/update', () => {}); + const incoming = new PassThrough(); + const client = new AcpClient({ stdin: new PassThrough(), stdout: incoming, log: () => {} }); + const closed = client.closed; + incoming.emit('error', new Error('EPIPE')); + expect(await closed).toEqual({ error: 'EPIPE' }); + }); + + it('finishes once, however many ways it is ended', async () => { + const w = await connected(); + let notifications = 0; + void w.client.closed.then(() => { + notifications++; + }); + w.client.finish({ error: 'first' }); + w.client.finish({ error: 'second' }); + w.end(); + expect(await w.client.closed).toEqual({ error: 'first' }); + expect(notifications).toBe(1); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts new file mode 100644 index 00000000..51def6cb --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts @@ -0,0 +1,697 @@ +import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import * as path from 'node:path'; +import { describe, expect, it, vi } from 'vitest'; +import { recordingContext, type RecordingContext } from '../../../__tests__/context'; +import type { StartSession } from '../../../types'; +import type { DriverSession } from '../../../driver'; +import { DeepSeekDriver } from '../driver'; +import { DeepSeekMcp } from '../mcp'; +import { DeepSeekRuntime, dshHomeDir } from '../runtime'; +import { FakeHarness } from './fakeHarness'; + +/** A harness home in a temp directory, with the profile directory the CLI + * would create on its first run. */ +function harnessHome(): string { + const home = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-')); + mkdirSync(path.join(home, 'profiles', 'acp'), { recursive: true }); + writeFileSync(path.join(home, 'profiles', 'acp', 'cordis.patch.yml'), '# the profile layer\n[]\n'); + return home; +} + +interface Harness { + driver: DeepSeekDriver; + runtime: DeepSeekRuntime; + harness: FakeHarness; + home: string; + spawns: Array<{ command: string; args: string[]; env: Record }>; + /** What the runtime logged (the harness's own stderr lines included). */ + logs: string[]; + /** The session the last `started()` call created. */ + session: DriverSession; +} + +/** A driver over a scripted harness. The install seam never downloads: the + * fake spawn answers instead. */ +function withDriver( + options: { idleCloseMs?: number; env?: NodeJS.ProcessEnv; dshPath?: string; log?: (line: string) => void } = {}, +): Harness { + const home = harnessHome(); + const harness = new FakeHarness(); + const spawns: Harness['spawns'] = []; + const logs: string[] = []; + const log = (line: string): void => { + logs.push(line); + }; + const mcp = new DeepSeekMcp({ profileDir: path.join(home, 'profiles', 'acp'), log }); + const runtime = new DeepSeekRuntime({ + ...(options.dshPath !== undefined ? { dshPath: options.dshPath } : {}), + home, + cacheDir: path.join(home, 'agents'), + installDsh: async () => '/fake/dsh/lib/bin.js', + configVersion: () => mcp.version, + spawnFn: ((command: string, args: string[], opts: { env: Record }) => { + spawns.push({ command, args, env: opts.env }); + return harness.child; + }) as never, + idleCloseMs: options.idleCloseMs ?? 0, + log: options.log ?? log, + }); + const driver = DeepSeekDriver.create({ + runtime, + home, + mcp, + baseEnv: options.env ?? ({} as NodeJS.ProcessEnv), + log: options.log ?? log, + }); + return { driver, runtime, harness, home, spawns, logs, session: undefined as never }; +} + +function start(overrides: Partial = {}): StartSession { + return { sessionId: 'b1', agent: 'deepseek-harness', cwd: '/work', ...overrides }; +} + +/** Start a session and wait for it to accept prompts. The session is kept + * on the harness so a test can prompt it and change its options. */ +async function started( + ready: Harness, + overrides: Partial = {}, + ctx: RecordingContext = recordingContext(), +): Promise { + ready.session = ready.driver.startSession(start(overrides), ctx); + await ctx.waitFor((event) => event.type === 'ready'); + return ctx; +} + +const infoEvents = (ctx: RecordingContext) => ctx.events.filter((event) => event.type === 'info'); + +describe('DeepSeekDriver.info', () => { + it('advertises what the ACP surface carries, and what it does not', () => { + const { driver } = withDriver(); + const info = driver.info(); + expect(info.id).toBe('deepseek-harness'); + expect(info.displayName).toBe('DeepSeek Harness'); + expect(info.modes?.map((mode) => mode.id)).toEqual(['ask', 'default']); + expect(info.efforts?.map((effort) => effort.id)).toEqual(['off', 'low', 'high', 'max']); + expect(info.defaultMode).toBe('ask'); + expect(info.supports).toEqual({ + models: true, + usage: false, + providers: true, + gsd: true, + interrupt: true, + commands: false, + plugins: true, + mcp: true, + tasks: false, + }); + expect(info.credentials).toEqual([{ id: 'deepseek_api_key', label: 'DeepSeek API key', envVar: 'DEEPSEEK_API_KEY' }]); + }); +}); + +describe('DeepSeekSession startup', () => { + it('starts a session and reports its identity', async () => { + const ready = withDriver(); + const ctx = await started(ready, { model: '["deepseek-official","deepseek-v4-pro"]', effort: 'low' }); + + expect(ready.harness.newSessions).toEqual([{ cwd: '/work', mcpServers: [] }]); + // The model is selected by the harness's own opaque value; the effort by + // its plain id. + expect(ready.harness.setOptions).toEqual([ + { sessionId: 's1', configId: 'model', value: '["deepseek-official","deepseek-v4-pro"]' }, + { sessionId: 's1', configId: 'reasoning_effort', value: 'low' }, + ]); + expect(infoEvents(ctx)[0]).toEqual({ type: 'info', nativeSessionId: 's1', model: 'DeepSeek-V4-Pro', mode: 'ask' }); + expect(ctx.entries().map((entry) => entry.entryType)).toEqual(['status']); + }); + + it('accepts a model named by its plain id, as a provider profile names one', async () => { + const ready = withDriver(); + await started(ready, { model: 'deepseek-v4-pro' }); + expect(ready.harness.setOptions[0]).toEqual({ + sessionId: 's1', + configId: 'model', + value: '["deepseek-official","deepseek-v4-pro"]', + }); + }); + + it('refuses a model the harness does not offer', async () => { + const ready = withDriver(); + const ctx = recordingContext(); + ready.driver.startSession(start({ model: 'gpt-9' }), ctx); + const ended = await ctx.ended(); + expect(ended.error).toMatch(/does not offer the model 'gpt-9'/); + expect(ctx.entries()[0]).toMatchObject({ entryType: 'error' }); + }); + + it('keeps going, with an error entry, when a provider-bound model is unknown', async () => { + const ready = withDriver(); + const ctx = await started(ready, { + model: 'kimi-k2', + provider: { id: 'p1', baseUrl: 'https://gateway.example/v1', authToken: 'sk-x', models: [] }, + }); + expect(ready.harness.setOptions.some((option) => option.configId === 'model')).toBe(true); + expect(ctx.entries().some((entry) => entry.entryType === 'error' && /kimi-k2/.test(entry.text))).toBe(true); + }); + + it('reports an effort the model does not have instead of refusing the session', async () => { + const ready = withDriver(); + // A model without a reasoning option (a gateway's, say). + ready.harness.options = [ready.harness.options[0]!]; + const ctx = await started(ready, { effort: 'max' }); + expect(ctx.entries().some((entry) => entry.entryType === 'error' && /no reasoning level/.test(entry.text))).toBe(true); + expect(ready.harness.setOptions).toEqual([]); + }); + + it('reports a start that failed as an error entry and an ended session', async () => { + const ready = withDriver(); + ready.harness.newSessionError = 'the profile could not be loaded'; + const ctx = recordingContext(); + ready.driver.startSession(start(), ctx); + expect((await ctx.ended()).error).toMatch(/the profile could not be loaded/); + }); + + it('lets go of the harness process when a session is closed while starting', async () => { + const ready = withDriver(); + const ctx = recordingContext(); + const session = ready.driver.startSession(start(), ctx); + await session.end(); + await vi.waitFor(() => expect(ready.harness.child.killed).toContain('SIGTERM')); + expect(ctx.events.some((event) => event.type === 'ended')).toBe(false); + }); +}); + +describe('DeepSeekSession environment', () => { + it('hands the session its provider binding, replacing the harness namespace', async () => { + const ready = withDriver({ env: { PATH: '/bin', DEEPSEEK_API_KEY: 'native-key', KEEP: 'yes' } }); + await started(ready, { + provider: { id: 'p1', baseUrl: 'https://gateway.example/v1', authToken: 'sk-gateway', models: [] }, + }); + expect(ready.spawns[0]?.env.DEEPSEEK_BASE_URL).toBe('https://gateway.example/v1'); + expect(ready.spawns[0]?.env.DEEPSEEK_API_KEY).toBe('sk-gateway'); + expect(ready.spawns[0]?.env.KEEP).toBe('yes'); + }); + + it('leaves the operator environment alone for a native session', async () => { + const ready = withDriver({ env: { PATH: '/bin', DEEPSEEK_BASE_URL: 'https://relay.example' } }); + await started(ready); + expect(ready.spawns[0]?.env.DEEPSEEK_BASE_URL).toBe('https://relay.example'); + }); + + it('refuses a provider profile with an insecure base URL before starting', () => { + const ready = withDriver(); + const ctx = recordingContext(); + expect(() => + ready.driver.startSession( + start({ provider: { id: 'p1', baseUrl: 'http://gateway.example/v1', authToken: 'sk', models: [] } }), + ctx, + ), + ).toThrow(/insecure base URL/); + }); + + it('runs one harness process per environment and shares it between sessions', async () => { + const ready = withDriver(); + await started(ready, { sessionId: 'b1' }); + await started(ready, { sessionId: 'b2' }); + const gateway = { id: 'p1', baseUrl: 'https://gateway.example/v1', authToken: 'sk', models: [] }; + await started(ready, { sessionId: 'b3', provider: gateway }); + expect(ready.spawns).toHaveLength(2); + }); +}); + +describe('DeepSeekSession updates', () => { + it('turns the harness updates into transcript entries', async () => { + const ready = withDriver(); + const ctx = await started(ready); + + ready.harness.thought('s1', 'weighing options'); + ready.harness.message('s1', 'Here is the plan.'); + ready.harness.toolCall('s1', 'c1', 'bash', { command: 'npm ci\nnpm test' }); + ready.harness.toolResult('s1', 'c1', 'all green'); + ready.harness.toolCall('s1', 'c2', 'edit', { file_path: 'src/a.ts', old_string: 'one', new_string: 'two' }); + ready.harness.toolResult('s1', 'c2', ''); + ready.harness.toolCall('s1', 'c3', 'todo_write', { todos: [{ content: 'Ship it', status: 'in_progress' }] }); + + await vi.waitFor(() => expect(ctx.entries()).toHaveLength(10)); + const entries = ctx.entries(); + expect(entries[0]).toMatchObject({ entryType: 'status' }); + expect(entries[1]).toMatchObject({ entryType: 'thinking', text: 'weighing options' }); + expect(entries[2]).toMatchObject({ entryType: 'text', role: 'agent', text: 'Here is the plan.' }); + expect(entries[3]).toMatchObject({ + entryType: 'tool_call', + callId: 'c1', + kind: 'execute', + title: 'npm ci…', + input: 'npm ci\nnpm test', + }); + expect(entries[4]).toMatchObject({ entryType: 'tool_result', callId: 'c1', text: 'all green' }); + expect(entries[5]).toMatchObject({ entryType: 'tool_call', callId: 'c2', kind: 'edit', locations: ['src/a.ts'] }); + // An empty result still marks the call finished, and the file change is + // reconstructed from the call's own arguments. + expect(entries[6]).toMatchObject({ entryType: 'tool_result', callId: 'c2', text: '' }); + expect(entries[7]).toMatchObject({ entryType: 'diff', path: 'src/a.ts', callId: 'c2' }); + expect(entries[8]).toMatchObject({ entryType: 'tool_call', callId: 'c3', kind: 'think' }); + expect(entries[9]).toMatchObject({ entryType: 'todos', items: [{ text: 'Ship it', status: 'in_progress' }] }); + }); + + it('reports how full the context is, and only when it changed', async () => { + const ready = withDriver(); + const ctx = await started(ready); + + ready.harness.usage('s1', 5000, 10_000); + ready.harness.usage('s1', 5000, 10_000); + ready.harness.usage('s1', 7500, 10_000); + await vi.waitFor(() => expect(infoEvents(ctx)).toHaveLength(3)); + expect(infoEvents(ctx).map((event) => [event.contextWindow, event.contextPercentage])).toEqual([ + [undefined, undefined], + [10_000, 50], + [10_000, 75], + ]); + }); + + it('drops an update for a session nobody serves', async () => { + const ready = withDriver(); + const ctx = await started(ready); + ready.harness.message('other', 'not mine'); + await new Promise((resolve) => setTimeout(resolve, 10)); + expect(ctx.entries().map((entry) => entry.entryType)).toEqual(['status']); + }); +}); + +describe('DeepSeekSession permissions', () => { + /** Drive one scripted turn that asks for `callId`, and answer with what + * the harness received for its ask. */ + async function askThrough( + ready: Harness, + ctx: RecordingContext, + callId: string, + toolName: string, + input: Record, + ): Promise<{ outcome: string; optionId?: string } | undefined> { + ready.harness.toolCall('s1', callId, toolName, input); + let answer: { outcome: string; optionId?: string } | undefined; + let answered = false; + ready.harness.onPrompt = async (sessionId) => { + answer = await ready.harness.askPermission(sessionId, callId); + answered = true; + return 'end_turn'; + }; + ready.session.prompt('go'); + await vi.waitFor(() => expect(answered).toBe(true)); + return answer; + } + + it('asks the phone with the tool call the harness named, and allows on Allow', async () => { + const ready = withDriver(); + const ctx = recordingContext({ + permission: (request) => { + expect(request).toMatchObject({ + requestId: 'c1', + toolName: 'bash', + kind: 'execute', + title: 'rm -rf build', + rawInput: { command: 'rm -rf build' }, + options: [ + { id: 'allow', label: 'Allow', kind: 'allow_once' }, + { id: 'deny', label: 'Deny', kind: 'reject_once' }, + ], + }); + return { outcome: 'selected', optionId: 'allow' }; + }, + }); + await started(ready, {}, ctx); + expect(await askThrough(ready, ctx, 'c1', 'bash', { command: 'rm -rf build' })).toEqual({ + outcome: 'selected', + optionId: 'allow-once', + }); + }); + + it('refuses the ask when the phone refuses', async () => { + const ready = withDriver(); + const ctx = recordingContext({ permission: () => ({ outcome: 'selected', optionId: 'deny' }) }); + await started(ready, {}, ctx); + expect(await askThrough(ready, ctx, 'c2', 'bash', { command: 'ls' })).toEqual({ + outcome: 'selected', + optionId: 'reject-once', + }); + }); + + it('cancels the ask when nobody answered, rather than pretending a refusal', async () => { + const ready = withDriver(); + const ctx = recordingContext({ permission: () => ({ outcome: 'cancelled', reason: 'timed out' }) }); + await started(ready, {}, ctx); + expect(await askThrough(ready, ctx, 'c3', 'bash', { command: 'ls' })).toEqual({ outcome: 'cancelled' }); + }); + + it('allows without asking in the auto-approve mode', async () => { + const ready = withDriver(); + const ctx = recordingContext({ permission: () => ({ outcome: 'selected', optionId: 'deny' }) }); + await started(ready, { mode: 'default' }, ctx); + expect(await askThrough(ready, ctx, 'c4', 'bash', { command: 'ls' })).toEqual({ + outcome: 'selected', + optionId: 'allow-once', + }); + expect(ctx.permissions).toHaveLength(0); + }); +}); + +describe('DeepSeekSession turns', () => { + it('runs one prompt at a time and marks each turn', async () => { + const ready = withDriver(); + const ctx = await started(ready); + const prompts: string[] = []; + const releases: Array<() => void> = []; + ready.harness.onPrompt = async (sessionId, text) => { + void sessionId; + prompts.push(text); + await new Promise((resolve) => { + releases.push(resolve); + }); + return 'end_turn'; + }; + ready.session.prompt('one'); + ready.session.prompt('two'); + // The second prompt waits for the first turn to be over: ACP refuses one + // while another is in flight. + await vi.waitFor(() => expect(prompts).toEqual(['one'])); + releases[0]?.(); + await vi.waitFor(() => expect(prompts).toEqual(['one', 'two'])); + releases[1]?.(); + await vi.waitFor(() => expect(ctx.entries().filter((entry) => entry.entryType === 'turn_complete')).toHaveLength(2)); + expect(ctx.events.filter((event) => event.type === 'turn')).toHaveLength(4); + }); + + it('reports a failed turn and completes it', async () => { + const ready = withDriver(); + const ctx = await started(ready); + ready.harness.onPrompt = () => { + throw new Error('DeepSeek Messages transport failed'); + }; + ready.session.prompt('go'); + await vi.waitFor(() => + expect(ctx.entries().some((entry) => entry.entryType === 'error' && /transport failed/.test(entry.text))).toBe(true), + ); + expect(ctx.entries().filter((entry) => entry.entryType === 'turn_complete').length).toBeGreaterThan(0); + }); + + it('cancels the running turn on interrupt', async () => { + const ready = withDriver(); + const ctx = await started(ready); + // Never resolves on its own: only the cancel notification ends it. + ready.harness.onPrompt = () => new Promise(() => {}); + ready.session.prompt('long one'); + await vi.waitFor(() => + expect(ready.harness.requests.some((request) => request.method === 'session/prompt')).toBe(true), + ); + await ready.session.interrupt(); + await vi.waitFor(() => expect(ready.harness.notifications.some((n) => n.method === 'session/cancel')).toBe(true)); + await vi.waitFor(() => expect(ctx.entries().some((entry) => entry.entryType === 'turn_complete')).toBe(true)); + }); +}); + +describe('DeepSeekSession options', () => { + it('applies a model and an effort mid-session and reports the resolved model', async () => { + const ready = withDriver(); + const ctx = await started(ready); + await ready.session.setOption('model', '["deepseek-official","deepseek-v4-pro"]'); + await ready.session.setOption('effort', 'off'); + await ready.session.setOption('mode', 'default'); + expect(ready.harness.setOptions.slice(-2)).toEqual([ + { sessionId: 's1', configId: 'model', value: '["deepseek-official","deepseek-v4-pro"]' }, + { sessionId: 's1', configId: 'reasoning_effort', value: 'off' }, + ]); + expect(infoEvents(ctx).some((event) => event.model === 'DeepSeek-V4-Pro')).toBe(true); + }); + + it('refuses a mode the driver does not have', async () => { + const ready = withDriver(); + const ctx = await started(ready); + await expect(ready.session.setOption('mode', 'plan')).rejects.toThrow(/no mode 'plan'/); + }); + + it('passes the harness its own refusal for an unknown effort', async () => { + const ready = withDriver(); + const ctx = await started(ready); + ready.harness.acceptsOptions = false; + await expect(ready.session.setOption('effort', 'turbo')).rejects.toThrow(/Invalid params/); + }); +}); + +describe('DeepSeekSession resume', () => { + it('continues the conversation the bridge names', async () => { + const ready = withDriver(); + await started(ready, { resume: 'old-session' }); + expect(ready.harness.resumed).toEqual([{ sessionId: 'old-session', cwd: '/work', mcpServers: [] }]); + expect(ready.harness.newSessions).toEqual([]); + }); + + it('starts fresh with a notice when the conversation is gone', async () => { + const ready = withDriver(); + ready.harness.resumeError = 'session is not resumable: old-session'; + const ctx = await started(ready, { resume: 'old-session' }); + expect(ready.harness.newSessions).toHaveLength(1); + expect(ctx.entries()[0]).toMatchObject({ entryType: 'notice', kind: 'session_restart' }); + expect(ctx.logs.some((line) => /could not resume old-session/.test(line))).toBe(true); + }); + + it('does not try a resume the harness says it does not support', async () => { + const ready = withDriver(); + ready.harness.supportsResume = false; + await started(ready, { resume: 'old-session' }); + expect(ready.harness.resumed).toEqual([]); + expect(ready.harness.newSessions).toHaveLength(1); + }); +}); + +describe('DeepSeekSession lifecycle', () => { + it('closes the session and stops the idle harness process', async () => { + const ready = withDriver(); + await started(ready); + await ready.session.end(); + expect(ready.harness.closed).toEqual(['s1']); + await vi.waitFor(() => expect(ready.harness.child.killed).toContain('SIGTERM')); + }); + + it('ends every session of a harness process that goes away', async () => { + const ready = withDriver(); + const first = await started(ready, { sessionId: 'b1' }); + const second = await started(ready, { sessionId: 'b2' }); + ready.harness.child.crash(7); + expect((await first.ended()).error).toMatch(/exited \(code 7\)/); + expect((await second.ended()).error).toMatch(/exited \(code 7\)/); + }); + + it('keeps an unused process for the idle grace period', async () => { + const ready = withDriver({ idleCloseMs: 60_000 }); + await started(ready); + await ready.session.end(); + expect(ready.harness.child.killed).toEqual([]); + await ready.driver.shutdown(); + expect(ready.harness.child.killed).toContain('SIGTERM'); + }); +}); + +describe('DeepSeekDriver model catalog', () => { + it('lists the harness catalog from a probe session, once', async () => { + const ready = withDriver(); + const models = await ready.driver.listModels(); + expect(models.defaultModel).toBe('["deepseek-official","deepseek-v4-flash"]'); + expect(models.models).toEqual([ + { id: '["deepseek-official","deepseek-v4-flash"]', label: 'deepseek-v4-flash', provider: 'DeepSeek' }, + { id: '["deepseek-official","deepseek-v4-pro"]', label: 'DeepSeek-V4-Pro', provider: 'DeepSeek' }, + ]); + await ready.driver.listModels(); + expect(ready.harness.newSessions).toHaveLength(1); + expect(ready.harness.closed).toEqual(['s1']); + }); + + it('asks again after an empty catalog rather than remembering nothing', async () => { + const ready = withDriver(); + ready.harness.options = []; + expect(await ready.driver.listModels()).toEqual({ models: [] }); + ready.harness.options = [{ id: 'model', type: 'select', currentValue: 'x', options: [{ value: 'x', name: 'X' }] }]; + expect((await ready.driver.listModels()).models).toHaveLength(1); + }); + + it('answers an empty list when the harness cannot be reached at all', async () => { + const home = harnessHome(); + const runtime = new DeepSeekRuntime({ + home, + cacheDir: path.join(home, 'agents'), + installDsh: async () => { + throw new Error('no network'); + }, + idleCloseMs: 0, + log: () => {}, + }); + const driver = DeepSeekDriver.create({ runtime, home, log: () => {} }); + expect(await driver.listModels()).toEqual({ models: [] }); + }); +}); + +describe('DeepSeekDriver credential check', () => { + it('checks the DeepSeek key against the DeepSeek API', async () => { + const httpGet = vi.fn(async () => ({ status: 200 })); + const ready = withDriver(); + const driver = DeepSeekDriver.create({ runtime: ready.runtime, home: ready.home, baseEnv: {} as NodeJS.ProcessEnv, httpGet, log: () => {} }); + expect(await driver.checkCredential('deepseek_api_key', 'sk-1')).toBe(true); + expect(httpGet).toHaveBeenCalledWith('https://api.deepseek.com/models', { authorization: 'Bearer sk-1' }); + expect(await driver.checkCredential('other', 'sk-1')).toBeUndefined(); + }); + + it('reports a refused key, and claims nothing on a network error', async () => { + const ready = withDriver(); + const refusing = DeepSeekDriver.create({ + runtime: ready.runtime, + home: ready.home, + baseEnv: {} as NodeJS.ProcessEnv, + httpGet: async () => ({ status: 401 }), + log: () => {}, + }); + expect(await refusing.checkCredential('deepseek_api_key', 'sk-bad')).toBe(false); + + const unreachable = DeepSeekDriver.create({ + runtime: ready.runtime, + home: ready.home, + baseEnv: {} as NodeJS.ProcessEnv, + httpGet: async () => { + throw new Error('ECONNREFUSED'); + }, + log: () => {}, + }); + expect(await unreachable.checkCredential('deepseek_api_key', 'sk-1')).toBeUndefined(); + }); + + it('claims nothing about a key that belongs to a configured gateway', async () => { + const httpGet = vi.fn(async () => ({ status: 401 })); + const ready = withDriver(); + const driver = DeepSeekDriver.create({ + runtime: ready.runtime, + home: ready.home, + baseEnv: { DEEPSEEK_BASE_URL: 'https://gateway.example/v1' } as NodeJS.ProcessEnv, + httpGet, + log: () => {}, + }); + expect(await driver.checkCredential('deepseek_api_key', 'sk-gateway')).toBeUndefined(); + expect(httpGet).not.toHaveBeenCalled(); + }); +}); + +describe('session MCP status', () => { + it('reports the profile servers, with what the harness said about them', async () => { + const ready = withDriver(); + await started(ready); + const session = ready.session; + expect((await session.mcpStatus?.())?.servers).toEqual([]); + + await ready.driver.mcp.act('add', [{ name: 'demo', setup: { type: 'stdio', command: '/usr/bin/demo' } }], []); + await ready.driver.mcp.act('add', [{ name: 'fresh', setup: { type: 'http', url: 'https://mcp.example/mcp' } }], []); + expect(readFileSync(path.join(ready.home, 'profiles', 'acp', 'cordis.patch.yml'), 'utf8')).toMatch(/codedeck-mcp-demo/); + + // The harness's own log is the only place it reports a failed server. + ready.harness.child.stderr.write('mcp-client(demo): tool registration failed, no tools registered: boom\n'); + await vi.waitFor(() => expect(ready.logs.some((line) => /mcp-client\(demo\)/.test(line))).toBe(true)); + + const status = await session.mcpStatus?.(); + expect(status?.servers).toEqual([ + // The harness complained about this one: it has no tools. + { name: 'demo', status: 'failed', error: expect.stringMatching(/boom/) }, + // Configured after this process started: not loaded yet. + { name: 'fresh', status: 'pending' }, + ]); + expect(status?.toggles).toBe(false); + await expect(session.toggleMcp?.('demo', false)).rejects.toThrow(/when it starts/); + }); + + it('reports a server the running harness has loaded as connected', async () => { + const ready = withDriver(); + // Configured before the session starts, so the process it spawns loads + // it: this is the state every session of a bridge restart begins in. + await ready.driver.mcp.act('add', [{ name: 'demo', setup: { type: 'stdio', command: '/usr/bin/demo' } }], []); + await started(ready); + expect((await ready.session.mcpStatus?.())?.servers).toEqual([{ name: 'demo', status: 'connected' }]); + }); + + it('reports a server switched off in the profile as disabled', async () => { + const ready = withDriver(); + await started(ready); + await ready.driver.mcp.act('add', [{ name: 'demo', setup: { type: 'stdio', command: '/usr/bin/demo' } }], []); + await ready.driver.mcp.act('disable', [], ['demo']); + expect((await ready.session.mcpStatus?.())?.servers).toEqual([{ name: 'demo', status: 'disabled' }]); + }); +}); + +describe('the harness runtime', () => { + it('is resolved — and installed — as the driver is created, not on the first session', async () => { + const home = harnessHome(); + const installs: number[] = []; + const runtime = new DeepSeekRuntime({ + home, + cacheDir: path.join(home, 'agents'), + installDsh: async () => { + installs.push(Date.now()); + return '/fake/dsh/lib/bin.js'; + }, + idleCloseMs: 0, + log: () => {}, + }); + const driver = DeepSeekDriver.create({ runtime, home, log: () => {} }); + void driver; + // Nothing has started a session; the runtime is already on its way. + await vi.waitFor(() => expect(installs).toHaveLength(1)); + // And a session does not ask for it again. + await driver.listModels(); + expect(installs).toHaveLength(1); + }); + + it('reports a runtime it could not fetch, and keeps the agent listed', async () => { + const home = harnessHome(); + const logs: string[] = []; + const runtime = new DeepSeekRuntime({ + home, + cacheDir: path.join(home, 'agents'), + installDsh: async () => { + throw new Error('no network'); + }, + idleCloseMs: 0, + log: (line) => logs.push(line), + }); + const driver = DeepSeekDriver.create({ runtime, home, log: (line) => logs.push(line) }); + await vi.waitFor(() => expect(logs.some((line) => /not ready yet: no network/.test(line))).toBe(true)); + expect(driver.info().unavailableReason).toBeUndefined(); + }); +}); + +describe('the harness process', () => { + it('spawns the installed CLI with the profile and the harness home', async () => { + const ready = withDriver(); + await started(ready); + expect(ready.spawns[0]?.args).toEqual(['/fake/dsh/lib/bin.js', '--profile', 'acp']); + expect(ready.spawns[0]?.env.DSH_HOME).toBe(ready.home); + }); + + it('runs an operator-provided entry point instead of installing one', async () => { + const home = harnessHome(); + const dshPath = path.join(home, 'my-dsh.js'); + writeFileSync(dshPath, '// a standalone harness CLI\n'); + const ready = withDriver({ dshPath }); + await started(ready); + expect(ready.spawns[0]?.args).toEqual([dshPath, '--profile', 'acp']); + }); + + it('refuses a path that is not a file', async () => { + const ready = withDriver({ dshPath: path.join(harnessHome(), 'missing.js') }); + const ctx = recordingContext(); + ready.driver.startSession(start(), ctx); + expect((await ctx.ended()).error).toMatch(/which is not a file/); + }); +}); + +describe('dshHomeDir', () => { + it('prefers the operator override and otherwise follows the agent cache', () => { + expect(dshHomeDir({ CODEDECK_DEEPSEEK_HOME: '/srv/dsh' } as NodeJS.ProcessEnv)).toBe('/srv/dsh'); + expect(dshHomeDir({ CODEDECK_AGENT_CACHE: path.join('/srv/home', 'agents') } as NodeJS.ProcessEnv)).toBe( + path.join('/srv/home', 'dsh'), + ); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekEnv.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekEnv.test.ts new file mode 100644 index 00000000..ee5a7fcc --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekEnv.test.ts @@ -0,0 +1,118 @@ +/** + * The environment one harness process runs in, for the native route and for a + * custom provider (a gateway), in the style of claudeEnv.test.ts. + */ +import { describe, expect, it } from 'vitest'; +import { PROVIDER_BASE_URL_ERROR } from '../../../provider'; +import type { ProviderBinding } from '../../../types'; +import { + DEEPSEEK_API_KEY_CREDENTIAL, + buildDeepSeekEnv, + sanitizeDeepSeekBaseEnv, +} from '../env'; + +const BASE: Record = { + PATH: '/usr/bin', + HOME: '/home/bridge', + DSH_HOME: '/data/dsh', + GITHUB_TOKEN: 'gh', + DEEPSEEK_BASE_URL: 'https://relay.example/anthropic', + DEEPSEEK_API_KEY: 'native-key', +}; + +const provider = (overrides: Partial = {}): ProviderBinding => ({ + id: 'gateway', + baseUrl: 'https://gateway.example/v1', + authToken: 'sk-gateway', + models: [], + ...overrides, +}); + +describe('buildDeepSeekEnv', () => { + it('leaves the operator environment alone when nothing is stored', () => { + const env = buildDeepSeekEnv({}, BASE); + expect(env.DEEPSEEK_API_KEY).toBe('native-key'); + expect(env.DEEPSEEK_BASE_URL).toBe('https://relay.example/anthropic'); + expect(env.PATH).toBe('/usr/bin'); + }); + + it('adds the stored credential when the operator set none', () => { + const env = buildDeepSeekEnv({ credentials: { [DEEPSEEK_API_KEY_CREDENTIAL]: 'sk-stored' } }, { PATH: '/usr/bin' }); + expect(env.DEEPSEEK_API_KEY).toBe('sk-stored'); + }); + + it('lets the operator’s own key win over a stored one', () => { + const env = buildDeepSeekEnv({ credentials: { [DEEPSEEK_API_KEY_CREDENTIAL]: 'sk-stored' } }, BASE); + expect(env.DEEPSEEK_API_KEY).toBe('native-key'); + }); + + it('merges the bridge-level environment last', () => { + const env = buildDeepSeekEnv( + { credentials: { [DEEPSEEK_API_KEY_CREDENTIAL]: 'sk-stored' }, env: { GITHUB_TOKEN: 'gh-session', DEEPSEEK_API_KEY: 'sk-env' } }, + BASE, + ); + expect(env.GITHUB_TOKEN).toBe('gh-session'); + expect(env.DEEPSEEK_API_KEY).toBe('sk-env'); + }); + + it('points a provider-bound session at the provider, with its own token', () => { + const env = buildDeepSeekEnv({ provider: provider() }, BASE); + expect(env.DEEPSEEK_BASE_URL).toBe('https://gateway.example/v1'); + expect(env.DEEPSEEK_API_KEY).toBe('sk-gateway'); + }); + + it('leaves nothing of the harness’s own endpoint or key namespace behind', () => { + const env = buildDeepSeekEnv({ provider: provider() }, BASE); + // The operator's relay must not survive: the session is bound to the + // provider profile, and routing it anywhere else would bill the wrong + // account. + expect(env.DEEPSEEK_BASE_URL).toBe('https://gateway.example/v1'); + expect(Object.keys(env).filter((key) => key.startsWith('DEEPSEEK_'))).toEqual(['DEEPSEEK_BASE_URL', 'DEEPSEEK_API_KEY']); + // Everything else — including where the harness keeps its state — is + // untouched: a session that cannot find its home is not more secure. + expect(env.DSH_HOME).toBe('/data/dsh'); + expect(env.GITHUB_TOKEN).toBe('gh'); + expect(env.PATH).toBe('/usr/bin'); + }); + + it('merges the bridge-level environment into a provider session too', () => { + const env = buildDeepSeekEnv({ provider: provider(), env: { GITHUB_TOKEN: 'gh-session' } }, BASE); + expect(env.GITHUB_TOKEN).toBe('gh-session'); + }); + + it('refuses an insecure provider base URL', () => { + expect(() => buildDeepSeekEnv({ provider: provider({ baseUrl: 'http://gateway.example/v1' }) }, BASE)).toThrow( + PROVIDER_BASE_URL_ERROR, + ); + expect(() => buildDeepSeekEnv({ provider: provider({ baseUrl: 'ftp://gateway.example' }) }, BASE)).toThrow(PROVIDER_BASE_URL_ERROR); + expect(() => buildDeepSeekEnv({ provider: provider({ baseUrl: 'not a url' }) }, BASE)).toThrow(PROVIDER_BASE_URL_ERROR); + }); + + it('allows cleartext to a local model server', () => { + const env = buildDeepSeekEnv({ provider: provider({ baseUrl: 'http://127.0.0.1:11434/v1' }) }, BASE); + expect(env.DEEPSEEK_BASE_URL).toBe('http://127.0.0.1:11434/v1'); + }); + + it('refuses a provider profile with no token', () => { + expect(() => buildDeepSeekEnv({ provider: provider({ authToken: '' }) }, BASE)).toThrow(/has no stored auth token/); + }); +}); + +describe('sanitizeDeepSeekBaseEnv', () => { + it('drops the harness namespace, in any case, and keeps the rest', () => { + expect( + sanitizeDeepSeekBaseEnv({ + PATH: '/usr/bin', + DSH_HOME: '/data/dsh', + GITHUB_TOKEN: 'gh', + DEEPSEEK_API_KEY: 'k', + DEEPSEEK_BASE_URL: 'https://relay.example', + deepseek_anything_else: 'future', + }), + ).toEqual({ PATH: '/usr/bin', DSH_HOME: '/data/dsh', GITHUB_TOKEN: 'gh' }); + }); + + it('skips variables an operator left unset', () => { + expect(sanitizeDeepSeekBaseEnv({ PATH: undefined, HOME: '/home' })).toEqual({ HOME: '/home' }); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekMcp.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekMcp.test.ts new file mode 100644 index 00000000..918aae41 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekMcp.test.ts @@ -0,0 +1,196 @@ +/** + * The harness's MCP servers: the managed block this driver keeps in a + * profile's own patch layer — the file the harness reads after every bundle. + * Everything around the block (comments, a user's rows) is read, kept and + * written back untouched, which is what most of these cases are about. + */ +import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import * as path from 'node:path'; +import { describe, expect, it } from 'vitest'; +import type { McpServerAdd } from '../../../types'; +import { DeepSeekMcp } from '../mcp'; + +const INITIAL_LAYER = `# Your patch layer for this dsh profile, applied after every bundle layer. +[]`; + +function profile(initial: string = INITIAL_LAYER): string { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-mcp-')); + writeFileSync(path.join(dir, 'cordis.patch.yml'), initial); + return dir; +} + +const layerOf = (dir: string): string => readFileSync(path.join(dir, 'cordis.patch.yml'), 'utf8'); +const manager = (dir: string): DeepSeekMcp => new DeepSeekMcp({ profileDir: dir, log: () => {} }); + +const stdio = (name: string, command = '/usr/bin/tool', env?: Record): McpServerAdd => ({ + name, + setup: { type: 'stdio', command, ...(env ? { env } : {}), args: ['--serve'] }, +}); + +describe('listing', () => { + it('answers nothing for a profile without a patch layer', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-mcp-')); + expect(await manager(dir).list()).toEqual({ servers: [], toggles: true }); + }); + + it('answers nothing for the layer the harness writes itself', async () => { + expect(await manager(profile()).list()).toEqual({ servers: [], toggles: true }); + }); +}); + +describe('adding', () => { + it('writes a managed block and reads it back without a secret value', async () => { + const dir = profile(); + const state = await manager(dir).act('add', [stdio('demo', '/usr/bin/tool', { API_KEY: 'secret' })], []); + expect(state.servers).toEqual([ + { name: 'demo', transport: 'stdio', target: '/usr/bin/tool', envKeys: ['API_KEY'], enabled: true }, + ]); + const file = layerOf(dir); + expect(file).toMatch(/codedeck-mcp-demo/); + expect(file).toMatch(/@deepseek-ai\/dsh-mcp-client/); + // The layer keeps its own header; the harness's initial empty list is + // gone (an empty sequence and a block sequence cannot share a document). + expect(file.startsWith('# Your patch layer')).toBe(true); + expect(file).not.toMatch(/^\[\]$/m); + // The value is in the file — the harness needs it — but never in what the + // phone is shown. + expect(file).toMatch(/secret/); + }); + + it('keeps an HTTP server’s URL in the layer and its redacted form on the wire', async () => { + const dir = profile(); + const state = await manager(dir).act( + 'add', + [{ name: 'remote', setup: { type: 'http', url: 'https://user:pw@mcp.example/mcp?key=q', headers: { Authorization: 'Bearer t' } } }], + [], + ); + expect(state.servers).toEqual([ + { name: 'remote', transport: 'http', target: 'https://mcp.example/mcp', headerKeys: ['Authorization'], enabled: true }, + ]); + expect(layerOf(dir)).toMatch(/transport: streamable-http/); + }); + + it('replaces a server it already has, keeping the switch the user set', async () => { + const dir = profile(); + const mcp = manager(dir); + await mcp.act('add', [stdio('demo', '/usr/bin/one')], []); + await mcp.act('disable', [], ['demo']); + const state = await mcp.act('add', [stdio('demo', '/usr/bin/two')], []); + expect(state.servers).toEqual([{ name: 'demo', transport: 'stdio', target: '/usr/bin/two', enabled: false }]); + }); + + it('refuses a name the harness cannot namespace', async () => { + const dir = profile(); + await expect(manager(dir).act('add', [stdio('my server!')], [])).rejects.toThrow(/not a usable MCP server name/); + await expect(manager(dir).act('add', [stdio('x'.repeat(33))], [])).rejects.toThrow(/not a usable MCP server name/); + }); + + it('refuses the SSE transport the harness does not speak', async () => { + const dir = profile(); + await expect(manager(dir).act('add', [{ name: 'old', setup: { type: 'sse', url: 'https://x/mcp' } }], [])).rejects.toThrow( + /stdio or streamable HTTP, not SSE/, + ); + }); +}); + +describe('switching', () => { + it('switches a server off and on without removing it', async () => { + const dir = profile(); + const mcp = manager(dir); + await mcp.act('add', [stdio('demo')], []); + expect((await mcp.act('disable', [], ['demo'])).servers).toEqual([ + { name: 'demo', transport: 'stdio', target: '/usr/bin/tool', enabled: false }, + ]); + // The row stays, with a disable row after it — the layer's own way of + // switching a row off. + expect(layerOf(dir)).toMatch(/disabled: true/); + expect((await mcp.act('enable', [], ['demo'])).servers).toEqual([ + { name: 'demo', transport: 'stdio', target: '/usr/bin/tool', enabled: true }, + ]); + expect(layerOf(dir)).not.toMatch(/disabled: true/); + }); + + it('counts a change so a session can tell what its harness has loaded', async () => { + // Nothing here restarts a running harness: the file is read as it starts, + // which is what a session's MCP status reports as pending. + const dir = profile(); + const mcp = manager(dir); + expect(mcp.version).toBe(0); + await mcp.act('add', [stdio('demo')], []); + expect(mcp.version).toBe(1); + // A write that changes nothing is not a change. + await mcp.act('add', [stdio('demo')], []); + expect(mcp.version).toBe(1); + await mcp.act('remove', [], ['demo']); + expect(mcp.version).toBe(2); + }); + + it('refuses to switch a server it does not have', async () => { + const dir = profile(); + await expect(manager(dir).act('disable', [], ['ghost'])).rejects.toThrow(/has no MCP server named 'ghost'/); + await expect(manager(dir).act('remove', [], ['ghost'])).rejects.toThrow(/has no MCP server named 'ghost'/); + }); +}); + +describe('removing', () => { + it('takes the server out and leaves the layer as it was', async () => { + const dir = profile(); + const mcp = manager(dir); + await mcp.act('add', [stdio('demo')], []); + expect(await mcp.act('remove', [], ['demo'])).toEqual({ servers: [], toggles: true }); + expect(layerOf(dir)).toBe(`${INITIAL_LAYER}\n`); + }); + + it('keeps everything outside the managed block', async () => { + const mine = `# Your patch layer for this dsh profile. +- insert: + - id: my-own-server + name: '@deepseek-ai/dsh-mcp-client' + config: + serverName: mine + transport: stdio + command: /usr/bin/mine + +# a trailing note`; + const dir = profile(mine); + const mcp = manager(dir); + await mcp.act('add', [stdio('demo')], []); + expect(layerOf(dir).trimEnd().startsWith(mine)).toBe(true); + + // Adding a second one rewrites only the block, so the user's own rows are + // still exactly where they were. + await mcp.act('add', [stdio('other')], []); + expect(layerOf(dir).trimEnd().startsWith(mine)).toBe(true); + expect(await mcp.list()).toEqual({ + servers: [ + { name: 'demo', transport: 'stdio', target: '/usr/bin/tool', enabled: true }, + { name: 'other', transport: 'stdio', target: '/usr/bin/tool', enabled: true }, + ], + toggles: true, + }); + + // Removing ours leaves the user's layer alone again. + await mcp.act('remove', [], ['demo', 'other']); + expect(layerOf(dir).trimEnd()).toBe(mine); + }); +}); + +describe('a layer this bridge cannot read', () => { + it('says so instead of losing the servers quietly', async () => { + const dir = profile( + `# --- CodeDeck+ MCP servers: managed from the MCP screen; everything outside this block is yours ---\n: not: yaml: [\n# --- end CodeDeck+ MCP servers ---`, + ); + await expect(manager(dir).list()).rejects.toThrow(/not valid YAML/); + }); +}); + +describe('the profile layer', () => { + it('is created when the profile has none yet', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-mcp-')); + mkdirSync(path.join(dir, 'profiles'), { recursive: true }); + const profileDir = path.join(dir, 'profiles', 'acp'); + await manager(profileDir).act('add', [stdio('demo')], []); + expect(readFileSync(path.join(profileDir, 'cordis.patch.yml'), 'utf8')).toMatch(/codedeck-mcp-demo/); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekPlugins.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekPlugins.test.ts new file mode 100644 index 00000000..4cfc726d --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekPlugins.test.ts @@ -0,0 +1,221 @@ +/** + * The harness's plugins: npm packages installed into a profile and mounted as + * patch layers. The harness's own CLI does the installing (its pnpm, its + * locks, its compatibility gate), so what is faked here is that CLI — and the + * cases are the ones its output decides. + */ +import { EventEmitter } from 'node:events'; +import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import * as path from 'node:path'; +import { describe, expect, it, vi } from 'vitest'; +import { DeepSeekPlugins, runDshPlugin, type DshRun } from '../plugins'; +import type { SpawnFn } from '../runtime'; + +/** A profile directory: its manifest, and whatever it has installed. */ +function profile( + manifest: Record = { name: 'dsh-profile-acp', private: true, dependencies: {} }, + packages: Record> = {}, +): string { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-plugins-')); + writeFileSync(path.join(dir, 'package.json'), `${JSON.stringify(manifest, null, 2)}\n`); + for (const [name, pkg] of Object.entries(packages)) { + const target = path.join(dir, 'node_modules', ...name.split('/')); + mkdirSync(target, { recursive: true }); + writeFileSync(path.join(target, 'package.json'), JSON.stringify(pkg)); + } + return dir; +} + +const bundles = (...names: string[]): Record => ({ + dsh: { profile: { bundles: ['@deepseek-ai/dsh-base', '@deepseek-ai/dsh-acp-app', ...names] } }, +}); + +const pluginPackage = (version: string, bundle = true): Record => ({ + name: 'demo-plugin', + version, + ...(bundle ? { dsh: { bundle: {} } } : {}), +}); + +interface Harness { + plugins: DeepSeekPlugins; + runs: string[][]; + manifest(): { dependencies?: Record; dsh?: { profile?: { bundles?: string[] } } }; +} + +/** A plugin manager whose CLI answers are scripted by `behaviour`. */ +function withPlugins( + dir: string, + behaviour: (args: string[]) => DshRun | Promise = () => ({ code: 0, stdout: '', stderr: '' }), +): Harness { + const runs: string[][] = []; + const plugins = new DeepSeekPlugins({ + profileDir: dir, + run: async (args) => { + runs.push(args); + return behaviour(args); + }, + log: () => {}, + }); + return { plugins, runs, manifest: () => JSON.parse(readFileSync(path.join(dir, 'package.json'), 'utf8')) }; +} + +describe('listing', () => { + it('answers nothing for a profile nobody has touched', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-plugins-')); + expect(await withPlugins(dir).plugins.list(false)).toEqual({ installed: [], toggles: true }); + }); + + it('shows what is installed, and which of it is a layer', async () => { + const dir = profile( + { ...bundles('demo-plugin'), dependencies: { 'demo-plugin': '1.2.3', 'plain-dep': '2.0.0' } }, + { 'demo-plugin': pluginPackage('1.2.3'), 'plain-dep': { name: 'plain-dep', version: '2.0.0' } }, + ); + const state = await withPlugins(dir).plugins.list(true); + expect(state.installed).toEqual([ + { id: '@deepseek-ai/dsh-acp-app', name: '@deepseek-ai/dsh-acp-app', version: undefined, enabled: true }, + { id: '@deepseek-ai/dsh-base', name: '@deepseek-ai/dsh-base', version: undefined, enabled: true }, + { id: 'demo-plugin', name: 'demo-plugin', version: '1.2.3', enabled: true }, + { id: 'plain-dep', name: 'plain-dep', version: '2.0.0', enabled: false }, + ]); + // The harness installs plugins from npm; it has no marketplaces to ask. + expect(state.marketplaces).toBeUndefined(); + expect(state.available).toBeUndefined(); + }); +}); + +describe('installing and removing', () => { + it('installs through the harness’s own command and says what it did', async () => { + const dir = profile(); + const harness = withPlugins(dir, () => ({ + code: 0, + stdout: 'Packages: +1\nDone in 1.1s using pnpm v10.8.0\n', + stderr: 'dsh: warning: demo-plugin declares no dsh.bundle — installed as a plain dependency, not a profile layer\n', + })); + const state = await harness.plugins.act('install', 'demo-plugin'); + expect(harness.runs).toEqual([['add', 'demo-plugin']]); + expect(state.message).toMatch(/declares no dsh\.bundle/); + }); + + it('refuses a target that is not a package name, without asking the CLI', async () => { + const dir = profile(); + const harness = withPlugins(dir); + await expect(harness.plugins.act('install', 'not a package; rm -rf /')).rejects.toThrow(/not a package name/); + expect(harness.runs).toEqual([]); + }); + + it('reports what the harness printed when the command fails', async () => { + const dir = profile(); + const harness = withPlugins(dir, () => ({ + code: 1, + stdout: '', + stderr: 'dsh: installation rejected: Plugin demo-plugin@0.0.1 is incompatible with dsh 0.2.0-rc.2\n', + })); + await expect(harness.plugins.act('install', 'demo-plugin')).rejects.toThrow(/incompatible with dsh/); + }); + + it('removes and updates with the harness’s own commands', async () => { + const dir = profile({ ...bundles(), dependencies: { 'demo-plugin': '^1.0.0' } }, { 'demo-plugin': pluginPackage('1.0.0') }); + const harness = withPlugins(dir); + await harness.plugins.act('uninstall', 'demo-plugin'); + await harness.plugins.act('update', 'demo-plugin'); + expect(harness.runs).toEqual([ + ['remove', 'demo-plugin'], + ['update', 'demo-plugin'], + ]); + }); + + it('refuses a plugin the profile does not have', async () => { + const dir = profile(); + const harness = withPlugins(dir); + await expect(harness.plugins.act('uninstall', 'ghost')).rejects.toThrow(/profile has no plugin 'ghost'/); + expect(harness.runs).toEqual([]); + }); + + it('refuses the profile’s own composition', async () => { + const dir = profile(); + const harness = withPlugins(dir); + await expect(harness.plugins.act('uninstall', '@deepseek-ai/dsh-base')).rejects.toThrow(/profile's own composition/); + await expect(harness.plugins.act('install', '@deepseek-ai/dsh-acp-app')).rejects.toThrow(/already installed/); + expect(harness.runs).toEqual([]); + }); + + it('has no marketplaces to act on', async () => { + const dir = profile(); + const harness = withPlugins(dir); + await expect(harness.plugins.act('add-marketplace', 'owner/repo')).rejects.toThrow(/no plugin marketplaces/); + await expect(harness.plugins.act('remove-marketplace', 'acme')).rejects.toThrow(/no plugin marketplaces/); + await expect(harness.plugins.act('update-marketplace', 'acme')).rejects.toThrow(/no plugin marketplaces/); + }); +}); + +describe('switching a plugin off', () => { + it('takes its layer out and leaves it installed', async () => { + const dir = profile({ ...bundles('demo-plugin'), dependencies: { 'demo-plugin': '1.0.0' } }, { 'demo-plugin': pluginPackage('1.0.0') }); + const harness = withPlugins(dir); + const disabled = await harness.plugins.act('disable', 'demo-plugin'); + expect(disabled.installed).toEqual([ + { id: '@deepseek-ai/dsh-acp-app', name: '@deepseek-ai/dsh-acp-app', version: undefined, enabled: true }, + { id: '@deepseek-ai/dsh-base', name: '@deepseek-ai/dsh-base', version: undefined, enabled: true }, + { id: 'demo-plugin', name: 'demo-plugin', version: '1.0.0', enabled: false }, + ]); + expect(harness.manifest().dsh?.profile?.bundles).toEqual(['@deepseek-ai/dsh-base', '@deepseek-ai/dsh-acp-app']); + expect(harness.runs).toEqual([]); + + // Switched back on, it goes last: the layers are an ordered stack. + const enabled = await harness.plugins.act('enable', 'demo-plugin'); + expect(enabled.installed.find((plugin) => plugin.name === 'demo-plugin')?.enabled).toBe(true); + expect(harness.manifest().dsh?.profile?.bundles).toEqual(['@deepseek-ai/dsh-base', '@deepseek-ai/dsh-acp-app', 'demo-plugin']); + }); + + it('refuses a plugin that is not installed, or is no layer', async () => { + const dir = profile( + { ...bundles(), dependencies: { 'plain-dep': '1.0.0' } }, + { 'plain-dep': { name: 'plain-dep', version: '1.0.0' } }, + ); + const harness = withPlugins(dir); + await expect(harness.plugins.act('enable', 'ghost')).rejects.toThrow(/install it first/); + await expect(harness.plugins.act('enable', 'plain-dep')).rejects.toThrow(/declares no dsh\.bundle/); + }); + + it('refuses to switch off the profile’s own composition', async () => { + const dir = profile(bundles()); + const harness = withPlugins(dir); + await expect(harness.plugins.act('disable', '@deepseek-ai/dsh-base')).rejects.toThrow(/cannot be switched off/); + }); +}); + +describe('runDshPlugin', () => { + class FakeChild extends EventEmitter { + stdout = new EventEmitter(); + stderr = new EventEmitter(); + killed: string[] = []; + kill(signal: string): boolean { + this.killed.push(signal); + return true; + } + } + + it('runs the harness CLI with the profile and the pnpm arguments', async () => { + const child = new FakeChild(); + const spawnFn = vi.fn(() => child) as unknown as SpawnFn; + const pending = runDshPlugin('/tree/dsh/lib/bin.js', 'acp', ['add', 'demo'], spawnFn); + expect(spawnFn).toHaveBeenCalledWith( + process.execPath, + ['/tree/dsh/lib/bin.js', 'plugin', '--profile', 'acp', 'add', 'demo'], + expect.objectContaining({ stdio: ['ignore', 'pipe', 'pipe'] }), + ); + child.stdout.emit('data', Buffer.from('installed\n')); + child.stderr.emit('data', Buffer.from('a warning\n')); + child.emit('close', 0); + expect(await pending).toEqual({ code: 0, stdout: 'installed\n', stderr: 'a warning\n' }); + }); + + it('answers a failure the CLI could not even start', async () => { + const child = new FakeChild(); + const spawnFn = vi.fn(() => child) as unknown as SpawnFn; + const pending = runDshPlugin('/tree/dsh/lib/bin.js', 'acp', ['add', 'demo'], spawnFn); + child.emit('error', new Error('ENOENT')); + await expect(pending).rejects.toThrow(/ENOENT/); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/fakeHarness.ts b/packages/agent-host/src/drivers/deepseek/__tests__/fakeHarness.ts new file mode 100644 index 00000000..8105f2b1 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/fakeHarness.ts @@ -0,0 +1,342 @@ +/** + * A scripted DeepSeek Harness behind the driver's spawn seam: it answers the + * ACP requests a session makes, in the shapes the real runtime sends, so the + * driver can be tested without the CLI, a credential or a network. + * + * The shapes are the harness's own (`@deepseek-ai/dsh-acp`): a session's + * option state, `tool_call` updates carrying the tool name as their title + * with `kind: "other"`, permission asks that name only the tool call, and + * stop reasons rather than a synthetic end. A test sets `onPrompt` to script + * one turn — sending updates and asking for a permission — and everything + * else is answered the way the harness would. + */ +import { EventEmitter } from 'node:events'; +import { PassThrough } from 'node:stream'; +import type { SpawnFn } from '../runtime'; + +/** Minimal fake ChildProcess: the streams the driver talks over, plus the + * exit and kill behaviour the runtime's close ladder needs. */ +export class FakeChild extends EventEmitter { + readonly stdin = new PassThrough(); + readonly stdout = new PassThrough(); + readonly stderr = new PassThrough(); + pid = 4242; + exitCode: number | null = null; + signalCode: string | null = null; + readonly killed: string[] = []; + + kill(signal: string): boolean { + this.killed.push(signal); + this.signalCode = signal; + this.exitCode = 0; + queueMicrotask(() => this.emit('exit', 0, signal)); + return true; + } + + /** The harness process dying on its own (a crash, a plugin error). */ + crash(code = 1): void { + this.exitCode = code; + this.emit('exit', code, null); + } +} + +/** One message the driver sent to the harness. */ +interface Sent { + id?: number | string; + method?: string; + params?: Record; + result?: unknown; + error?: unknown; +} + +/** The option state a session starts with, as the harness composes it. */ +export function configOptions(currentModel = '["deepseek-official","deepseek-v4-flash"]'): unknown[] { + return [ + { + id: 'model', + name: 'Model', + category: 'model', + type: 'select', + currentValue: currentModel, + options: [ + { + group: 'deepseek-official', + name: 'DeepSeek', + options: [ + { value: '["deepseek-official","deepseek-v4-flash"]', name: 'deepseek-v4-flash' }, + { value: '["deepseek-official","deepseek-v4-pro"]', name: 'DeepSeek-V4-Pro' }, + ], + }, + ], + }, + { + id: 'reasoning_effort', + name: 'Reasoning effort', + category: 'thought_level', + type: 'select', + currentValue: 'high', + options: [ + { value: 'off', name: 'Off' }, + { value: 'low', name: 'Low' }, + { value: 'high', name: 'High' }, + { value: 'max', name: 'Max' }, + ], + }, + ]; +} + +export class FakeHarness { + readonly child = new FakeChild(); + /** Requests the driver sent, in order. */ + readonly requests: Array<{ method: string; params: Record }> = []; + /** Notifications the driver sent, in order. */ + readonly notifications: Array<{ method: string; params: Record }> = []; + /** Every `session/new` the driver asked for. */ + readonly newSessions: Array> = []; + readonly resumed: Array> = []; + readonly closed: string[] = []; + readonly setOptions: Array<{ sessionId: string; configId: string; value: string }> = []; + /** The option state session/new and session/resume answer with. */ + options: unknown[] = configOptions(); + /** Make `session/resume` fail the way a missing conversation does. */ + resumeError: string | undefined; + /** Whether the harness accepts the values `set_config_option` is given. */ + acceptsOptions = true; + /** Whether the connection advertises `session/resume` at all. */ + supportsResume = true; + /** Whether `session/new` succeeds. */ + newSessionError: string | undefined; + /** Scripts one turn; the default completes at once. */ + onPrompt: ((sessionId: string, text: string, harness: FakeHarness) => Promise | string) | undefined; + private nextId = 1; + private readonly pending = new Map void>(); + private readonly inbound: Sent[] = []; + private buffer = ''; + + constructor(readonly spawnFn: SpawnFn = (() => this.child) as unknown as SpawnFn) { + this.child.stdin.on('data', (chunk: Buffer) => this.receive(chunk.toString())); + // Nothing reads the harness's own log here; keep the stream drained. + this.child.stderr.resume(); + } + + private receive(text: string): void { + this.buffer += text; + for (;;) { + const end = this.buffer.indexOf('\n'); + if (end < 0) return; + const line = this.buffer.slice(0, end); + this.buffer = this.buffer.slice(end + 1); + if (line.trim() === '') continue; + this.handle(JSON.parse(line) as Sent); + } + } + + private handle(message: Sent): void { + if (message.method === undefined) { + const settle = message.id !== undefined ? this.pending.get(message.id) : undefined; + if (settle && message.id !== undefined) { + this.pending.delete(message.id); + settle(message); + } + return; + } + if (message.id === undefined) { + this.notifications.push({ method: message.method, params: message.params ?? {} }); + if (message.method === 'session/cancel') { + this.resolveTurn(message.params?.sessionId as string, 'cancelled'); + } + return; + } + const params = message.params ?? {}; + this.requests.push({ method: message.method, params }); + void this.answer(message.id, message.method, params); + } + + private async answer(id: number | string, method: string, params: Record): Promise { + switch (method) { + case 'initialize': + this.reply(id, { + protocolVersion: 1, + agentInfo: { name: 'deepseek-harness-acp', version: '0.0.1' }, + agentCapabilities: { + mcpCapabilities: { http: true }, + promptCapabilities: { image: false, audio: false, embeddedContext: false }, + sessionCapabilities: { + close: {}, + list: {}, + ...(this.supportsResume ? { resume: {} } : {}), + }, + }, + authMethods: [], + }); + return; + case 'session/new': { + if (this.newSessionError !== undefined) { + this.errorReply(id, -32602, `Invalid params: ${this.newSessionError}`); + return; + } + this.newSessions.push(params); + const sessionId = `s${this.newSessions.length}`; + this.reply(id, { sessionId, configOptions: this.options }); + return; + } + case 'session/resume': { + if (this.resumeError !== undefined) { + this.errorReply(id, -32602, `Invalid params: ${this.resumeError}`); + return; + } + this.resumed.push(params); + this.reply(id, { configOptions: this.options }); + return; + } + case 'session/set_config_option': { + const configId = String(params.configId); + const value = String(params.value); + this.setOptions.push({ sessionId: String(params.sessionId), configId, value }); + // The harness answers a change with the complete, updated option + // state — including a current value the change did not accept. + const option = this.options.find( + (entry) => typeof entry === 'object' && entry !== null && (entry as { id?: string }).id === configId, + ) as { options?: Array<{ value?: string; options?: Array<{ value?: string }> }> } | undefined; + // The harness offers a select option's values flat or grouped (its + // models come grouped by provider). + const offered = + option?.options?.some((entry) => + Array.isArray(entry.options) + ? entry.options.some((inner) => inner.value === value) + : entry.value === value, + ) === true; + if (!this.acceptsOptions || !offered) { + this.errorReply(id, -32602, `Invalid params: unknown ${configId} option: ${value}`); + return; + } + this.options = this.options.map((entry) => (entry === option ? { ...(entry as object), currentValue: value } : entry)); + this.reply(id, { configOptions: this.options }); + return; + } + case 'session/close': { + this.closed.push(String(params.sessionId)); + this.reply(id, {}); + return; + } + case 'session/prompt': { + const sessionId = String(params.sessionId); + const text = (params.prompt as Array<{ text?: string }> | undefined)?.[0]?.text ?? ''; + this.turnIds.set(sessionId, id); + let stop = 'end_turn'; + try { + stop = this.onPrompt ? await this.onPrompt(sessionId, text, this) : 'end_turn'; + } catch (error) { + // A turn that failed is a failed request, as the harness reports it. + this.turnIds.delete(sessionId); + this.errorReply(id, -32603, `Internal error: turn failed: ${error instanceof Error ? error.message : String(error)}`); + return; + } + // A scripted turn may have been completed by a cancel already. + if (this.turnIds.get(sessionId) === id) { + this.turnIds.delete(sessionId); + this.reply(id, { stopReason: stop }); + } + return; + } + default: + this.errorReply(id, -32601, `Method not found: ${method}`); + } + } + + private readonly turnIds = new Map(); + + /** Finish the turn running in `sessionId`, as the harness does for a + * cancelled prompt. */ + resolveTurn(sessionId: string, reason: string): void { + const id = this.turnIds.get(sessionId); + if (id === undefined) return; + this.turnIds.delete(sessionId); + this.reply(id, { stopReason: reason }); + } + + // --- messages to the client --- + + send(method: string, params: unknown): void { + this.child.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', method, params })}\n`); + } + + /** One `session/update` notification. */ + update(sessionId: string, update: unknown): void { + this.send('session/update', { sessionId, update }); + } + + /** One agent message chunk, as the harness derives it from a committed + * assistant message. */ + message(sessionId: string, text: string): void { + this.update(sessionId, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text } }); + } + + thought(sessionId: string, text: string): void { + this.update(sessionId, { sessionUpdate: 'agent_thought_chunk', content: { type: 'text', text } }); + } + + toolCall(sessionId: string, toolCallId: string, name: string, rawInput: unknown = {}): void { + this.update(sessionId, { sessionUpdate: 'tool_call', toolCallId, title: name, kind: 'other', status: 'in_progress', rawInput }); + } + + toolResult(sessionId: string, toolCallId: string, text: string, failed = false): void { + this.update(sessionId, { + sessionUpdate: 'tool_call_update', + toolCallId, + status: failed ? 'failed' : 'completed', + content: text === '' ? [] : [{ type: 'content', content: { type: 'text', text } }], + }); + } + + usage(sessionId: string, used: number, size: number): void { + this.update(sessionId, { sessionUpdate: 'usage_update', used, size }); + } + + /** Ask the client to allow one tool call, as the harness does, and answer + * with what it decided. */ + askPermission( + sessionId: string, + toolCallId: string, + options?: unknown[], + ): Promise<{ outcome: string; optionId?: string } | undefined> { + const id = 9000 + this.nextId++; + const message = new Promise((resolve) => this.pending.set(id, resolve)); + this.child.stdout.write( + `${JSON.stringify({ + jsonrpc: '2.0', + id, + method: 'session/request_permission', + params: { + sessionId, + toolCall: { toolCallId }, + options: + options ?? + [ + { optionId: 'allow-once', name: 'Allow once', kind: 'allow_once' }, + { optionId: 'reject-once', name: 'Reject', kind: 'reject_once' }, + ], + }, + })}\n`, + ); + return message.then((answer) => { + const outcome = ( + answer.result as { outcome?: { outcome?: string; optionId?: string } } | undefined + )?.outcome; + return outcome === undefined ? undefined : { outcome: outcome.outcome ?? '', ...(outcome.optionId ? { optionId: outcome.optionId } : {}) }; + }); + } + + /** Erase stdout/stderr support for a line that is not JSON-RPC at all. */ + raw(line: string): void { + this.child.stdout.write(line); + } + + private reply(id: number | string, result: unknown): void { + this.child.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id, result })}\n`); + } + + private errorReply(id: number | string, code: number, message: string): void { + this.child.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id, error: { code, message } })}\n`); + } +} diff --git a/packages/agent-host/src/drivers/deepseek/acp.ts b/packages/agent-host/src/drivers/deepseek/acp.ts new file mode 100644 index 00000000..e94d7bac --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/acp.ts @@ -0,0 +1,270 @@ +/** + * The Agent Client Protocol side of the DeepSeek Harness driver: JSON-RPC 2.0 + * over the newline-delimited stdio of a `dsh --profile acp` child — the ACP + * v1 wire the framing here implements, typed by the protocol's own schema + * package (a type-only import, so nothing of that package ships in the host). + * + * Small on purpose: the host needs requests with their replies, the agent's + * notifications, its `session/request_permission` asks answered asynchronously, + * and a definite end when the child dies. Everything above that — which + * session a notification belongs to, what a permission ask becomes on the + * phone — is the driver's, not the wire's. + * + * A line that is not a JSON-RPC message is logged and dropped rather than + * killing the connection: the runtime owns stdout for ACP, but a wrapped or + * interleaved line is not worth losing every running session over. A closed + * stdio is the end: every pending request is rejected and `closed` settles. + */ +import type { + AgentNotificationParamsByMethod, + AgentRequestParamsByMethod, + AgentRequestResponsesByMethod, + ClientNotificationParamsByMethod, + ClientRequestParamsByMethod, + ClientRequestResponsesByMethod, +} from '@agentclientprotocol/sdk'; + +/** A JSON-RPC id as it rides the wire (the agent may use either kind). */ +type WireId = string | number; + +/** A failed request, with the agent's own JSON-RPC error text. */ +export class AcpRequestError extends Error { + constructor( + message: string, + readonly code: number, + readonly data: unknown = undefined, + ) { + super(message); + this.name = 'AcpRequestError'; + } +} + +/** The end of a connection: `error` is absent for an orderly close. */ +export interface AcpClosed { + error?: string; +} + +export interface AcpClientOptions { + /** The child's stdin — messages are written here. */ + stdin: NodeJS.WritableStream; + /** The child's stdout — messages are read from here. */ + stdout: NodeJS.ReadableStream; + /** Diagnostics (the host's stderr). Never given message contents verbatim + * beyond what a protocol error already says. */ + log: (message: string) => void; +} + +/** Milliseconds a request may wait before it is abandoned. `initialize` gets + * one because a first run initializes the profile; a prompt does not, since + * a turn is as long as the model takes. */ +export const INITIALIZE_TIMEOUT_MS = 120_000; + +interface Pending { + resolve: (value: unknown) => void; + reject: (error: Error) => void; + timer?: NodeJS.Timeout; +} + +/** A notification the agent sent. */ +type NotificationHandler = ( + params: ClientNotificationParamsByMethod[M], +) => void; + +/** An agent request (currently only permission) the client answers. */ +type RequestHandler = ( + params: ClientRequestParamsByMethod[M], +) => Promise; + +export class AcpClient { + private readonly pending = new Map(); + private readonly notifications = new Map void>(); + private readonly requests = new Map Promise>(); + private nextId = 1; + private buffer = ''; + private ending: AcpClosed | undefined; + private readonly done: Promise; + private settleDone!: (closed: AcpClosed) => void; + private readonly onData: (chunk: Buffer | string) => void; + private readonly onEnd: () => void; + private readonly onError: (error: Error) => void; + + constructor(private readonly options: AcpClientOptions) { + this.done = new Promise((resolve) => { + this.settleDone = resolve; + }); + this.onData = (chunk) => this.receive(chunk.toString()); + this.onEnd = () => this.finish({ error: 'the agent closed its output' }); + this.onError = (error) => this.finish({ error: error.message }); + options.stdout.on('data', this.onData as (chunk: unknown) => void); + options.stdout.on('end', this.onEnd); + options.stdout.on('error', this.onError); + } + + /** Settles when the connection is over (either side ended it). */ + get closed(): Promise { + return this.done; + } + + /** Whether the connection can still carry messages. */ + get isOpen(): boolean { + return this.ending === undefined; + } + + /** Send one request and wait for its reply. */ + request( + method: M, + params: AgentRequestParamsByMethod[M], + options?: { timeoutMs?: number }, + ): Promise { + const id = this.nextId++; + return new Promise((resolve, reject) => { + const pending: Pending = { resolve, reject }; + if (options?.timeoutMs !== undefined) { + pending.timer = setTimeout(() => { + this.pending.delete(id); + reject(new Error(`${String(method)} did not answer within ${options.timeoutMs}ms`)); + }, options.timeoutMs); + pending.timer.unref?.(); + } + this.pending.set(id, pending); + try { + this.send({ jsonrpc: '2.0', id, method, params }); + } catch (error) { + this.pending.delete(id); + if (pending.timer) clearTimeout(pending.timer); + reject(error instanceof Error ? error : new Error(String(error))); + } + }) as Promise; + } + + /** Send one notification (no reply follows, by definition). */ + notify( + method: M, + params: AgentNotificationParamsByMethod[M], + ): void { + this.send({ jsonrpc: '2.0', method, params }); + } + + /** Handle one notification kind the agent sends. */ + on(method: M, handler: NotificationHandler): void { + this.notifications.set(method, handler as (params: never) => void); + } + + /** Answer one kind of request the agent sends. */ + onRequest(method: M, handler: RequestHandler): void { + this.requests.set(method, handler as (params: never) => Promise); + } + + /** Stop reading and end every pending request. Idempotent. */ + finish(closed: AcpClosed): void { + if (this.ending !== undefined) return; + this.ending = closed; + this.options.stdout.off?.('data', this.onData as (chunk: unknown) => void); + this.options.stdout.off?.('end', this.onEnd); + this.options.stdout.off?.('error', this.onError); + const reason = new Error(closed.error ?? 'the agent connection was closed'); + for (const [, pending] of this.pending) { + if (pending.timer) clearTimeout(pending.timer); + pending.reject(reason); + } + this.pending.clear(); + this.settleDone(closed); + } + + private send(message: object): void { + if (this.ending !== undefined) throw new Error(this.ending.error ?? 'the agent connection was closed'); + this.options.stdin.write(`${JSON.stringify(message)}\n`); + } + + /** One chunk of the child's output: whole lines are dispatched, a partial + * one waits for the rest. */ + private receive(text: string): void { + this.buffer += text; + for (;;) { + const end = this.buffer.indexOf('\n'); + if (end < 0) return; + const line = this.buffer.slice(0, end).replace(/\r$/, ''); + this.buffer = this.buffer.slice(end + 1); + if (line.trim() !== '') this.dispatch(line); + } + } + + private dispatch(line: string): void { + let message: unknown; + try { + message = JSON.parse(line); + } catch { + this.options.log(`[deepseek] dropped a malformed line from the agent: ${line.slice(0, 200)}`); + return; + } + if (typeof message !== 'object' || message === null) { + this.options.log('[deepseek] dropped a non-object message from the agent'); + return; + } + const frame = message as { id?: WireId; method?: unknown; params?: unknown; result?: unknown; error?: unknown }; + if (typeof frame.method === 'string') { + if (frame.id === undefined || frame.id === null) this.notifyIncoming(frame.method, frame.params); + else void this.answer(frame.id, frame.method, frame.params); + return; + } + if (frame.id === undefined || frame.id === null) { + this.options.log('[deepseek] dropped a message from the agent with no id and no method'); + return; + } + const pending = this.pending.get(frame.id); + if (!pending) { + this.options.log(`[deepseek] dropped a reply to unknown request ${String(frame.id)}`); + return; + } + this.pending.delete(frame.id); + if (pending.timer) clearTimeout(pending.timer); + if (frame.error !== undefined && frame.error !== null) { + const error = frame.error as { code?: unknown; message?: unknown; data?: unknown }; + const code = typeof error.code === 'number' ? error.code : -32603; + const text = typeof error.message === 'string' ? error.message : 'the agent refused the request'; + pending.reject(new AcpRequestError(text, code, error.data)); + } else { + pending.resolve(frame.result); + } + } + + private notifyIncoming(method: string, params: unknown): void { + const handler = this.notifications.get(method); + if (!handler) return; + try { + (handler as (params: unknown) => void)(params); + } catch (error) { + this.options.log(`[deepseek] ${method} handler failed: ${error instanceof Error ? error.message : String(error)}`); + } + } + + /** Answer one agent request. A handler that throws becomes a JSON-RPC + * error, so the agent is never left waiting on a reply. */ + private async answer(id: WireId, method: string, params: unknown): Promise { + const handler = this.requests.get(method); + if (!handler) { + this.reply({ jsonrpc: '2.0', id, error: { code: -32601, message: `Method not found: ${method}` } }); + return; + } + try { + const result = await (handler as (params: unknown) => Promise)(params); + this.reply({ jsonrpc: '2.0', id, result }); + } catch (error) { + this.reply({ + jsonrpc: '2.0', + id, + error: { code: -32603, message: error instanceof Error ? error.message : String(error) }, + }); + } + } + + private reply(message: object): void { + // A reply to a request the agent sent is best effort: a connection that + // closed in the meantime has nobody left to answer. + try { + this.send(message); + } catch (error) { + this.options.log(`[deepseek] could not answer the agent: ${error instanceof Error ? error.message : String(error)}`); + } + } +} diff --git a/packages/agent-host/src/drivers/deepseek/adapter.ts b/packages/agent-host/src/drivers/deepseek/adapter.ts new file mode 100644 index 00000000..09dd5bae --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/adapter.ts @@ -0,0 +1,215 @@ +/** + * Translates the DeepSeek Harness's ACP `session/update` notifications into + * transcript entries — the counterpart of the Claude driver's + * `sdkMessageToEntries` and the OpenCode driver's `opencodeEventToEntries`. + * + * Pure: one update in, zero or more entries out, with the only state being + * the facts a tool call's own update carried (`ToolCallFacts`), which the + * harness's result update does not repeat. Two updates are not entries and + * are the session's own: context usage (`usage_update`) and the option list + * (`config_option_update`). + * + * The harness sends the standard ACP updates for what it does — agent + * messages and thoughts, generic tool call lifecycles, usage, config — and + * nothing else: no plans, no slash commands, no modes, no terminal or + * filesystem callbacks. Its tool calls arrive with `kind: "other"` and the + * tool's own name as their title, so the agent-neutral kind and summary come + * from the name (src/tools.ts) exactly as they do for the other agents. + */ +import type { SessionUpdate } from '@agentclientprotocol/sdk'; +import { todosOf, toolInput, toolKindOf, toolLocations, toolTitle } from '../../tools'; +import { MAX_DIFF_LINES, truncateToolResult, toDiffLines, type DiffPayload } from '../../transcript'; +import type { OutputEntry } from '../../types'; + +/** What a tool call's own update carried: its result update repeats neither + * the tool's name nor its input. */ +export interface ToolCallFacts { + name: string; + input: Record; +} + +/** Every tool call of one session, by id. */ +export type ToolCallMemory = Map; + +/** Convert one update into entries. */ +export function deepseekUpdateToEntries(update: SessionUpdate, calls: ToolCallMemory): OutputEntry[] { + const ts = new Date().toISOString(); + switch (update.sessionUpdate) { + case 'agent_message_chunk': + return textOf(update.content, 'agent', ts); + case 'agent_thought_chunk': + return textOf(update.content, 'thinking', ts); + case 'tool_call': + return toolCallEntries(update, calls, ts); + case 'tool_call_update': + return toolResultEntries(update, calls, ts); + default: + return []; + } +} + +function textOf(content: unknown, role: 'agent' | 'thinking', ts: string): OutputEntry[] { + const block = content as { type?: unknown; text?: unknown } | null; + if (block?.type !== 'text' || typeof block.text !== 'string' || block.text === '') return []; + return [role === 'thinking' ? { entryType: 'thinking', text: block.text, timestamp: ts } : { entryType: 'text', role, text: block.text, timestamp: ts }]; +} + +/** One started tool call: its row, and the checklist when the call wrote one. */ +function toolCallEntries( + update: Extract, + calls: ToolCallMemory, + ts: string, +): OutputEntry[] { + const name = toolNameOf(update); + const input = record(update.rawInput); + calls.set(update.toolCallId, { name, input }); + const locations = fileLocations(name, input); + const full = toolInput(name, input); + const todos = todosOf(input); + return [ + { + entryType: 'tool_call', + callId: update.toolCallId, + toolName: name, + kind: toolKindOf(name), + title: toolTitle(name, input) || name, + ...(locations.length > 0 ? { locations } : {}), + ...(full !== undefined ? { input: full } : {}), + timestamp: ts, + }, + ...(todos ? [{ entryType: 'todos' as const, items: todos, callId: update.toolCallId, timestamp: ts }] : []), + ]; +} + +/** One finished tool call: its result text, and the file change it made when + * the harness's own input says what changed (its result update carries no + * diff block). A non-terminal update carries nothing new to show — the + * call's row is already there. */ +function toolResultEntries( + update: Extract, + calls: ToolCallMemory, + ts: string, +): OutputEntry[] { + const status = update.status ?? undefined; + if (status !== 'completed' && status !== 'failed') return []; + const facts = calls.get(update.toolCallId); + calls.delete(update.toolCallId); + const text = contentText(update.content); + const entries: OutputEntry[] = [ + { + entryType: 'tool_result', + callId: update.toolCallId, + text: truncateToolResult(text), + ...(status === 'failed' ? { isError: true } : {}), + timestamp: ts, + }, + ]; + if (status === 'completed' && facts) { + for (const diff of toolCallDiffs(facts.name, facts.input)) { + entries.push({ entryType: 'diff', ...diff, callId: update.toolCallId, timestamp: ts }); + } + } + return entries; +} + +/** The tool's own name: ACP carries it as `name` when the agent has one, and + * the harness puts it in `title`. */ +function toolNameOf(update: Extract): string { + return update.name ?? update.title; +} + +/** Everything a result's content blocks say, one line each. */ +function contentText(content: unknown): string { + if (!Array.isArray(content)) return ''; + const parts: string[] = []; + for (const item of content) { + const block = record(item); + if (block?.type !== 'content') continue; + const inner = record(block.content); + if (inner?.type === 'text' && typeof inner.text === 'string') parts.push(inner.text); + else if (inner?.type === 'image') parts.push('[image]'); + } + return parts.join('\n'); +} + +// --- file changes --- + +/** + * The files a completed call changed, from its own input. The harness's + * result update carries text only — no ACP diff block — so a file change is + * reconstructed the way the agent described it: the replaced text for `edit` + * and `str_replace_editor`, the whole file for `write` and a create. + * + * `str_replace_editor` is the Claude-Code-shaped editor the harness also + * mounts: its `command` decides which of its arguments are the change. + */ +export function toolCallDiffs(name: string, input: Record): DiffPayload[] { + switch (name) { + case 'edit': { + const path = str(input.file_path) ?? str(input.path); + if (!path) return []; + return bounded(path, [ + ...toDiffLines(str(input.old_string) ?? '', 'del'), + ...toDiffLines(str(input.new_string) ?? '', 'add'), + ]); + } + case 'write': { + const path = str(input.file_path) ?? str(input.path); + const content = str(input.content) ?? str(input.file_text); + if (!path || content === undefined) return []; + return bounded(path, toDiffLines(content, 'add')); + } + case 'str_replace_editor': { + const path = str(input.path); + if (!path) return []; + const command = str(input.command) ?? ''; + if (command === 'create') { + const content = str(input.file_text); + return content === undefined ? [] : bounded(path, toDiffLines(content, 'add')); + } + if (command === 'str_replace') { + return bounded(path, [ + ...toDiffLines(str(input.old_str) ?? '', 'del'), + ...toDiffLines(str(input.new_str) ?? '', 'add'), + ]); + } + if (command === 'insert') { + return bounded(path, toDiffLines(str(input.new_str) ?? '', 'add')); + } + return []; + } + default: + return []; + } +} + +/** A diff payload inside the shared wire cap; nothing for an empty change. */ +function bounded(path: string, lines: DiffPayload['lines']): DiffPayload[] { + if (lines.length === 0) return []; + const truncated = lines.length > MAX_DIFF_LINES; + return [{ + path, + lines: truncated ? lines.slice(0, MAX_DIFF_LINES) : lines, + ...(truncated ? { truncated: true } : {}), + }]; +} + +function str(value: unknown): string | undefined { + return typeof value === 'string' && value !== '' ? value : undefined; +} + +function record(value: unknown): Record { + return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record) : {}; +} + +/** + * The file a call names. The harness's own file tools agree on `file_path`; + * `str_replace_editor` is the odd one out with `path` — a key `glob` and + * `grep` use for a directory, so only that editor is read that way. + */ +function fileLocations(name: string, input: Record): string[] { + const direct = toolLocations(input); + if (direct.length > 0) return direct; + const path = name === 'str_replace_editor' ? str(input.path) : undefined; + return path ? [path] : []; +} diff --git a/packages/agent-host/src/drivers/deepseek/driver.ts b/packages/agent-host/src/drivers/deepseek/driver.ts new file mode 100644 index 00000000..1b31a008 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/driver.ts @@ -0,0 +1,721 @@ +/** + * The DeepSeek Harness driver, over the ACP profile of the `dsh` CLI + * (`dsh --profile acp`, runtime.ts) — the only interface the harness exposes + * that has everything an interactive client needs: prompts, cancellation, + * one-shot permission asks, and a model/reasoning selection that can change + * mid-session. Its `sdk` profile has none of the last three, and `headless` + * is one-shot. + * + * Deliberate limits, all of them the ACP surface's: + * - no modes: the harness has none, so `ask`/`default` are this driver's own + * (every ask to the phone, or auto-approve); + * - no slash commands, questions or background tasks: the automation profile + * carries none of them; + * - no subscription usage: there is nothing to ask (the context meter + * travels as session info instead); + * - MCP servers are attached when the harness starts, so a session shows + * them but cannot switch one; + * - a file change is reconstructed from the call's own arguments: the + * harness's result update carries no diff. + */ +import type { RequestPermissionRequest, RequestPermissionResponse, SessionConfigOption, SessionNotification } from '@agentclientprotocol/sdk'; +import type { Driver, DriverSession, McpManager, PluginManager, SessionContext, SessionMcpState } from '../../driver'; +import type { HttpGet } from '../../net'; +import { mcpStatus as mcpStatusOf } from '../../mcp'; +import { PERMISSION_ALLOW, PERMISSION_DENY, now, toolKindOf, toolLocations, toolTitle } from '../../tools'; +import type { + AgentInfo, + McpStatus, + ModelEntry, + OutputEntry, + SessionMcpServer, + SessionOption, + StartSession, + UsageData, +} from '../../types'; +import { deepseekUpdateToEntries, type ToolCallMemory } from './adapter'; +import { DEEPSEEK_API_KEY_CREDENTIAL, buildDeepSeekEnv } from './env'; +import { DSH_LABEL } from './install'; +import { DeepSeekMcp } from './mcp'; +import { DeepSeekPlugins, runDshPlugin, type DshRun } from './plugins'; +import { + DSH_PROFILE, + DeepSeekRuntime, + dshProfileDir, + type DeepSeekProcess, + type DeepSeekProcessEvents, + type SpawnFn, +} from './runtime'; + +export const DEEPSEEK_AGENT_ID = 'deepseek-harness'; + +/** `ask` sends every permission the harness asks for to the phone; `default` + * (the auto-approve mode every agent shares) allows them all. */ +const AUTO_APPROVE_MODE = 'default'; +const DEFAULT_MODE = 'ask'; +const DEEPSEEK_MODES = [ + { id: DEFAULT_MODE, label: 'Ask', description: 'Ask before each tool call' }, + { id: AUTO_APPROVE_MODE, label: 'YOLO', description: 'Run every tool without asking' }, +]; + +/** + * The harness's reasoning levels. They are the harness's own vocabulary and + * are offered in `info()` because a session's options — which would say so + * precisely — only exist once a session has started; a level this list offers + * and the running model does not have is refused by the harness itself, with + * its own reason. + */ +const DEEPSEEK_EFFORTS = [ + { id: 'off', label: 'Off', description: 'Use for simple tasks that do not need reasoning.' }, + { id: 'low', label: 'Low', description: 'Prefer for routine or latency-sensitive tasks.' }, + { id: 'high', label: 'High', description: 'The default balance for most tasks.' }, + { id: 'max', label: 'Max', description: 'Reserve for the hardest quality-first tasks.' }, +]; +/** What the DeepSeek route runs at when nothing is chosen. */ +const DEFAULT_EFFORT = 'high'; + +/** The harness's own option ids (standard ACP session config options). */ +const MODEL_CONFIG_ID = 'model'; +const EFFORT_CONFIG_ID = 'reasoning_effort'; + +/** One choice of a session config option. */ +interface Choice { + value: string; + label: string; + provider?: string; + description?: string; +} + +/** + * The choices of a select option. ACP lets an agent send them as one flat + * list or grouped, and the harness groups its models by provider (one group + * per configured provider, named after it) while its reasoning levels come + * flat. + */ +export function selectChoices(option: SessionConfigOption | undefined): Choice[] { + if (!option || option.type !== 'select') return []; + const choices: Choice[] = []; + for (const entry of option.options) { + if (!isGroup(entry)) { + choices.push({ value: entry.value, label: entry.name, ...(entry.description ? { description: entry.description } : {}) }); + continue; + } + for (const inner of entry.options) { + choices.push({ + value: inner.value, + label: inner.name, + provider: entry.name, + ...(inner.description ? { description: inner.description } : {}), + }); + } + } + return choices; +} + +/** ACP sends a select option's values either as one flat list or as groups; + * only a group entry carries values of its own. */ +function isGroup(entry: { value?: unknown; options?: unknown }): entry is { name: string; options: Array<{ value: string; name: string; description?: string | null }> } { + return Array.isArray(entry.options); +} + +/** The model choices of a session's option state: `value` is the opaque + * selector the harness sets and returns, `label` what its own name says. */ +export function modelChoices(option: SessionConfigOption | undefined): Choice[] { + return selectChoices(option); +} + +/** The plain reasoning levels of a session's option state (the empty value + * the harness offers as "provider default" is not a level). */ +export function effortChoices(option: SessionConfigOption | undefined): Choice[] { + return selectChoices(option).filter((choice) => choice.value !== ''); +} + +/** + * The model inside a selector: its value is the harness's own encoding of + * `[provider, model]`, and a model named by a provider profile is the plain + * id inside it. A value that is not that pair is returned as it is, so an + * unknown encoding matches nothing rather than everything. + */ +export function modelIdOf(value: string): string { + try { + const parsed: unknown = JSON.parse(value); + if (Array.isArray(parsed) && parsed.length === 2 && typeof parsed[1] === 'string') return parsed[1]; + } catch { + // Not a selector: the value is already what it looks like. + } + return value; +} + +export class DeepSeekSession implements DriverSession { + /** What each tool call's own update carried, for its result and for the + * permission card the harness asks about it. */ + private readonly calls: ToolCallMemory = new Map(); + private readonly cwd: string; + private readonly env: Record; + private readonly ready: Promise; + private mode: string; + private process?: DeepSeekProcess; + private nativeId?: string; + private options: SessionConfigOption[] = []; + private contextPercentage?: number; + private contextWindow?: number; + /** Whether the phone has been told the session is up: until then its model + * travels in the identity info, not as a change. */ + private announced = false; + private ended = false; + /** Prompts run one at a time: ACP refuses a second prompt while one is in + * flight, so a message sent meanwhile waits for the turn before it. */ + private tail: Promise = Promise.resolve(); + + constructor( + private readonly params: StartSession, + private readonly ctx: SessionContext, + private readonly deps: { + runtime: DeepSeekRuntime; + mcp: DeepSeekMcp; + baseEnv: NodeJS.ProcessEnv; + /** Where this session is registered while it runs, so the driver can + * end it when the harness process it shares goes away. */ + live: { + add(sessionId: string, session: DeepSeekSession): void; + remove(sessionId: string): void; + events(): DeepSeekProcessEvents; + }; + }, + ) { + this.cwd = params.cwd; + this.mode = params.mode ?? DEFAULT_MODE; + // Built here, not in `init`: a provider profile that cannot be used at + // all refuses the session before it starts, rather than after an error + // entry the phone would have to read. + this.env = buildDeepSeekEnv(params, deps.baseEnv); + this.ready = this.init(); + // init() reports its own failure as `ended`; nothing else awaits this + // rejection except prompt/interrupt, which catch it themselves. + this.ready.catch(() => {}); + } + + private get client() { + const process_ = this.process; + if (!process_) throw new Error('the DeepSeek Harness session has not started'); + return process_.client; + } + + /** The harness process this session shares went away, taking the session + * with it. */ + endFromProcess(error: string): void { + this.finish(error); + } + + private async init(): Promise { + try { + const process_ = await this.deps.runtime.acquire(this.env, this.deps.live.events()); + this.process = process_; + // A session closed while its harness was starting keeps nothing: the + // process it acquired is let go at once. + if (this.ended) { + this.abandon(); + return; + } + const opened = await this.openSession(); + this.nativeId = opened.sessionId; + this.options = opened.configOptions; + if (this.ended) { + this.abandon(); + return; + } + process_.attach(opened.sessionId, { + update: (notification) => this.onUpdate(notification), + permission: (request) => this.onPermission(request), + }); + this.deps.live.add(opened.sessionId, this); + await this.applySelection(); + if (this.ended) return; + const model = this.currentModel(); + this.announced = true; + this.ctx.emit({ type: 'info', nativeSessionId: opened.sessionId, ...(model ? { model: model.label } : {}), mode: this.mode }); + this.deliver({ entryType: 'status', text: `${DSH_LABEL} session started${model ? ` (${model.label})` : ''}`, timestamp: now() }); + this.ctx.emit({ type: 'ready' }); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + this.deliver({ entryType: 'error', text: message, timestamp: now() }); + this.finish(message); + } + } + + /** Start a fresh conversation, or continue the one the bridge names. A + * conversation the harness no longer has (removed, or started in another + * workspace — it checks) falls back to a fresh one with a notice, as the + * other drivers do: the transcript is the bridge's, the memory is the + * agent's. */ + private async openSession(): Promise<{ sessionId: string; configOptions: SessionConfigOption[] }> { + const resume = this.params.resume; + const resumable = this.process?.capabilities.sessionCapabilities?.resume; + if (resume && resumable !== undefined) { + try { + const resumed = await this.client.request('session/resume', { sessionId: resume, cwd: this.cwd, mcpServers: [] }); + return { sessionId: resume, configOptions: resumed.configOptions ?? [] }; + } catch (error) { + const reason = error instanceof Error ? error.message : String(error); + this.ctx.log(`[deepseek] could not resume ${resume} (${reason}) — starting a fresh session`); + this.deliver({ + entryType: 'notice', + kind: 'session_restart', + text: + `${DSH_LABEL} could not continue this conversation — starting a fresh one in the same workspace. ` + + 'The transcript is preserved, but the model does not remember earlier turns.', + timestamp: now(), + }); + } + } + const created = await this.client.request('session/new', { cwd: this.cwd, mcpServers: [] }); + return { sessionId: created.sessionId, configOptions: created.configOptions ?? [] }; + } + + /** Apply the model and reasoning level the session was started with. The + * model goes first: which reasoning levels exist is the model's own. */ + private async applySelection(): Promise { + const wanted = this.params.model; + if (wanted) { + const value = this.resolveModel(wanted); + try { + await this.setConfig(MODEL_CONFIG_ID, value ?? wanted); + } catch (error) { + const reason = error instanceof Error ? error.message : String(error); + if (!this.params.provider) { + // The phone chooses from this driver's own model list, so a model + // it cannot have is a stale choice: refusing the session says so + // loudly instead of quietly running something else. + throw new Error(`${DSH_LABEL} does not offer the model '${wanted}': ${reason} — choose one from its model list.`); + } + // A provider-bound session's model names the gateway's own model, + // while the harness sends its catalog's name on the wire and lets the + // gateway map it: a name the catalog does not know is not fatal, but + // the phone must not believe it took effect. + this.deliver({ + entryType: 'error', + text: `The provider profile's model '${wanted}' is not one the harness knows: ${reason}`, + timestamp: now(), + }); + } + } + const effort = this.params.effort; + if (effort && effortChoices(this.optionOf(EFFORT_CONFIG_ID)).some((choice) => choice.value === effort)) { + await this.setConfig(EFFORT_CONFIG_ID, effort); + } else if (effort) { + this.deliver({ + entryType: 'error', + text: `This model has no reasoning level '${effort}' in ${DSH_LABEL} — the session runs at the model's own default.`, + timestamp: now(), + }); + } + } + + /** The value to select for a model the bridge names: the option's own + * opaque value, or the choice whose model id it is. */ + private resolveModel(model: string): string | undefined { + const choices = modelChoices(this.optionOf(MODEL_CONFIG_ID)); + return choices.find((choice) => choice.value === model)?.value ?? choices.find((choice) => modelIdOf(choice.value) === model)?.value; + } + + private optionOf(id: string): SessionConfigOption | undefined { + return this.options.find((option) => option.id === id); + } + + /** The model the session is on, as its option state describes it. */ + private currentModel(): Choice | undefined { + const option = this.optionOf(MODEL_CONFIG_ID); + if (!option || option.type !== 'select') return undefined; + return ( + modelChoices(option).find((choice) => choice.value === option.currentValue) ?? { + value: option.currentValue, + label: option.currentValue, + } + ); + } + + /** Change one option and keep the state that comes back — the harness + * answers every change with the complete option list. */ + private async setConfig(configId: string, value: string): Promise { + const sessionId = this.nativeId; + if (!sessionId) throw new Error('the session has not started'); + const result = await this.client.request('session/set_config_option', { sessionId, configId, value }); + const before = this.currentModel()?.value; + this.options = result.configOptions ?? this.options; + const after = this.currentModel(); + if (this.announced && configId === MODEL_CONFIG_ID && after && after.value !== before) { + this.ctx.emit({ type: 'info', model: after.label }); + } + } + + /** One update of this session: entries for the transcript, and the two + * updates that are session state rather than conversation. */ + private onUpdate(notification: SessionNotification): void { + if (this.ended) return; + const update = notification.update; + if (update.sessionUpdate === 'usage_update') { + this.reportContext(update.used, update.size); + return; + } + if (update.sessionUpdate === 'config_option_update') { + this.options = update.configOptions; + return; + } + const entries = deepseekUpdateToEntries(update, this.calls); + if (entries.length > 0) this.ctx.emit({ type: 'entries', entries }); + } + + /** How full the context is, over the window the harness reports. */ + private reportContext(used: number, size: number): void { + if (!(size > 0) || !Number.isFinite(used)) return; + const percentage = Math.max(0, Math.min(100, Math.round((used / size) * 100))); + if (percentage === this.contextPercentage && size === this.contextWindow) return; + this.contextPercentage = percentage; + this.contextWindow = size; + this.ctx.emit({ type: 'info', contextWindow: size, contextPercentage: percentage }); + } + + /** + * One permission ask. The harness names only the tool call, so the card + * comes from that call's own update — which the harness sends before it + * asks — and the choices are the two it offers: it has no "always allow" + * to choose. + */ + private async onPermission(request: RequestPermissionRequest): Promise { + const allow = request.options.find((option) => option.kind === 'allow_once'); + const reject = request.options.find((option) => option.kind === 'reject_once'); + const refuse = (): RequestPermissionResponse => + reject ? { outcome: { outcome: 'selected', optionId: reject.optionId } } : { outcome: { outcome: 'cancelled' } }; + if (this.ended || !allow) return { outcome: { outcome: 'cancelled' } }; + if (this.mode === AUTO_APPROVE_MODE) return { outcome: { outcome: 'selected', optionId: allow.optionId } }; + + const callId = request.toolCall.toolCallId; + const facts = this.calls.get(callId); + const toolName = facts?.name ?? request.toolCall.name ?? request.toolCall.title ?? 'tool'; + const input = facts?.input ?? {}; + const locations = toolLocations(input); + const outcome = await this.ctx.requestPermission({ + requestId: callId, + toolName, + kind: toolKindOf(toolName), + title: toolTitle(toolName, input) || toolName, + ...(locations.length > 0 ? { locations } : {}), + rawInput: input, + options: [PERMISSION_ALLOW, PERMISSION_DENY], + }); + if (outcome.outcome === 'cancelled') return { outcome: { outcome: 'cancelled' } }; + return outcome.optionId === PERMISSION_ALLOW.id ? { outcome: { outcome: 'selected', optionId: allow.optionId } } : refuse(); + } + + private deliver(entry: OutputEntry): void { + this.ctx.emit({ type: 'entries', entries: [entry] }); + } + + private finish(error?: string): void { + if (this.ended) return; + this.ended = true; + this.abandon(); + this.ctx.emit({ type: 'ended', ...(error ? { error } : {}) }); + } + + /** Let go of the harness process this session held. */ + private abandon(): void { + const process_ = this.process; + this.process = undefined; + if (this.nativeId !== undefined) { + process_?.detach(this.nativeId); + this.deps.live.remove(this.nativeId); + } + process_?.release(); + } + + prompt(text: string): void { + const next = this.tail.then( + () => this.runPrompt(text), + () => this.runPrompt(text), + ); + this.tail = next.catch(() => {}); + } + + private async runPrompt(text: string): Promise { + try { + await this.ready; + const sessionId = this.nativeId; + if (this.ended || sessionId === undefined) return; + this.ctx.emit({ type: 'turn', state: 'running' }); + await this.client.request('session/prompt', { sessionId, prompt: [{ type: 'text', text }] }); + this.endTurn(); + } catch (error) { + if (this.ended) return; + this.deliver({ entryType: 'error', text: error instanceof Error ? error.message : String(error), timestamp: now() }); + this.endTurn(); + } + } + + /** The turn is over: the transcript marks it and the phone stops showing + * the agent as working. Every ending is one of these — a cancelled turn + * and a failed one end the turn too. */ + private endTurn(): void { + if (this.ended) return; + this.deliver({ entryType: 'turn_complete', timestamp: now() }); + this.ctx.emit({ type: 'turn', state: 'idle' }); + } + + async interrupt(): Promise { + const sessionId = this.nativeId; + if (sessionId === undefined || this.ended) return; + // Best effort: an already-idle session has nothing to cancel. + try { + this.client.notify('session/cancel', { sessionId }); + } catch { + // The connection is gone; `ended` has already said so. + } + } + + async setOption(option: SessionOption, value: string): Promise { + switch (option) { + case 'mode': + if (!DEEPSEEK_MODES.some((mode) => mode.id === value)) throw new Error(`${DSH_LABEL} has no mode '${value}'`); + this.mode = value; + return; + case 'model': + await this.setConfig(MODEL_CONFIG_ID, this.resolveModel(value) ?? value); + return; + case 'effort': + await this.setConfig(EFFORT_CONFIG_ID, value); + return; + } + } + + async getUsage(): Promise { + // Nothing to ask for: the harness has no subscription usage, and its + // context meter arrives as session info. + return null; + } + + /** + * The session's MCP servers. The harness reads them when it starts, so + * this reports what the running process has: a server configured after it + * started is not in it yet, and a server the harness complained about + * (on stderr — the only place it says so) is the one failure it reports. + */ + async mcpStatus(): Promise { + const state = await this.deps.mcp.list(); + const process_ = this.process; + const failures = process_?.mcpFailures() ?? new Map(); + const configured = this.deps.mcp.version; + const loaded = process_?.configVersion ?? Number.POSITIVE_INFINITY; + const servers: SessionMcpServer[] = state.servers.map((server) => { + const failure = failures.get(server.name); + // The harness's own word first: a server it complained about has no + // tools, whatever the configuration says. Then a configuration this + // process was not started with, which it therefore has not loaded. + const status: McpStatus = !server.enabled + ? 'disabled' + : failure + ? mcpStatusOf('failed') + : process_?.alive !== true || configured > loaded + ? 'pending' + : 'connected'; + return { name: server.name, status, ...(failure ? { error: failure } : {}) }; + }); + return { servers, toggles: false, projectWide: false }; + } + + async toggleMcp(name: string, enabled: boolean): Promise { + void name; + void enabled; + throw new Error( + `${DSH_LABEL} attaches its MCP servers when it starts, so a running session cannot switch one. ` + + 'Change it in the MCP list: the next session uses the new set.', + ); + } + + async end(): Promise { + if (this.ended) return; + const sessionId = this.nativeId; + const process_ = this.process; + this.ended = true; + if (sessionId !== undefined && process_) { + // Closing the session lets the harness cancel its work and flush; the + // conversation stays on disk for a later resume. + await process_.client.request('session/close', { sessionId }).catch(() => {}); + } + this.abandon(); + } +} + +export interface DeepSeekDriverOptions { + /** The runtime that owns the harness processes. */ + runtime: DeepSeekRuntime; + /** `$DSH_HOME` — where the harness's profiles and sessions live. */ + home: string; + /** The MCP manager over that home's profile layer. The runtime is told to + * watch its version, so the process and the manager share one instance. */ + mcp?: DeepSeekMcp; + /** The environment this driver's own probe inherits (the host's). */ + baseEnv?: NodeJS.ProcessEnv; + /** HTTPS client for the credential check. */ + httpGet?: HttpGet; + /** Spawn seam for the plugin commands, for tests. */ + spawnFn?: SpawnFn; + log: (message: string) => void; +} + +export class DeepSeekDriver implements Driver { + readonly mcp: DeepSeekMcp; + readonly plugins: PluginManager; + private unavailable: string | undefined; + private models?: Promise<{ models: ModelEntry[]; defaultModel?: string }>; + /** Sessions by the harness's own ids: a process serves several, and it is + * this map that ends them all when it goes away. */ + private readonly sessions = new Map(); + private readonly live = { + events: (): DeepSeekProcessEvents => ({ + ended: (sessionIds: readonly string[], error: string) => { + for (const sessionId of sessionIds) this.sessions.get(sessionId)?.endFromProcess(error); + }, + }), + add: (sessionId: string, session: DeepSeekSession): void => { + this.sessions.set(sessionId, session); + }, + remove: (sessionId: string): void => { + this.sessions.delete(sessionId); + }, + }; + + private constructor(private readonly options: DeepSeekDriverOptions) { + const profileDir = dshProfileDir(options.home); + this.mcp = options.mcp ?? new DeepSeekMcp({ profileDir, log: options.log }); + this.plugins = new DeepSeekPlugins({ + profileDir, + run: (args) => this.runDsh(args), + log: options.log, + }); + } + + static create(options: DeepSeekDriverOptions): DeepSeekDriver { + const driver = new DeepSeekDriver(options); + // The runtime is fetched as the host starts, like the other agents', so + // the first session (and the model list the phone asks for before it) + // finds it ready instead of waiting on a download. + void options.runtime.prepare(); + return driver; + } + + /** Mark the driver unusable (a path the operator named is not a file). */ + setUnavailable(reason: string): void { + this.unavailable = reason; + } + + info(): AgentInfo { + return { + id: DEEPSEEK_AGENT_ID, + displayName: DSH_LABEL, + modes: DEEPSEEK_MODES, + efforts: DEEPSEEK_EFFORTS, + defaultMode: DEFAULT_MODE, + defaultEffort: DEFAULT_EFFORT, + // What the harness's automation profile carries, and what it does not: + // no slash commands, no background tasks, no subscription usage. Its + // plugins and MCP servers are its own configuration files, which this + // driver reads and writes. + supports: { + models: true, + usage: false, + providers: true, + gsd: true, + interrupt: true, + commands: false, + plugins: true, + mcp: true, + tasks: false, + }, + credentials: [{ id: DEEPSEEK_API_KEY_CREDENTIAL, label: 'DeepSeek API key', envVar: 'DEEPSEEK_API_KEY' }], + ...(this.unavailable ? { unavailableReason: this.unavailable } : {}), + }; + } + + startSession(params: StartSession, ctx: SessionContext): DriverSession { + if (this.unavailable) throw new Error(this.unavailable); + if (params.mode !== undefined && !DEEPSEEK_MODES.some((mode) => mode.id === params.mode)) { + throw new Error(`${DSH_LABEL} has no mode '${params.mode}'`); + } + return new DeepSeekSession(params, ctx, { + runtime: this.options.runtime, + mcp: this.mcp, + baseEnv: this.options.baseEnv ?? process.env, + live: this.live, + }); + } + + /** + * The harness's model catalog, from a short-lived probe session: the option + * state a session starts with is where its catalog lives, and reading it + * needs neither a credential nor a reachable endpoint (it is the profile's + * own, declarative list). Cached once it says something, and asked again + * after a failure or an empty answer — an empty catalog is not a catalog. + */ + listModels(): Promise<{ models: ModelEntry[]; defaultModel?: string }> { + this.models ??= this.probeModels().catch((error: unknown) => { + this.models = undefined; + this.options.log(`[deepseek] could not list models: ${error instanceof Error ? error.message : String(error)}`); + return { models: [] }; + }); + return this.models; + } + + private async probeModels(): Promise<{ models: ModelEntry[]; defaultModel?: string }> { + const env = buildDeepSeekEnv({}, this.options.baseEnv ?? process.env); + const process_ = await this.options.runtime.acquire(env, { ended: () => {} }); + try { + const opened = await process_.client.request('session/new', { cwd: this.options.home, mcpServers: [] }); + const option = (opened.configOptions ?? []).find((entry) => entry.id === MODEL_CONFIG_ID); + const models: ModelEntry[] = modelChoices(option).map((choice) => ({ + id: choice.value, + label: choice.label, + ...(choice.provider ? { provider: choice.provider } : {}), + })); + if (models.length === 0) this.models = undefined; + // The probe's own conversation is disposed of; nothing of it survives + // but an empty session record in the harness's home. + await process_.client.request('session/close', { sessionId: opened.sessionId }).catch(() => {}); + return { + models, + ...(option && option.type === 'select' && option.currentValue ? { defaultModel: option.currentValue } : {}), + }; + } finally { + process_.release(); + } + } + + /** + * Check the DeepSeek API key against the DeepSeek API. With an operator-set + * `DEEPSEEK_BASE_URL` the key belongs to that endpoint instead, whose model + * list this bridge does not know: the check is left to the gateway, and + * nothing is claimed about the key. + */ + async checkCredential(credential: string, value: string): Promise { + if (credential !== DEEPSEEK_API_KEY_CREDENTIAL || !this.options.httpGet) return undefined; + const baseEnv = this.options.baseEnv ?? process.env; + if (baseEnv.DEEPSEEK_BASE_URL?.trim()) return undefined; + try { + const res = await this.options.httpGet('https://api.deepseek.com/models', { authorization: `Bearer ${value}` }); + return res.status !== 401 && res.status !== 403; + } catch { + return undefined; + } + } + + /** One `dsh plugin` invocation, through the same CLI the sessions run. */ + private async runDsh(args: string[]): Promise { + const entry = await this.options.runtime.entryPoint(); + return this.options.spawnFn === undefined + ? runDshPlugin(entry, DSH_PROFILE, args) + : runDshPlugin(entry, DSH_PROFILE, args, this.options.spawnFn); + } + + async shutdown(): Promise { + await this.options.runtime.close(); + } +} diff --git a/packages/agent-host/src/drivers/deepseek/env.ts b/packages/agent-host/src/drivers/deepseek/env.ts new file mode 100644 index 00000000..0feb79df --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/env.ts @@ -0,0 +1,104 @@ +/** + * The DeepSeek Harness child's environment for one spawn: the bridge's stored + * credential and the session's provider binding, turned into the variables + * the harness reads. The returned object carries SECRETS — never log it. + * + * The harness takes its endpoint and key from `DEEPSEEK_BASE_URL` and + * `DEEPSEEK_API_KEY` (its DeepSeek route reads exactly this pair when its own + * plugin config names no endpoint), so a custom provider — a gateway such as + * Claude Code Router, a relay — is the same session shape Claude Code's + * `ANTHROPIC_BASE_URL` is: point the base URL at it and hand it the token. + * Its protocol then decides what the gateway must speak; the default here is + * the DeepSeek messages API, which is what a DeepSeek-compatible relay + * serves. + */ +import { isValidProviderBaseUrl, PROVIDER_BASE_URL_ERROR } from '../../provider'; +import type { ProviderBinding, StartSession } from '../../types'; + +export const DEEPSEEK_API_KEY_CREDENTIAL = 'deepseek_api_key'; +/** The key the harness reads. */ +export const DEEPSEEK_API_KEY_ENV = 'DEEPSEEK_API_KEY'; +/** The endpoint the harness reads; unset means its own public API. */ +export const DEEPSEEK_BASE_URL_ENV = 'DEEPSEEK_BASE_URL'; + +/** + * The environment-name namespace a provider-bound session inherits NOTHING + * from. `DEEPSEEK_BASE_URL` is where a session is routed and + * `DEEPSEEK_API_KEY` is what it authenticates with; both are replaced by the + * provider's. A prefix rather than the two names: the harness is a developer + * preview whose plugin set moves, and a routing or credential variable added + * under its vendor prefix must be dropped by default rather than silently + * honoured. + * + * `DSH_` is deliberately NOT in this list: those name the harness's own home + * and profile layout, which a gateway does not change, and dropping + * `DSH_HOME` would silently move a session's state to `~/.dsh`. + */ +const VENDOR_ENV_PREFIXES = ['DEEPSEEK_'] as const; + +/** The base environment for a session bound to a CUSTOM provider: everything + * inherited except the harness's own endpoint/credential namespace. */ +export function sanitizeDeepSeekBaseEnv(baseEnv: Record): Record { + const env: Record = {}; + for (const [key, value] of Object.entries(baseEnv)) { + if (value === undefined) continue; + const upper = key.toUpperCase(); + if (VENDOR_ENV_PREFIXES.some((prefix) => upper.startsWith(prefix))) continue; + env[key] = value; + } + return env; +} + +function inherited(baseEnv: Record): Record { + const env: Record = {}; + for (const [key, value] of Object.entries(baseEnv)) { + if (value !== undefined) env[key] = value; + } + return env; +} + +/** + * The environment for one spawn. Without a provider: the inherited env plus + * `DEEPSEEK_API_KEY` — the operator's own environment key wins over a stored + * one — and the bridge-level `env` (e.g. `GITHUB_TOKEN`, stored wins). + * + * With a provider: the sanitized base env and the provider's own base URL and + * token. Throws for an insecure base URL or a missing token — the session is + * then refused loudly; falling back to the native key would bill the wrong + * account. + */ +export function buildDeepSeekEnv( + params: Pick, + baseEnv: Record = process.env, +): Record { + const extra = params.env ?? {}; + const provider = params.provider ?? undefined; + if (provider) return providerEnv(provider, extra, baseEnv); + + const env = inherited(baseEnv); + const key = baseEnv[DEEPSEEK_API_KEY_ENV] || params.credentials?.[DEEPSEEK_API_KEY_CREDENTIAL]; + if (key) env[DEEPSEEK_API_KEY_ENV] = key; + Object.assign(env, extra); + return env; +} + +function providerEnv( + provider: ProviderBinding, + extra: Record, + baseEnv: Record, +): Record { + // Checked before the token: this decides whether the token may travel on + // this connection at all. The base URL is not a secret. + if (!isValidProviderBaseUrl(provider.baseUrl)) { + throw new Error( + `provider profile '${provider.id}' has an insecure base URL (${provider.baseUrl}) — ` + + `${PROVIDER_BASE_URL_ERROR}. Its API token would travel in cleartext, so the session is refused.`, + ); + } + if (!provider.authToken) throw new Error(`provider profile '${provider.id}' has no stored auth token`); + const env = sanitizeDeepSeekBaseEnv(baseEnv); + env[DEEPSEEK_BASE_URL_ENV] = provider.baseUrl; + env[DEEPSEEK_API_KEY_ENV] = provider.authToken; + Object.assign(env, extra); + return env; +} diff --git a/packages/agent-host/src/drivers/deepseek/install.ts b/packages/agent-host/src/drivers/deepseek/install.ts new file mode 100644 index 00000000..4c073d9c --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/install.ts @@ -0,0 +1,33 @@ +/** + * Where the DeepSeek Harness runtime comes from when the machine has none: + * `@deepseek-ai/dsh` and its whole dependency closure, installed on demand + * (agentInstall.installPackageTree) at the version and sha512 pnpm-lock.yaml + * pins (src/generated/dshPackages.ts). The release archives and the default + * image ship no part of it — a driver that finds nothing on the machine + * downloads the tree the first time it needs it. + * + * The harness is a pure-JS CLI: nothing runs until every package of that + * closure sits in one `node_modules`, which is what the tree installer + * reproduces. `lib/bin.js` is the CLI's entry point, run with the host's own + * `node`. + */ +import * as path from 'node:path'; +import { installPackageTree, type InstallOptions } from '../../agentInstall'; +import { DSH_PACKAGES } from '../../generated/dshPackages'; + +/** The npm package the harness ships as. */ +export const DSH_PACKAGE = '@deepseek-ai/dsh'; +/** Its CLI, relative to the installed package directory. */ +const DSH_ENTRY = 'lib/bin.js'; +/** How the driver refers to it in progress lines and errors. */ +export const DSH_LABEL = 'DeepSeek Harness'; + +/** The CLI entry point of a tree the installer has laid down. */ +export function dshEntryPoint(treeRoot: string): string { + return path.join(treeRoot, DSH_ENTRY); +} + +/** Install (or find) the harness tree and return its CLI entry point. */ +export async function installDshTree(options: InstallOptions): Promise { + return dshEntryPoint(await installPackageTree(DSH_PACKAGE, DSH_PACKAGES, { ...options, label: DSH_LABEL })); +} diff --git a/packages/agent-host/src/drivers/deepseek/mcp.ts b/packages/agent-host/src/drivers/deepseek/mcp.ts new file mode 100644 index 00000000..5caadf03 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/mcp.ts @@ -0,0 +1,333 @@ +/** + * The DeepSeek Harness's MCP servers: the `dsh-mcp-client` rows a profile's + * own patch layer holds. + * + * The harness reads a profile as an ordered stack of patch layers, and + * `$DSH_HOME/profiles//cordis.patch.yml` is the last of them — the + * user's own layer, the file the harness's own documentation says to edit. + * Rows added there start with the harness, so they are part of the harness's + * configuration rather than of this bridge: any `dsh --profile acp` run gets + * them, and so does the next bridge that runs the same home. + * + * Only a delimited block of that file is this bridge's — everything around + * it, comments included, is read, kept and written back untouched. The block + * is a patch list: one `insert` row per server, and a `disabled` row after + * the ones switched off (a row addressed by id later in the same layer wins). + * + * The servers are attached when the harness starts, in the harness's own + * working directory, and a server that fails to start is logged rather than + * fatal (the harness's log is where the status screen reads it from). A + * session therefore shows them but cannot switch one: switching means + * restarting the harness, which is what happens to the whole home's sessions + * when this file changes and none is running. + * + * ACP could carry the same servers per session instead. That path was not + * taken: the harness fails `session/new` outright when one of them cannot + * start, so a single mistyped server would lock the user out of every + * session, and each session would pay its own connections. + */ +import { mkdir, readFile, rename, writeFile } from 'node:fs/promises'; +import * as path from 'node:path'; +import { load, dump } from 'js-yaml'; +import type { McpManager, McpState } from '../../driver'; +import { serverInfo } from '../../mcp'; +import type { McpAction, McpServerAdd, McpServerInfo } from '../../types'; + +/** The plugin every managed row mounts. */ +const MCP_CLIENT_PLUGIN = '@deepseek-ai/dsh-mcp-client'; +/** Which servers are this bridge's, among the profile's other rows. */ +const ROW_PREFIX = 'codedeck-mcp-'; +const MARKER_BEGIN = '# --- CodeDeck+ MCP servers: managed from the MCP screen; everything outside this block is yours ---'; +const MARKER_END = '# --- end CodeDeck+ MCP servers ---'; + +/** The harness's own rule for a server namespace, so a name this bridge + * writes is one the harness accepts (`mcp____` names follow). */ +const SERVER_NAME = /^[A-Za-z0-9_-]{1,32}$/; + +/** A server as this manager knows it: what the phone shows, and what to write + * back. */ +interface ManagedServer extends McpServerInfo { + /** The row's own configuration, as the harness's plugin takes it. */ + config: Record; +} + +export interface DeepSeekMcpOptions { + /** The profile directory (`$DSH_HOME/profiles/acp`). */ + profileDir: string; + log: (message: string) => void; +} + +/** One patch document of the managed block. */ +type PatchDoc = Record; + +export class DeepSeekMcp implements McpManager { + /** One write at a time: each reads the file, edits, writes it back. */ + private queue: Promise = Promise.resolve(); + /** How many times this manager changed the layer. A harness process records + * it as it starts, so a change made afterwards is configuration that + * process has not loaded — no file timestamp, and no clock, involved. */ + private versions = 0; + + constructor(private readonly options: DeepSeekMcpOptions) {} + + /** How many times the layer has changed since this bridge started. */ + get version(): number { + return this.versions; + } + + list(): Promise { + return this.serial(async () => this.state(await this.servers())); + } + + act(action: McpAction, servers: McpServerAdd[], names: string[]): Promise { + return this.serial(async () => { + const current = await this.servers(); + const next = applyAction(current, action, servers, names); + await this.write(next); + return this.state(next); + }); + } + + private file(): string { + return path.join(this.options.profileDir, 'cordis.patch.yml'); + } + + private serial(work: () => Promise): Promise { + const next = this.queue.then(work, work); + this.queue = next.catch(() => {}); + return next; + } + + private state(servers: ManagedServer[]): McpState { + return { + servers: servers.map(({ config: _config, ...info }) => info).sort((a, b) => a.name.localeCompare(b.name)), + // A server can be switched off without being removed: its row stays, + // with a `disabled` row after it. + toggles: true, + }; + } + + /** The servers in the managed block, in the order they are written. */ + private async servers(): Promise { + const text = await this.read(); + const block = extractBlock(text); + if (block === undefined) return []; + let docs: unknown; + try { + docs = load(block); + } catch (error) { + throw new Error(`${this.file()} has a CodeDeck MCP block that is not valid YAML: ${error instanceof Error ? error.message : String(error)}`); + } + return serversOf(Array.isArray(docs) ? (docs as PatchDoc[]) : []); + } + + private async read(): Promise { + try { + return await readFile(this.file(), 'utf8'); + } catch { + return ''; + } + } + + private async write(servers: ManagedServer[]): Promise { + const text = await this.read(); + const rest = removeBlock(text); + const joined = servers.length === 0 ? restoreEmptyList(rest) : withBlock(rest, renderBlock(servers)); + const content = joined.endsWith('\n') ? joined : `${joined}\n`; + // A change that leaves the layer as it was is not a change: a session + // reads this version to tell a server its harness has from one it has + // not loaded yet. + if (content === text) return; + this.versions++; + const file = this.file(); + await mkdir(path.dirname(file), { recursive: true }); + // Written beside and renamed: a torn write would leave a profile the + // harness cannot read at all. + const temporary = `${file}.codedeck-${process.pid}`; + await writeFile(temporary, content); + await rename(temporary, file); + this.options.log(`[deepseek] MCP servers updated in ${file}`); + } +} + +/** The block's own text, without its markers; `undefined` when there is none. */ +function extractBlock(text: string): string | undefined { + const start = text.indexOf(MARKER_BEGIN); + if (start < 0) return undefined; + const end = text.indexOf(MARKER_END, start); + if (end < 0) return undefined; + return text.slice(start + MARKER_BEGIN.length, end).trim(); +} + +/** `text` with the managed block taken out (markers included). */ +function removeBlock(text: string): string { + const start = text.indexOf(MARKER_BEGIN); + if (start < 0) return text; + const end = text.indexOf(MARKER_END, start); + if (end < 0) return text; + return `${text.slice(0, start)}${text.slice(end + MARKER_END.length)}`.trimEnd() + '\n'; +} + +/** Whether a profile patch layer holds anything but comments and blanks. */ +function isEmptyLayer(text: string): boolean { + for (const line of text.split('\n')) { + const trimmed = line.trim(); + if (trimmed === '' || trimmed.startsWith('#')) continue; + // The profile's initial layer: an empty list, and nothing else. + if (trimmed === '[]' || trimmed === '---') continue; + return false; + } + return true; +} + +/** + * The layer's own rows, then the managed block, as one document. The + * harness's initial layer is an empty list (`[]`) on its own, and an empty + * sequence cannot share a document with a block sequence — nor can a `[]` a + * user left after their own rows — so those lines go. + */ +function withBlock(rest: string, block: string): string { + const head = withoutEmptyList(rest).trimEnd(); + return head === '' ? block : `${head}\n\n${block}`; +} + +/** The layer with no managed block and no rows of ours: the profile's own + * comments and its empty list, which is the shape the harness starts from. */ +function restoreEmptyList(rest: string): string { + if (!isEmptyLayer(rest)) return rest.trimEnd(); + const head = rest + .split('\n') + .filter((line) => line.trim().startsWith('#')) + .join('\n') + .trimEnd(); + return head === '' ? '[]' : `${head}\n[]`; +} + +/** `text` without a line that is an empty-list document (`[]` at the left + * margin; an argument's own `[]` is indented and kept). */ +function withoutEmptyList(text: string): string { + return text + .split('\n') + .filter((line) => line.replace(/\r$/, '') !== '[]') + .join('\n'); +} + +/** The managed block for `servers`, as the patch list the harness loads. */ +function renderBlock(servers: ManagedServer[]): string { + const docs: PatchDoc[] = []; + for (const server of servers) { + docs.push({ insert: [{ id: `${ROW_PREFIX}${server.name}`, name: MCP_CLIENT_PLUGIN, config: server.config }] }); + if (!server.enabled) docs.push({ id: `${ROW_PREFIX}${server.name}`, disabled: true }); + } + const body = dump(docs, { lineWidth: -1, noRefs: true, quotingType: "'" }).trimEnd(); + return `${MARKER_BEGIN}\n${body}\n${MARKER_END}`; +} + +/** The servers a managed block describes, the last row per id winning. */ +function serversOf(docs: PatchDoc[]): ManagedServer[] { + const byName = new Map(); + for (const doc of docs) { + const insert = doc.insert; + if (Array.isArray(insert)) { + for (const row of insert as PatchDoc[]) { + if (row.name !== MCP_CLIENT_PLUGIN) continue; + const config = record(row.config); + const name = typeof config.serverName === 'string' ? config.serverName : undefined; + if (!name) continue; + byName.set(name, { ...infoOf(name, config), config, enabled: true }); + } + continue; + } + const id = typeof doc.id === 'string' ? doc.id : ''; + if (doc.disabled === true && id.startsWith(ROW_PREFIX)) { + const server = byName.get(id.slice(ROW_PREFIX.length)); + if (server) server.enabled = false; + } + } + return [...byName.values()]; +} + +/** A server's row, as the phone shows it — never a secret value. */ +function infoOf(name: string, config: Record): McpServerInfo { + const keys = (value: unknown) => (Object.keys(record(value)).length > 0 ? Object.keys(record(value)) : []); + if (config.transport === 'stdio') { + return serverInfo({ + name, + transport: 'stdio', + command: typeof config.command === 'string' ? config.command : '', + envKeys: keys(config.env), + enabled: true, + }); + } + return serverInfo({ + name, + transport: 'http', + url: typeof config.url === 'string' ? config.url : '', + headerKeys: keys(config.headers), + enabled: true, + }); +} + +/** The managed rows for one added server, as the harness's plugin takes it. */ +function serverConfig(add: McpServerAdd): Record { + const setup = add.setup; + const name = add.name.trim(); + if (!SERVER_NAME.test(name)) { + throw new Error( + `'${add.name}' is not a usable MCP server name for the DeepSeek Harness: it takes 1–32 letters, digits, ` + + 'underscores or hyphens (the name becomes part of every tool the server contributes).', + ); + } + const common = { serverName: name, failOnStartupError: true }; + if (setup.type === 'stdio') { + return { + ...common, + transport: 'stdio', + command: setup.command, + ...(setup.args?.length ? { args: [...setup.args] } : {}), + ...(setup.env && Object.keys(setup.env).length > 0 ? { env: { ...setup.env } } : {}), + }; + } + if (setup.type === 'sse') { + throw new Error('The DeepSeek Harness reaches MCP servers over stdio or streamable HTTP, not SSE.'); + } + return { + ...common, + transport: 'streamable-http', + url: setup.url, + ...(setup.headers && Object.keys(setup.headers).length > 0 ? { headers: { ...setup.headers } } : {}), + }; +} + +/** The list after one change. Unknown names are refused with the reason. */ +function applyAction( + current: ManagedServer[], + action: McpAction, + servers: McpServerAdd[], + names: string[], +): ManagedServer[] { + if (action === 'add') { + const next = [...current]; + for (const add of servers) { + const config = serverConfig(add); + const name = add.name.trim(); + const at = next.findIndex((server) => server.name === name); + const entry: ManagedServer = { ...infoOf(name, config), config, enabled: true }; + // Adding a server that is already there replaces it, keeping whatever + // the user had switched it to. + if (at >= 0) entry.enabled = next[at]!.enabled; + if (at >= 0) next[at] = entry; + else next.push(entry); + } + return next; + } + const wanted = new Set(names); + const missing = names.find((name) => !current.some((server) => server.name === name)); + if (missing) throw new Error(`The DeepSeek Harness has no MCP server named '${missing}'.`); + if (action === 'remove') return current.filter((server) => !wanted.has(server.name)); + return current.map((server) => (wanted.has(server.name) ? { ...server, enabled: action === 'enable' } : server)); +} + +function record(value: unknown): Record { + return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record) : {}; +} diff --git a/packages/agent-host/src/drivers/deepseek/plugins.ts b/packages/agent-host/src/drivers/deepseek/plugins.ts new file mode 100644 index 00000000..b817aee3 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/plugins.ts @@ -0,0 +1,266 @@ +/** + * The DeepSeek Harness's plugins: npm packages installed into a profile and + * mounted as patch layers. + * + * A profile is a directory with a `package.json` and a `cordis.yml`; its + * `dsh.profile.bundles` list is the ordered stack of layers it composes, and + * `dsh plugin --profile ` forwards to pnpm in that + * directory. Installing a package that declares a `dsh.bundle` adds it to the + * bundles list — it becomes a layer from then on. A package that declares + * none is installed as a plain dependency (the harness says so itself), which + * is why this manager shows what is installed and which of it is a layer. + * + * There are no marketplaces: a plugin is an npm package. Switching one off + * means taking it out of the bundles list, which is exactly what the list + * means — the package stays installed, so it can be switched back on. The + * profile's own composition (the shared core and the ACP application) is + * never touched: switching it off would leave a harness that cannot run. + * + * The commands run through the harness's own CLI, so its pnpm, its locks and + * its version-compatibility gate are the ones that apply, and a failure is + * whatever it printed. + */ +import { spawn } from 'node:child_process'; +import { mkdir, readFile, rename, writeFile } from 'node:fs/promises'; +import * as path from 'node:path'; +import type { PluginManager, PluginState } from '../../driver'; +import type { InstalledPlugin, PluginAction } from '../../types'; +import { dshCommand, type SpawnFn } from './runtime'; + +/** The layers a profile composes without any plugin: the shared core and the + * ACP application. */ +const SHIPPED_BUNDLES = ['@deepseek-ai/dsh-base', '@deepseek-ai/dsh-acp-app']; + +/** How long one `dsh plugin` run may take (a pnpm install, or a registry + * lookup before it). */ +const RUN_TIMEOUT_MS = 300_000; + +/** An npm package name, optionally versioned — the shape pnpm's `add` takes. + * Deliberately plain: a version may be a number (`1.2.3`) or a tag + * (`latest`), not a range or anything a shell would read as syntax. */ +const PACKAGE_SPEC = /^(@[a-z0-9][\w.-]*\/)?[a-z0-9][\w.-]*(@[\w.-]+)?$/i; + +export interface DshRun { + code: number; + stdout: string; + stderr: string; +} + +/** Run `dsh plugin --profile ` and answer with its output. */ +export function runDshPlugin( + entry: string, + profile: string, + args: string[], + spawnFn: SpawnFn = spawn, +): Promise { + const command = dshCommand(entry, ['plugin', '--profile', profile, ...args]); + return new Promise((resolve, reject) => { + const child = spawnFn(command.command, command.args, { + stdio: ['ignore', 'pipe', 'pipe'], + windowsHide: true, + }); + let stdout = ''; + let stderr = ''; + const timer = setTimeout(() => { + child.kill('SIGKILL'); + reject(new Error(`the harness's plugin command did not finish within ${RUN_TIMEOUT_MS / 1000}s`)); + }, RUN_TIMEOUT_MS); + timer.unref?.(); + child.stdout?.on('data', (chunk: Buffer) => { + stdout += chunk.toString(); + }); + child.stderr?.on('data', (chunk: Buffer) => { + stderr += chunk.toString(); + }); + child.on('error', (error) => { + clearTimeout(timer); + reject(error); + }); + child.on('close', (code) => { + clearTimeout(timer); + resolve({ code: code ?? -1, stdout, stderr }); + }); + }); +} + +export interface DeepSeekPluginsOptions { + /** The profile directory (`$DSH_HOME/profiles/acp`). */ + profileDir: string; + /** Run one `dsh plugin` invocation (runDshPlugin, bound to the runtime's + * entry point by the driver). */ + run: (args: string[]) => Promise; + log: (message: string) => void; +} + +/** A profile's `package.json`, as far as a plugin manager cares. */ +interface Manifest { + dependencies?: Record; + dsh?: { profile?: { bundles?: string[] } }; +} + +export class DeepSeekPlugins implements PluginManager { + private message: string | undefined; + /** One change at a time: each may rewrite the manifest. */ + private queue: Promise = Promise.resolve(); + + constructor(private readonly options: DeepSeekPluginsOptions) {} + + list(available: boolean): Promise { + void available; // No marketplaces to ask about. + return this.serial(async () => this.state(await this.manifest(), undefined)); + } + + act(action: PluginAction, target: string): Promise { + return this.serial(async () => { + if (action === 'add-marketplace' || action === 'remove-marketplace' || action === 'update-marketplace') { + throw new Error('The DeepSeek Harness installs plugins from npm by package name; it has no plugin marketplaces.'); + } + if (action === 'install' && !PACKAGE_SPEC.test(target)) { + throw new Error(`'${target}' is not a package name — give an npm package, optionally with a version ('name@1.2.3').`); + } + const manifest = await this.manifest(); + const bundles = manifest.dsh?.profile?.bundles ?? []; + const dependencies = manifest.dependencies ?? {}; + + if (action === 'enable' || action === 'disable') { + const next = await this.setBundle(manifest, bundles, action, target, dependencies); + return this.state(next, action === 'enable' ? `Enabled ${target}.` : `Disabled ${target}.`); + } + + // The profile's own composition first: it is not in its dependency list + // (the CLI keeps it in the bundles list), and the reason matters more + // than the lookup. + if (action === 'install' && SHIPPED_BUNDLES.includes(target)) { + throw new Error(`${target} is part of the profile's own composition; it is already installed.`); + } + if (action === 'uninstall' && SHIPPED_BUNDLES.includes(target)) { + throw new Error( + `${target} is part of the profile's own composition — the harness does not run without it, so it is not removed from here.`, + ); + } + const installed = Object.prototype.hasOwnProperty.call(dependencies, target); + if (action !== 'install' && !installed) throw new Error(`The DeepSeek Harness profile has no plugin '${target}'.`); + const args = action === 'install' ? ['add', target] : action === 'uninstall' ? ['remove', target] : ['update', target]; + const run = await this.options.run(args); + const output = lastLines(`${run.stdout}\n${run.stderr}`); + if (run.code !== 0) throw new Error(`The harness refused the plugin command: ${output || `exit code ${run.code}`}`); + this.options.log(`[deepseek] dsh plugin ${args.join(' ')}: ${output}`); + return this.state(await this.manifest(), output); + }); + } + + /** Switch one bundle on or off by editing the profile's layer list — the + * list dsh itself keeps and the profile's `cordis.yml` points at. */ + private async setBundle( + manifest: Manifest, + bundles: string[], + action: 'enable' | 'disable', + target: string, + dependencies: Record, + ): Promise { + if (SHIPPED_BUNDLES.includes(target)) { + throw new Error(`${target} is part of the profile's own composition and cannot be switched off.`); + } + const present = bundles.includes(target); + if (action === 'enable' && present) return manifest; + if (action === 'disable' && !present) return manifest; + if (action === 'enable') { + if (!Object.prototype.hasOwnProperty.call(dependencies, target)) { + throw new Error(`The DeepSeek Harness profile has no plugin '${target}' — install it first.`); + } + if (!(await this.declaresBundle(target))) { + throw new Error( + `${target} declares no dsh.bundle, so it cannot be a profile layer — the harness installed it as a plain ` + + 'dependency. Plugins that add a layer are packages whose own manifest declares one.', + ); + } + } + // The list is an ordered stack: a re-enabled plugin goes last, after + // everything already composed. + const next = action === 'enable' ? [...bundles, target] : bundles.filter((name) => name !== target); + const updated: Manifest = { ...manifest, dsh: { ...manifest.dsh, profile: { ...manifest.dsh?.profile, bundles: next } } }; + await this.writeManifest(updated); + return updated; + } + + /** Whether a package in the profile's own node_modules declares a bundle + * (i.e. it ships a patch layer rather than a plain module). */ + private async declaresBundle(name: string): Promise { + try { + const text = await readFile(path.join(this.options.profileDir, 'node_modules', ...name.split('/'), 'package.json'), 'utf8'); + const manifest = JSON.parse(text) as { dsh?: { bundle?: unknown } }; + return typeof manifest.dsh?.bundle === 'object' && manifest.dsh.bundle !== null; + } catch { + return false; + } + } + + private serial(work: () => Promise): Promise { + const next = this.queue.then(work, work); + this.queue = next.catch(() => {}); + return next; + } + + private async manifest(): Promise { + try { + const text = await readFile(this.manifestPath(), 'utf8'); + const parsed: unknown = JSON.parse(text); + return typeof parsed === 'object' && parsed !== null ? (parsed as Manifest) : {}; + } catch { + // A profile nobody has initialized yet has no manifest: it composes its + // own bundles and nothing else. + return {}; + } + } + + private manifestPath(): string { + return path.join(this.options.profileDir, 'package.json'); + } + + private async writeManifest(manifest: Manifest): Promise { + const file = this.manifestPath(); + await mkdir(path.dirname(file), { recursive: true }); + const temporary = `${file}.codedeck-${process.pid}`; + await writeFile(temporary, `${JSON.stringify(manifest, null, 2)}\n`); + await rename(temporary, file); + this.options.log(`[deepseek] profile layers updated in ${file}`); + } + + private async state(manifest: Manifest, message: string | undefined): Promise { + const bundles = manifest.dsh?.profile?.bundles ?? []; + const dependencies = manifest.dependencies ?? {}; + const names = [...new Set([...bundles, ...Object.keys(dependencies)])].sort(); + const installed: InstalledPlugin[] = []; + for (const name of names) { + installed.push({ + id: name, + name, + version: await this.versionOf(name), + enabled: bundles.includes(name), + }); + } + if (message !== undefined) this.message = message; + return { installed, toggles: true, ...(this.message !== undefined ? { message: this.message } : {}) }; + } + + /** The version the profile actually has installed, when it has one. */ + private async versionOf(name: string): Promise { + try { + const text = await readFile(path.join(this.options.profileDir, 'node_modules', ...name.split('/'), 'package.json'), 'utf8'); + const manifest = JSON.parse(text) as { version?: unknown }; + return typeof manifest.version === 'string' ? manifest.version : undefined; + } catch { + return undefined; + } + } +} + +/** The last few non-empty lines of a command's output — what says what + * happened, rather than a whole pnpm progress log. */ +function lastLines(output: string, count = 3): string { + const lines = output + .split('\n') + .map((line) => line.trimEnd()) + .filter((line) => line.trim() !== ''); + return lines.slice(-count).join('\n'); +} diff --git a/packages/agent-host/src/drivers/deepseek/runtime.ts b/packages/agent-host/src/drivers/deepseek/runtime.ts new file mode 100644 index 00000000..817d2547 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/runtime.ts @@ -0,0 +1,456 @@ +/** + * The `dsh --profile acp` process behind the driver: where its entry point + * comes from, the environment it runs in, and the ACP connection to it. + * + * One process serves every session started in the SAME environment. That is + * ACP's own model — a session is an id inside one connection — and it is what + * makes several sessions of one bridge share one harness boot. An environment + * is the unit because a session's provider binding is: a session bound to a + * gateway needs a base URL and a token the native session must not have, so a + * binding change means a different process rather than one connection + * carrying two conflicting sets of credentials. Processes are reference- + * counted by their sessions and closed once the last one lets go — after a + * grace period, so a bridge restart does not pay a fresh harness boot per + * session — and always on shutdown. + * + * The harness's own state — profiles, sessions, credentials — lives under + * `$DSH_HOME`, the one variable every environment shares: the conversation a + * session resumes is on disk, not in the process. + * + * A process hands each of its sessions its own messages: a session attaches + * before it prompts, and detaches as it ends. A message for a session nobody + * has attached yet is dropped — the harness answers `session/new` before it + * has anything to say about it. + */ +import { spawn, type ChildProcess } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import * as path from 'node:path'; +import { StringDecoder } from 'node:string_decoder'; +import type { + InitializeResponse, + RequestPermissionRequest, + RequestPermissionResponse, + SessionNotification, +} from '@agentclientprotocol/sdk'; +import { agentCacheDir } from '../../agentInstall'; +import { isFile } from '../../executable'; +import { AcpClient, INITIALIZE_TIMEOUT_MS } from './acp'; +import { DSH_LABEL } from './install'; + +/** The ACP profile the driver runs: the automation surface, ACP on stdio. */ +export const DSH_PROFILE = 'acp'; +/** The ACP revision this client speaks; the harness answers with its own. */ +const ACP_PROTOCOL_VERSION = 1; + +/** How the harness reports one MCP server's trouble on stderr, e.g. + * `mcp-client(demo): ...`. */ +const MCP_FAILURE = /mcp-client\(([^)]+)\)/; + +/** Injectable spawn seam for tests. */ +export type SpawnFn = typeof spawn; + +/** Milliseconds a process stays up after its last session ends. */ +const IDLE_CLOSE_MS = 120_000; +/** Grace period between SIGTERM and SIGKILL. */ +const CLOSE_GRACE_MS = 5_000; + +/** What a session wants from the connection it shares. */ +export interface DeepSeekSessionHandler { + /** One `session/update` notification bound for this session. */ + update(notification: SessionNotification): void; + /** The harness is asking the user to allow or refuse a tool call. */ + permission(request: RequestPermissionRequest): Promise; +} + +/** What the driver is told about a process, whichever sessions it serves. */ +export interface DeepSeekProcessEvents { + /** The process is gone: every session it served has ended. */ + ended(sessionIds: readonly string[], error: string): void; +} + +/** One live harness process. */ +export interface DeepSeekProcess { + readonly client: AcpClient; + /** What the harness said it implements, from `initialize`. */ + readonly capabilities: NonNullable; + readonly pid: number | undefined; + /** The driver's configuration version as it was when this process + * started: a change since is configuration this process has not loaded. */ + readonly configVersion: number; + /** MCP servers the harness has complained about since it started, by name + * — the one failure signal ACP does not carry. */ + mcpFailures(): ReadonlyMap; + /** Whether the process can still serve a session. */ + readonly alive: boolean; + /** Take the messages of one session. */ + attach(sessionId: string, handler: DeepSeekSessionHandler): void; + /** Stop taking them (the session is over). */ + detach(sessionId: string): void; + /** Let go of this process: the runtime closes it once it was the last. */ + release(): void; +} + +export interface DeepSeekRuntimeOptions { + /** An operator-provided CLI entry point (a `dsh` they installed and want + * used, `CODEDECK_DEEPSEEK_PATH`); wins over the installed tree. */ + dshPath?: string; + /** `$DSH_HOME` — the harness's state root. */ + home: string; + cacheDir: string; + registry?: string; + log: (message: string) => void; + /** Installs the runtime tree (install.ts). */ + installDsh: (options: { cacheDir: string; registry?: string; log: (message: string) => void }) => Promise; + /** Spawn seam for tests. */ + spawnFn?: SpawnFn; + /** A counter that changes when the configuration a process loads + * changes, read at each spawn. The runtime does not know what that + * configuration is; the driver that owns it does. */ + configVersion?: () => number; + /** How long a process outlives its last session (0 to close at once). */ + idleCloseMs?: number; +} + +/** One environment's process, with the sessions using it. */ +interface Context { + readonly key: string; + /** Settles with the live process, or rejects when it could not start. */ + opened: Promise; + /** Sessions that have acquired and not yet released it. */ + sessions: number; + /** Every session let go and the process is on its way out: a new session + * needs a new one. */ + closing: boolean; + /** The idle close waiting to happen. */ + timer?: NodeJS.Timeout; + /** The process, once it is up. */ + live?: HarnessProcess; +} + +/** `$DSH_HOME`: the operator's override, else a `dsh` beside the installed + * agent binaries (the bridge passes its own home, so this follows it). */ +export function dshHomeDir(env: NodeJS.ProcessEnv = process.env): string { + return env.CODEDECK_DEEPSEEK_HOME?.trim() || path.join(path.dirname(agentCacheDir(env)), 'dsh'); +} + +/** The harness's profile directory, where its own configuration lives. */ +export function dshProfileDir(home: string, profile: string = DSH_PROFILE): string { + return path.join(home, 'profiles', profile); +} + +/** + * How to run the harness's CLI: an operator's own entry point may be a + * directory's `bin.js` (this host runs it with its own node) or an executable + * of their own, which is run as it stands. Never through a shell: the + * arguments a session contributes are never shell syntax. + */ +export function dshCommand(entry: string, args: string[]): { command: string; args: string[] } { + return /\.[cm]?js$/i.test(entry) ? { command: process.execPath, args: [entry, ...args] } : { command: entry, args }; +} + +/** The identity of one environment: same variables, same process. The hash is + * never logged — the environment carries credentials. */ +function envKeyOf(env: Record): string { + const sorted = Object.keys(env) + .sort() + .map((key) => [key, env[key]]); + return createHash('sha256').update(JSON.stringify(sorted)).digest('hex').slice(0, 32); +} + +/** One spawned child, wrapped as the ACP connection the driver uses. */ +class HarnessProcess implements DeepSeekProcess { + /** What the harness answered `initialize` with; filled in by the runtime + * before the process is handed to a session. */ + capabilities: NonNullable = {}; + readonly configVersion: number; + private readonly handlers = new Map(); + private readonly failures = new Map(); + private readonly decoder = new StringDecoder('utf8'); + private stderrBuffer = ''; + private gone = false; + + constructor( + private readonly child: ChildProcess, + readonly client: AcpClient, + configVersion: number, + private readonly hooks: { + log: (message: string) => void; + gone: (process_: HarnessProcess) => void; + release: (process_: HarnessProcess) => void; + ended: (sessionIds: readonly string[], error: string) => void; + }, + ) { + this.configVersion = configVersion; + this.client.on('session/update', (notification) => { + const handler = this.handlers.get(notification.sessionId); + if (handler) handler.update(notification); + else hooks.log(`[deepseek] dropped an update for unknown session ${notification.sessionId}`); + }); + this.client.onRequest('session/request_permission', async (request): Promise => { + const handler = this.handlers.get(request.sessionId); + if (!handler) { + // Nobody is waiting on this ask: refusing is the only safe answer to + // a tool call whose session is gone. + return { outcome: { outcome: 'cancelled' } }; + } + return handler.permission(request); + }); + + // The harness logs its own diagnostics on stderr (ACP owns stdout). A + // failed MCP server is only visible there, so those lines are read as a + // status signal as well as passed to the host's log. + child.stderr?.on('data', (chunk: Buffer) => this.readStderr(chunk)); + child.on('error', (error) => { + hooks.log(`[deepseek] could not start the harness: ${error.message}`); + this.client.finish({ error: error.message }); + }); + child.on('exit', (code, signal) => { + this.client.finish({ error: `the DeepSeek Harness process exited (${signal ? `signal ${signal}` : `code ${code ?? '?'}`})` }); + }); + void this.client.closed.then((closed) => { + if (this.gone) return; + this.gone = true; + const sessionIds = [...this.handlers.keys()]; + this.handlers.clear(); + hooks.gone(this); + const error = closed.error ?? 'the DeepSeek Harness process was closed'; + hooks.log(`[deepseek] the harness process is gone: ${error}`); + hooks.ended(sessionIds, error); + }); + } + + get pid(): number | undefined { + return this.child.pid; + } + + get alive(): boolean { + return !this.gone && this.client.isOpen; + } + + mcpFailures(): ReadonlyMap { + return this.failures; + } + + attach(sessionId: string, handler: DeepSeekSessionHandler): void { + this.handlers.set(sessionId, handler); + } + + detach(sessionId: string): void { + this.handlers.delete(sessionId); + } + + release(): void { + this.hooks.release(this); + } + + /** A clean shutdown: SIGTERM, then SIGKILL if the harness does not go. */ + close(): Promise { + this.client.finish({ error: 'the agent host is shutting down' }); + return new Promise((resolve) => { + if (this.child.exitCode !== null || this.child.signalCode !== null) { + resolve(); + return; + } + const kill = setTimeout(() => this.child.kill('SIGKILL'), CLOSE_GRACE_MS); + kill.unref?.(); + this.child.once('exit', () => { + clearTimeout(kill); + resolve(); + }); + this.child.kill('SIGTERM'); + }); + } + + private readStderr(chunk: Buffer): void { + this.stderrBuffer += this.decoder.write(chunk); + for (;;) { + const end = this.stderrBuffer.indexOf('\n'); + if (end < 0) return; + const line = this.stderrBuffer.slice(0, end).replace(/\r$/, ''); + this.stderrBuffer = this.stderrBuffer.slice(end + 1); + if (line.trim() === '') continue; + this.hooks.log(`[deepseek] ${line}`); + const failure = MCP_FAILURE.exec(line); + if (failure?.[1] !== undefined) this.failures.set(failure[1], line); + } + } +} + +export class DeepSeekRuntime { + private readonly contexts = new Map(); + private readonly log: (message: string) => void; + private entry: Promise | null = null; + private stopping = false; + + constructor(private readonly options: DeepSeekRuntimeOptions) { + this.log = options.log; + } + + /** The connection for one session's environment, started on first use. */ + async acquire(env: Record, events: DeepSeekProcessEvents): Promise { + if (this.stopping) throw new Error('the agent host is shutting down'); + const key = envKeyOf(env); + const context = this.open(key, env, events); + context.sessions++; + try { + return await context.opened; + } catch (error) { + // A start that failed leaves nothing behind: the next session retries. + context.sessions--; + if (context.sessions <= 0) this.forget(key, context); + throw error; + } + } + + /** + * Resolve the runtime now — installing it when the machine has none — so a + * session that comes later does not wait for the download. A failure is + * only logged: the next session asks again, and reports it then. + */ + async prepare(): Promise { + try { + await this.entryPoint(); + } catch (error) { + this.log(`[deepseek] the DeepSeek Harness runtime is not ready yet: ${error instanceof Error ? error.message : String(error)}`); + } + } + + /** Close every process. Called on host shutdown. */ + async close(): Promise { + this.stopping = true; + const contexts = [...this.contexts.values()]; + this.contexts.clear(); + await Promise.all( + contexts.map(async (context) => { + context.closing = true; + if (context.timer) clearTimeout(context.timer); + try { + await (await context.opened).close(); + } catch { + // A start that failed has nothing to close. + } + }), + ); + this.entry = null; + } + + /** The context for one key: the live one while it can still serve, else a + * fresh process. */ + private open(key: string, env: Record, events: DeepSeekProcessEvents): Context { + const existing = this.contexts.get(key); + if (existing && !existing.closing && (existing.live === undefined || existing.live.alive)) { + if (existing.timer) { + clearTimeout(existing.timer); + existing.timer = undefined; + } + return existing; + } + const context: Context = { key, opened: undefined as never, sessions: 0, closing: false }; + this.contexts.set(key, context); + context.opened = this.spawn(context, env, events); + return context; + } + + private async spawn(context: Context, env: Record, events: DeepSeekProcessEvents): Promise { + const entry = await this.entryPoint(); + // The harness's state root is the driver's to set, never the session's: + // a session that moved it would lose the conversation it is resuming. + const command = dshCommand(entry, ['--profile', DSH_PROFILE]); + const child = (this.options.spawnFn ?? spawn)(command.command, command.args, { + env: { ...env, DSH_HOME: this.options.home }, + stdio: ['pipe', 'pipe', 'pipe'], + windowsHide: true, + }); + const process_ = new HarnessProcess( + child, + new AcpClient({ stdin: child.stdin!, stdout: child.stdout!, log: this.log }), + this.options.configVersion?.() ?? 0, + { + log: this.log, + gone: (gone) => this.forget(context.key, context, gone), + release: (released) => this.release(context, released), + ended: (sessionIds, error) => events.ended(sessionIds, error), + }, + ); + // The connection is initialized before any session uses it: the harness + // answers with what it implements, and a profile that cannot boot fails + // here rather than on the first prompt. + try { + const initialized = await process_.client.request( + 'initialize', + { protocolVersion: ACP_PROTOCOL_VERSION, clientCapabilities: {} }, + { timeoutMs: INITIALIZE_TIMEOUT_MS }, + ); + process_.capabilities = initialized.agentCapabilities ?? {}; + } catch (error) { + process_.client.finish({ error: 'the harness did not initialize' }); + await process_.close(); + throw error instanceof Error ? error : new Error(String(error)); + } + if (this.stopping || context.closing) { + await process_.close(); + throw new Error('the agent host is shutting down'); + } + context.live = process_; + this.log(`[deepseek] started ${DSH_LABEL} (pid ${child.pid ?? '?'}, profile ${DSH_PROFILE})`); + return process_; + } + + /** The CLI entry point: the operator's own, else the installed tree. */ + entryPoint(): Promise { + if (this.options.dshPath) { + const explicit = this.options.dshPath; + if (!isFile(explicit)) return Promise.reject(new Error(`CODEDECK_DEEPSEEK_PATH points at ${explicit}, which is not a file`)); + return Promise.resolve(explicit); + } + this.entry ??= this.options + .installDsh({ + cacheDir: this.options.cacheDir, + ...(this.options.registry !== undefined ? { registry: this.options.registry } : {}), + log: this.log, + }) + .catch((error: unknown) => { + // A download that failed is attempted again by the next session + // rather than remembered as this driver's permanent state. + this.entry = null; + throw error; + }); + return this.entry; + } + + /** A process went away: it is no longer this environment's process, and + * the next session starts a new one. */ + private forget(key: string, context: Context, process_?: HarnessProcess): void { + const current = this.contexts.get(key); + if (current !== context) return; + if (process_ && current.live && current.live !== process_) return; + if (current.timer) clearTimeout(current.timer); + this.contexts.delete(key); + } + + /** One session let go: close the process once nobody is using it, after a + * grace period so a bridge restart does not pay a boot per session. */ + private async release(context: Context, process_: HarnessProcess): Promise { + context.sessions = Math.max(0, context.sessions - 1); + if (context.sessions > 0) return; + const idle = this.options.idleCloseMs ?? IDLE_CLOSE_MS; + if (idle > 0 && !this.stopping) { + context.timer = setTimeout(() => void this.closeIdle(context), idle); + context.timer.unref?.(); + return; + } + context.closing = true; + this.forget(context.key, context); + await process_.close(); + } + + private async closeIdle(context: Context): Promise { + context.timer = undefined; + // A session that arrived while the timer ran keeps the process. + if (context.sessions > 0 || this.contexts.get(context.key) !== context) return; + context.closing = true; + this.forget(context.key, context); + this.log('[deepseek] closing the idle harness process'); + await context.live?.close(); + } +} diff --git a/packages/agent-host/src/main.ts b/packages/agent-host/src/main.ts index 7d90f65e..df1a099a 100644 --- a/packages/agent-host/src/main.ts +++ b/packages/agent-host/src/main.ts @@ -6,12 +6,18 @@ * * Configuration is the environment the bridge passes down: * CODEDECK_AGENT_HOST_DRIVERS comma-separated drivers to load - * (default `claude-code,opencode`; `fake` for tests) + * (default `claude-code,opencode,deepseek-harness`; + * `fake` for tests) * CODEDECK_CLAUDE_PATH the `claude` executable * CODEDECK_TEST_MODE=1 Claude Code sessions answer canned /test-* commands * CODEDECK_OPENCODE_SERVER_URL an OpenCode server to use * CODEDECK_OPENCODE_AUTO_START=1, CODEDECK_OPENCODE_PATH, CODEDECK_OPENCODE_PORT * spawn and manage an OpenCode server instead + * CODEDECK_DEEPSEEK_PATH the DeepSeek Harness CLI to run (its + * `lib/bin.js`, or an executable of your own); + * unset = the runtime this build pins + * CODEDECK_DEEPSEEK_HOME `$DSH_HOME`, the harness's state root + * (the bridge passes `/dsh`) * CODEDECK_AGENT_CACHE where agent binaries installed on demand live * (the bridge passes `/agents`; `bin/` * in it links each one under a stable name) @@ -25,11 +31,16 @@ import { ClaudeDriver } from './drivers/claude/driver'; import { RealSdkFacade, resolveClaudeExecutable } from './drivers/claude/facade'; import { bundledClaudeExecutable, claudeBinary } from './drivers/claude/install'; import { TestModeSdkFacade } from './drivers/claude/testModeFacade'; +import { DeepSeekDriver } from './drivers/deepseek/driver'; +import { installDshTree } from './drivers/deepseek/install'; +import { DeepSeekMcp } from './drivers/deepseek/mcp'; +import { DeepSeekRuntime, dshHomeDir, dshProfileDir } from './drivers/deepseek/runtime'; import { FakeDriver } from './drivers/fake'; import { OpenCodeDriver } from './drivers/opencode/driver'; import { openCodeBinary } from './drivers/opencode/install'; +import { isFile } from './executable'; import { AgentHost, type HostIo } from './host'; -import { httpPost } from './net'; +import { httpGet, httpPost } from './net'; // stdout carries protocol frames only; a stray console.log from any library // would corrupt the stream, so every console method writes to stderr. @@ -45,7 +56,7 @@ process.on('uncaughtException', (err) => log(`[agent-host] uncaught exception: $ process.on('unhandledRejection', (err) => log(`[agent-host] unhandled rejection: ${err instanceof Error ? err.stack : String(err)}`)); async function loadDrivers(env: NodeJS.ProcessEnv): Promise { - const names = (env.CODEDECK_AGENT_HOST_DRIVERS ?? 'claude-code,opencode') + const names = (env.CODEDECK_AGENT_HOST_DRIVERS ?? 'claude-code,opencode,deepseek-harness') .split(',') .map((n) => n.trim()) .filter(Boolean); @@ -92,6 +103,39 @@ async function loadDrivers(env: NodeJS.ProcessEnv): Promise { ); break; } + case 'deepseek-harness': { + const home = dshHomeDir(lookupEnv); + const dshPath = env.CODEDECK_DEEPSEEK_PATH?.trim(); + // The MCP servers live in this profile layer, and a harness process + // is told the layer's version as it starts: the same manager serves + // both, so a change after a process started is configuration it has + // not loaded. + const mcp = new DeepSeekMcp({ profileDir: dshProfileDir(home), log }); + const driver = DeepSeekDriver.create({ + runtime: new DeepSeekRuntime({ + // An explicit path is the operator's own harness; without one the + // pinned tree is installed on demand, at the version and sha512 + // pnpm-lock.yaml holds. + ...(dshPath ? { dshPath } : {}), + home, + cacheDir, + registry: registryUrl(env), + installDsh: installDshTree, + configVersion: () => mcp.version, + log, + }), + home, + mcp, + baseEnv: env, + httpGet, + log, + }); + if (dshPath && !isFile(dshPath)) { + driver.setUnavailable(`CODEDECK_DEEPSEEK_PATH points at ${dshPath}, which is not a file.`); + } + drivers.push(driver); + break; + } case 'fake': drivers.push(new FakeDriver()); break; diff --git a/packages/agent-host/src/net.ts b/packages/agent-host/src/net.ts index 69a9dd57..497557de 100644 --- a/packages/agent-host/src/net.ts +++ b/packages/agent-host/src/net.ts @@ -14,3 +14,10 @@ export const httpPost: HttpPost = async (url, headers, body) => { const res = await fetch(url, { method: 'POST', headers, body, signal: AbortSignal.timeout(15_000) }); return { status: res.status }; }; + +export type HttpGet = (url: string, headers: Record) => Promise; + +export const httpGet: HttpGet = async (url, headers) => { + const res = await fetch(url, { method: 'GET', headers, signal: AbortSignal.timeout(15_000) }); + return { status: res.status }; +}; diff --git a/packages/agent-host/src/provider.ts b/packages/agent-host/src/provider.ts new file mode 100644 index 00000000..d18e0e81 --- /dev/null +++ b/packages/agent-host/src/provider.ts @@ -0,0 +1,26 @@ +/** + * The rule a custom-provider base URL must satisfy, shared by every driver + * whose agent is pointed at one. The bridge applies the same rule when a + * profile is saved, so a value that reaches a driver has normally been + * checked already — a driver checks again because it is the one that would + * put an API token on the connection. + */ + +/** The message shown when a base URL is refused (the bridge shows the same). */ +export const PROVIDER_BASE_URL_ERROR = + 'Base URL must be https:// (http:// is allowed only for localhost, 127.0.0.1 or [::1])'; + +/** https anywhere, or http ONLY on loopback — a local model server has no + * cert and its traffic never leaves the machine; anything else is a network + * hop carrying a bearer token. */ +export function isValidProviderBaseUrl(raw: string): boolean { + let url: URL; + try { + url = new URL(raw); + } catch { + return false; + } + if (url.protocol === 'https:') return url.host !== ''; + if (url.protocol !== 'http:') return false; + return ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname.toLowerCase()); +} diff --git a/packages/agent-host/src/tools.ts b/packages/agent-host/src/tools.ts index a2998930..6e4050cb 100644 --- a/packages/agent-host/src/tools.ts +++ b/packages/agent-host/src/tools.ts @@ -30,6 +30,17 @@ const TOOL_KINDS: Record = { enterplanmode: 'switch_mode', task: 'agent', agent: 'agent', + // The DeepSeek Harness's own tools. + pwsh: 'execute', + str_replace_editor: 'edit', + todo_write: 'think', + web_fetch: 'fetch', + web_search: 'fetch', + read_image: 'read', + skill: 'read', + job_output: 'read', + job_list: 'read', + job_kill: 'execute', }; /** Normalize an agent's tool name (Claude Code's `Bash`, OpenCode's `bash`) @@ -56,14 +67,20 @@ function oneLine(text: string): string { export function toolTitle(toolName: string, input: Record): string { switch (toolName.toLowerCase()) { case 'bash': + case 'pwsh': return oneLine(str(input.command) || str(input.description)); case 'read': case 'write': case 'edit': case 'multiedit': + case 'read_image': return str(input.file_path) || str(input.filePath); case 'notebookedit': return str(input.notebook_path) || str(input.file_path); + // The DeepSeek Harness's editor names its file `path`; its `command` + // (view, create, str_replace, insert) says what the call does. + case 'str_replace_editor': + return `${str(input.command)} ${str(input.path)}`.trim(); case 'glob': case 'grep': return str(input.pattern); @@ -75,8 +92,13 @@ export function toolTitle(toolName: string, input: Record): str } case 'websearch': return str(input.query); + case 'web_search': + return Array.isArray(input.queries) ? str(input.queries[0]) : ''; case 'webfetch': + case 'web_fetch': return str(input.url); + case 'skill': + return str(input.name); default: return JSON.stringify(input ?? {}).slice(0, MAX_TITLE_CHARS); } @@ -111,6 +133,8 @@ export function toolInput(toolName: string, input: Record): str case 'apply_patch': case 'todowrite': case 'todoread': + case 'todo_write': + case 'str_replace_editor': return undefined; default: { const keys = Object.keys(input ?? {}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13513d28..bff80882 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,9 @@ importers: '@opencode-ai/sdk': specifier: ^1.18.32 version: 1.18.32 + js-yaml: + specifier: ^4.2.0 + version: 4.3.2 zod: specifier: ^4.6.5 version: 4.6.5 @@ -35,9 +38,6 @@ importers: esbuild: specifier: ^0.25.0 version: 0.25.12 - js-yaml: - specifier: ^4.2.0 - version: 4.3.2 opencode-ai: specifier: 1.18.32 version: 1.18.32 @@ -4271,6 +4271,7 @@ packages: opencode-ai@1.18.32: resolution: {integrity: sha512-SCrZWdq44y/EoH2+fE4HLcXS+DzpVqHPzmXk3p2RrufYy8LWvpfhRhKtijb5ktvx8r94ScqToqwHxR0BwS65OQ==} + cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true From 427afa731ddc7f07ce277a7aeaafbc8c4b8b14de Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:38 +0200 Subject: [PATCH 03/22] feat(agent-host): run the harness on a gateway's own models MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An operator who sets `DEEPSEEK_BASE_URL` is saying "run sessions on this endpoint", but the harness takes only the endpoint from the environment: its model catalog is its own fixed list of DeepSeek model names. A gateway would be sent a name it does not know, and the phone would offer models that are not there — while the one model the harness is *on* (the profile's pinned default, which it always offers) showed up as a model nobody could run. So the gateway's own list becomes the harness's catalog. As the host starts, the endpoint is asked for its models — `/v1/models`, on the same root the harness posts `/messages` to, so one setting configures both — and the list is written into the harness's profile, where the harness documents its catalog as replaceable. The entries naming the model a session starts on move with it. Clearing the variable takes the row back out; an endpoint that does not answer leaves the harness's own catalog alone, and nothing is guessed. Models are reported in the shape the other drivers use: the endpoint's own id (a router's ids name their channel before a slash), with the channel as the provider and the model as the label. The credential check asks that same list about the key, so a gateway key gets a real verdict. Both blocks live in one file and each leaves the other alone, so the profile layer's block editing moves into profileLayer.ts with a claim per block. Co-Authored-By: Claude Code --- .../deepseek/__tests__/deepseekDriver.test.ts | 85 +++++++- .../__tests__/deepseekGateway.test.ts | 131 ++++++++++++ .../agent-host/src/drivers/deepseek/driver.ts | 99 +++++++-- .../src/drivers/deepseek/gateway.ts | 191 ++++++++++++++++++ .../agent-host/src/drivers/deepseek/mcp.ts | 126 ++---------- .../src/drivers/deepseek/profileLayer.ts | 140 +++++++++++++ packages/agent-host/src/net.ts | 5 +- 7 files changed, 644 insertions(+), 133 deletions(-) create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseekGateway.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/gateway.ts create mode 100644 packages/agent-host/src/drivers/deepseek/profileLayer.ts diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts index 51def6cb..01b83069 100644 --- a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts @@ -495,10 +495,10 @@ describe('DeepSeekDriver model catalog', () => { it('lists the harness catalog from a probe session, once', async () => { const ready = withDriver(); const models = await ready.driver.listModels(); - expect(models.defaultModel).toBe('["deepseek-official","deepseek-v4-flash"]'); + expect(models.defaultModel).toBe('deepseek-v4-flash'); expect(models.models).toEqual([ - { id: '["deepseek-official","deepseek-v4-flash"]', label: 'deepseek-v4-flash', provider: 'DeepSeek' }, - { id: '["deepseek-official","deepseek-v4-pro"]', label: 'DeepSeek-V4-Pro', provider: 'DeepSeek' }, + { id: 'deepseek-v4-flash', label: 'deepseek-v4-flash', provider: 'DeepSeek' }, + { id: 'deepseek-v4-pro', label: 'DeepSeek-V4-Pro', provider: 'DeepSeek' }, ]); await ready.driver.listModels(); expect(ready.harness.newSessions).toHaveLength(1); @@ -562,18 +562,20 @@ describe('DeepSeekDriver credential check', () => { expect(await unreachable.checkCredential('deepseek_api_key', 'sk-1')).toBeUndefined(); }); - it('claims nothing about a key that belongs to a configured gateway', async () => { - const httpGet = vi.fn(async () => ({ status: 401 })); + it('checks a key against the gateway it belongs to, not the DeepSeek API', async () => { + const httpGet = vi.fn(async () => ({ status: 200 })); const ready = withDriver(); const driver = DeepSeekDriver.create({ runtime: ready.runtime, home: ready.home, - baseEnv: { DEEPSEEK_BASE_URL: 'https://gateway.example/v1' } as NodeJS.ProcessEnv, + baseEnv: { DEEPSEEK_BASE_URL: 'https://gateway.example' } as NodeJS.ProcessEnv, httpGet, log: () => {}, }); - expect(await driver.checkCredential('deepseek_api_key', 'sk-gateway')).toBeUndefined(); - expect(httpGet).not.toHaveBeenCalled(); + expect(await driver.checkCredential('deepseek_api_key', 'sk-gateway')).toBe(true); + // The list the gateway serves is the one call every gateway has, and the + // one this driver reads its catalog from. + expect(httpGet).toHaveBeenCalledWith('https://gateway.example/v1/models', { authorization: 'Bearer sk-gateway' }); }); }); @@ -662,6 +664,73 @@ describe('the harness runtime', () => { }); }); +describe('a gateway', () => { + const gatewayEnv = (base: string, key = 'sk-gateway'): NodeJS.ProcessEnv => + ({ DEEPSEEK_BASE_URL: base, DEEPSEEK_API_KEY: key }) as NodeJS.ProcessEnv; + + it('writes the models the gateway serves into the harness profile, as the host starts', async () => { + const ready = withDriver({ env: gatewayEnv('http://gateway.example:3458') }); + ready.driver = DeepSeekDriver.create({ + runtime: ready.runtime, + home: ready.home, + baseEnv: gatewayEnv('http://gateway.example:3458'), + httpGet: async (url, headers) => { + expect(url).toBe('http://gateway.example:3458/v1/models'); + expect(headers.authorization).toBe('Bearer sk-gateway'); + return { status: 200, text: JSON.stringify({ data: [{ id: 'kimi-k2' }, { id: 'glm-4.6', context_length: 200_000 }] }) }; + }, + log: () => {}, + }); + await vi.waitFor(() => + expect(readFileSync(path.join(ready.home, 'profiles', 'acp', 'cordis.patch.yml'), 'utf8')).toMatch(/kimi-k2/), + ); + const layer = readFileSync(path.join(ready.home, 'profiles', 'acp', 'cordis.patch.yml'), 'utf8'); + // The row the harness reads: the endpoint, and the catalog it may serve. + expect(layer).toMatch(/id: llm-deepseek/); + expect(layer).toMatch(/baseURL: http:\/\/gateway\.example:3458/); + expect(layer).toMatch(/contextWindow: 200000/); + // Its own block, and nothing else of ours: the MCP list is another one. + expect(layer).toMatch(/CodeDeck\+ gateway catalog/); + expect(layer).not.toMatch(/CodeDeck\+ MCP servers/); + }); + + it('leaves the harness catalog alone when the gateway does not answer', async () => { + const ready = withDriver(); + const driver = DeepSeekDriver.create({ + runtime: ready.runtime, + home: ready.home, + baseEnv: gatewayEnv('http://gateway.example:3458'), + httpGet: async () => { + throw new Error('ECONNREFUSED'); + }, + log: () => {}, + }); + await driver.listModels(); + expect(readFileSync(path.join(ready.home, 'profiles', 'acp', 'cordis.patch.yml'), 'utf8')).not.toMatch(/llm-deepseek/); + }); + + it('takes its catalog back out when no gateway is configured any more', async () => { + const ready = withDriver(); + const layer = path.join(ready.home, 'profiles', 'acp', 'cordis.patch.yml'); + writeFileSync( + layer, + `# the profile + +# --- CodeDeck+ gateway catalog: written from the gateway's own model list; everything outside this block is yours --- +- id: llm-deepseek + config: + baseURL: http://old.example +# --- end CodeDeck+ gateway catalog --- +`, + ); + const driver = DeepSeekDriver.create({ runtime: ready.runtime, home: ready.home, baseEnv: {} as NodeJS.ProcessEnv, log: () => {} }); + await driver.listModels(); + const after = readFileSync(layer, 'utf8'); + expect(after).not.toMatch(/llm-deepseek/); + expect(after).toMatch(/# the profile/); + }); +}); + describe('the harness process', () => { it('spawns the installed CLI with the profile and the harness home', async () => { const ready = withDriver(); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekGateway.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekGateway.test.ts new file mode 100644 index 00000000..a1409e2c --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekGateway.test.ts @@ -0,0 +1,131 @@ +/** + * A gateway the harness is pointed at: reading the models it serves, and + * writing them into the harness's own profile as its catalog — beside the + * block the MCP list owns, since both live in that one file. + */ +import { mkdtempSync, readFileSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import * as path from 'node:path'; +import { describe, expect, it, vi } from 'vitest'; +import { DeepSeekMcp } from '../mcp'; +import { fetchGatewayCatalog, gatewayModelsUrl, parseModels, renderCatalogLayer, syncGatewayCatalog } from '../gateway'; + +function profile(initial = '# Your patch layer for this dsh profile.\n[]\n'): string { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-gateway-')); + writeFileSync(path.join(dir, 'cordis.patch.yml'), initial); + return dir; +} + +const layerOf = (dir: string): string => readFileSync(path.join(dir, 'cordis.patch.yml'), 'utf8'); + +/** A gateway answering with `body`. */ +const answering = (body: unknown, status = 200, expectUrl?: string, expectKey?: string) => + vi.fn(async (url: string, headers: Record) => { + if (expectUrl !== undefined) expect(url).toBe(expectUrl); + if (expectKey !== undefined) expect(headers.authorization).toBe(`Bearer ${expectKey}`); + return { status, text: typeof body === 'string' ? body : JSON.stringify(body) }; + }); + +describe('the model list a gateway serves', () => { + it('is read from the root the harness itself posts to', async () => { + expect(gatewayModelsUrl('http://gateway.example:3458')).toBe('http://gateway.example:3458/v1/models'); + expect(gatewayModelsUrl('http://gateway.example:3458/')).toBe('http://gateway.example:3458/v1/models'); + // The harness appends `/v1` unless the path already ends in it, and this + // mirrors that rule, so one setting configures both. + expect(gatewayModelsUrl('https://gateway.example/v1')).toBe('https://gateway.example/v1/models'); + }); + + it('reads the shapes gateways answer with, and keeps what says something', () => { + expect(parseModels({ data: [{ id: 'kimi-k2' }, { id: 'glm-4.6', context_length: 200_000 }] })).toEqual([ + { id: 'kimi-k2' }, + { id: 'glm-4.6', contextWindow: 200_000 }, + ]); + expect(parseModels(['a', 'b'])).toEqual([{ id: 'a' }, { id: 'b' }]); + expect(parseModels({ models: [{ id: 'x', name: 'X' }] })).toEqual([{ id: 'x', name: 'X' }]); + // Duplicates, blanks and anything that is not a model are dropped. + expect(parseModels({ data: [{ id: 'a' }, { id: 'a' }, { id: ' ' }, { no: 'id' }, 7] })).toEqual([{ id: 'a' }]); + expect(parseModels({ error: 'nope' })).toEqual([]); + expect(parseModels('not json at all')).toEqual([]); + }); + + it('is asked with the key, and answered with the endpoint as the harness reads it', async () => { + const httpGet = answering({ data: [{ id: 'kimi-k2' }] }, 200, 'http://gw.example/v1/models', 'sk-1'); + const catalog = await fetchGatewayCatalog('http://gw.example/', 'sk-1', httpGet, () => {}); + expect(catalog).toEqual({ baseUrl: 'http://gw.example', models: [{ id: 'kimi-k2' }], defaultModel: 'kimi-k2' }); + }); + + it('answers nothing — and says so — when the gateway refuses, breaks or lists nothing', async () => { + const logs: string[] = []; + const log = (line: string): void => { + logs.push(line); + }; + expect(await fetchGatewayCatalog('http://gw.example', 'sk', answering({}, 401), log)).toBeUndefined(); + expect(await fetchGatewayCatalog('http://gw.example', 'sk', answering('', 200), log)).toBeUndefined(); + expect(await fetchGatewayCatalog('http://gw.example', 'sk', answering({ data: [] }, 200), log)).toBeUndefined(); + expect( + await fetchGatewayCatalog('http://gw.example', 'sk', async () => { + throw new Error('ECONNREFUSED'); + }, log), + ).toBeUndefined(); + expect(logs.some((line) => /answered 401/.test(line))).toBe(true); + expect(logs.some((line) => /listed no models/.test(line))).toBe(true); + expect(logs.some((line) => /ECONNREFUSED/.test(line))).toBe(true); + }); +}); + +describe('the catalog the harness reads', () => { + it('is a row over the deployment entry, carrying the endpoint and the models', () => { + const rows = renderCatalogLayer({ + baseUrl: 'http://gw.example', + models: [{ id: 'kimi-k2' }, { id: 'glm-4.6', contextWindow: 200_000 }], + defaultModel: 'kimi-k2', + }); + expect(rows).toMatch(/^- id: llm-deepseek/m); + expect(rows).toMatch(/baseURL: http:\/\/gw\.example/); + expect(rows).toMatch(/id: kimi-k2/); + expect(rows).toMatch(/contextWindow: 200000/); + // And the model a session starts on moves with the catalog: the harness + // always offers the model it is on, so a default it does not serve would + // show up as one nobody can run. + expect(rows).toMatch(/^- id: acp$/m); + expect(rows).toMatch(/^- id: agent-default-model/m); + expect(rows).toMatch(/provider: deepseek-official/); + expect(rows).toMatch(/model: kimi-k2/); + }); + + it('is written beside the MCP block without disturbing it, and taken back out again', async () => { + const dir = profile(); + await new DeepSeekMcp({ profileDir: dir, log: () => {} }).act('add', [{ name: 'demo', setup: { type: 'stdio', command: '/usr/bin/demo' } }], []); + await syncGatewayCatalog({ profileDir: dir, log: () => {}, httpGet: answering({ data: [{ id: 'kimi-k2' }] }) }, 'http://gw.example', 'sk-1'); + const both = layerOf(dir); + expect(both).toMatch(/CodeDeck\+ MCP servers/); + expect(both).toMatch(/serverName: demo/); + expect(both).toMatch(/CodeDeck\+ gateway catalog/); + expect(both).toMatch(/id: kimi-k2/); + + // The MCP list still reads exactly what it wrote. + expect((await new DeepSeekMcp({ profileDir: dir, log: () => {} }).list()).servers).toEqual([ + { name: 'demo', transport: 'stdio', target: '/usr/bin/demo', enabled: true }, + ]); + + // No gateway any more: its block goes, the MCP one stays. + await syncGatewayCatalog({ profileDir: dir, log: () => {} }, undefined, undefined); + const after = layerOf(dir); + expect(after).not.toMatch(/gateway catalog/); + expect(after).toMatch(/serverName: demo/); + }); + + it('stays as it was when the gateway cannot be read', async () => { + const dir = profile(); + const wrote = await syncGatewayCatalog({ profileDir: dir, log: () => {} }, 'http://gw.example', 'sk-1'); + expect(wrote).toBe(false); + expect(layerOf(dir)).toBe('# Your patch layer for this dsh profile.\n[]\n'); + }); + + it('is written only when it changed', async () => { + const dir = profile(); + const httpGet = answering({ data: [{ id: 'kimi-k2' }] }); + expect(await syncGatewayCatalog({ profileDir: dir, log: () => {}, httpGet }, 'http://gw.example', 'sk-1')).toBe(true); + expect(await syncGatewayCatalog({ profileDir: dir, log: () => {}, httpGet }, 'http://gw.example', 'sk-1')).toBe(false); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/driver.ts b/packages/agent-host/src/drivers/deepseek/driver.ts index 1b31a008..faca981f 100644 --- a/packages/agent-host/src/drivers/deepseek/driver.ts +++ b/packages/agent-host/src/drivers/deepseek/driver.ts @@ -34,7 +34,8 @@ import type { UsageData, } from '../../types'; import { deepseekUpdateToEntries, type ToolCallMemory } from './adapter'; -import { DEEPSEEK_API_KEY_CREDENTIAL, buildDeepSeekEnv } from './env'; +import { DEEPSEEK_API_KEY_CREDENTIAL, DEEPSEEK_API_KEY_ENV, DEEPSEEK_BASE_URL_ENV, buildDeepSeekEnv } from './env'; +import { gatewayModelsUrl, syncGatewayCatalog } from './gateway'; import { DSH_LABEL } from './install'; import { DeepSeekMcp } from './mcp'; import { DeepSeekPlugins, runDshPlugin, type DshRun } from './plugins'; @@ -80,8 +81,10 @@ const EFFORT_CONFIG_ID = 'reasoning_effort'; /** One choice of a session config option. */ interface Choice { + /** The harness's own selector value (what `set_config_option` takes). */ value: string; label: string; + /** Who serves it, as a person reads it (`DeepSeek`), when the option says. */ provider?: string; description?: string; } @@ -114,10 +117,33 @@ export function selectChoices(option: SessionConfigOption | undefined): Choice[] /** ACP sends a select option's values either as one flat list or as groups; * only a group entry carries values of its own. */ -function isGroup(entry: { value?: unknown; options?: unknown }): entry is { name: string; options: Array<{ value: string; name: string; description?: string | null }> } { +function isGroup(entry: { + value?: unknown; + options?: unknown; +}): entry is { name: string; group?: string; options: Array<{ value: string; name: string; description?: string | null }> } { return Array.isArray(entry.options); } +/** + * One model as the phone sees it, in the shape the other drivers report: the + * id is the model's own — a gateway's usually names its channel before a + * slash (`Z.ai (Global) - Coding Plan/glm-5.3-flash`, Claude Code's gateway + * models arrive the same way) — and the channel becomes the provider, with + * the model part as the label. The harness's own selector value is what + * travels back to it; `resolveModel` maps one to the other. + */ +export function toModelEntry(choice: Choice): ModelEntry { + const id = modelIdOf(choice.value); + const slash = id.indexOf('/'); + const channel = slash > 0 ? id.slice(0, slash) : undefined; + const label = channel !== undefined ? id.slice(slash + 1) : choice.label; + return { + id, + label, + ...(channel !== undefined ? { provider: channel } : choice.provider ? { provider: choice.provider } : {}), + }; +} + /** The model choices of a session's option state: `value` is the opaque * selector the harness sets and returns, `label` what its own name says. */ export function modelChoices(option: SessionConfigOption | undefined): Choice[] { @@ -181,6 +207,8 @@ export class DeepSeekSession implements DriverSession { remove(sessionId: string): void; events(): DeepSeekProcessEvents; }; + /** The endpoint's catalog, being written into the harness's profile. */ + gateway: Promise; }, ) { this.cwd = params.cwd; @@ -209,6 +237,9 @@ export class DeepSeekSession implements DriverSession { private async init(): Promise { try { + // The harness reads its catalog as it boots, so the endpoint's own + // models have to be in the profile before a process starts. + await this.deps.gateway; const process_ = await this.deps.runtime.acquire(this.env, this.deps.live.events()); this.process = process_; // A session closed while its harness was starting keeps nothing: the @@ -311,11 +342,17 @@ export class DeepSeekSession implements DriverSession { } } - /** The value to select for a model the bridge names: the option's own - * opaque value, or the choice whose model id it is. */ + /** + * The value to select for a model the bridge names. Two shapes reach here: + * the model id this driver reports (what the phone was shown, and what a + * provider profile names), and the harness's own selector value. Anything + * else matches nothing, so it is refused rather than guessed at. + */ private resolveModel(model: string): string | undefined { const choices = modelChoices(this.optionOf(MODEL_CONFIG_ID)); - return choices.find((choice) => choice.value === model)?.value ?? choices.find((choice) => modelIdOf(choice.value) === model)?.value; + return ( + choices.find((choice) => choice.value === model)?.value ?? choices.find((choice) => modelIdOf(choice.value) === model)?.value + ); } private optionOf(id: string): SessionConfigOption | undefined { @@ -567,6 +604,10 @@ export class DeepSeekDriver implements Driver { readonly plugins: PluginManager; private unavailable: string | undefined; private models?: Promise<{ models: ModelEntry[]; defaultModel?: string }>; + /** The gateway's catalog is fetched (and written into the harness profile) + * as the host starts, and everything that starts a harness waits for it: + * a process reads its catalog once, as it boots. */ + private gateway: Promise = Promise.resolve(); /** Sessions by the harness's own ids: a process serves several, and it is * this map that ends them all when it goes away. */ private readonly sessions = new Map(); @@ -600,9 +641,31 @@ export class DeepSeekDriver implements Driver { // the first session (and the model list the phone asks for before it) // finds it ready instead of waiting on a download. void options.runtime.prepare(); + driver.gateway = driver.syncGateway(); return driver; } + /** + * Point the harness at the operator's endpoint, with the models that + * endpoint serves (gateway.ts): without this a session on a gateway would + * be sent a DeepSeek model name the gateway does not know, and the phone + * would offer models that are not there. + */ + private async syncGateway(): Promise { + const env = this.options.baseEnv ?? process.env; + try { + await syncGatewayCatalog( + { profileDir: dshProfileDir(this.options.home), log: this.options.log, ...(this.options.httpGet ? { httpGet: this.options.httpGet } : {}) }, + env[DEEPSEEK_BASE_URL_ENV]?.trim() || undefined, + env[DEEPSEEK_API_KEY_ENV]?.trim() || undefined, + ); + } catch (error) { + // The catalog is a convenience, never a reason to refuse to run: the + // harness's own models still work. + this.options.log(`[deepseek] could not write the gateway's catalog: ${error instanceof Error ? error.message : String(error)}`); + } + } + /** Mark the driver unusable (a path the operator named is not a file). */ setUnavailable(reason: string): void { this.unavailable = reason; @@ -646,6 +709,7 @@ export class DeepSeekDriver implements Driver { mcp: this.mcp, baseEnv: this.options.baseEnv ?? process.env, live: this.live, + gateway: this.gateway, }); } @@ -666,23 +730,22 @@ export class DeepSeekDriver implements Driver { } private async probeModels(): Promise<{ models: ModelEntry[]; defaultModel?: string }> { + await this.gateway; const env = buildDeepSeekEnv({}, this.options.baseEnv ?? process.env); const process_ = await this.options.runtime.acquire(env, { ended: () => {} }); try { const opened = await process_.client.request('session/new', { cwd: this.options.home, mcpServers: [] }); const option = (opened.configOptions ?? []).find((entry) => entry.id === MODEL_CONFIG_ID); - const models: ModelEntry[] = modelChoices(option).map((choice) => ({ - id: choice.value, - label: choice.label, - ...(choice.provider ? { provider: choice.provider } : {}), - })); + const choices = modelChoices(option); + const models: ModelEntry[] = choices.map(toModelEntry); if (models.length === 0) this.models = undefined; // The probe's own conversation is disposed of; nothing of it survives // but an empty session record in the harness's home. await process_.client.request('session/close', { sessionId: opened.sessionId }).catch(() => {}); + const current = choices.find((choice) => choice.value === option?.currentValue); return { models, - ...(option && option.type === 'select' && option.currentValue ? { defaultModel: option.currentValue } : {}), + ...(current ? { defaultModel: toModelEntry(current).id } : {}), }; } finally { process_.release(); @@ -690,17 +753,19 @@ export class DeepSeekDriver implements Driver { } /** - * Check the DeepSeek API key against the DeepSeek API. With an operator-set - * `DEEPSEEK_BASE_URL` the key belongs to that endpoint instead, whose model - * list this bridge does not know: the check is left to the gateway, and - * nothing is claimed about the key. + * Check the key against the endpoint it is for: the operator's gateway when + * one is configured (its `/models` is the one call every gateway has in + * common — the same one this driver reads the catalog from), else the + * DeepSeek API. A refusal is a refusal; anything else says nothing. */ async checkCredential(credential: string, value: string): Promise { if (credential !== DEEPSEEK_API_KEY_CREDENTIAL || !this.options.httpGet) return undefined; const baseEnv = this.options.baseEnv ?? process.env; - if (baseEnv.DEEPSEEK_BASE_URL?.trim()) return undefined; + const base = baseEnv[DEEPSEEK_BASE_URL_ENV]?.trim(); try { - const res = await this.options.httpGet('https://api.deepseek.com/models', { authorization: `Bearer ${value}` }); + const res = await this.options.httpGet(base ? gatewayModelsUrl(base) : 'https://api.deepseek.com/models', { + authorization: `Bearer ${value}`, + }); return res.status !== 401 && res.status !== 403; } catch { return undefined; diff --git a/packages/agent-host/src/drivers/deepseek/gateway.ts b/packages/agent-host/src/drivers/deepseek/gateway.ts new file mode 100644 index 00000000..9dbcda6e --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/gateway.ts @@ -0,0 +1,191 @@ +/** + * A gateway the harness is pointed at, end to end. + * + * An operator who sets `DEEPSEEK_BASE_URL` is saying "run sessions on this + * endpoint". The harness takes that endpoint from the environment (its + * DeepSeek route reads exactly that variable), but its *model catalog* is its + * own, fixed list of DeepSeek model names — so a gateway with its own models + * would be sent a name it does not know, and the phone would offer models the + * gateway cannot serve. What the gateway serves is the one thing only the + * gateway can say, and it says it at `/models` (the OpenAI-shaped list every + * gateway exposes), on the same root the harness itself appends `/v1` to and + * then posts `/messages` to. + * + * So this module asks the gateway for that list and writes it into the + * harness's own profile, as the deployment's catalog for the native route: + * a patch row over the `llm-deepseek` entry, which is how the harness + * documents its catalog as replaceable. From the next harness start, the + * phone offers exactly what the gateway serves and a session can select any + * of it. No gateway configured (or one that does not answer) means no row at + * all: the harness's own catalog stands, and nothing is guessed. + */ +import * as path from 'node:path'; +import { dump } from 'js-yaml'; +import type { HttpGet } from '../../net'; +import { ProfileLayer, type LayerBlock } from './profileLayer'; + +/** Our block in the profile's patch layer. */ +const BLOCK: LayerBlock = { + begin: "# --- CodeDeck+ gateway catalog: written from the gateway's own model list; everything outside this block is yours ---", + end: '# --- end CodeDeck+ gateway catalog ---', +}; + +/** The entry that mounts the native DeepSeek adapter; its config carries the + * endpoint and the catalog. */ +const PROVIDER_ROW = 'llm-deepseek'; +/** The entries naming the provider and model a session starts on. They have + * to move with the catalog: the harness always offers the model it is on, + * so a default the gateway does not serve would appear as one nobody can + * run. `acp` is the profile's own selection (what a new session starts + * with); `agent-default-model` is the agent module's. */ +const SESSION_MODEL_ROW = 'acp'; +const DEFAULT_MODEL_ROW = 'agent-default-model'; +/** The provider the native route is registered under. */ +const NATIVE_PROVIDER = 'deepseek-official'; + +/** How many of a gateway's models are kept: a catalog is for a phone screen. */ +const MAX_MODELS = 200; + +/** One model, as a catalog entry. */ +export interface GatewayModel { + id: string; + name?: string; + contextWindow?: number; +} + +export interface GatewayCatalog { + /** The endpoint as the harness should read it. */ + baseUrl: string; + models: GatewayModel[]; + /** The model sessions start on: the gateway's own first entry, in the + * order it lists them. */ + defaultModel: string; +} + +/** + * The list a gateway serves, or `undefined` when it could not be read (an + * unreachable endpoint, a refusal, an answer that is not a model list). The + * base URL is normalised the way the harness normalises it, so the same + * variable points at the same endpoint for both. + */ +export async function fetchGatewayCatalog( + baseUrl: string, + key: string | undefined, + httpGet: HttpGet, + log: (message: string) => void, +): Promise { + const url = gatewayModelsUrl(baseUrl); + let body: unknown; + try { + const response = await httpGet(url, key ? { authorization: `Bearer ${key}` } : {}); + if (response.status < 200 || response.status >= 300) { + log(`[deepseek] the gateway at ${baseUrl} answered ${response.status} for its model list`); + return undefined; + } + body = readJson(response); + } catch (error) { + log(`[deepseek] could not read the gateway's model list from ${url}: ${error instanceof Error ? error.message : String(error)}`); + return undefined; + } + const models = parseModels(body); + if (models.length === 0) { + log(`[deepseek] the gateway at ${baseUrl} listed no models; leaving the harness's own catalog in place`); + return undefined; + } + return { baseUrl: baseUrl.replace(/\/+$/, ''), models, defaultModel: models[0]!.id }; +} + +/** The harness's own rule for where a provider's list of models lives: the + * root ends in `/v1` (the endpoint `/messages` is posted to lives beside + * it). Mirrored here so one setting configures both. */ +export function gatewayModelsUrl(baseUrl: string): string { + const base = baseUrl.replace(/\/+$/, ''); + const rooted = new URL(base).pathname.endsWith('/v1') ? base : `${base}/v1`; + return `${rooted}/models`; +} + +/** The model ids in a gateway's answer: the OpenAI-shaped `data` array, a + * bare array, or a `models` array. Anything else yields nothing. */ +export function parseModels(body: unknown): GatewayModel[] { + const list = Array.isArray(body) + ? body + : typeof body === 'object' && body !== null + ? ((body as { data?: unknown }).data ?? (body as { models?: unknown }).models) + : undefined; + if (!Array.isArray(list)) return []; + const models: GatewayModel[] = []; + const seen = new Set(); + for (const entry of list) { + const id = + typeof entry === 'string' + ? entry + : typeof entry === 'object' && entry !== null + ? (entry as { id?: unknown; name?: unknown }).id + : undefined; + if (typeof id !== 'string' || id.trim() === '' || seen.has(id)) continue; + seen.add(id); + const context = typeof entry === 'object' && entry !== null ? contextWindowOf(entry as Record) : undefined; + const name = typeof entry === 'object' && entry !== null && typeof (entry as { name?: unknown }).name === 'string' ? (entry as { name: string }).name : undefined; + models.push({ id, ...(name && name !== id ? { name } : {}), ...(context !== undefined ? { contextWindow: context } : {}) }); + if (models.length >= MAX_MODELS) break; + } + return models; +} + +/** A model's context size, when the gateway states one (OpenAI-compatible + * gateways spell it several ways). */ +function contextWindowOf(entry: Record): number | undefined { + for (const field of ['context_window', 'context_length', 'contextWindow', 'max_input_tokens']) { + const value = entry[field]; + if (typeof value === 'number' && Number.isSafeInteger(value) && value > 0) return value; + } + return undefined; +} + +function readJson(response: Awaited>): unknown { + return JSON.parse(response.text ?? '') as unknown; +} + +/** The patch rows for a gateway's catalog: the catalog itself, and the + * model a session starts on. */ +export function renderCatalogLayer(catalog: GatewayCatalog): string { + const models = catalog.models.map((model) => ({ + id: model.id, + ...(model.name !== undefined ? { name: model.name } : {}), + ...(model.contextWindow !== undefined ? { contextWindow: model.contextWindow } : {}), + })); + const selection = { provider: NATIVE_PROVIDER, model: catalog.defaultModel }; + const rows = [ + { id: PROVIDER_ROW, config: { baseURL: catalog.baseUrl, models } }, + { id: SESSION_MODEL_ROW, config: selection }, + { id: DEFAULT_MODEL_ROW, config: selection }, + ]; + return dump(rows, { lineWidth: -1, noRefs: true, quotingType: "'" }).trimEnd(); +} + +export interface GatewaySyncOptions { + /** The profile directory (`$DSH_HOME/profiles/acp`). */ + profileDir: string; + log: (message: string) => void; + httpGet?: HttpGet; +} + +/** + * Write the gateway's catalog into the harness profile (or take our row out + * when no gateway is configured), and answer whether the layer changed. + */ +export async function syncGatewayCatalog( + options: GatewaySyncOptions, + baseUrl: string | undefined, + key: string | undefined, +): Promise { + const layer = new ProfileLayer(path.join(options.profileDir, 'cordis.patch.yml'), options.log); + if (!baseUrl || !options.httpGet) return layer.set(BLOCK, undefined); + const catalog = await fetchGatewayCatalog(baseUrl, key, options.httpGet, options.log); + if (!catalog) return false; + const changed = await layer.set(BLOCK, renderCatalogLayer(catalog)); + if (changed) { + options.log(`[deepseek] ${catalog.models.length} models from ${catalog.baseUrl} now make up the harness's catalog`); + } + return changed; +} diff --git a/packages/agent-host/src/drivers/deepseek/mcp.ts b/packages/agent-host/src/drivers/deepseek/mcp.ts index 5caadf03..93498170 100644 --- a/packages/agent-host/src/drivers/deepseek/mcp.ts +++ b/packages/agent-host/src/drivers/deepseek/mcp.ts @@ -26,19 +26,22 @@ * start, so a single mistyped server would lock the user out of every * session, and each session would pay its own connections. */ -import { mkdir, readFile, rename, writeFile } from 'node:fs/promises'; import * as path from 'node:path'; import { load, dump } from 'js-yaml'; import type { McpManager, McpState } from '../../driver'; import { serverInfo } from '../../mcp'; import type { McpAction, McpServerAdd, McpServerInfo } from '../../types'; +import { ProfileLayer, type LayerBlock } from './profileLayer'; /** The plugin every managed row mounts. */ const MCP_CLIENT_PLUGIN = '@deepseek-ai/dsh-mcp-client'; /** Which servers are this bridge's, among the profile's other rows. */ const ROW_PREFIX = 'codedeck-mcp-'; -const MARKER_BEGIN = '# --- CodeDeck+ MCP servers: managed from the MCP screen; everything outside this block is yours ---'; -const MARKER_END = '# --- end CodeDeck+ MCP servers ---'; +/** This manager's own block in that layer (profileLayer.ts). */ +const BLOCK: LayerBlock = { + begin: '# --- CodeDeck+ MCP servers: managed from the MCP screen; everything outside this block is yours ---', + end: '# --- end CodeDeck+ MCP servers ---', +}; /** The harness's own rule for a server namespace, so a name this bridge * writes is one the harness accepts (`mcp____` names follow). */ @@ -61,14 +64,17 @@ export interface DeepSeekMcpOptions { type PatchDoc = Record; export class DeepSeekMcp implements McpManager { - /** One write at a time: each reads the file, edits, writes it back. */ + /** One change at a time: each reads the block, edits it, writes it back. */ private queue: Promise = Promise.resolve(); + private readonly layer: ProfileLayer; /** How many times this manager changed the layer. A harness process records * it as it starts, so a change made afterwards is configuration that * process has not loaded — no file timestamp, and no clock, involved. */ private versions = 0; - constructor(private readonly options: DeepSeekMcpOptions) {} + constructor(options: DeepSeekMcpOptions) { + this.layer = new ProfileLayer(path.join(options.profileDir, 'cordis.patch.yml'), options.log); + } /** How many times the layer has changed since this bridge started. */ get version(): number { @@ -83,15 +89,11 @@ export class DeepSeekMcp implements McpManager { return this.serial(async () => { const current = await this.servers(); const next = applyAction(current, action, servers, names); - await this.write(next); + if (await this.layer.set(BLOCK, next.length === 0 ? undefined : renderRows(next))) this.versions++; return this.state(next); }); } - private file(): string { - return path.join(this.options.profileDir, 'cordis.patch.yml'); - } - private serial(work: () => Promise): Promise { const next = this.queue.then(work, work); this.queue = next.catch(() => {}); @@ -109,118 +111,28 @@ export class DeepSeekMcp implements McpManager { /** The servers in the managed block, in the order they are written. */ private async servers(): Promise { - const text = await this.read(); - const block = extractBlock(text); + const block = await this.layer.body(BLOCK); if (block === undefined) return []; let docs: unknown; try { docs = load(block); } catch (error) { - throw new Error(`${this.file()} has a CodeDeck MCP block that is not valid YAML: ${error instanceof Error ? error.message : String(error)}`); + throw new Error( + `the DeepSeek Harness profile has a CodeDeck MCP block that is not valid YAML: ${error instanceof Error ? error.message : String(error)}`, + ); } return serversOf(Array.isArray(docs) ? (docs as PatchDoc[]) : []); } - - private async read(): Promise { - try { - return await readFile(this.file(), 'utf8'); - } catch { - return ''; - } - } - - private async write(servers: ManagedServer[]): Promise { - const text = await this.read(); - const rest = removeBlock(text); - const joined = servers.length === 0 ? restoreEmptyList(rest) : withBlock(rest, renderBlock(servers)); - const content = joined.endsWith('\n') ? joined : `${joined}\n`; - // A change that leaves the layer as it was is not a change: a session - // reads this version to tell a server its harness has from one it has - // not loaded yet. - if (content === text) return; - this.versions++; - const file = this.file(); - await mkdir(path.dirname(file), { recursive: true }); - // Written beside and renamed: a torn write would leave a profile the - // harness cannot read at all. - const temporary = `${file}.codedeck-${process.pid}`; - await writeFile(temporary, content); - await rename(temporary, file); - this.options.log(`[deepseek] MCP servers updated in ${file}`); - } -} - -/** The block's own text, without its markers; `undefined` when there is none. */ -function extractBlock(text: string): string | undefined { - const start = text.indexOf(MARKER_BEGIN); - if (start < 0) return undefined; - const end = text.indexOf(MARKER_END, start); - if (end < 0) return undefined; - return text.slice(start + MARKER_BEGIN.length, end).trim(); -} - -/** `text` with the managed block taken out (markers included). */ -function removeBlock(text: string): string { - const start = text.indexOf(MARKER_BEGIN); - if (start < 0) return text; - const end = text.indexOf(MARKER_END, start); - if (end < 0) return text; - return `${text.slice(0, start)}${text.slice(end + MARKER_END.length)}`.trimEnd() + '\n'; -} - -/** Whether a profile patch layer holds anything but comments and blanks. */ -function isEmptyLayer(text: string): boolean { - for (const line of text.split('\n')) { - const trimmed = line.trim(); - if (trimmed === '' || trimmed.startsWith('#')) continue; - // The profile's initial layer: an empty list, and nothing else. - if (trimmed === '[]' || trimmed === '---') continue; - return false; - } - return true; -} - -/** - * The layer's own rows, then the managed block, as one document. The - * harness's initial layer is an empty list (`[]`) on its own, and an empty - * sequence cannot share a document with a block sequence — nor can a `[]` a - * user left after their own rows — so those lines go. - */ -function withBlock(rest: string, block: string): string { - const head = withoutEmptyList(rest).trimEnd(); - return head === '' ? block : `${head}\n\n${block}`; -} - -/** The layer with no managed block and no rows of ours: the profile's own - * comments and its empty list, which is the shape the harness starts from. */ -function restoreEmptyList(rest: string): string { - if (!isEmptyLayer(rest)) return rest.trimEnd(); - const head = rest - .split('\n') - .filter((line) => line.trim().startsWith('#')) - .join('\n') - .trimEnd(); - return head === '' ? '[]' : `${head}\n[]`; -} - -/** `text` without a line that is an empty-list document (`[]` at the left - * margin; an argument's own `[]` is indented and kept). */ -function withoutEmptyList(text: string): string { - return text - .split('\n') - .filter((line) => line.replace(/\r$/, '') !== '[]') - .join('\n'); } -/** The managed block for `servers`, as the patch list the harness loads. */ -function renderBlock(servers: ManagedServer[]): string { +/** The rows of the managed block, as the patch list the harness loads. */ +function renderRows(servers: ManagedServer[]): string { const docs: PatchDoc[] = []; for (const server of servers) { docs.push({ insert: [{ id: `${ROW_PREFIX}${server.name}`, name: MCP_CLIENT_PLUGIN, config: server.config }] }); if (!server.enabled) docs.push({ id: `${ROW_PREFIX}${server.name}`, disabled: true }); } - const body = dump(docs, { lineWidth: -1, noRefs: true, quotingType: "'" }).trimEnd(); - return `${MARKER_BEGIN}\n${body}\n${MARKER_END}`; + return dump(docs, { lineWidth: -1, noRefs: true, quotingType: "'" }).trimEnd(); } /** The servers a managed block describes, the last row per id winning. */ diff --git a/packages/agent-host/src/drivers/deepseek/profileLayer.ts b/packages/agent-host/src/drivers/deepseek/profileLayer.ts new file mode 100644 index 00000000..27b741cc --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/profileLayer.ts @@ -0,0 +1,140 @@ +/** + * The harness's profile patch layer, edited in delimited blocks. + * + * A profile is an ordered stack of patch layers, and + * `$DSH_HOME/profiles//cordis.patch.yml` is the user's own — the + * file the harness's own documentation says to edit, applied after every + * bundle. More than one thing this bridge keeps lives there (its MCP server + * rows, the model catalog it writes for a gateway), so each of them owns a + * block: exactly the lines between its own two marker comments. Everything + * else — the profile's comments, a row a person added — is read, kept and + * written back as it was. + * + * Writes are serialised per file (one editor at a time, whichever block it + * owns) and atomic: written beside and renamed, because a torn write leaves a + * profile the harness cannot read at all. + */ +import { mkdir, readFile, rename, writeFile } from 'node:fs/promises'; +import * as path from 'node:path'; + +/** A block's markers: the lines that bound the text this bridge owns. */ +export interface LayerBlock { + /** The line that opens it — what identifies the block in the file. */ + readonly begin: string; + /** The line that closes it. */ + readonly end: string; +} + +/** One file's editors, so two blocks never write over each other. */ +const queues = new Map>(); + +export class ProfileLayer { + constructor( + private readonly file: string, + private readonly log?: (message: string) => void, + ) {} + + /** The layer as it is on disk (`''` for a profile nobody has started). */ + async text(): Promise { + try { + return await readFile(this.file, 'utf8'); + } catch { + return ''; + } + } + + /** One block's own rows, without its markers. */ + async body(block: LayerBlock): Promise { + const text = await this.text(); + const start = text.indexOf(block.begin); + if (start < 0) return undefined; + const end = text.indexOf(block.end, start); + if (end < 0) return undefined; + return text.slice(start + block.begin.length, end).trim(); + } + + /** + * Write one block — its rows, with the markers around them — leaving every + * other byte of the layer alone. `undefined` takes the block out. Answers + * whether the file changed. + */ + set(block: LayerBlock, body: string | undefined): Promise { + return this.serial(async () => { + const text = await this.text(); + const rest = withoutBlock(text, block); + const rendered = body === undefined || body.trim() === '' ? undefined : `${block.begin}\n${body.trim()}\n${block.end}`; + const joined = rendered === undefined ? restoreEmptyList(rest) : addRows(rest, rendered); + const content = joined.endsWith('\n') ? joined : `${joined}\n`; + if (content === text) return false; + await mkdir(path.dirname(this.file), { recursive: true }); + const temporary = `${this.file}.codedeck-${process.pid}`; + await writeFile(temporary, content); + await rename(temporary, this.file); + this.log?.(`[deepseek] profile layer updated in ${this.file}`); + return true; + }); + } + + private serial(work: () => Promise): Promise { + const key = path.resolve(this.file); + const next = (queues.get(key) ?? Promise.resolve()).then(work, work); + queues.set( + key, + next.catch(() => {}), + ); + return next; + } +} + +/** `text` with one block taken out (its markers included). */ +function withoutBlock(text: string, block: LayerBlock): string { + const start = text.indexOf(block.begin); + if (start < 0) return text; + const end = text.indexOf(block.end, start); + if (end < 0) return text; + return `${text.slice(0, start)}${text.slice(end + block.end.length)}`.trimEnd() + '\n'; +} + +/** Whether a profile patch layer holds anything but comments and blanks. */ +function isEmptyLayer(text: string): boolean { + for (const line of text.split('\n')) { + const trimmed = line.trim(); + if (trimmed === '' || trimmed.startsWith('#')) continue; + // The profile's initial layer: an empty list, and nothing else. + if (trimmed === '[]' || trimmed === '---') continue; + return false; + } + return true; +} + +/** + * The layer's own rows, then this block, as one document. The harness's + * initial layer is an empty list (`[]`) on its own, and an empty sequence + * cannot share a document with a block sequence — nor can a `[]` a user left + * after their own rows — so those lines go. + */ +function addRows(rest: string, block: string): string { + const head = withoutEmptyList(rest).trimEnd(); + return head === '' ? block : `${head}\n\n${block}`; +} + +/** The layer with no block of ours in it: the profile's own comments and its + * empty list, which is the shape the harness starts from. */ +function restoreEmptyList(rest: string): string { + if (!isEmptyLayer(rest)) return rest.trimEnd(); + const head = rest + .split('\n') + .filter((line) => line.trim().startsWith('#')) + .join('\n') + .trimEnd(); + return head === '' ? '[]' : `${head}\n[]`; +} + +/** `text` without a line that is an empty-list document (`[]` at the left + * margin; an argument's own `[]` is indented and kept). */ +function withoutEmptyList(text: string): string { + return text + .split('\n') + .filter((line) => line.replace(/\r$/, '') !== '[]') + .join('\n'); +} diff --git a/packages/agent-host/src/net.ts b/packages/agent-host/src/net.ts index 497557de..8bf997b6 100644 --- a/packages/agent-host/src/net.ts +++ b/packages/agent-host/src/net.ts @@ -6,6 +6,9 @@ export interface HttpResponse { status: number; + /** The response body, for a call that asked for it. `net.ts`'s own + * fetchers read it; a test's fake may leave it out. */ + text?: string; } export type HttpPost = (url: string, headers: Record, body: string) => Promise; @@ -19,5 +22,5 @@ export type HttpGet = (url: string, headers: Record) => Promise< export const httpGet: HttpGet = async (url, headers) => { const res = await fetch(url, { method: 'GET', headers, signal: AbortSignal.timeout(15_000) }); - return { status: res.status }; + return { status: res.status, text: await res.text() }; }; From e982ce34a5f7c44516aa2dfa0a2b0dd071e51902 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:38 +0200 Subject: [PATCH 04/22] feat(agent-host): the harness's slash commands, on the phone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The harness has commands in this profile — the automation stack mounts the registry and `/compact`, `/goal`, `/feedback`, `/plan`, `/permission` — but its ACP surface carries none of it: ACP has no command list and no way to invoke one, the only invoker is the harness's own client API, and the automation profile mounts no transport for that. A typed `/name` was therefore prompt text that reached the model. CodeDeck brings its own transport. A small plugin of ours goes into the profile — a package in its `node_modules` and a row in its patch layer — holds the harness's command registry, and answers two questions over a local socket: what a session can run, and "run this line". The driver lists them for the phone and runs a typed `/name` there instead of prompting with it, so `/plan` answers "Plan mode on" and `/compact` compacts, both as the agent's own words in the transcript. The plugin is kept in the profile because the harness reads it as it boots; its row and its two files are rewritten when the host starts. A list that cannot be read is not an error: the phone offers no commands and a slash line is ordinary text again, and no session fails over it. Commands that take attachments get none: this bridge sends the line alone. Co-Authored-By: Claude Code --- .../__tests__/deepseekCommands.test.ts | 219 ++++++++++++++++++ .../deepseek/__tests__/deepseekDriver.test.ts | 100 +++++++- .../src/drivers/deepseek/commands.ts | 124 ++++++++++ .../src/drivers/deepseek/commandsPlugin.ts | 172 ++++++++++++++ .../agent-host/src/drivers/deepseek/driver.ts | 124 ++++++++-- 5 files changed, 725 insertions(+), 14 deletions(-) create mode 100644 packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts create mode 100644 packages/agent-host/src/drivers/deepseek/commands.ts create mode 100644 packages/agent-host/src/drivers/deepseek/commandsPlugin.ts diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts new file mode 100644 index 00000000..ac8218ab --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts @@ -0,0 +1,219 @@ +/** + * The command bridge: the plugin CodeDeck writes into the harness profile, + * run here as the harness would run it (a fake plugin context and a real + * socket), and the client the driver asks it questions with. + */ +import { mkdtempSync, readFileSync, writeFileSync } from 'node:fs'; +import { createServer, type Server, type Socket } from 'node:net'; +import { tmpdir } from 'node:os'; +import * as path from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { describe, expect, it, vi } from 'vitest'; +import { commandsSocketPath, listSessionCommands, runSessionCommand } from '../commands'; +import { COMMANDS_PLUGIN, installCommandsPlugin } from '../commandsPlugin'; + +const socketPathIn = (dir: string): string => path.join(dir, 'commands.sock'); + +/** A stand-in for the harness's plugin context: the two services the plugin + * asks for, the effect disposer, and a logger. */ +function pluginContext(commands: unknown, agents: { get: (id: string) => unknown } = { get: () => ({ id: 'a1' }) }) { + const cleanups: Array<() => void> = []; + return { + cleanups, + ctx: { + get: (service: string) => (service === 'commands' ? commands : service === 'agents' ? agents : undefined), + logger: { warn: () => {}, debug: () => {} }, + effect: (callback: () => () => void) => { + cleanups.push(callback()); + }, + }, + }; +} + +/** Run the plugin's source the way the harness does: import it and apply it. */ +async function runPlugin( + profileDir: string, + commandService: unknown, + agents: { get: (id: string) => unknown } = { get: () => ({ id: 'a1' }) }, +): Promise<{ cleanups: Array<() => void>; socket: string }> { + const socket = socketPathIn(profileDir); + await installCommandsPlugin(profileDir, socket, () => {}); + const module = (await import(pathToFileURL(path.join(profileDir, 'node_modules', COMMANDS_PLUGIN, 'index.js')).href)) as { + apply: (ctx: unknown, config: unknown) => void; + name: string; + inject: string[]; + }; + expect(module.name).toBe('codedeck-commands'); + expect(module.inject).toEqual(['agents', 'commands']); + const { ctx, cleanups } = pluginContext(commandService, agents); + module.apply(ctx, { socket }); + return { cleanups, socket }; +} + +/** Wait for a socket to accept a connection (the plugin listens asynchronously). */ +async function waitForSocket(socket: string): Promise { + const { connect } = await import('node:net'); + for (let attempt = 0; attempt < 100; attempt++) { + const connected = await new Promise((resolve) => { + const probe = connect(socket); + probe.on('connect', () => { + probe.destroy(); + resolve(true); + }); + probe.on('error', () => resolve(false)); + }); + if (connected) return; + await new Promise((resolve) => setTimeout(resolve, 10)); + } + throw new Error(`nothing is listening on ${socket}`); +} + +describe('installing the command plugin', () => { + it('writes its package into the profile and its row into the layer', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + writeFileSync(path.join(dir, 'cordis.patch.yml'), '# the profile\n[]\n'); + await installCommandsPlugin(dir, '/tmp/some.sock', () => {}); + const manifest = JSON.parse(readFileSync(path.join(dir, 'node_modules', COMMANDS_PLUGIN, 'package.json'), 'utf8')) as { + name: string; + type: string; + main: string; + }; + expect(manifest).toMatchObject({ name: COMMANDS_PLUGIN, type: 'module', main: 'index.js' }); + const layer = readFileSync(path.join(dir, 'cordis.patch.yml'), 'utf8'); + expect(layer).toMatch(/CodeDeck\+ commands/); + expect(layer).toMatch(/- id: codedeck-commands/); + expect(layer).toMatch(new RegExp(`name: '${COMMANDS_PLUGIN}'`)); + expect(layer).toMatch(/socket: "\/tmp\/some\.sock"/); + // The profile's own content is still there. + expect(layer).toMatch(/# the profile/); + }); + + it('leaves the files alone when they are already right', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const write = vi.fn(); + await installCommandsPlugin(dir, '/tmp/a.sock', () => {}); + const first = readFileSync(path.join(dir, 'node_modules', COMMANDS_PLUGIN, 'index.js'), 'utf8'); + // A second run must not rewrite the source the harness may be running — + // the content check is what makes it safe to run at every start. + await installCommandsPlugin(dir, '/tmp/a.sock', () => {}); + expect(readFileSync(path.join(dir, 'node_modules', COMMANDS_PLUGIN, 'index.js'), 'utf8')).toBe(first); + expect(write).not.toHaveBeenCalled(); + }); +}); + +describe('the plugin, talking to the driver', () => { + const commands = { + list: () => [ + { name: 'compact', description: 'Compact the conversation', input: { hint: '[]' } }, + { name: 'goal', description: 'Set or view the goal', input: { hint: '[]', attachments: true } }, + { name: 'plain', description: 'No input at all' }, + ], + execute: (_agent: unknown, line: string) => + line.startsWith('/compact') + ? Promise.resolve({ commandId: 'c1', result: { kind: 'success', text: 'Compacted 12 messages.' } }) + : Promise.resolve(undefined), + }; + + it('lists them, with the hint the harness gives', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, socket } = await runPlugin(dir, commands); + await waitForSocket(socket); + expect(await listSessionCommands(socket, 's1', () => {})).toEqual([ + { name: 'compact', description: 'Compact the conversation', argumentHint: '[]' }, + { name: 'goal', description: 'Set or view the goal', argumentHint: '[]' }, + { name: 'plain', description: 'No input at all' }, + ]); + for (const cleanup of cleanups) cleanup(); + }); + + it('runs one line and reports what it said, and says so when it cannot', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, socket } = await runPlugin(dir, commands); + await waitForSocket(socket); + expect(await runSessionCommand(socket, 's1', '/compact now', () => {})).toEqual({ ok: true, text: 'Compacted 12 messages.' }); + // The harness answers `undefined` for a line it does not have: that is a + // refusal to report, not a success with no text. + const unknown = await runSessionCommand(socket, 's1', '/nope', () => {}); + expect(unknown?.ok).toBe(false); + for (const cleanup of cleanups) cleanup(); + }); + + it('reports a session the harness does not have', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, socket } = await runPlugin(dir, { ...commands, list: () => [] }, { get: () => undefined }); + await waitForSocket(socket); + expect(await listSessionCommands(socket, 'gone', () => {})).toBeUndefined(); + for (const cleanup of cleanups) cleanup(); + }); + + it('answers a command whose handler failed as an error', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const failing = { + list: () => [], + execute: () => Promise.resolve({ commandId: 'c2', result: { kind: 'error', text: 'nothing to compact' } }), + }; + const { cleanups, socket } = await runPlugin(dir, failing); + await waitForSocket(socket); + expect(await runSessionCommand(socket, 's1', '/compact', () => {})).toEqual({ ok: false, text: 'nothing to compact' }); + for (const cleanup of cleanups) cleanup(); + }); +}); + +describe('the client on its own', () => { + /** A socket that answers whatever the test scripts (or nothing at all). */ + async function fakeBridge(answer: (request: Record, socket: Socket) => void): Promise<{ socket: string; close: () => void }> { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const socket = socketPathIn(dir); + const server: Server = createServer((connection) => { + connection.setEncoding('utf8'); + let buffered = ''; + connection.on('data', (chunk: string) => { + buffered += chunk; + const end = buffered.indexOf('\n'); + if (end < 0) return; + answer(JSON.parse(buffered.slice(0, end)) as Record, connection); + }); + connection.on('error', () => {}); + }); + await new Promise((resolve) => server.listen(socket, resolve)); + return { socket, close: () => server.close() }; + } + + it('answers nothing when no plugin is there', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const logs: string[] = []; + expect(await listSessionCommands(socketPathIn(dir), 's1', (line) => logs.push(line))).toBeUndefined(); + expect(logs.some((line) => /command bridge is not running/.test(line))).toBe(true); + }); + + it('answers nothing on a malformed reply, a wrong id, or no reply at all', async () => { + const malformed = await fakeBridge((_request, socket) => socket.write('not json at all\n')); + expect(await runSessionCommand(malformed.socket, 's1', '/x', () => {}, 2_000)).toBeUndefined(); + malformed.close(); + + const silent = await fakeBridge(() => {}); + const logs: string[] = []; + expect(await listSessionCommands(silent.socket, 's1', (line) => logs.push(line), 50)).toBeUndefined(); + expect(logs.some((line) => /did not answer within 50ms/.test(line))).toBe(true); + silent.close(); + }); + + it('forgets about a command name that is not a name', async () => { + const bridge = await fakeBridge((_request, socket) => + socket.write(`${JSON.stringify({ id: 1, ok: true, commands: [{ name: '' }, { name: 'ok' }] })}\n`), + ); + expect((await listSessionCommands(bridge.socket, 's1', () => {}))?.map((command) => command.name)).toEqual(['ok']); + bridge.close(); + }); +}); + +describe('the socket path', () => { + it('is one file per home, and a named pipe on Windows', () => { + expect(commandsSocketPath('/data')).toBe(path.join('/data', 'codedeck', 'dsh-commands.sock')); + const pipe = commandsSocketPath('/data', 'win32'); + expect(pipe.startsWith('\\\\.\\pipe\\codedeck-dsh-commands-')).toBe(true); + // Two homes, two pipes: a machine running two bridges must not have them + // answer each other's questions. + expect(commandsSocketPath('/data', 'win32')).not.toBe(commandsSocketPath('/other', 'win32')); + }); +}); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts index 01b83069..2db8e73e 100644 --- a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts @@ -1,4 +1,5 @@ import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs'; +import { createServer, type Socket } from 'node:net'; import { tmpdir } from 'node:os'; import * as path from 'node:path'; import { describe, expect, it, vi } from 'vitest'; @@ -6,6 +7,7 @@ import { recordingContext, type RecordingContext } from '../../../__tests__/cont import type { StartSession } from '../../../types'; import type { DriverSession } from '../../../driver'; import { DeepSeekDriver } from '../driver'; +import { commandsSocketPath } from '../commands'; import { DeepSeekMcp } from '../mcp'; import { DeepSeekRuntime, dshHomeDir } from '../runtime'; import { FakeHarness } from './fakeHarness'; @@ -100,7 +102,7 @@ describe('DeepSeekDriver.info', () => { providers: true, gsd: true, interrupt: true, - commands: false, + commands: true, plugins: true, mcp: true, tasks: false, @@ -731,6 +733,102 @@ describe('a gateway', () => { }); }); +describe('slash commands', () => { + /** A stand-in for the command plugin: it answers over the socket the driver + * asks on, and records what it was asked. */ + async function commandBridge( + home: string, + answer: (request: Record) => Record, + ): Promise<{ requests: Array>; close: () => void }> { + const requests: Array> = []; + const server = createServer((connection: Socket) => { + connection.setEncoding('utf8'); + let buffered = ''; + connection.on('data', (chunk: string) => { + buffered += chunk; + const end = buffered.indexOf('\n'); + if (end < 0) return; + const request = JSON.parse(buffered.slice(0, end)) as Record; + requests.push(request); + connection.write(`${JSON.stringify({ id: request.id, ...answer(request) })}\n`); + }); + connection.on('error', () => {}); + }); + const socket = commandsSocketPath(home); + mkdirSync(path.dirname(socket), { recursive: true }); + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(socket, resolve); + }); + return { requests, close: () => server.close() }; + } + + const listing = (): Record => ({ + ok: true, + commands: [{ name: 'compact', description: 'Compact the conversation', hint: '[]' }], + }); + + it('lists what the harness has, and runs a typed command rather than prompting', async () => { + const ready = withDriver(); + const bridge = await commandBridge(ready.home, (request) => + request.method === 'list' ? listing() : { ok: true, result: { kind: 'success', text: 'Compacted 12 messages.' } }, + ); + const ctx = await started(ready); + expect(await ready.session.listCommands?.()).toEqual([ + { name: 'compact', description: 'Compact the conversation', argumentHint: '[]' }, + ]); + + ready.session.prompt('/compact keep the decisions'); + await vi.waitFor(() => expect(bridge.requests.some((request) => request.method === 'run')).toBe(true)); + const run = bridge.requests.find((request) => request.method === 'run')!; + expect(run).toMatchObject({ sessionId: 's1', line: '/compact keep the decisions' }); + // The command's own words are in the transcript, and the harness was + // never asked to prompt the model with a slash line. + await vi.waitFor(() => + expect(ctx.entries().some((entry) => entry.entryType === 'text' && /Compacted 12 messages/.test(entry.text))).toBe(true), + ); + expect(ready.harness.requests.some((request) => request.method === 'session/prompt')).toBe(false); + bridge.close(); + }); + + it('reports a command that failed', async () => { + const ready = withDriver(); + const bridge = await commandBridge(ready.home, (request) => + request.method === 'list' ? listing() : { ok: true, result: { kind: 'error', text: 'nothing to compact' } }, + ); + const ctx = await started(ready); + ready.session.prompt('/compact'); + await vi.waitFor(() => + expect(ctx.entries().some((entry) => entry.entryType === 'error' && /nothing to compact/.test(entry.text))).toBe(true), + ); + bridge.close(); + }); + + it('sends a slash line the harness does not have to the model, as text', async () => { + const ready = withDriver(); + const bridge = await commandBridge(ready.home, (request) => (request.method === 'list' ? listing() : { ok: false })); + const ctx = await started(ready); + ready.session.prompt('/etc/hosts is missing'); + await vi.waitFor(() => + expect(ready.harness.requests.some((request) => request.method === 'session/prompt')).toBe(true), + ); + expect(bridge.requests.some((request) => request.method === 'run')).toBe(false); + expect(ctx.entries().length).toBeGreaterThan(0); + bridge.close(); + }); + + it('runs the session normally when nothing answers on the command socket', async () => { + const ready = withDriver(); + const ctx = await started(ready); + expect(await ready.session.listCommands?.()).toEqual([]); + ready.session.prompt('/compact'); + await vi.waitFor(() => + expect(ready.harness.requests.some((request) => request.method === 'session/prompt')).toBe(true), + ); + expect(ctx.entries().some((entry) => entry.entryType === 'error')).toBe(false); + }); +}); + describe('the harness process', () => { it('spawns the installed CLI with the profile and the harness home', async () => { const ready = withDriver(); diff --git a/packages/agent-host/src/drivers/deepseek/commands.ts b/packages/agent-host/src/drivers/deepseek/commands.ts new file mode 100644 index 00000000..03e5dfdc --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/commands.ts @@ -0,0 +1,124 @@ +/** + * The driver's side of the command bridge: what a session's commands are, and + * running one line of them. + * + * The plugin (commandsPlugin.ts) holds the harness's command registry and + * answers over a local socket, so this module is a small client of it: one + * connection per question, line-delimited JSON, and `undefined` for anything + * that does not work out — a harness without the plugin, a plugin that could + * not start, a timeout. Commands are a convenience: a session runs without + * them exactly as it did before, and nothing here may fail one. + */ +import { createHash } from 'node:crypto'; +import * as path from 'node:path'; +import { connect } from 'node:net'; +import { slashCommand } from '../../commands'; +import type { SlashCommand } from '../../types'; + +/** How long one question may take. The plugin answers from memory; a command + * that does real work (a compaction asks a model) takes as long as it takes, + * and the caller's own long timeout is the one that applies. */ +const LIST_TIMEOUT_MS = 5_000; +const RUN_TIMEOUT_MS = 10 * 60_000; + +/** + * Where the plugin listens. A file inside the bridge's home on a POSIX + * machine — one home, one socket — and a named pipe on Windows, named after + * the home so two bridges on one machine do not collide. + */ +export function commandsSocketPath(home: string, platform: NodeJS.Platform = process.platform): string { + if (platform === 'win32') { + const tag = createHash('sha256').update(path.resolve(home)).digest('hex').slice(0, 12); + return `\\\\.\\pipe\\codedeck-dsh-commands-${tag}`; + } + return path.join(home, 'codedeck', 'dsh-commands.sock'); +} + +/** One command as the plugin lists it. */ +interface CommandListing { + name: string; + description?: string; + hint?: string; +} + +/** The plugin's answer. */ +interface Reply { + ok: boolean; + error?: string; + commands?: CommandListing[]; + result?: { kind: string; text?: string }; +} + +/** The commands of one session, or `undefined` when they cannot be read. */ +export async function listSessionCommands( + socket: string, + sessionId: string, + log: (message: string) => void, + timeoutMs: number = LIST_TIMEOUT_MS, +): Promise { + const reply = await ask(socket, { method: 'list', sessionId }, timeoutMs, log); + if (!reply?.ok) return undefined; + return (reply.commands ?? []) + .filter((command) => typeof command.name === 'string' && command.name !== '') + .map((command) => slashCommand(command.name, command.description, command.hint)); +} + +/** What running one command line produced, or `undefined` when it did not run + * (an unknown command, an unreachable plugin, a failure in the handler). */ +export async function runSessionCommand( + socket: string, + sessionId: string, + line: string, + log: (message: string) => void, + timeoutMs: number = RUN_TIMEOUT_MS, +): Promise<{ ok: boolean; text: string } | undefined> { + const reply = await ask(socket, { method: 'run', sessionId, line }, timeoutMs, log); + if (!reply) return undefined; + if (!reply.ok) return { ok: false, text: reply.error ?? 'the command could not be run' }; + return { ok: reply.result?.kind !== 'error', text: reply.result?.text ?? '' }; +} + +/** One question, one answer. Never throws: a socket that is not there (no + * plugin, a harness that has not started) is not an error worth a stack. */ +async function ask( + socket: string, + request: Record, + timeoutMs: number, + log: (message: string) => void, +): Promise { + const id = 1; + return new Promise((resolve) => { + let buffered = ''; + let settled = false; + const connection = connect(socket); + const finish = (reply: Reply | undefined, reason?: string): void => { + if (settled) return; + settled = true; + clearTimeout(timer); + connection.destroy(); + if (reply === undefined && reason !== undefined) log(`[deepseek] ${reason}`); + resolve(reply); + }; + const timer = setTimeout(() => finish(undefined, `the command bridge did not answer within ${timeoutMs}ms`), timeoutMs); + timer.unref?.(); + connection.on('error', (error: NodeJS.ErrnoException) => { + // A missing socket means the plugin is not running: worth one line, not + // a failure. + finish(undefined, error.code === 'ENOENT' || error.code === 'ECONNREFUSED' ? 'the command bridge is not running' : error.message); + }); + connection.on('data', (chunk: Buffer) => { + buffered += chunk.toString(); + const end = buffered.indexOf('\n'); + if (end < 0) return; + try { + const answer = JSON.parse(buffered.slice(0, end)) as Reply & { id?: number }; + if (answer.id !== undefined && answer.id !== id) return; + finish(answer); + } catch { + finish(undefined, 'the command bridge answered something that is not JSON'); + } + }); + connection.on('close', () => finish(undefined, 'the command bridge closed without answering')); + connection.on('connect', () => connection.write(`${JSON.stringify({ id, ...request })}\n`)); + }); +} diff --git a/packages/agent-host/src/drivers/deepseek/commandsPlugin.ts b/packages/agent-host/src/drivers/deepseek/commandsPlugin.ts new file mode 100644 index 00000000..2743941a --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/commandsPlugin.ts @@ -0,0 +1,172 @@ +/** + * The plugin that gives CodeDeck the harness's slash commands. + * + * The harness has commands (`/compact`, `/goal`, and whatever its plugins + * add) in this profile: the registry is mounted. What it has no way to hand + * them to is an ACP client — ACP carries no command list and no way to invoke + * one, and a typed `/name` is prompt text that reaches the model. The + * registry is reachable only from inside the process, through the harness's + * client API, which the automation profile mounts no transport for. + * + * So CodeDeck brings its own transport: this plugin, installed into the + * profile, holds the command service and answers two questions over a local + * socket — what commands this session has, and "run this line". It is ours, + * which is the point: no harness API is patched, and a harness that changes + * under it leaves commands unreported (the driver treats every failure that + * way) rather than breaking a session. + * + * The plugin is a package in the profile's own `node_modules`, written from + * the source below — dsh resolves a row's plugin by name from there, so no + * package manager is involved (and installing one later can prune the + * directory, which is why it is rewritten when the host starts). + */ +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import * as path from 'node:path'; +import { ProfileLayer, type LayerBlock } from './profileLayer'; + +/** The package name the profile's row refers to. */ +export const COMMANDS_PLUGIN = 'codedeck-dsh-commands'; + +/** This plugin's block in the profile's patch layer. */ +const BLOCK: LayerBlock = { + begin: '# --- CodeDeck+ commands: the local socket CodeDeck asks this profile for its slash commands over; everything outside this block is yours ---', + end: '# --- end CodeDeck+ commands ---', +}; + +/** + * The plugin, as it is written to disk. Plain JavaScript: the harness imports + * it as it is, so nothing here may need a build step, and it must not import + * anything of CodeDeck's — the profile has no idea this host exists. + */ +const SOURCE = `import { mkdirSync, rmSync } from 'node:fs'; +import net from 'node:net'; +import path from 'node:path'; + +export const name = 'codedeck-commands'; +export const inject = ['agents', 'commands']; + +/** Answer one connection's line-delimited JSON requests until it closes. */ +export function apply(ctx, config) { + const socket = config?.socket; + if (typeof socket !== 'string' || socket === '') throw new Error('codedeck-commands: config.socket is required'); + const server = net.createServer((connection) => { + connection.setEncoding('utf8'); + let buffered = ''; + connection.on('data', (chunk) => { + buffered += chunk; + for (;;) { + const end = buffered.indexOf('\\n'); + if (end < 0) break; + const line = buffered.slice(0, end); + buffered = buffered.slice(end + 1); + if (line.trim() !== '') void respond(ctx, connection, line); + } + }); + connection.on('error', () => {}); + }); + mkdirSync(path.dirname(socket), { recursive: true }); + rmSync(socket, { force: true }); + server.on('error', (error) => ctx.logger?.warn?.(\`codedeck-commands: \${error.message}\`)); + server.listen(socket); + ctx.effect(() => () => { + server.close(); + rmSync(socket, { force: true }); + }, 'codedeck.commands'); +} + +async function respond(ctx, connection, line) { + const reply = (body) => connection.write(JSON.stringify(body) + '\\n'); + let request; + try { + request = JSON.parse(line); + } catch { + reply({ ok: false, error: 'malformed request' }); + return; + } + const id = request?.id; + try { + const agent = ctx.get('agents')?.get(request?.sessionId); + if (agent === undefined) { + reply({ id, ok: false, error: 'no live session with that id' }); + return; + } + const commands = ctx.get('commands'); + if (request.method === 'list') { + reply({ + id, + ok: true, + commands: commands.list(agent).map((command) => ({ + name: command.name, + description: command.description, + ...(command.input?.hint === undefined ? {} : { hint: command.input.hint }), + })), + }); + return; + } + if (request.method === 'run') { + // An empty attachment list: the phone sends the line, and a command + // that wants files is out of scope for this bridge. + const execution = await commands.execute(agent, String(request.line ?? ''), [], new AbortController().signal); + if (execution === undefined) { + reply({ id, ok: false, error: 'not a command this session has' }); + return; + } + reply({ id, ok: true, result: { kind: execution.result.kind, text: execution.result.text ?? '' } }); + return; + } + reply({ id, ok: false, error: \`unknown method \${String(request.method)}\` }); + } catch (error) { + reply({ id, ok: false, error: error instanceof Error ? error.message : String(error) }); + } +} +`; + +/** The package manifest the loader reads beside the source. */ +function manifest(): string { + return `${JSON.stringify( + { + name: COMMANDS_PLUGIN, + version: '1.0.0', + private: true, + type: 'module', + main: 'index.js', + description: "CodeDeck+'s local command bridge for the harness's automation profile", + }, + null, + 2, + )}\n`; +} + +/** + * Put the plugin where the harness loads it from — its package in the + * profile's `node_modules`, and a row naming it in the profile's patch layer + * — and answer the directory it lives in. + */ +export async function installCommandsPlugin(profileDir: string, socket: string, log: (message: string) => void): Promise { + const dir = path.join(profileDir, 'node_modules', COMMANDS_PLUGIN); + await mkdir(dir, { recursive: true }); + await writeIfChanged(path.join(dir, 'package.json'), manifest()); + await writeIfChanged(path.join(dir, 'index.js'), SOURCE); + await new ProfileLayer(path.join(profileDir, 'cordis.patch.yml'), log).set(BLOCK, rows(socket)); +} + +/** The row that mounts it, with the socket it answers on. */ +function rows(socket: string): string { + return [ + '- insert:', + ' - id: codedeck-commands', + ` name: '${COMMANDS_PLUGIN}'`, + ' config:', + ` socket: ${JSON.stringify(socket)}`, + ].join('\n'); +} + +/** A file the harness may be running: rewritten only when its content is. */ +async function writeIfChanged(file: string, content: string): Promise { + try { + if ((await readFile(file, 'utf8')) === content) return; + } catch { + // Not written yet. + } + await writeFile(file, content); +} diff --git a/packages/agent-host/src/drivers/deepseek/driver.ts b/packages/agent-host/src/drivers/deepseek/driver.ts index faca981f..4c8b75fe 100644 --- a/packages/agent-host/src/drivers/deepseek/driver.ts +++ b/packages/agent-host/src/drivers/deepseek/driver.ts @@ -22,6 +22,7 @@ import type { RequestPermissionRequest, RequestPermissionResponse, SessionConfig import type { Driver, DriverSession, McpManager, PluginManager, SessionContext, SessionMcpState } from '../../driver'; import type { HttpGet } from '../../net'; import { mcpStatus as mcpStatusOf } from '../../mcp'; +import { parseSlashCommand } from '../../commands'; import { PERMISSION_ALLOW, PERMISSION_DENY, now, toolKindOf, toolLocations, toolTitle } from '../../tools'; import type { AgentInfo, @@ -30,11 +31,14 @@ import type { OutputEntry, SessionMcpServer, SessionOption, + SlashCommand, StartSession, UsageData, } from '../../types'; import { deepseekUpdateToEntries, type ToolCallMemory } from './adapter'; import { DEEPSEEK_API_KEY_CREDENTIAL, DEEPSEEK_API_KEY_ENV, DEEPSEEK_BASE_URL_ENV, buildDeepSeekEnv } from './env'; +import { commandsSocketPath, listSessionCommands, runSessionCommand } from './commands'; +import { installCommandsPlugin } from './commandsPlugin'; import { gatewayModelsUrl, syncGatewayCatalog } from './gateway'; import { DSH_LABEL } from './install'; import { DeepSeekMcp } from './mcp'; @@ -188,6 +192,9 @@ export class DeepSeekSession implements DriverSession { /** Whether the phone has been told the session is up: until then its model * travels in the identity info, not as a change. */ private announced = false; + /** The names this session's harness can run, from the last list fetched + * (dropped again on failure, so the next look asks again). */ + private commandNames?: Promise>; private ended = false; /** Prompts run one at a time: ACP refuses a second prompt while one is in * flight, so a message sent meanwhile waits for the turn before it. */ @@ -207,8 +214,11 @@ export class DeepSeekSession implements DriverSession { remove(sessionId: string): void; events(): DeepSeekProcessEvents; }; - /** The endpoint's catalog, being written into the harness's profile. */ - gateway: Promise; + /** The profile as it must be before a harness boots: the endpoint's + * catalog written, the command plugin in place. */ + prepared: Promise; + /** Where the command plugin listens. */ + commandsSocket: string; }, ) { this.cwd = params.cwd; @@ -237,9 +247,9 @@ export class DeepSeekSession implements DriverSession { private async init(): Promise { try { - // The harness reads its catalog as it boots, so the endpoint's own - // models have to be in the profile before a process starts. - await this.deps.gateway; + // The harness reads its catalog and mounts its plugins as it boots, so + // both have to be in the profile before a process starts. + await this.deps.prepared; const process_ = await this.deps.runtime.acquire(this.env, this.deps.live.events()); this.process = process_; // A session closed while its harness was starting keeps nothing: the @@ -474,7 +484,18 @@ export class DeepSeekSession implements DriverSession { this.tail = next.catch(() => {}); } + /** + * A typed `/name` that this session's harness has runs as that command — + * `listCommands` is what makes the phone offer it, and the harness's own + * command registry is what runs it (`/compact` compacts, rather than being + * text the model reads). Anything else is a prompt. + */ private async runPrompt(text: string): Promise { + const command = parseSlashCommand(text); + if (command && (await this.knownCommands()).has(command.name)) { + await this.runCommand(text); + return; + } try { await this.ready; const sessionId = this.nativeId; @@ -489,6 +510,53 @@ export class DeepSeekSession implements DriverSession { } } + /** Run one command line and show what it said. A command is not a turn in + * the harness, but the phone is waiting on one: it is opened and closed + * around it, so the session never sits there looking busy. */ + private async runCommand(line: string): Promise { + await this.ready; + const sessionId = this.nativeId; + if (this.ended || sessionId === undefined) return; + this.ctx.emit({ type: 'turn', state: 'running' }); + const outcome = await runSessionCommand(this.deps.commandsSocket, sessionId, line, this.ctx.log); + if (this.ended) return; + if (outcome === undefined) { + this.deliver({ entryType: 'error', text: `${line} did not run: the command bridge is not answering.`, timestamp: now() }); + } else if (outcome.text !== '') { + this.deliver({ + ...(outcome.ok + ? { entryType: 'text' as const, role: 'agent' as const, text: outcome.text } + : { entryType: 'error' as const, text: outcome.text }), + timestamp: now(), + }); + } else if (!outcome.ok) { + this.deliver({ entryType: 'error', text: `${line} failed.`, timestamp: now() }); + } + this.endTurn(); + } + + /** What this session's harness can run, asked of the harness itself (the + * command plugin) and cached until the session ends. An empty set means + * every slash line is ordinary text, which is what a harness without the + * plugin does. */ + private knownCommands(): Promise> { + this.commandNames ??= this.ready + .then(() => listSessionCommands(this.deps.commandsSocket, this.nativeId ?? '', this.ctx.log)) + .then((commands) => new Set((commands ?? []).map((command) => command.name))) + .catch(() => { + this.commandNames = undefined; + return new Set(); + }); + return this.commandNames; + } + + async listCommands(): Promise { + await this.ready; + const sessionId = this.nativeId; + if (this.ended || sessionId === undefined) return []; + return (await listSessionCommands(this.deps.commandsSocket, sessionId, this.ctx.log)) ?? []; + } + /** The turn is over: the transcript marks it and the phone stops showing * the agent as working. Every ending is one of these — a cancelled turn * and a failed one end the turn too. */ @@ -604,10 +672,15 @@ export class DeepSeekDriver implements Driver { readonly plugins: PluginManager; private unavailable: string | undefined; private models?: Promise<{ models: ModelEntry[]; defaultModel?: string }>; - /** The gateway's catalog is fetched (and written into the harness profile) - * as the host starts, and everything that starts a harness waits for it: - * a process reads its catalog once, as it boots. */ - private gateway: Promise = Promise.resolve(); + /** + * Everything that has to be true of the harness's profile before a process + * starts: the gateway's catalog (a process reads its catalog once, as it + * boots) and the command bridge (a process mounts its plugins once, too). + * Sessions and the model probe wait for it. + */ + private prepared: Promise = Promise.resolve(); + /** Where the command plugin listens. One per harness home. */ + private readonly commandsSocket: string; /** Sessions by the harness's own ids: a process serves several, and it is * this map that ends them all when it goes away. */ private readonly sessions = new Map(); @@ -627,6 +700,7 @@ export class DeepSeekDriver implements Driver { private constructor(private readonly options: DeepSeekDriverOptions) { const profileDir = dshProfileDir(options.home); + this.commandsSocket = commandsSocketPath(options.home); this.mcp = options.mcp ?? new DeepSeekMcp({ profileDir, log: options.log }); this.plugins = new DeepSeekPlugins({ profileDir, @@ -641,10 +715,30 @@ export class DeepSeekDriver implements Driver { // the first session (and the model list the phone asks for before it) // finds it ready instead of waiting on a download. void options.runtime.prepare(); - driver.gateway = driver.syncGateway(); + driver.prepared = driver.prepareProfile(); return driver; } + /** Everything the profile needs before a harness boots (once, at the + * start): the endpoint's catalog, and the row that mounts our command + * plugin. */ + private async prepareProfile(): Promise { + await this.syncGateway(); + await this.installCommands(); + } + + /** + * Put the command plugin in the profile and tell it where to listen. A + * failure only costs commands: it is logged, and the session runs on. + */ + private async installCommands(): Promise { + try { + await installCommandsPlugin(dshProfileDir(this.options.home), this.commandsSocket, this.options.log); + } catch (error) { + this.options.log(`[deepseek] could not install the command bridge: ${error instanceof Error ? error.message : String(error)}`); + } + } + /** * Point the harness at the operator's endpoint, with the models that * endpoint serves (gateway.ts): without this a session on a gateway would @@ -689,7 +783,10 @@ export class DeepSeekDriver implements Driver { providers: true, gsd: true, interrupt: true, - commands: false, + // Through the command plugin this driver installs into the profile + // (commandsPlugin.ts): the harness's registry is reachable from + // inside its process, never over ACP. + commands: true, plugins: true, mcp: true, tasks: false, @@ -709,7 +806,8 @@ export class DeepSeekDriver implements Driver { mcp: this.mcp, baseEnv: this.options.baseEnv ?? process.env, live: this.live, - gateway: this.gateway, + prepared: this.prepared, + commandsSocket: this.commandsSocket, }); } @@ -730,7 +828,7 @@ export class DeepSeekDriver implements Driver { } private async probeModels(): Promise<{ models: ModelEntry[]; defaultModel?: string }> { - await this.gateway; + await this.prepared; const env = buildDeepSeekEnv({}, this.options.baseEnv ?? process.env); const process_ = await this.options.runtime.acquire(env, { ended: () => {} }); try { From f28a3b2c038a3c88d2acbb53839ef44f53a0973b Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:38 +0200 Subject: [PATCH 05/22] feat(bridge): the DeepSeek Harness environment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bridge tells the agent host where each agent's own things live, and the harness is the same shape as the other two: - `deepseekPath` (`--deepseek-path`, `CODEDECK_DEEPSEEK_PATH`) names the harness CLI to run instead of the runtime this build installs on demand. - `CODEDECK_DEEPSEEK_HOME` is the harness's state root (`$DSH_HOME`: its profiles, sessions and credentials), and it follows the bridge's home the way `CODEDECK_AGENT_CACHE` already does — a bridge that moves its data directory must not leave an agent's conversations behind. Both travel to the agent host as its environment, alongside the paths already there; nothing else in the bridge learns that a third agent exists. Co-Authored-By: Claude Code --- config.example.json | 1 + crates/bridge-runtime/src/config.rs | 10 +++++++++- crates/bridge-runtime/src/main.rs | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/config.example.json b/config.example.json index 6486b4a8..9640c337 100644 --- a/config.example.json +++ b/config.example.json @@ -13,6 +13,7 @@ "openCodePort": 4096, "openCodeServerUrl": "http://127.0.0.1:4096", "openCodePath": "/usr/local/bin/opencode", + "deepseekPath": "/usr/local/lib/node_modules/@deepseek-ai/dsh/lib/bin.js", "relayRegisterEndpoint": "https://relay.example.com/admin/allow", "relayRegisterToken": "admin-token", "blossomRegisterEndpoint": "https://blossom.example.com/admin/allow", diff --git a/crates/bridge-runtime/src/config.rs b/crates/bridge-runtime/src/config.rs index f8694634..3a24977a 100644 --- a/crates/bridge-runtime/src/config.rs +++ b/crates/bridge-runtime/src/config.rs @@ -23,6 +23,7 @@ pub struct Flags { pub opencode_server_url: Option, pub opencode_auto_start: bool, pub opencode_path: Option, + pub deepseek_path: Option, pub agent_host: Option, pub service: bool, pub test_mode: bool, @@ -48,6 +49,7 @@ struct FileConfig { open_code_server_url: Option, open_code_auto_start: Option, open_code_path: Option, + deepseek_path: Option, open_code_port: Option, agent_host_path: Option, node_path: Option, @@ -373,11 +375,15 @@ pub fn load(flags: &Flags) -> Result { put("CODEDECK_OPENCODE_AUTO_START", auto_start.then(|| "1".into())); put("CODEDECK_OPENCODE_PATH", flags.opencode_path.clone().or_else(|| env("CODEDECK_OPENCODE_PATH")).or(file.open_code_path)); put("CODEDECK_OPENCODE_PORT", env("CODEDECK_OPENCODE_PORT").or(file.open_code_port.map(|p| p.to_string()))); + put("CODEDECK_DEEPSEEK_PATH", flags.deepseek_path.clone().or_else(|| env("CODEDECK_DEEPSEEK_PATH")).or(file.deepseek_path)); let test_mode = flags.test_mode || env_bool("CODEDECK_TEST_MODE").unwrap_or(false); put("CODEDECK_TEST_MODE", test_mode.then(|| "1".into())); put("CODEDECK_AGENT_HOST_DRIVERS", env("CODEDECK_AGENT_HOST_DRIVERS")); - // Agent binaries the host installs on demand live under the bridge's home. + // Agent binaries the host installs on demand live under the bridge's home, + // and so does the state of an agent that keeps its own (the harness's + // profiles, sessions and credentials). put("CODEDECK_AGENT_CACHE", Some(home.join("agents").to_string_lossy().into_owned())); + put("CODEDECK_DEEPSEEK_HOME", Some(home.join("dsh").to_string_lossy().into_owned())); let direct = direct_config(flags, file.direct)?; @@ -450,6 +456,7 @@ mod tests { open_code_server_url, open_code_auto_start, open_code_path, + deepseek_path, open_code_port, agent_host_path, node_path, @@ -470,6 +477,7 @@ mod tests { ("openCodeServerUrl", open_code_server_url.is_some()), ("openCodeAutoStart", open_code_auto_start.is_some()), ("openCodePath", open_code_path.is_some()), + ("deepseekPath", deepseek_path.is_some()), ("openCodePort", open_code_port.is_some()), ("agentHostPath", agent_host_path.is_some()), ("nodePath", node_path.is_some()), diff --git a/crates/bridge-runtime/src/main.rs b/crates/bridge-runtime/src/main.rs index e3cc12d4..384684a5 100644 --- a/crates/bridge-runtime/src/main.rs +++ b/crates/bridge-runtime/src/main.rs @@ -52,6 +52,9 @@ struct Cli { /// Path to the opencode executable, for auto-start [env: CODEDECK_OPENCODE_PATH] #[arg(long, global = true)] opencode_path: Option, + /// Path to the DeepSeek Harness CLI — its `lib/bin.js`, or an executable of your own — instead of the runtime this build installs [env: CODEDECK_DEEPSEEK_PATH] + #[arg(long, global = true)] + deepseek_path: Option, /// Path to the agent host bundle (main.js) [env: CODEDECK_AGENT_HOST] #[arg(long, global = true)] agent_host: Option, @@ -115,6 +118,7 @@ fn main() -> ExitCode { opencode_server_url: cli.opencode_server_url.clone(), opencode_auto_start: cli.opencode_auto_start, opencode_path: cli.opencode_path.clone(), + deepseek_path: cli.deepseek_path.clone(), agent_host: cli.agent_host.clone(), service: cli.service, test_mode: cli.test_mode, From 536f22d26eb81f7d63fb9ee6dd309a75a752fbaf Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:38 +0200 Subject: [PATCH 06/22] build(docker): bundle the harness runtime with BUNDLE_AGENTS=1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The other two agents bundle as a binary — the Claude Agent SDK's platform package is kept, OpenCode's is copied in — but the DeepSeek Harness is a package tree of some 600 packages and several hundred megabytes: nothing runs until every one of them is laid down, which is exactly what the host's own installer does. So the image does not re-implement that install with a second package manager (whose tree could differ from the pins); it runs the installer. That needs a way to run an install without serving anything, so the host gains one: `CODEDECK_AGENT_HOST_WARM=1` installs the runtimes of the enabled drivers and exits. Each agent's own lookup decides, so an agent already on the machine is left alone, and a startup that fails exits non-zero — a build step that asked for an install cannot report success without it. The tree lands in the cache the host installs into, inside the /data volume, which Docker fills from the image when it is first created. The container's own wiring gains what a third agent needs: the DeepSeek key as a compose secret (like the other two credentials, read by the entrypoint), `DEEPSEEK_BASE_URL` for a relay or gateway, and `CODEDECK_DEEPSEEK_PATH` for an operator's own CLI. `.env.example` is regrouped around that: secrets, git, the three agents, the bridge, extras. Co-Authored-By: Claude Code --- .env.example | 99 ++++++++++++++++++++------------- docker-compose.yml | 12 ++++ docker/Dockerfile | 20 ++++++- docker/entrypoint.sh | 3 +- packages/agent-host/src/main.ts | 75 ++++++++++++++++++++++++- 5 files changed, 165 insertions(+), 44 deletions(-) diff --git a/.env.example b/.env.example index 68f1ec6f..fcab563f 100644 --- a/.env.example +++ b/.env.example @@ -1,20 +1,63 @@ -# Docker Compose reads this file: the container's secrets and Git setup, and -# optionally the bridge's most common settings. Every bridge setting can also -# live in ./data/config.json (created on first start; config.example.json -# shows every key). A variable set here wins over config.json; leave it -# unset to use the file's value. +# CodeDeck+ container settings (docker compose reads this file). +# +# Almost nothing here is required: the bridge writes its own configuration on +# first start (./data/config.json, and config.example.json in the repository +# shows every key it knows). What you set here wins over that file, so this is +# the place for the few things you want in the environment — the secrets, your +# git identity, and whichever agent you configure beyond its defaults. -# Compose exposes these two to the container as secrets. +# --------------------------------- secrets ---------------------------------- +# Compose mounts these into the container as files under /run/secrets, so they +# never show up in `docker inspect`; the entrypoint reads them into the +# variables the agents expect. Every one of them is optional — leave a line +# empty and set that credential on the phone instead. + +# Claude Code: a long-lived token from `claude setup-token`. CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat... + +# GitHub: for git and the `gh` CLI inside sessions. GITHUB_TOKEN=ghp_... -# Git identity for commits made in sessions. +# The DeepSeek Harness. +DEEPSEEK_API_KEY= + +# ----------------------------------- git ------------------------------------ +# Identity for the commits sessions make, and repositories cloned at start +# (each into /data/workspaces/). GIT_USER=your_username GIT_EMAIL=your_email@example.com -# Comma-separated repos, each cloned under /data/workspaces/. GIT_REPO=https://github.com/your-username/your-repo.git -# --- Bridge settings (optional; or set them in data/config.json) --- +# ---------------------------------- agents ---------------------------------- +# Claude Code, OpenCode and the DeepSeek Harness all run out of the box; these +# configure them further. docs/OPENCODE.md and docs/DEEPSEEK.md have the long +# version. + +# Claude Code through a gateway or router (e.g. claude-code-router) instead of +# Anthropic directly: +# ANTHROPIC_BASE_URL=http://your-router-host:port +# For a router that exposes several providers behind one /v1/models: +# CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 + +# OpenCode: an external `opencode serve`... +# CODEDECK_OPENCODE_SERVER_URL=http://127.0.0.1:4096 +# ...or one the bridge starts and manages, optionally on a fixed port. +# CODEDECK_OPENCODE_AUTO_START=1 +# CODEDECK_OPENCODE_PORT=4096 + +# DeepSeek Harness: a DeepSeek-compatible relay or gateway, for sessions that +# are not bound to a provider profile of their own: +# DEEPSEEK_BASE_URL=http://your-router-host:port +# A harness CLI of your own, instead of the one installed on first use (its +# lib/bin.js, or an executable): +# CODEDECK_DEEPSEEK_PATH= + +# Agent runtimes are installed into /data/agents on first use, at the version +# the lockfile pins. Set this to bake them into the image instead, for a host +# without internet access (it applies at the next build). +# CODEDECK_BUNDLE_AGENTS=1 + +# -------------------------------- the bridge -------------------------------- # The name the phone shows for this machine. # CODEDECK_MACHINE_NAME=workstation # Comma-separated relay URLs. @@ -22,37 +65,15 @@ GIT_REPO=https://github.com/your-username/your-repo.git # SOCKS5 proxy for all relay connections: your own Tor daemon, or the bundled # `codedeck-tor` service (docker-compose.yml, `tor` profile). # CODEDECK_TOR_PROXY_URL=socks5h://codedeck-tor:9050 -# OpenCode, a second agent (docs/OPENCODE.md): an external `opencode serve`... -# CODEDECK_OPENCODE_SERVER_URL=http://127.0.0.1:4096 -# ...or one the bridge starts and manages, optionally on a fixed port. -# CODEDECK_OPENCODE_AUTO_START=1 -# CODEDECK_OPENCODE_PORT=4096 -# The direct link (on by default in config.json): where it listens, and the -# host's addresses phones dial (inside the container the bridge cannot see -# them; they can also be added on the phone). +# The direct link (on by default): where it listens, and the addresses phones +# dial. Inside the container the bridge cannot see the host's addresses, so +# set them here (or add them on the phone). # CODEDECK_DIRECT_LISTEN=0.0.0.0:7447 # CODEDECK_DIRECT_ENDPOINTS=wss://192.168.1.20:7447 -# --- LLM gateway / router (optional — leave unset to talk to Anthropic directly) --- -# Point the Claude Code CLI at a router (e.g. claude-code-router) instead of Anthropic. -# ANTHROPIC_BASE_URL=http://your-router-host:port - -# Needed for a router that exposes multiple providers behind one /v1/models -# (ids like "/") — works around a confirmed SDK gateway- -# discovery bug on cold bridge start; see ENABLE_GATEWAY_MODEL_DISCOVERY's doc -# comment in packages/agent-host/src/drivers/claude/facade.ts. -# CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 - -# --- Agent binaries --- -# Claude Code (and OpenCode, with auto-start) are installed into /data/agents -# on first use, pinned to the lockfile. Set to 1 to bake them into the image -# instead, for a host without internet access (applies at the next build). -# CODEDECK_BUNDLE_AGENTS=1 - -# --- GSD (github.com/open-gsd/gsd-core, optional planning workflow) --- -# Off by default: installing gsd-core is a plain npm-registry call the -# entrypoint would otherwise make on every container boot, and outside the -# bridge's Tor proxy. Set to 1 to have the container install it globally for -# Claude on startup. A missing GSD install never blocks a session, it just -# leaves the phone's GSD stage strip empty. +# ---------------------------------- extras ---------------------------------- +# Install gsd-core for Claude at container start (github.com/open-gsd/gsd-core). +# Off by default: it is an npm-registry call on every boot, outside the Tor +# proxy. A missing GSD never blocks a session — it only leaves the phone's GSD +# strip empty. # CODEDECK_GSD_AUTO_INSTALL=1 diff --git a/docker-compose.yml b/docker-compose.yml index 359249a9..1173e510 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,10 @@ services: # Claude Code's own settings, for an LLM gateway / router. - ANTHROPIC_BASE_URL=${ANTHROPIC_BASE_URL:-} - CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=${CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY:-} + # The DeepSeek Harness's endpoint — a DeepSeek-compatible relay or + # gateway, unless a session is bound to a provider profile. Its key + # travels as a secret, below. + - DEEPSEEK_BASE_URL=${DEEPSEEK_BASE_URL:-} # The bridge's own settings live in ./data/config.json (created on # first start; config.example.json shows every key). The common ones # can also be set in .env: a variable set there wins over the file, @@ -35,6 +39,7 @@ services: - CODEDECK_OPENCODE_SERVER_URL=${CODEDECK_OPENCODE_SERVER_URL:-} - CODEDECK_OPENCODE_AUTO_START=${CODEDECK_OPENCODE_AUTO_START:-} - CODEDECK_OPENCODE_PORT=${CODEDECK_OPENCODE_PORT:-} + - CODEDECK_DEEPSEEK_PATH=${CODEDECK_DEEPSEEK_PATH:-} - CODEDECK_DIRECT_LISTEN=${CODEDECK_DIRECT_LISTEN:-} - CODEDECK_DIRECT_ENDPOINTS=${CODEDECK_DIRECT_ENDPOINTS:-} # The direct link: phones on your network (or VPN) reach the bridge here @@ -52,6 +57,11 @@ services: uid: "1000" gid: "1000" mode: 0440 + - source: deepseek_api_key + target: deepseek_api_key + uid: "1000" + gid: "1000" + mode: 0440 volumes: - ./data:/data @@ -72,6 +82,8 @@ secrets: environment: CLAUDE_CODE_OAUTH_TOKEN github_token: environment: GITHUB_TOKEN + deepseek_api_key: + environment: DEEPSEEK_API_KEY networks: codedeck-net: diff --git a/docker/Dockerfile b/docker/Dockerfile index cb6d673d..e119f98a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -23,7 +23,9 @@ # # BUNDLE_AGENTS=1 builds a complete image for hosts without internet access: # the Agent SDK's platform package stays in (so /usr/local/bin/claude is a -# symlink to its binary, version-locked to the SDK) and OpenCode is copied in. +# symlink to its binary, version-locked to the SDK), OpenCode is copied in, +# and the DeepSeek Harness's runtime — a package tree, not one binary, so the +# host's own installer fetches it — is laid down in the cache it installs into. ARG BUNDLE_AGENTS=0 ARG NODE_IMAGE=node:24.20.0-slim@sha256:ba849c60be29959425b8734d57b8b4b7d56f98edd9504c9af091d5281095a71e @@ -75,6 +77,17 @@ RUN --mount=type=cache,id=codedeck-pnpm-store,target=/root/.local/share/pnpm/sto else \ rm -rf /deploy/node_modules/.pnpm/@anthropic-ai+claude-agent-sdk-*@*; \ fi +# The DeepSeek Harness runs from a whole package tree rather than one binary, +# so it cannot be copied in the way OpenCode is: the host's own installer — +# the code that would fetch it on a machine with internet — lays it down here, +# into the cache layout the host looks in, at the version and sha512 +# pnpm-lock.yaml pins. An image built without BUNDLE_AGENTS ships nothing of +# it and installs it on first use. +RUN mkdir -p /agents \ + && if [ "$BUNDLE_AGENTS" = 1 ]; then \ + CODEDECK_AGENT_HOST_WARM=1 CODEDECK_AGENT_HOST_DRIVERS=deepseek-harness \ + CODEDECK_AGENT_CACHE=/agents node /deploy/dist/main.js; \ + fi # --------------------------------------------------------------------------- FROM ${NODE_IMAGE} AS opencode @@ -147,6 +160,11 @@ RUN if getent group ${GROUP_ID}; then groupmod -n codedeck $(getent group ${GROU # The binary finds the agent host at agent-host/ beside it. COPY --from=opencode /out/ /usr/local/bin/ COPY --from=agenthost /deploy /app/agent-host +# Agents bundled at build time land in the cache the host installs into. That +# cache lives in the /data volume, which Docker fills from the image when the +# volume is FIRST created — so a bundle reaches a new deployment, and a volume +# that already exists keeps what it has (the agents already installed in it). +COPY --from=agenthost /agents/ /data/agents/ COPY --from=bridge /codedeck-bridge /app/codedeck-bridge COPY --chmod=0755 docker/entrypoint.sh /app/entrypoint.sh COPY --chmod=0755 docker/git-credential-codedeck-secret /usr/local/bin/git-credential-codedeck-secret diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 91aacced..192f9add 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -24,7 +24,8 @@ read_secret() { CLAUDE_CODE_OAUTH_TOKEN=$(read_secret claude_code_oauth_token CLAUDE_CODE_OAUTH_TOKEN) GITHUB_TOKEN=$(read_secret github_token GITHUB_TOKEN) -export CLAUDE_CODE_OAUTH_TOKEN +DEEPSEEK_API_KEY=$(read_secret deepseek_api_key DEEPSEEK_API_KEY) +export CLAUDE_CODE_OAUTH_TOKEN DEEPSEEK_API_KEY # /data is the only volume this image persists — the Dockerfile points # XDG_CONFIG_HOME/XDG_DATA_HOME there so OpenCode's own config/auth (e.g. a diff --git a/packages/agent-host/src/main.ts b/packages/agent-host/src/main.ts index df1a099a..a4248a4d 100644 --- a/packages/agent-host/src/main.ts +++ b/packages/agent-host/src/main.ts @@ -18,6 +18,9 @@ * unset = the runtime this build pins * CODEDECK_DEEPSEEK_HOME `$DSH_HOME`, the harness's state root * (the bridge passes `/dsh`) + * CODEDECK_AGENT_HOST_WARM=1 install the enabled agents' runtimes and + * exit, without serving anything (an image + * build, or a first-run warm-up) * CODEDECK_AGENT_CACHE where agent binaries installed on demand live * (the bridge passes `/agents`; `bin/` * in it links each one under a stable name) @@ -38,6 +41,7 @@ import { DeepSeekRuntime, dshHomeDir, dshProfileDir } from './drivers/deepseek/r import { FakeDriver } from './drivers/fake'; import { OpenCodeDriver } from './drivers/opencode/driver'; import { openCodeBinary } from './drivers/opencode/install'; +import { resolveOpenCodePath } from './drivers/opencode/server'; import { isFile } from './executable'; import { AgentHost, type HostIo } from './host'; import { httpGet, httpPost } from './net'; @@ -55,11 +59,66 @@ const log = (message: string): void => { process.on('uncaughtException', (err) => log(`[agent-host] uncaught exception: ${err instanceof Error ? err.stack : String(err)}`)); process.on('unhandledRejection', (err) => log(`[agent-host] unhandled rejection: ${err instanceof Error ? err.stack : String(err)}`)); -async function loadDrivers(env: NodeJS.ProcessEnv): Promise { - const names = (env.CODEDECK_AGENT_HOST_DRIVERS ?? 'claude-code,opencode,deepseek-harness') +/** The drivers this host runs, in the order they were asked for. */ +function driverNames(env: NodeJS.ProcessEnv): string[] { + return (env.CODEDECK_AGENT_HOST_DRIVERS ?? 'claude-code,opencode,deepseek-harness') .split(',') .map((n) => n.trim()) .filter(Boolean); +} + +/** + * `CODEDECK_AGENT_HOST_WARM=1` with a driver list: fetch what those agents + * run from (the same installs a first session would trigger) and exit. An + * image built with BUNDLE_AGENTS=1 runs this at build time, so a host with no + * internet has every runtime already; an operator can run it to have the + * first session start without waiting for a download. + * + * Nothing is installed twice: each agent's own lookup decides, so an agent + * already on the machine (or bundled beside the host) is left alone. + */ +async function warmAgents(env: NodeJS.ProcessEnv, names: string[], cacheDir: string): Promise { + const cache = { cacheDir, registry: registryUrl(env), log }; + for (const name of names) { + switch (name) { + case 'claude-code': { + const found = env.CODEDECK_TEST_MODE === '1' ? 'test mode' : (resolveClaudeExecutable(undefined, env) ?? bundledClaudeExecutable()); + if (found) { + log(`[warm] Claude Code is already available (${found})`); + break; + } + log(`[warm] Claude Code: ${await installBinary(claudeBinary(), cache)}`); + break; + } + case 'opencode': { + const found = resolveOpenCodePath(undefined, env); + if (found) { + log(`[warm] OpenCode is already available (${found})`); + break; + } + log(`[warm] OpenCode: ${await installBinary(openCodeBinary(), cache)}`); + break; + } + case 'deepseek-harness': { + const explicit = env.CODEDECK_DEEPSEEK_PATH?.trim(); + if (explicit) { + log(`[warm] the DeepSeek Harness runs the CLI at ${explicit}`); + break; + } + log(`[warm] DeepSeek Harness: ${await installDshTree(cache)}`); + break; + } + case 'fake': + break; + default: + log(`[warm] unknown driver '${name}' — skipped`); + } + } + log('[warm] every agent this host was asked for is installed'); +} + +async function loadDrivers(env: NodeJS.ProcessEnv): Promise { + const names = driverNames(env); const drivers: Driver[] = []; const cacheDir = agentCacheDir(env); const install = (binary: PackagedBinary) => (): Promise => @@ -147,6 +206,13 @@ async function loadDrivers(env: NodeJS.ProcessEnv): Promise { } async function main(): Promise { + const warm = process.env.CODEDECK_AGENT_HOST_WARM?.trim(); + if (warm === '1' || warm === 'true') { + // A build step or a first-run warm-up: install, then exit without ever + // reading stdin. + await warmAgents(process.env, driverNames(process.env), agentCacheDir(process.env)); + return; + } const io: HostIo = { write: (line) => { process.stdout.write(`${line}\n`); @@ -164,4 +230,7 @@ async function main(): Promise { }); } -void main(); +main().catch((error: unknown) => { + log(`[agent-host] could not start: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`); + process.exitCode = 1; +}); From 54295ee32cca16801d63a0a36b46b5951be00caa Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:38 +0200 Subject: [PATCH 07/22] docs: the DeepSeek Harness agent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `DEEPSEEK.md` covers what an operator needs: the key, the harness's own home under the bridge's, models and reasoning as the harness reports them, gateways through a provider profile or the bridge's own endpoint, slash commands and the plugin that brings them, the MCP servers and plugins it keeps in its own profile, what the automation surface does not have, and the offline and container notes. The pages that enumerate the agents now name all three — the README, the bridge's install and config sections, and the protocol's MCP notes, where the harness joins Claude Code, and the driver-adding guide. Co-Authored-By: Claude Code --- .claude/CLAUDE.md | 6 +- README.md | 8 +- docs/BRIDGE.md | 37 +++++--- docs/DEEPSEEK.md | 216 ++++++++++++++++++++++++++++++++++++++++++++++ docs/PROTOCOL.md | 6 +- 5 files changed, 254 insertions(+), 19 deletions(-) create mode 100644 docs/DEEPSEEK.md diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index ca79c5df..ffcf6c74 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -5,7 +5,7 @@ Guidance for Claude Code (claude.ai/code) when working in this repository. ## Project identity CodeDeck+ is a community-maintained continuation of CodeDeck Next: run coding -agents (Claude Code, OpenCode, …) on a laptop/VPS ("the bridge") and drive them +agents (Claude Code, OpenCode, DeepSeek Harness) on a laptop/VPS ("the bridge") and drive them from an Android phone over end-to-end-encrypted Nostr. It started as a merge of the two upstream projects (`codedeck-next-bridge`, `codedeck-next-mobile`) and has since been rebuilt: the protocol, the bridge and the phone's core are Rust; @@ -218,8 +218,8 @@ crates/protocol the phone wire: messages, total codec, kinds, ranges, there by default — keep them consistent. Neither ships the agents' own binaries: the agent host installs them on demand at the version and sha512 pnpm-lock.yaml pins (the image into the `/data` volume); only an image built - with `BUNDLE_AGENTS=1` bakes them in. Never add a global Claude Code or - OpenCode install — the version must follow the lockfile. + with `BUNDLE_AGENTS=1` bakes them in. Never add a global Claude Code, + OpenCode or DeepSeek Harness install — the version must follow the lockfile. ## History note diff --git a/README.md b/README.md index 639d7960..88be1db4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # CodeDeck+ -**Control coding agents (Claude Code, OpenCode) running on your laptop or VPS +**Control coding agents (Claude Code, OpenCode, DeepSeek Harness) running on your laptop or VPS from your Android phone, over end-to-end encrypted Nostr.** No accounts and no CodeDeck server: the phone and the bridge pair by scanning a QR code and talk through ordinary Nostr relays — public ones, or your own. @@ -38,8 +38,9 @@ Pairing is a one-time QR scan; it survives restarts on both ends. - Transcripts that survive restarts and offline gaps (ranged sync) - Per-session mode, model and effort, plus custom AI provider profiles (Kimi K3, OpenRouter, any Anthropic-compatible endpoint) -- Claude Code and [OpenCode](https://opencode.ai), chosen per session — the - protocol is agent-neutral, so another agent is one driver away +- Claude Code, [OpenCode](https://opencode.ai) and the + [DeepSeek Harness](https://www.deepseek.com/en/harness/), chosen per session + — the protocol is agent-neutral, so another agent is one driver away ([`docs/PROTOCOL.md`](docs/PROTOCOL.md#adding-an-agent)) - File attachments (photos or any file), and project/folder management on every paired bridge - NIP-42 `AUTH` relays, and Tor on both ends (see below) @@ -223,6 +224,7 @@ the full runbook. - [`docs/CLIENT.md`](docs/CLIENT.md) — the phone: the Rust client core, the Android app, transport rules, building the APK - [`docs/PROTOCOL.md`](docs/PROTOCOL.md) — the v11 wire contract, the driver protocol, adding an agent - [`docs/OPENCODE.md`](docs/OPENCODE.md) — the optional OpenCode session backend: external server vs. bridge-managed, config, Docker setup +- [`docs/DEEPSEEK.md`](docs/DEEPSEEK.md) — the DeepSeek Harness backend: API key, models and reasoning, gateways, MCP servers and plugins - [`.claude/skills/cut-release/SKILL.md`](.claude/skills/cut-release/SKILL.md) — the release runbook ## Upstream diff --git a/docs/BRIDGE.md b/docs/BRIDGE.md index 6d5bfa4e..b3aa57a1 100644 --- a/docs/BRIDGE.md +++ b/docs/BRIDGE.md @@ -1,8 +1,8 @@ # The bridge -The bridge runs coding agents (Claude Code, and optionally OpenCode) on your -laptop or VPS and serves them to the CodeDeck+ Android app over end-to-end -encrypted Nostr (NIP-44). No accounts and no central server: the phone and the +The bridge runs coding agents (Claude Code, OpenCode and the DeepSeek +Harness) on your laptop or VPS and serves them to the CodeDeck+ Android app +over end-to-end encrypted Nostr (NIP-44). No accounts and no central server: the phone and the bridge pair by scanning a QR code. It is one binary, `codedeck-bridge` (Rust), plus its **agent host** @@ -47,7 +47,9 @@ Upgrading is extracting the new archive over the old one. Task Scheduler. Under WSL2, the Linux archive works as on Linux. Claude Code authenticates with `ANTHROPIC_API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN`, -an existing `claude` login, or a key set from the phone. +an existing `claude` login, or a key set from the phone. The DeepSeek Harness +uses `DEEPSEEK_API_KEY` — or a session's provider profile, for a gateway — and +keeps its own state under `/dsh`; see [`DEEPSEEK.md`](DEEPSEEK.md). ### Agent binaries @@ -60,17 +62,27 @@ installs it on first use: the SDK is locked to. - **OpenCode**: when auto-start is on (`CODEDECK_OPENCODE_AUTO_START=1`) and no `opencode` is found; a server URL instead needs nothing installed. +- **The DeepSeek Harness**: always, unless `CODEDECK_DEEPSEEK_PATH` names a + CLI to use instead. It is not one binary but a package tree, so this is the + bigger download by far — some 600 packages, a few hundred MB. The download starts in the background as the bridge starts, so the agents are listed at once and a first session waits for it (about 100 MB for Claude -Code, 60 MB for OpenCode). It comes from the npm registry and is checked -against the sha512 in this build's `pnpm-lock.yaml`; a mismatch is refused. -Binaries live in `/agents/`, one version per package; an upgrade that -moves the pin installs the new one and removes the old. A failed download -(no network) is retried by the next session. +Code, 60 MB for OpenCode, and a couple of minutes for the harness on a normal +connection). It comes from the npm registry and is checked against the sha512 +in this build's `pnpm-lock.yaml`; a mismatch is refused. Binaries live in +`/agents/`, one version per package, and the harness's tree in +`/agents/@deepseek-ai+dsh@/`; an upgrade that moves the pin +installs the new one and removes the old. A failed download (no network) is +retried by the next session. + +`CODEDECK_AGENT_HOST_WARM=1` installs everything the enabled agents need and +exits, without serving: a first-run warm-up, and what the image's bundled +build runs at build time. - Offline machines: install `claude` (or `opencode`) yourself and it is used - as is, or copy an `agents/` directory from another machine. + as is, point `CODEDECK_DEEPSEEK_PATH` at a harness you installed, or copy an + `agents/` directory from another machine. - A mirror: `CODEDECK_NPM_REGISTRY=https://…` (the sha512 still applies). - An HTTP(S) proxy for the download: Node reads `HTTPS_PROXY` only with `NODE_USE_ENV_PROXY=1` set. The Tor proxy is for relay traffic only and is @@ -82,7 +94,9 @@ them until the pin moves. `/data/agents/bin` holds each one under a stable name and is on the container's `PATH`, so `docker compose exec codedeck-bridge claude …` (or `opencode …`) works once it is installed. For a host without internet access, build with `CODEDECK_BUNDLE_AGENTS=1` in `.env`: the image -then carries both agents, as before. +then carries all three agents. (The harness lands in `/data/agents`, which +Docker fills from the image when the volume is first created; a volume that +already exists keeps the agents already in it.) The links in `/agents/bin` are for people. The agent host never uses them to find an agent, because after an upgrade they may still point at the @@ -122,6 +136,7 @@ you need. | `torProxyUrl` | `CODEDECK_TOR_PROXY_URL` / `--tor-proxy` | SOCKS5 proxy (e.g. `socks5h://127.0.0.1:9050`) for the relay connections | | `claudePath` | `CODEDECK_CLAUDE_PATH` / `--claude-path` | A specific `claude` binary instead of the bundled one | | `openCodeServerUrl`, `openCodeAutoStart`, `openCodePath`, `openCodePort` | `CODEDECK_OPENCODE_*` | The optional OpenCode agent — see [`OPENCODE.md`](OPENCODE.md) | +| `deepseekPath` | `CODEDECK_DEEPSEEK_PATH` / `--deepseek-path` | A DeepSeek Harness CLI to run instead of the one this build installs — see [`DEEPSEEK.md`](DEEPSEEK.md) | | `relayRegisterEndpoint` / `relayRegisterToken` | `CODEDECK_RELAY_REGISTER_ENDPOINT` / `..._TOKEN` | Register paired phones on a write-restricted relay (https only — the token is an admin secret) | | `blossomRegisterEndpoint` / `blossomRegisterToken` | `CODEDECK_BLOSSOM_REGISTER_ENDPOINT` / `..._TOKEN` | The same for a Blossom server, so a phone's attachments do not fall back to relay chunking | | `transcriptKeepLast` | `CODEDECK_TRANSCRIPT_KEEP_LAST` | Entries kept per session transcript (default 5000; 0 keeps all) | diff --git a/docs/DEEPSEEK.md b/docs/DEEPSEEK.md new file mode 100644 index 00000000..7ea95d32 --- /dev/null +++ b/docs/DEEPSEEK.md @@ -0,0 +1,216 @@ +# DeepSeek Harness backend + +CodeDeck+ runs sessions on any agent its agent host has a driver for: Claude +Code, [OpenCode](https://opencode.ai), and the +[DeepSeek Harness](https://www.deepseek.com/en/harness/) (`dsh`). A phone picks +the agent per session from the "New session" sheet, which lists what the +bridge advertises in its heartbeat. The DeepSeek Harness is on by default and +needs one thing: a DeepSeek API key (set from the phone, or exported on the +bridge). + +The driver (`packages/agent-host/src/drivers/deepseek/`) drives the harness's +`acp` profile — `dsh --profile acp` — which is the only interface it exposes +that has everything a remote client needs: prompts, cancellation, one-shot +permission asks, and a model/reasoning choice that can change mid-session. +Its `sdk` profile has none of the last three and `headless` is one-shot. + +## Getting it running + +Nothing to install by hand. The harness is a Node program — a few hundred MB +of npm packages, with no single binary to ship — so the agent host installs +it on demand, exactly like the other agents' binaries: at the version and +sha512 this build pins in `pnpm-lock.yaml`, into `/agents/`, from the +npm registry (or `CODEDECK_NPM_REGISTRY`). The download starts as the bridge +starts; a first session waits for it. An operator who already has a harness +can point the bridge at it instead: + +```bash +codedeck-bridge run --deepseek-path /usr/local/lib/node_modules/@deepseek-ai/dsh/lib/bin.js +# or: CODEDECK_DEEPSEEK_PATH=… codedeck-bridge run +# or in config.json: { "deepseekPath": "…" } +``` + +The path is the harness's CLI entry point (`…/@deepseek-ai/dsh/lib/bin.js`) or +an executable of your own; the host runs a `.js` entry point with its own +`node`. + +The key is a **DeepSeek API key**: set it from the phone (Agents → DeepSeek +Harness → credential), or export `DEEPSEEK_API_KEY` on the bridge — an +exported key wins over a stored one and the phone cannot clear it. The key is +verified against `https://api.deepseek.com/models` when you save it (a +refusal means the key is not accepted; a network error means nothing was +claimed either way). + +## Its own home + +The harness keeps everything under `$DSH_HOME`: its profiles (the `acp` +profile's configuration), the sessions a bridge can resume, and its +credentials. CodeDeck+ sets it to `/dsh` (`/data/dsh` in the container +image), following the bridge's home so a bridge that moves its data directory +does not leave an agent's conversations behind. `CODEDECK_DEEPSEEK_HOME` +overrides it. It is shared by every session, whatever provider profile a +session is bound to. + +## Models and reasoning + +The model list and the reasoning levels come from the harness itself, read +from a short-lived probe session when the phone asks for models; nothing is +hardcoded here, so a deployment that replaces the harness's model catalog +sees its own models in the phone. Two things follow from the harness's own +shape: + +- A model's value is the harness's own opaque selector (it names a provider + and a model together), not a friendly id. The phone shows the model's + label; what it stores and sends back is that value. A session started with + a model the running catalog does not have is refused, with the reason. +- The reasoning levels are `off`, `low`, `high` and `max` (the DeepSeek + route's own), and a model without reasoning support has none — a session + started with a level such a model does not have reports that rather than + refusing to start. + +The session header shows the model the harness actually resolved, and how +full the context is (the harness reports its own usage). + +## Gateways and other providers + +Two ways to run sessions somewhere other than DeepSeek's own API, and both end +up at the same place: the harness's DeepSeek route pointed at that endpoint, +with `DEEPSEEK_BASE_URL` and `DEEPSEEK_API_KEY`. + +**The bridge's own endpoint** (every session that does not name a profile of +its own). Set both in the bridge's environment — for the container, `.env`: + +```bash +DEEPSEEK_BASE_URL=http://gateway.example:3458 # a DeepSeek-compatible relay or router +DEEPSEEK_API_KEY=… # travelled as a compose secret, not an env var +``` + +Then the endpoint's *own* model list becomes the harness's catalog: as the +host starts, CodeDeck asks it for its models (`/v1/models`, on the same +root the harness itself posts `/messages` to) and writes that list into the +harness's profile, where the harness documents its catalog as replaceable. So +the phone offers exactly what the gateway serves — for a router whose ids name +their channel (`Z.ai (Global) - Coding Plan/glm-5.3-flash`), the channel is +shown as the model's provider, the way Claude Code's gateway models are. The +model a session starts on moves with the list, since the harness always +offers the model it is on: a DeepSeek default the gateway does not serve would +otherwise appear there as a model nobody can run. + +The key is checked against that same list when you save it (a refusal is shown +as rejected; an endpoint that cannot be reached claims nothing). An endpoint +that does not answer leaves the harness's own catalog alone — its three +DeepSeek models — and nothing is guessed; clearing `DEEPSEEK_BASE_URL` takes +CodeDeck's row back out again. + +**A provider profile on the phone** (one session). Same idea, per session: the +profile's endpoint and token reach that session's harness instead of the +operator's, and the profile's models are what the phone offers. Pick this when +one bridge should run, say, a native session and a gateway session side by +side — a session's provider binding applies to its whole process, so the two +do not mix. + +Both go through the same rules as the other agents: the base URL must be +`https://` (plain `http://` only to localhost, 127.0.0.1 or `[::1]`), a token +is required, and the harness's whole `DEEPSEEK_*` namespace is dropped from +the environment of a bound session — an operator's native key must not be +billed for a session bound somewhere else. `DSH_HOME` survives: where the +harness keeps its state is not routing. + +One limit of the harness's own design: a session bound to an endpoint is +reached through its DeepSeek route, so that endpoint has to speak that API. +A gateway of another shape (OpenAI-completions, Anthropic messages) is +configured in the harness's own profile — dsh's configuration to write, not +this driver's. + +## Slash commands + +The harness has commands — `/compact`, `/goal`, `/feedback`, `/plan`, +`/permission`, and whatever its plugins add — and this driver brings them to +the phone, which is not something its automation surface does on its own: ACP +carries no command list and no way to invoke one, and the harness keeps +commands for its own UI modules. A typed `/name` would otherwise be prompt +text that reaches the model. + +So CodeDeck installs one small plugin of its own into the profile +(`codedeck-dsh-commands`, mounted by a row in the profile's patch layer) that +holds the harness's command registry and answers two questions over a local +socket: what this session can run, and "run this line". The phone lists what +it says, and a typed `/name` runs there instead of being sent to the model — +the command's own words come back as the agent's answer (`/plan` answers with +"Plan mode on", `/compact` with what it compacted). + +The socket is a file in the bridge's home (`/data/codedeck/dsh-commands.sock`, +a named pipe on Windows, named after the home). Nothing else about the profile +changes, and the plugin is harmless if the harness moves under it: a list that +cannot be read means the phone offers no commands and a slash line is ordinary +text again — a session never fails because of it. A command that takes +attachments has none to take: this bridge sends the line alone. + +## MCP servers + +The harness reads its MCP servers from the `acp` profile's own patch layer, +`/dsh/profiles/acp/cordis.patch.yml` — the file the harness documents as +the user's. This driver owns one delimited block of it (the MCP screen writes +there); everything around the block, comments included, is preserved. A +server is a `dsh-mcp-client` row reaching it over **stdio** or **streamable +HTTP** (no SSE), and switching one off leaves its row in place with a disable +row after it, so it can be switched back on. + +The servers are attached when the harness starts, which is why a session +shows them but cannot switch one: change the list on the MCP screen and the +next harness process uses it (the session screen says `pending` for a server +the running harness has not loaded). Failures are the harness's own — it logs +them on stderr, which is where the session screen's `failed` status and its +message come from; a server that cannot start does not stop the session. + +## Plugins + +A plugin is an npm package installed into the profile and mounted as a patch +layer. The harness's own CLI does the work — `dsh plugin --profile acp add +`, which runs pnpm in the profile directory — so its pnpm, its lock +and its version-compatibility gate are the ones that apply, and a refusal is +whatever it printed. That means **pnpm must be on the agent host's `PATH`** +for install, uninstall and update to work; listing and switching need nothing. + +- Installing a package that declares a `dsh.bundle` adds it to the profile's + layer list: that is what "enabled" means here. A package that declares none + is installed as a plain dependency (the harness says so itself) and stays + switched off. +- Switching a plugin off takes it out of the layer list without uninstalling + it. The profile's own composition — the shared core and the ACP application + — is not switchable. +- There are no marketplaces: a plugin is an npm package name, optionally with + a version. + +## What this does not have + +The automation profile carries none of these, and the driver says so in the +catalog the phone reads: + +- **No modes.** The harness has none, so `ask` and `YOLO` are this driver's + own: send every permission to the phone, or allow everything. Asked + permissions offer Allow and Deny only — the harness has no "always allow" + to choose. +- **No questions or background tasks**, and no attachments on a command. +- **No subscription usage** to ask for (the context meter still works). +- **No diff blocks.** The harness reports a tool result as text, so a file + change is reconstructed from the call's own arguments — what an `edit` + replaced, what a `write` wrote. A change made by a shell command shows as + its output, not as a card. +- **No image prompts from the phone** (the harness advertises them per model; + CodeDeck+ sends text). + +## Offline and container notes + +- The container image installs the harness into `/data/agents` on first use, + like the other agents. Build with `CODEDECK_BUNDLE_AGENTS=1` (see + [`BRIDGE.md`](BRIDGE.md)) and the image carries it instead, from the same + installer and so at the same pinned version. +- `CODEDECK_AGENT_HOST_WARM=1` runs that install and exits, for a host that + should fetch everything before it serves anything. +- The harness's runtime is large (some 600 packages): a minute or two on a + normal connection, and several on a bind mount from a Windows host (Docker + Desktop's `/data` is far slower than a container's own filesystem, and can + refuse a rename for a moment — the installer waits and retries). +- A container recreated with an existing `/data` volume keeps whatever agents + that volume already has; the bundled copy reaches a *new* volume. diff --git a/docs/PROTOCOL.md b/docs/PROTOCOL.md index 24408519..12010b5b 100644 --- a/docs/PROTOCOL.md +++ b/docs/PROTOCOL.md @@ -303,14 +303,16 @@ Changing a secret means adding the server again. - `mcp-request {agent}` → `mcp-servers {agent, servers[], toggles, error?}`. `toggles`: a server can be switched off without removing it (OpenCode; - Claude Code has no such switch). A list that could not be read comes + Claude Code and the DeepSeek Harness have no such switch). A list that could + not be read comes empty, with `error`. - `mcp-action {agent, action, servers?, names?}` → `mcp-ack {agent, action, names, success, error?}`, then (when done) the new `mcp-servers` to every phone. `add` takes up to 50 `servers` (a name that exists is replaced); `remove`, `enable`, `disable` take `names`. One bad server refuses the whole action. Running sessions pick the change up (Claude Code reloads in - place; OpenCode reloads, restarting them). + place; OpenCode reloads, restarting them; the harness attaches its servers + as it starts, so its next process uses the new list). - `session-mcp-request {sessionId}` and `session-mcp-toggle {sessionId, name, enabled}` → `session-mcp {sessionId, servers[], toggles, projectWide, error?}`, each server `{name, status, error?, tools?}` with `status` one of From 34a4bf9a6823db85e87c5b3fe9ecc5051d98f18f Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:14:39 +0200 Subject: [PATCH 08/22] chore: store every text file as LF The repository stores LF, but nothing said so: a checkout on Windows writes CRLF into a file it edits, and the change lands as a whole-file diff that says nothing about the code. `* text=auto eol=lf` makes the repository's form the shared one, whatever the platform that wrote the change, and leaves binaries alone. Gradle's wrapper script is the one text file that has to keep its CRLF. The two ignore files that predate this are stored as LF now too. Co-Authored-By: Claude Code --- .gitattributes | 7 ++++++ .gitignore | 64 ++++++++++++++++++++++++------------------------- data/.gitignore | 2 +- 3 files changed, 40 insertions(+), 33 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..eabc8b9b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +# Line endings. The repository stores LF and every checkout gets LF, whatever +# the platform that made the change: a Windows checkout would otherwise write +# CRLF into a file it edits, and the tree would carry a whole-file diff that +# says nothing. `text=auto` leaves binaries alone (git detects them), and +# Gradle's wrapper script is the one text file that has to keep its CRLF. +* text=auto eol=lf +apps/android/gradlew.bat text eol=crlf diff --git a/.gitignore b/.gitignore index 5b64b076..22448b9e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,32 @@ -.env* -!.env.example - -# Node / pnpm workspace -node_modules/ -**/node_modules/ -pnpm-debug.log* -.pnpm-store/ - -# Build outputs -apps/mobile/dist/ -packages/agent-host/dist/ -**/target/ -**/*.tsbuildinfo - -# NOTE: apps/mobile/src-tauri/gen/ is intentionally NOT ignored — upstream -# commits the generated Android project scaffold (Gradle needs it present; -# `**/target/` above already covers Rust's own build output; the Gradle -# `build/` dir under gen/android is already covered by that project's own -# gen/android/.gitignore). - -# APKs built via apps/mobile/docker/build-apk.sh land here — never commit a -# built binary. -/dist/ -# Cargo workspace build output -/target -/crates/**/target - -# scripts/install-toolchain.sh's local Android SDK/NDK (Linux host builds, -# apps/android/scripts/build-apk-local.sh) — project-scoped on purpose, never -# a system path, so it never collides with another project's SDK/NDK version. -/toolchain/ +.env* +!.env.example + +# Node / pnpm workspace +node_modules/ +**/node_modules/ +pnpm-debug.log* +.pnpm-store/ + +# Build outputs +apps/mobile/dist/ +packages/agent-host/dist/ +**/target/ +**/*.tsbuildinfo + +# NOTE: apps/mobile/src-tauri/gen/ is intentionally NOT ignored — upstream +# commits the generated Android project scaffold (Gradle needs it present; +# `**/target/` above already covers Rust's own build output; the Gradle +# `build/` dir under gen/android is already covered by that project's own +# gen/android/.gitignore). + +# APKs built via apps/mobile/docker/build-apk.sh land here — never commit a +# built binary. +/dist/ +# Cargo workspace build output +/target +/crates/**/target + +# scripts/install-toolchain.sh's local Android SDK/NDK (Linux host builds, +# apps/android/scripts/build-apk-local.sh) — project-scoped on purpose, never +# a system path, so it never collides with another project's SDK/NDK version. +/toolchain/ diff --git a/data/.gitignore b/data/.gitignore index a3a0c8b5..c96a04f0 100644 --- a/data/.gitignore +++ b/data/.gitignore @@ -1,2 +1,2 @@ -* +* !.gitignore \ No newline at end of file From aee7dffa5b329949f54cb2a96860f4d235c160f0 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:34:49 +0200 Subject: [PATCH 09/22] fix(agent-host): read a shipped bundle's version where it actually is MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Plugins screen listed the harness's own bundles — the shared core and the ACP application — with no version, which reads as "not installed": a profile composes those bundles from the harness's installation without copying them into its own `node_modules`, so the version is not where a user-installed plugin's is. The lookup now falls back to the runtime's own packages tree before answering nothing. Co-Authored-By: Claude Code --- .../agent-host/src/drivers/deepseek/driver.ts | 1 + .../src/drivers/deepseek/plugins.ts | 27 ++++++++++++++----- .../src/drivers/deepseek/runtime.ts | 16 +++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/packages/agent-host/src/drivers/deepseek/driver.ts b/packages/agent-host/src/drivers/deepseek/driver.ts index 4c8b75fe..08ab4310 100644 --- a/packages/agent-host/src/drivers/deepseek/driver.ts +++ b/packages/agent-host/src/drivers/deepseek/driver.ts @@ -705,6 +705,7 @@ export class DeepSeekDriver implements Driver { this.plugins = new DeepSeekPlugins({ profileDir, run: (args) => this.runDsh(args), + packagesDir: () => options.runtime.packagesRoot(), log: options.log, }); } diff --git a/packages/agent-host/src/drivers/deepseek/plugins.ts b/packages/agent-host/src/drivers/deepseek/plugins.ts index b817aee3..6a16c0d6 100644 --- a/packages/agent-host/src/drivers/deepseek/plugins.ts +++ b/packages/agent-host/src/drivers/deepseek/plugins.ts @@ -89,6 +89,9 @@ export interface DeepSeekPluginsOptions { /** Run one `dsh plugin` invocation (runDshPlugin, bound to the runtime's * entry point by the driver). */ run: (args: string[]) => Promise; + /** The runtime's own packages directory, for the versions of the bundles a + * profile does not install itself (the harness ships them). */ + packagesDir?: () => Promise; log: (message: string) => void; } @@ -243,15 +246,25 @@ export class DeepSeekPlugins implements PluginManager { return { installed, toggles: true, ...(this.message !== undefined ? { message: this.message } : {}) }; } - /** The version the profile actually has installed, when it has one. */ + /** + * The version a plugin is at: the profile's own copy when it has one (what + * a user installed), else the harness's — a profile composes the bundles + * the harness ships without copying them in, so their version lives in the + * runtime's tree. A plugin that shows no version is one neither has. + */ private async versionOf(name: string): Promise { - try { - const text = await readFile(path.join(this.options.profileDir, 'node_modules', ...name.split('/'), 'package.json'), 'utf8'); - const manifest = JSON.parse(text) as { version?: unknown }; - return typeof manifest.version === 'string' ? manifest.version : undefined; - } catch { - return undefined; + const shipped = await this.options.packagesDir?.(); + const roots = [path.join(this.options.profileDir, 'node_modules'), ...(shipped === undefined ? [] : [shipped])]; + for (const root of roots) { + try { + const text = await readFile(path.join(root, ...name.split('/'), 'package.json'), 'utf8'); + const manifest = JSON.parse(text) as { version?: unknown }; + if (typeof manifest.version === 'string') return manifest.version; + } catch { + // Not here; the next root may have it. + } } + return undefined; } } diff --git a/packages/agent-host/src/drivers/deepseek/runtime.ts b/packages/agent-host/src/drivers/deepseek/runtime.ts index 817d2547..e7013030 100644 --- a/packages/agent-host/src/drivers/deepseek/runtime.ts +++ b/packages/agent-host/src/drivers/deepseek/runtime.ts @@ -302,6 +302,22 @@ export class DeepSeekRuntime { } } + /** + * The runtime's own `node_modules`: every `@deepseek-ai/*` package the + * harness ships resolves from here, which is where a shipped bundle's + * version is found (a profile installs only what a user added). + */ + async packagesRoot(): Promise { + let file = await this.entryPoint(); + for (let depth = 0; depth < 8; depth++) { + const dir = path.dirname(file); + if (dir === file) break; + if (path.basename(dir) === 'node_modules') return dir; + file = dir; + } + return undefined; + } + /** * Resolve the runtime now — installing it when the machine has none — so a * session that comes later does not wait for the download. A failure is From cb931cc19b6316facbe8625999b421a33ac146b7 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:34:49 +0200 Subject: [PATCH 10/22] feat(agent-host): the harness's questions, on the phone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The harness's model can put a decision to the user — its question tool and its plan review both ask through the same `user-questions` service — and that service's answerer is a panel in the harness's own apps. A plain setup has none, so the tool fails with "no user-questions answerer configured" wherever a model tries to ask. It is the same shape of gap as commands: the capability is there, the automation surface simply never carries it. The plugin CodeDeck already installs for commands becomes the bridge for both (it is `codedeck-dsh-bridge` now, on `dsh-bridge.sock`): it composes an answerer on the harness's question waterfall, pushes the question to the host as a marker line on stderr — the one stream ACP does not own — and returns the answer it gets back on the socket. The phone shows the question as the very card the other agents' asks use, and the answer travels in the shape the harness takes: the labels of the chosen options, or the text the user typed, one item per question keyed by the question's own id. An unanswered question (the phone gone, the user cancelling, the turn ending) is answered with nothing, which the harness reports to the model as a question that was not answered — never a hang. The question tool's own transcript row is hidden, since the card is the exchange. Co-Authored-By: Claude Code --- docs/DEEPSEEK.md | 59 +++--- .../__tests__/deepseekCommands.test.ts | 168 +++++++++++++++--- .../deepseek/__tests__/deepseekDriver.test.ts | 87 ++++++++- .../src/drivers/deepseek/adapter.ts | 9 + .../deepseek/{commands.ts => bridge.ts} | 32 ++-- .../agent-host/src/drivers/deepseek/driver.ts | 65 +++++-- .../deepseek/{commandsPlugin.ts => plugin.ts} | 128 +++++++++---- .../src/drivers/deepseek/questions.ts | 128 +++++++++++++ .../src/drivers/deepseek/runtime.ts | 38 ++-- 9 files changed, 594 insertions(+), 120 deletions(-) rename packages/agent-host/src/drivers/deepseek/{commands.ts => bridge.ts} (79%) rename packages/agent-host/src/drivers/deepseek/{commandsPlugin.ts => plugin.ts} (50%) create mode 100644 packages/agent-host/src/drivers/deepseek/questions.ts diff --git a/docs/DEEPSEEK.md b/docs/DEEPSEEK.md index 7ea95d32..3e91edf8 100644 --- a/docs/DEEPSEEK.md +++ b/docs/DEEPSEEK.md @@ -122,29 +122,42 @@ A gateway of another shape (OpenAI-completions, Anthropic messages) is configured in the harness's own profile — dsh's configuration to write, not this driver's. -## Slash commands - -The harness has commands — `/compact`, `/goal`, `/feedback`, `/plan`, -`/permission`, and whatever its plugins add — and this driver brings them to -the phone, which is not something its automation surface does on its own: ACP -carries no command list and no way to invoke one, and the harness keeps -commands for its own UI modules. A typed `/name` would otherwise be prompt -text that reaches the model. - -So CodeDeck installs one small plugin of its own into the profile -(`codedeck-dsh-commands`, mounted by a row in the profile's patch layer) that -holds the harness's command registry and answers two questions over a local -socket: what this session can run, and "run this line". The phone lists what -it says, and a typed `/name` runs there instead of being sent to the model — -the command's own words come back as the agent's answer (`/plan` answers with -"Plan mode on", `/compact` with what it compacted). - -The socket is a file in the bridge's home (`/data/codedeck/dsh-commands.sock`, -a named pipe on Windows, named after the home). Nothing else about the profile +## Commands and questions + +Two things the harness does in this profile that its automation surface does +not carry, and that CodeDeck brings to the phone with one small plugin of its +own (`codedeck-dsh-bridge`, mounted by a row in the profile's patch layer): + +**Slash commands.** The harness has `/compact`, `/goal`, `/feedback`, `/plan`, +`/permission`, and whatever its plugins add. ACP carries no command list and +no way to invoke one, and the harness keeps commands for its own UI modules, so +a typed `/name` would otherwise be prompt text that reaches the model. The +plugin holds the command registry and answers two questions over a local +socket: what this session can run, and "run this line". The phone lists what it +says, and a typed `/name` runs there instead of being sent to the model — the +command's own words come back as the agent's answer (`/plan` answers "Plan mode +on", `/goal set X` answers with the goal it now holds). + +**Questions.** The harness's model can put a decision to the user — its +`ask_user_question` tool and its plan review both ask through the same service +— and that service's answerer is a panel in the harness's own apps. Without +one, the tool fails with "no user-questions answerer configured", which is +what a plain setup does. The plugin composes an answerer instead: the question +is pushed to the host as a marker line on the harness's stderr (the one stream +that is not ACP's), the phone shows it as the very card the other agents' ask +uses, and the answer goes back the way the harness takes one — the labels of +the chosen options, or the text the user typed. Each question carries its own +id, so a batch of them comes back matched to what was asked. + +The socket is a file in the bridge's home (`/data/codedeck/dsh-bridge.sock`, a +named pipe on Windows, named after the home). Nothing else about the profile changes, and the plugin is harmless if the harness moves under it: a list that -cannot be read means the phone offers no commands and a slash line is ordinary -text again — a session never fails because of it. A command that takes -attachments has none to take: this bridge sends the line alone. +cannot be read means the phone offers no commands, an unanswerable question +reads as one the user did not answer, and a slash line is ordinary text again — +a session never fails over either. Two things it does not do: a command that +takes attachments gets none (this bridge sends the line alone), and the +question tool's own row is hidden in the transcript, since the question card is +the exchange. ## MCP servers @@ -191,7 +204,7 @@ catalog the phone reads: own: send every permission to the phone, or allow everything. Asked permissions offer Allow and Deny only — the harness has no "always allow" to choose. -- **No questions or background tasks**, and no attachments on a command. +- **No background tasks**, and no attachments on a command or a question. - **No subscription usage** to ask for (the context meter still works). - **No diff blocks.** The harness reports a tool result as text, so a file change is reconstructed from the call's own arguments — what an `edit` diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts index ac8218ab..84d95a44 100644 --- a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts @@ -9,8 +9,9 @@ import { tmpdir } from 'node:os'; import * as path from 'node:path'; import { pathToFileURL } from 'node:url'; import { describe, expect, it, vi } from 'vitest'; -import { commandsSocketPath, listSessionCommands, runSessionCommand } from '../commands'; -import { COMMANDS_PLUGIN, installCommandsPlugin } from '../commandsPlugin'; +import { askPlugin, bridgeSocketPath, listSessionCommands, runSessionCommand } from '../bridge'; +import { HARNESS_PLUGIN, QUESTION_MARKER, installHarnessPlugin } from '../plugin'; +import { parseQuestionLine, toAnswerItems, toQuestionSpecs } from '../questions'; const socketPathIn = (dir: string): string => path.join(dir, 'commands.sock'); @@ -18,10 +19,16 @@ const socketPathIn = (dir: string): string => path.join(dir, 'commands.sock'); * asks for, the effect disposer, and a logger. */ function pluginContext(commands: unknown, agents: { get: (id: string) => unknown } = { get: () => ({ id: 'a1' }) }) { const cleanups: Array<() => void> = []; + /** What the plugin registered with `ctx.on`, by event name. */ + const listeners = new Map never) => unknown>(); return { cleanups, + listeners, ctx: { get: (service: string) => (service === 'commands' ? commands : service === 'agents' ? agents : undefined), + on: (event: string, listener: (payload: never, next: () => never) => unknown) => { + listeners.set(event, listener); + }, logger: { warn: () => {}, debug: () => {} }, effect: (callback: () => () => void) => { cleanups.push(callback()); @@ -35,19 +42,23 @@ async function runPlugin( profileDir: string, commandService: unknown, agents: { get: (id: string) => unknown } = { get: () => ({ id: 'a1' }) }, -): Promise<{ cleanups: Array<() => void>; socket: string }> { +): Promise<{ + cleanups: Array<() => void>; + socket: string; + listeners: Map never) => unknown>; +}> { const socket = socketPathIn(profileDir); - await installCommandsPlugin(profileDir, socket, () => {}); - const module = (await import(pathToFileURL(path.join(profileDir, 'node_modules', COMMANDS_PLUGIN, 'index.js')).href)) as { + await installHarnessPlugin(profileDir, socket, () => {}); + const module = (await import(pathToFileURL(path.join(profileDir, 'node_modules', HARNESS_PLUGIN, 'index.js')).href)) as { apply: (ctx: unknown, config: unknown) => void; name: string; inject: string[]; }; - expect(module.name).toBe('codedeck-commands'); - expect(module.inject).toEqual(['agents', 'commands']); - const { ctx, cleanups } = pluginContext(commandService, agents); + expect(module.name).toBe('codedeck-bridge'); + expect(module.inject).toEqual(['agents', 'commands', 'userQuestions']); + const { ctx, cleanups, listeners } = pluginContext(commandService, agents); module.apply(ctx, { socket }); - return { cleanups, socket }; + return { cleanups, socket, listeners }; } /** Wait for a socket to accept a connection (the plugin listens asynchronously). */ @@ -72,17 +83,17 @@ describe('installing the command plugin', () => { it('writes its package into the profile and its row into the layer', async () => { const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); writeFileSync(path.join(dir, 'cordis.patch.yml'), '# the profile\n[]\n'); - await installCommandsPlugin(dir, '/tmp/some.sock', () => {}); - const manifest = JSON.parse(readFileSync(path.join(dir, 'node_modules', COMMANDS_PLUGIN, 'package.json'), 'utf8')) as { + await installHarnessPlugin(dir, '/tmp/some.sock', () => {}); + const manifest = JSON.parse(readFileSync(path.join(dir, 'node_modules', HARNESS_PLUGIN, 'package.json'), 'utf8')) as { name: string; type: string; main: string; }; - expect(manifest).toMatchObject({ name: COMMANDS_PLUGIN, type: 'module', main: 'index.js' }); + expect(manifest).toMatchObject({ name: HARNESS_PLUGIN, type: 'module', main: 'index.js' }); const layer = readFileSync(path.join(dir, 'cordis.patch.yml'), 'utf8'); - expect(layer).toMatch(/CodeDeck\+ commands/); - expect(layer).toMatch(/- id: codedeck-commands/); - expect(layer).toMatch(new RegExp(`name: '${COMMANDS_PLUGIN}'`)); + expect(layer).toMatch(/CodeDeck\+ bridge/); + expect(layer).toMatch(/- id: codedeck-bridge/); + expect(layer).toMatch(new RegExp(`name: '${HARNESS_PLUGIN}'`)); expect(layer).toMatch(/socket: "\/tmp\/some\.sock"/); // The profile's own content is still there. expect(layer).toMatch(/# the profile/); @@ -91,12 +102,12 @@ describe('installing the command plugin', () => { it('leaves the files alone when they are already right', async () => { const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); const write = vi.fn(); - await installCommandsPlugin(dir, '/tmp/a.sock', () => {}); - const first = readFileSync(path.join(dir, 'node_modules', COMMANDS_PLUGIN, 'index.js'), 'utf8'); + await installHarnessPlugin(dir, '/tmp/a.sock', () => {}); + const first = readFileSync(path.join(dir, 'node_modules', HARNESS_PLUGIN, 'index.js'), 'utf8'); // A second run must not rewrite the source the harness may be running — // the content check is what makes it safe to run at every start. - await installCommandsPlugin(dir, '/tmp/a.sock', () => {}); - expect(readFileSync(path.join(dir, 'node_modules', COMMANDS_PLUGIN, 'index.js'), 'utf8')).toBe(first); + await installHarnessPlugin(dir, '/tmp/a.sock', () => {}); + expect(readFileSync(path.join(dir, 'node_modules', HARNESS_PLUGIN, 'index.js'), 'utf8')).toBe(first); expect(write).not.toHaveBeenCalled(); }); }); @@ -159,6 +170,117 @@ describe('the plugin, talking to the driver', () => { }); }); +describe('questions, through the plugin', () => { + /** One question as the harness's model asks it. */ + const asked = { + questions: [ + { + id: 'q1', + question: 'Which database?', + header: 'Storage', + options: [{ label: 'SQLite' }, { label: 'Postgres', description: 'A server' }], + }, + ], + agent: { session: { id: 's1' } }, + signal: new AbortController().signal, + wait: { callId: 'c1' }, + }; + + it('pushes it to the host on stderr and returns what the host answers with', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, socket, listeners } = await runPlugin(dir, { list: () => [], execute: () => Promise.resolve(undefined) }); + await waitForSocket(socket); + const pushed: string[] = []; + const stderr = vi.spyOn(process.stderr, 'write').mockImplementation((chunk: unknown) => { + pushed.push(String(chunk)); + return true; + }); + const listener = listeners.get('user-questions/request')!; + const pending = listener(asked as never, () => Promise.reject(new Error('delegated')) as never); + stderr.mockRestore(); + + // The host learns about it on stderr — the stream ACP does not own. + const line = pushed.find((chunk) => chunk.includes(QUESTION_MARKER)); + expect(line).toBeDefined(); + const parsed = parseQuestionLine(line!, QUESTION_MARKER)!; + expect(parsed).toMatchObject({ sessionId: 's1', callId: 'c1' }); + expect(parsed.questions[0]).toMatchObject({ id: 'q1', question: 'Which database?', header: 'Storage' }); + + // And answers on the socket, which is what the harness's tool returns. + await askPlugin(socket, { method: 'answer', callId: 'c1', sessionId: 's1', answer: [{ id: 'q1', selected: ['SQLite'] }] }, 2_000, () => {}); + expect(await pending).toEqual({ answers: [{ id: 'q1', selected: ['SQLite'] }] }); + for (const cleanup of cleanups) cleanup(); + }); + + it('tells the model it was not answered when the host says nothing', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, socket, listeners } = await runPlugin(dir, { list: () => [], execute: () => Promise.resolve(undefined) }); + await waitForSocket(socket); + const stderr = vi.spyOn(process.stderr, 'write').mockImplementation(() => true); + const pending = listeners.get('user-questions/request')!(asked as never, () => Promise.reject(new Error('delegated')) as never); + stderr.mockRestore(); + // The handler is attached before the answer arrives: a rejection nobody + // is waiting on yet is an unhandled one. + const refused = expect(pending).rejects.toThrow(/did not answer/); + await askPlugin(socket, { method: 'answer', callId: 'c1', sessionId: 's1' }, 2_000, () => {}); + await refused; + for (const cleanup of cleanups) cleanup(); + }); + + it('leaves a question it cannot key to another answerer', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, listeners } = await runPlugin(dir, { list: () => [], execute: () => Promise.resolve(undefined) }); + const listener = listeners.get('user-questions/request')!; + expect(await listener({ questions: [] } as never, () => Promise.reject(new Error('delegated')) as never)).toBeUndefined(); + for (const cleanup of cleanups) cleanup(); + }); +}); + +describe('what the host makes of a question', () => { + it('shows the harness questions as the wire ones, detail and all', () => { + const specs = toQuestionSpecs([ + { id: 'q1', question: 'Which database?', header: 'Storage', options: [{ label: 'SQLite' }, { label: 'Postgres', description: 'A server' }] }, + { id: 'q2', question: 'Anything else?', detail: 'A line of context.', multiSelect: true }, + ]); + expect(specs).toEqual([ + { + question: 'Which database?', + header: 'Storage', + options: [{ label: 'SQLite' }, { label: 'Postgres', description: 'A server' }], + }, + { question: 'Anything else?\n\nA line of context.', options: [], multiSelect: true }, + ]); + }); + + it('answers the way the harness takes an answer: labels, or what was typed', () => { + const questions = [ + { id: 'q1', question: 'Which database?', options: [{ label: 'SQLite' }, { label: 'Postgres' }] }, + { id: 'q2', question: 'Anything else?' }, + { id: 'q3', question: 'Which parts?', options: [{ label: 'api' }, { label: 'app' }], multiSelect: true }, + ]; + expect(toAnswerItems(questions, ['SQLite', 'a note', 'api, app'])).toEqual([ + { id: 'q1', selected: ['SQLite'] }, + { id: 'q2', selected: [], custom: 'a note' }, + { id: 'q3', selected: ['api', 'app'] }, + ]); + // A multi-select answered with something that is not a list of its own + // labels is text the user typed, not labels. + expect(toAnswerItems(questions, ['Postgres', 'a, b', 'api, something else'])[2]).toEqual({ + id: 'q3', + selected: [], + custom: 'api, something else', + }); + }); + + it('reads a pushed line, and ignores anything that is not one', () => { + const line = `${QUESTION_MARKER}${JSON.stringify({ sessionId: 's1', callId: 'c1', questions: [{ id: 'q1', question: 'Q?' }] })}`; + expect(parseQuestionLine(line, QUESTION_MARKER)).toEqual({ sessionId: 's1', callId: 'c1', questions: [{ id: 'q1', question: 'Q?' }] }); + expect(parseQuestionLine('the harness logging something', QUESTION_MARKER)).toBeUndefined(); + expect(parseQuestionLine(`${QUESTION_MARKER}not json`, QUESTION_MARKER)).toBeUndefined(); + expect(parseQuestionLine(`${QUESTION_MARKER}{"questions":[]}`, QUESTION_MARKER)).toBeUndefined(); + }); +}); + describe('the client on its own', () => { /** A socket that answers whatever the test scripts (or nothing at all). */ async function fakeBridge(answer: (request: Record, socket: Socket) => void): Promise<{ socket: string; close: () => void }> { @@ -209,11 +331,11 @@ describe('the client on its own', () => { describe('the socket path', () => { it('is one file per home, and a named pipe on Windows', () => { - expect(commandsSocketPath('/data')).toBe(path.join('/data', 'codedeck', 'dsh-commands.sock')); - const pipe = commandsSocketPath('/data', 'win32'); - expect(pipe.startsWith('\\\\.\\pipe\\codedeck-dsh-commands-')).toBe(true); + expect(bridgeSocketPath('/data')).toBe(path.join('/data', 'codedeck', 'dsh-bridge.sock')); + const pipe = bridgeSocketPath('/data', 'win32'); + expect(pipe.startsWith('\\\\.\\pipe\\codedeck-dsh-bridge-')).toBe(true); // Two homes, two pipes: a machine running two bridges must not have them // answer each other's questions. - expect(commandsSocketPath('/data', 'win32')).not.toBe(commandsSocketPath('/other', 'win32')); + expect(bridgeSocketPath('/data', 'win32')).not.toBe(bridgeSocketPath('/other', 'win32')); }); }); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts index 2db8e73e..0063a85f 100644 --- a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts @@ -7,7 +7,8 @@ import { recordingContext, type RecordingContext } from '../../../__tests__/cont import type { StartSession } from '../../../types'; import type { DriverSession } from '../../../driver'; import { DeepSeekDriver } from '../driver'; -import { commandsSocketPath } from '../commands'; +import { bridgeSocketPath } from '../bridge'; +import { QUESTION_MARKER } from '../plugin'; import { DeepSeekMcp } from '../mcp'; import { DeepSeekRuntime, dshHomeDir } from '../runtime'; import { FakeHarness } from './fakeHarness'; @@ -754,7 +755,7 @@ describe('slash commands', () => { }); connection.on('error', () => {}); }); - const socket = commandsSocketPath(home); + const socket = bridgeSocketPath(home); mkdirSync(path.dirname(socket), { recursive: true }); await new Promise((resolve, reject) => { server.once('error', reject); @@ -829,6 +830,88 @@ describe('slash commands', () => { }); }); +describe('the questions the model asks', () => { + /** A question as the plugin pushes it: a marker line on the harness's + * stderr, which is the one stream ACP does not own. */ + const pushed = (callId: string): string => + `${QUESTION_MARKER}${JSON.stringify({ + sessionId: 's1', + callId, + questions: [{ id: 'q1', question: 'Which database?', options: [{ label: 'SQLite' }, { label: 'Postgres' }] }], + })}\n`; + + async function bridge(ready: Harness): Promise<{ requests: Array>; close: () => void }> { + const requests: Array> = []; + const server = createServer((connection: Socket) => { + connection.setEncoding('utf8'); + let buffered = ''; + connection.on('data', (chunk: string) => { + buffered += chunk; + const end = buffered.indexOf('\n'); + if (end < 0) return; + const request = JSON.parse(buffered.slice(0, end)) as Record; + requests.push(request); + connection.write(`${JSON.stringify({ id: request.id, ok: true })}\n`); + }); + connection.on('error', () => {}); + }); + const socket = bridgeSocketPath(ready.home); + mkdirSync(path.dirname(socket), { recursive: true }); + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(socket, resolve); + }); + return { requests, close: () => server.close() }; + } + + it('shows it on the phone and answers the harness with what it chose', async () => { + const ready = withDriver(); + const socket = await bridge(ready); + const ctx = recordingContext({ + question: (requestId, questions) => { + expect(requestId).toBe('c9'); + expect(questions).toEqual([ + { question: 'Which database?', options: [{ label: 'SQLite' }, { label: 'Postgres' }] }, + ]); + return { outcome: 'answered', answers: ['SQLite'] }; + }, + }); + await started(ready, {}, ctx); + ready.harness.child.stderr.write(pushed('c9')); + await vi.waitFor(() => expect(socket.requests.some((request) => request.method === 'answer')).toBe(true)); + expect(socket.requests.find((request) => request.method === 'answer')).toMatchObject({ + sessionId: 's1', + callId: 'c9', + answer: [{ id: 'q1', selected: ['SQLite'] }], + }); + socket.close(); + }); + + it('answers with nothing when the user does not, so the model is told', async () => { + const ready = withDriver(); + const socket = await bridge(ready); + const ctx = recordingContext({ question: () => ({ outcome: 'cancelled', reason: 'the phone went away' }) }); + await started(ready, {}, ctx); + ready.harness.child.stderr.write(pushed('c9')); + await vi.waitFor(() => expect(socket.requests.some((request) => request.method === 'answer')).toBe(true)); + const answer = socket.requests.find((request) => request.method === 'answer')!; + expect(answer).toMatchObject({ sessionId: 's1', callId: 'c9' }); + expect(answer.answer).toBeUndefined(); + socket.close(); + }); + + it('keeps a pushed question out of the harness log', async () => { + const ready = withDriver(); + const socket = await bridge(ready); + const ctx = recordingContext({ question: () => ({ outcome: 'cancelled', reason: 'never mind' }) }); + await started(ready, {}, ctx); + ready.harness.child.stderr.write(pushed('c9')); + await vi.waitFor(() => expect(socket.requests.length).toBeGreaterThan(0)); + expect(ready.logs.some((line) => line.includes(QUESTION_MARKER))).toBe(false); + socket.close(); + }); +}); + describe('the harness process', () => { it('spawns the installed CLI with the profile and the harness home', async () => { const ready = withDriver(); diff --git a/packages/agent-host/src/drivers/deepseek/adapter.ts b/packages/agent-host/src/drivers/deepseek/adapter.ts index 09dd5bae..1fad81a6 100644 --- a/packages/agent-host/src/drivers/deepseek/adapter.ts +++ b/packages/agent-host/src/drivers/deepseek/adapter.ts @@ -21,6 +21,13 @@ import { todosOf, toolInput, toolKindOf, toolLocations, toolTitle } from '../../ import { MAX_DIFF_LINES, truncateToolResult, toDiffLines, type DiffPayload } from '../../transcript'; import type { OutputEntry } from '../../types'; +/** + * The harness's question tool. Its card is the question itself — the bridge + * shows it, and the answer goes back through the command bridge — so its own + * tool rows would be a second, emptier copy of the same exchange. + */ +const QUESTION_TOOL = 'ask_user_question'; + /** What a tool call's own update carried: its result update repeats neither * the tool's name nor its input. */ export interface ToolCallFacts { @@ -63,6 +70,7 @@ function toolCallEntries( const name = toolNameOf(update); const input = record(update.rawInput); calls.set(update.toolCallId, { name, input }); + if (name === QUESTION_TOOL) return []; const locations = fileLocations(name, input); const full = toolInput(name, input); const todos = todosOf(input); @@ -94,6 +102,7 @@ function toolResultEntries( if (status !== 'completed' && status !== 'failed') return []; const facts = calls.get(update.toolCallId); calls.delete(update.toolCallId); + if (facts?.name === QUESTION_TOOL) return []; const text = contentText(update.content); const entries: OutputEntry[] = [ { diff --git a/packages/agent-host/src/drivers/deepseek/commands.ts b/packages/agent-host/src/drivers/deepseek/bridge.ts similarity index 79% rename from packages/agent-host/src/drivers/deepseek/commands.ts rename to packages/agent-host/src/drivers/deepseek/bridge.ts index 03e5dfdc..ae4b727f 100644 --- a/packages/agent-host/src/drivers/deepseek/commands.ts +++ b/packages/agent-host/src/drivers/deepseek/bridge.ts @@ -1,13 +1,13 @@ /** - * The driver's side of the command bridge: what a session's commands are, and - * running one line of them. + * The driver's side of the socket the plugin listens on (plugin.ts): what a + * session's commands are, running one line of them, and answering a question + * the harness's model asked. * - * The plugin (commandsPlugin.ts) holds the harness's command registry and - * answers over a local socket, so this module is a small client of it: one - * connection per question, line-delimited JSON, and `undefined` for anything - * that does not work out — a harness without the plugin, a plugin that could - * not start, a timeout. Commands are a convenience: a session runs without - * them exactly as it did before, and nothing here may fail one. + * One connection per request, line-delimited JSON, and `undefined` for + * anything that does not work out — a harness without the plugin, a plugin + * that could not start, a timeout. Commands and questions are conveniences: + * a session runs without them exactly as it did before, and nothing here may + * fail one. */ import { createHash } from 'node:crypto'; import * as path from 'node:path'; @@ -26,12 +26,12 @@ const RUN_TIMEOUT_MS = 10 * 60_000; * machine — one home, one socket — and a named pipe on Windows, named after * the home so two bridges on one machine do not collide. */ -export function commandsSocketPath(home: string, platform: NodeJS.Platform = process.platform): string { +export function bridgeSocketPath(home: string, platform: NodeJS.Platform = process.platform): string { if (platform === 'win32') { const tag = createHash('sha256').update(path.resolve(home)).digest('hex').slice(0, 12); - return `\\\\.\\pipe\\codedeck-dsh-commands-${tag}`; + return `\\\\.\\pipe\\codedeck-dsh-bridge-${tag}`; } - return path.join(home, 'codedeck', 'dsh-commands.sock'); + return path.join(home, 'codedeck', 'dsh-bridge.sock'); } /** One command as the plugin lists it. */ @@ -42,7 +42,7 @@ interface CommandListing { } /** The plugin's answer. */ -interface Reply { +export interface Reply { ok: boolean; error?: string; commands?: CommandListing[]; @@ -56,7 +56,7 @@ export async function listSessionCommands( log: (message: string) => void, timeoutMs: number = LIST_TIMEOUT_MS, ): Promise { - const reply = await ask(socket, { method: 'list', sessionId }, timeoutMs, log); + const reply = await askPlugin(socket, { method: 'list', sessionId }, timeoutMs, log); if (!reply?.ok) return undefined; return (reply.commands ?? []) .filter((command) => typeof command.name === 'string' && command.name !== '') @@ -72,7 +72,7 @@ export async function runSessionCommand( log: (message: string) => void, timeoutMs: number = RUN_TIMEOUT_MS, ): Promise<{ ok: boolean; text: string } | undefined> { - const reply = await ask(socket, { method: 'run', sessionId, line }, timeoutMs, log); + const reply = await askPlugin(socket, { method: 'run', sessionId, line }, timeoutMs, log); if (!reply) return undefined; if (!reply.ok) return { ok: false, text: reply.error ?? 'the command could not be run' }; return { ok: reply.result?.kind !== 'error', text: reply.result?.text ?? '' }; @@ -80,7 +80,9 @@ export async function runSessionCommand( /** One question, one answer. Never throws: a socket that is not there (no * plugin, a harness that has not started) is not an error worth a stack. */ -async function ask( +/** One request to the plugin, for the callers in this folder and beside it + * (questions.ts). Never throws. */ +export async function askPlugin( socket: string, request: Record, timeoutMs: number, diff --git a/packages/agent-host/src/drivers/deepseek/driver.ts b/packages/agent-host/src/drivers/deepseek/driver.ts index 08ab4310..8b8132dd 100644 --- a/packages/agent-host/src/drivers/deepseek/driver.ts +++ b/packages/agent-host/src/drivers/deepseek/driver.ts @@ -37,8 +37,9 @@ import type { } from '../../types'; import { deepseekUpdateToEntries, type ToolCallMemory } from './adapter'; import { DEEPSEEK_API_KEY_CREDENTIAL, DEEPSEEK_API_KEY_ENV, DEEPSEEK_BASE_URL_ENV, buildDeepSeekEnv } from './env'; -import { commandsSocketPath, listSessionCommands, runSessionCommand } from './commands'; -import { installCommandsPlugin } from './commandsPlugin'; +import { askPlugin, bridgeSocketPath, listSessionCommands, runSessionCommand } from './bridge'; +import { HARNESS_PLUGIN, installHarnessPlugin, QUESTION_MARKER } from './plugin'; +import { parseQuestionLine, toAnswerItems, toQuestionSpecs, type PushedQuestionLine } from './questions'; import { gatewayModelsUrl, syncGatewayCatalog } from './gateway'; import { DSH_LABEL } from './install'; import { DeepSeekMcp } from './mcp'; @@ -79,6 +80,11 @@ const DEEPSEEK_EFFORTS = [ /** What the DeepSeek route runs at when nothing is chosen. */ const DEFAULT_EFFORT = 'high'; +/** How long the harness waits for the phone's answer to a question before + * the bridge gives up on it (the harness's own waits are its business; this + * is only the socket round trip that carries the answer). */ +const QUESTION_TIMEOUT_MS = 60_000; + /** The harness's own option ids (standard ACP session config options). */ const MODEL_CONFIG_ID = 'model'; const EFFORT_CONFIG_ID = 'reasoning_effort'; @@ -217,8 +223,8 @@ export class DeepSeekSession implements DriverSession { /** The profile as it must be before a harness boots: the endpoint's * catalog written, the command plugin in place. */ prepared: Promise; - /** Where the command plugin listens. */ - commandsSocket: string; + /** Where the Codeck plugin listens. */ + pluginSocket: string; }, ) { this.cwd = params.cwd; @@ -518,7 +524,7 @@ export class DeepSeekSession implements DriverSession { const sessionId = this.nativeId; if (this.ended || sessionId === undefined) return; this.ctx.emit({ type: 'turn', state: 'running' }); - const outcome = await runSessionCommand(this.deps.commandsSocket, sessionId, line, this.ctx.log); + const outcome = await runSessionCommand(this.deps.pluginSocket, sessionId, line, this.ctx.log); if (this.ended) return; if (outcome === undefined) { this.deliver({ entryType: 'error', text: `${line} did not run: the command bridge is not answering.`, timestamp: now() }); @@ -535,13 +541,44 @@ export class DeepSeekSession implements DriverSession { this.endTurn(); } + /** + * The harness's model asked the user something, and the plugin pushed it + * here. It goes to the phone as the same question card the other agents + * send, and the answer goes back the way the harness takes it — labels for + * a chosen option, free text for a typed one. An unanswered question (the + * phone is gone, the user cancelled, the turn ended) is answered with + * nothing, which the harness reports to the model as a question that was + * not answered. + */ + askQuestion(pushed: PushedQuestionLine): void { + const specs = toQuestionSpecs(pushed.questions); + void this.ctx + .askQuestion(pushed.callId, specs) + .then((outcome) => + askPlugin( + this.deps.pluginSocket, + { + method: 'answer', + sessionId: this.nativeId, + callId: pushed.callId, + ...(outcome.outcome === 'answered' ? { answer: toAnswerItems(pushed.questions, outcome.answers) } : {}), + }, + QUESTION_TIMEOUT_MS, + this.ctx.log, + ), + ) + .catch((error: unknown) => { + this.ctx.log(`[deepseek] could not pass a question on: ${error instanceof Error ? error.message : String(error)}`); + }); + } + /** What this session's harness can run, asked of the harness itself (the * command plugin) and cached until the session ends. An empty set means * every slash line is ordinary text, which is what a harness without the * plugin does. */ private knownCommands(): Promise> { this.commandNames ??= this.ready - .then(() => listSessionCommands(this.deps.commandsSocket, this.nativeId ?? '', this.ctx.log)) + .then(() => listSessionCommands(this.deps.pluginSocket, this.nativeId ?? '', this.ctx.log)) .then((commands) => new Set((commands ?? []).map((command) => command.name))) .catch(() => { this.commandNames = undefined; @@ -554,7 +591,7 @@ export class DeepSeekSession implements DriverSession { await this.ready; const sessionId = this.nativeId; if (this.ended || sessionId === undefined) return []; - return (await listSessionCommands(this.deps.commandsSocket, sessionId, this.ctx.log)) ?? []; + return (await listSessionCommands(this.deps.pluginSocket, sessionId, this.ctx.log)) ?? []; } /** The turn is over: the transcript marks it and the phone stops showing @@ -679,8 +716,8 @@ export class DeepSeekDriver implements Driver { * Sessions and the model probe wait for it. */ private prepared: Promise = Promise.resolve(); - /** Where the command plugin listens. One per harness home. */ - private readonly commandsSocket: string; + /** Where the CodeDeck plugin listens. One per harness home. */ + private readonly pluginSocket: string; /** Sessions by the harness's own ids: a process serves several, and it is * this map that ends them all when it goes away. */ private readonly sessions = new Map(); @@ -689,6 +726,10 @@ export class DeepSeekDriver implements Driver { ended: (sessionIds: readonly string[], error: string) => { for (const sessionId of sessionIds) this.sessions.get(sessionId)?.endFromProcess(error); }, + question: (line: string) => { + const pushed = parseQuestionLine(line, QUESTION_MARKER); + if (pushed?.sessionId !== undefined) this.sessions.get(pushed.sessionId)?.askQuestion(pushed); + }, }), add: (sessionId: string, session: DeepSeekSession): void => { this.sessions.set(sessionId, session); @@ -700,7 +741,7 @@ export class DeepSeekDriver implements Driver { private constructor(private readonly options: DeepSeekDriverOptions) { const profileDir = dshProfileDir(options.home); - this.commandsSocket = commandsSocketPath(options.home); + this.pluginSocket = bridgeSocketPath(options.home); this.mcp = options.mcp ?? new DeepSeekMcp({ profileDir, log: options.log }); this.plugins = new DeepSeekPlugins({ profileDir, @@ -734,7 +775,7 @@ export class DeepSeekDriver implements Driver { */ private async installCommands(): Promise { try { - await installCommandsPlugin(dshProfileDir(this.options.home), this.commandsSocket, this.options.log); + await installHarnessPlugin(dshProfileDir(this.options.home), this.pluginSocket, this.options.log); } catch (error) { this.options.log(`[deepseek] could not install the command bridge: ${error instanceof Error ? error.message : String(error)}`); } @@ -808,7 +849,7 @@ export class DeepSeekDriver implements Driver { baseEnv: this.options.baseEnv ?? process.env, live: this.live, prepared: this.prepared, - commandsSocket: this.commandsSocket, + pluginSocket: this.pluginSocket, }); } diff --git a/packages/agent-host/src/drivers/deepseek/commandsPlugin.ts b/packages/agent-host/src/drivers/deepseek/plugin.ts similarity index 50% rename from packages/agent-host/src/drivers/deepseek/commandsPlugin.ts rename to packages/agent-host/src/drivers/deepseek/plugin.ts index 2743941a..e61722fc 100644 --- a/packages/agent-host/src/drivers/deepseek/commandsPlugin.ts +++ b/packages/agent-host/src/drivers/deepseek/plugin.ts @@ -1,38 +1,47 @@ /** - * The plugin that gives CodeDeck the harness's slash commands. + * The plugin that carries what the harness's ACP surface does not: its slash + * commands, and the questions its model asks the user. * - * The harness has commands (`/compact`, `/goal`, and whatever its plugins - * add) in this profile: the registry is mounted. What it has no way to hand - * them to is an ACP client — ACP carries no command list and no way to invoke - * one, and a typed `/name` is prompt text that reaches the model. The - * registry is reachable only from inside the process, through the harness's - * client API, which the automation profile mounts no transport for. + * Both exist in this profile and neither is reachable from outside it. ACP has + * no command list and no way to invoke one, and the harness keeps commands and + * human-interaction for its own UI modules; the same is true of the + * `user-questions` service, whose answerer is a browser panel. Inside the + * process both are ordinary services. * * So CodeDeck brings its own transport: this plugin, installed into the - * profile, holds the command service and answers two questions over a local - * socket — what commands this session has, and "run this line". It is ours, - * which is the point: no harness API is patched, and a harness that changes - * under it leaves commands unreported (the driver treats every failure that - * way) rather than breaking a session. + * profile, holds the command registry and composes the questions answerer, and + * talks to the agent host over a local socket. It is ours, which is the point: + * no harness API is patched, and a harness that changes under it leaves + * commands or questions unanswered (the driver treats every failure that way) + * rather than breaking a session. * * The plugin is a package in the profile's own `node_modules`, written from * the source below — dsh resolves a row's plugin by name from there, so no * package manager is involved (and installing one later can prune the * directory, which is why it is rewritten when the host starts). + * + * Two channels, deliberately: questions are *pushed* to the host as + * marker-prefixed lines on stderr (the one stream the harness leaves free — + * stdout is ACP), and every answer, like every command asked for, is a request + * on the socket. */ import { mkdir, readFile, writeFile } from 'node:fs/promises'; import * as path from 'node:path'; import { ProfileLayer, type LayerBlock } from './profileLayer'; /** The package name the profile's row refers to. */ -export const COMMANDS_PLUGIN = 'codedeck-dsh-commands'; +export const HARNESS_PLUGIN = 'codedeck-dsh-bridge'; /** This plugin's block in the profile's patch layer. */ const BLOCK: LayerBlock = { - begin: '# --- CodeDeck+ commands: the local socket CodeDeck asks this profile for its slash commands over; everything outside this block is yours ---', - end: '# --- end CodeDeck+ commands ---', + begin: '# --- CodeDeck+ bridge: brings this profile its slash commands and its questions, over a local socket; everything outside this block is yours ---', + end: '# --- end CodeDeck+ bridge ---', }; +/** Where a pushed question starts on the harness's stderr (the host reads + * these lines and never logs them as harness output). */ +export const QUESTION_MARKER = 'codedeck-question:'; + /** * The plugin, as it is written to disk. Plain JavaScript: the harness imports * it as it is, so nothing here may need a build step, and it must not import @@ -42,13 +51,56 @@ const SOURCE = `import { mkdirSync, rmSync } from 'node:fs'; import net from 'node:net'; import path from 'node:path'; -export const name = 'codedeck-commands'; -export const inject = ['agents', 'commands']; +export const name = 'codedeck-bridge'; +export const inject = ['agents', 'commands', 'userQuestions']; -/** Answer one connection's line-delimited JSON requests until it closes. */ +const QUESTION_MARKER = 'codedeck-question:'; + +/** + * Serve the host's socket, and answer the harness's questions over it. + * @param ctx - the profile's plugin context. + * @param config - this row's config: the socket path to listen on. + */ export function apply(ctx, config) { const socket = config?.socket; - if (typeof socket !== 'string' || socket === '') throw new Error('codedeck-commands: config.socket is required'); + if (typeof socket !== 'string' || socket === '') throw new Error('codedeck-bridge: config.socket is required'); + + /** Questions waiting for the host's answer, by call id. */ + const pending = new Map(); + + ctx.on('user-questions/request', async (request) => { + // The card is keyed by the tool call, and the host needs the session; a + // request without either is one this bridge cannot show, so another + // answerer — or the harness's own error — has it. + const callId = request?.wait?.callId; + const sessionId = request?.agent?.session?.id; + if (callId === undefined || sessionId === undefined) return undefined; + const job = {}; + job.promise = new Promise((resolve, reject) => { + job.resolve = resolve; + job.reject = reject; + }); + pending.set(callId, job); + // The host learns about the question on stderr — the one stream that is + // not ACP's — and answers on the socket. + process.stderr.write(QUESTION_MARKER + JSON.stringify({ + sessionId, + callId, + questions: request.questions, + }) + '\\n'); + const onAbort = () => { + pending.delete(callId); + job.reject(new Error('the question was cancelled')); + }; + request.signal?.addEventListener('abort', onAbort, { once: true }); + try { + return await job.promise; + } finally { + pending.delete(callId); + request.signal?.removeEventListener('abort', onAbort); + } + }); + const server = net.createServer((connection) => { connection.setEncoding('utf8'); let buffered = ''; @@ -59,22 +111,23 @@ export function apply(ctx, config) { if (end < 0) break; const line = buffered.slice(0, end); buffered = buffered.slice(end + 1); - if (line.trim() !== '') void respond(ctx, connection, line); + if (line.trim() !== '') void respond(ctx, connection, line, pending); } }); connection.on('error', () => {}); }); mkdirSync(path.dirname(socket), { recursive: true }); rmSync(socket, { force: true }); - server.on('error', (error) => ctx.logger?.warn?.(\`codedeck-commands: \${error.message}\`)); + server.on('error', (error) => ctx.logger?.warn?.('codedeck-bridge: ' + error.message)); server.listen(socket); ctx.effect(() => () => { server.close(); rmSync(socket, { force: true }); - }, 'codedeck.commands'); + }, 'codedeck.bridge'); } -async function respond(ctx, connection, line) { +/** One socket request: what a session can run, or the answer to a question. */ +async function respond(ctx, connection, line, pending) { const reply = (body) => connection.write(JSON.stringify(body) + '\\n'); let request; try { @@ -85,6 +138,18 @@ async function respond(ctx, connection, line) { } const id = request?.id; try { + if (request.method === 'answer') { + const job = pending.get(request.callId); + if (job === undefined) { + reply({ id, ok: false, error: 'that question is no longer waiting' }); + return; + } + pending.delete(request.callId); + if (request.answer === undefined) job.reject(new Error('the user did not answer')); + else job.resolve({ answers: request.answer }); + reply({ id, ok: true }); + return; + } const agent = ctx.get('agents')?.get(request?.sessionId); if (agent === undefined) { reply({ id, ok: false, error: 'no live session with that id' }); @@ -114,7 +179,7 @@ async function respond(ctx, connection, line) { reply({ id, ok: true, result: { kind: execution.result.kind, text: execution.result.text ?? '' } }); return; } - reply({ id, ok: false, error: \`unknown method \${String(request.method)}\` }); + reply({ id, ok: false, error: 'unknown method ' + String(request.method) }); } catch (error) { reply({ id, ok: false, error: error instanceof Error ? error.message : String(error) }); } @@ -125,12 +190,12 @@ async function respond(ctx, connection, line) { function manifest(): string { return `${JSON.stringify( { - name: COMMANDS_PLUGIN, + name: HARNESS_PLUGIN, version: '1.0.0', private: true, type: 'module', main: 'index.js', - description: "CodeDeck+'s local command bridge for the harness's automation profile", + description: "CodeDeck+'s side channel into the harness's automation profile", }, null, 2, @@ -139,11 +204,10 @@ function manifest(): string { /** * Put the plugin where the harness loads it from — its package in the - * profile's `node_modules`, and a row naming it in the profile's patch layer - * — and answer the directory it lives in. + * profile's `node_modules`, and a row naming it in the profile's patch layer. */ -export async function installCommandsPlugin(profileDir: string, socket: string, log: (message: string) => void): Promise { - const dir = path.join(profileDir, 'node_modules', COMMANDS_PLUGIN); +export async function installHarnessPlugin(profileDir: string, socket: string, log: (message: string) => void): Promise { + const dir = path.join(profileDir, 'node_modules', HARNESS_PLUGIN); await mkdir(dir, { recursive: true }); await writeIfChanged(path.join(dir, 'package.json'), manifest()); await writeIfChanged(path.join(dir, 'index.js'), SOURCE); @@ -154,8 +218,8 @@ export async function installCommandsPlugin(profileDir: string, socket: string, function rows(socket: string): string { return [ '- insert:', - ' - id: codedeck-commands', - ` name: '${COMMANDS_PLUGIN}'`, + ' - id: codedeck-bridge', + ` name: '${HARNESS_PLUGIN}'`, ' config:', ` socket: ${JSON.stringify(socket)}`, ].join('\n'); diff --git a/packages/agent-host/src/drivers/deepseek/questions.ts b/packages/agent-host/src/drivers/deepseek/questions.ts new file mode 100644 index 00000000..8539bcf7 --- /dev/null +++ b/packages/agent-host/src/drivers/deepseek/questions.ts @@ -0,0 +1,128 @@ +/** + * The questions the harness's model asks, on their way to the phone and back. + * + * The harness has a `user-questions` service and a tool that uses it: the + * model can put a decision to the user — with options, or free text — and wait + * for the answer. Its answerer is a UI panel in the harness's own apps; in the + * automation profile there is none, so the tool fails with "no user-questions + * answerer configured". Our plugin composes one (plugin.ts), which pushes the + * question to the host over stderr and waits for the answer on its socket. + * + * This module is the host's half: what a pushed question becomes on the phone + * (`QuestionSpec`, the same shape the other drivers send), and what the + * phone's answer becomes for the harness. Both are the harness's own shapes + * (its `AskUserQuestionItem` and `AskUserQuestionAnswer`), which is what makes + * the round trip exact: option labels are what a selected answer carries, and + * free text is what a typed one does. + */ +import type { QuestionSpec } from '../../types'; + +/** One question as the plugin pushes it. */ +export interface PushedQuestion { + id: string; + question: string; + header?: string; + detail?: string; + options?: Array<{ label: string; description?: string }>; + multiSelect?: boolean; +} + +/** One line the plugin pushed, once parsed. */ +export interface PushedQuestionLine { + sessionId?: string; + callId: string; + questions: PushedQuestion[]; +} + +/** + * Parse one pushed line, or `undefined` when it is not one (the marker is how + * a question is told apart from the harness's own stderr). The remainder after + * the marker is JSON the plugin wrote. + */ +export function parseQuestionLine(line: string, marker: string): PushedQuestionLine | undefined { + const at = line.indexOf(marker); + if (at < 0) return undefined; + try { + const parsed: unknown = JSON.parse(line.slice(at + marker.length).trim()); + if (typeof parsed !== 'object' || parsed === null) return undefined; + const { callId, sessionId, questions } = parsed as { callId?: unknown; sessionId?: unknown; questions?: unknown }; + if (typeof callId !== 'string' || !Array.isArray(questions)) return undefined; + return { + callId, + ...(typeof sessionId === 'string' ? { sessionId } : {}), + questions: questions.map(toPushed).filter((question): question is PushedQuestion => question !== undefined), + }; + } catch { + return undefined; + } +} + +function toPushed(raw: unknown): PushedQuestion | undefined { + if (typeof raw !== 'object' || raw === null) return undefined; + const item = raw as Record; + if (typeof item.id !== 'string' || typeof item.question !== 'string') return undefined; + const options = Array.isArray(item.options) + ? item.options + .map((option) => + typeof option === 'object' && option !== null && typeof (option as { label?: unknown }).label === 'string' + ? { + label: (option as { label: string }).label, + ...(typeof (option as { description?: unknown }).description === 'string' + ? { description: (option as { description: string }).description } + : {}), + } + : undefined, + ) + .filter((option): option is { label: string; description?: string } => option !== undefined) + : undefined; + return { + id: item.id, + question: item.question, + ...(typeof item.header === 'string' && item.header !== '' ? { header: item.header } : {}), + ...(typeof item.detail === 'string' && item.detail !== '' ? { detail: item.detail } : {}), + ...(options && options.length > 0 ? { options } : {}), + ...(item.multiSelect === true ? { multiSelect: true } : {}), + }; +} + +/** + * What the phone shows: the harness's questions in the wire's shape. The + * question's own detail travels with the text, because a phone card shows one + * body (the same way a plan's or a tool's detail does). + */ +export function toQuestionSpecs(questions: PushedQuestion[]): QuestionSpec[] { + return questions.map((question) => ({ + question: question.detail ? `${question.question}\n\n${question.detail}` : question.question, + ...(question.header ? { header: question.header } : {}), + options: (question.options ?? []).map((option) => ({ + label: option.label, + ...(option.description ? { description: option.description } : {}), + })), + ...(question.multiSelect ? { multiSelect: true } : {}), + })); +} + +/** + * The phone's answers as the harness takes them: one item per question, keyed + * by the question's id. The phone answers with one string per question; a + * multi-select arrives as its labels joined by ", ", and is split into them + * only when every piece is one of the offered labels — anything else is what + * the user typed, which the harness takes as custom text. + */ +export function toAnswerItems( + questions: PushedQuestion[], + answers: string[], +): Array<{ id: string; selected: string[]; custom?: string }> { + return questions.map((question, index) => { + const raw = answers[index] ?? ''; + if (raw === '') return { id: question.id, selected: [] }; + if (question.multiSelect) { + const labels = new Set((question.options ?? []).map((option) => option.label)); + const pieces = raw.split(', '); + if (pieces.length > 0 && pieces.every((piece) => labels.has(piece))) return { id: question.id, selected: pieces }; + return { id: question.id, selected: [], custom: raw }; + } + const labels = new Set((question.options ?? []).map((option) => option.label)); + return labels.has(raw) ? { id: question.id, selected: [raw] } : { id: question.id, selected: [], custom: raw }; + }); +} diff --git a/packages/agent-host/src/drivers/deepseek/runtime.ts b/packages/agent-host/src/drivers/deepseek/runtime.ts index e7013030..a20cb445 100644 --- a/packages/agent-host/src/drivers/deepseek/runtime.ts +++ b/packages/agent-host/src/drivers/deepseek/runtime.ts @@ -36,6 +36,7 @@ import { agentCacheDir } from '../../agentInstall'; import { isFile } from '../../executable'; import { AcpClient, INITIALIZE_TIMEOUT_MS } from './acp'; import { DSH_LABEL } from './install'; +import { QUESTION_MARKER } from './plugin'; /** The ACP profile the driver runs: the automation surface, ACP on stdio. */ export const DSH_PROFILE = 'acp'; @@ -66,6 +67,9 @@ export interface DeepSeekSessionHandler { export interface DeepSeekProcessEvents { /** The process is gone: every session it served has ended. */ ended(sessionIds: readonly string[], error: string): void; + /** The harness's model asked the user something (the plugin pushes it on + * stderr, the one stream that is not the protocol's). */ + question?(line: string): void; } /** One live harness process. */ @@ -175,6 +179,7 @@ class HarnessProcess implements DeepSeekProcess { configVersion: number, private readonly hooks: { log: (message: string) => void; + question: (line: string) => void; gone: (process_: HarnessProcess) => void; release: (process_: HarnessProcess) => void; ended: (sessionIds: readonly string[], error: string) => void; @@ -269,6 +274,12 @@ class HarnessProcess implements DeepSeekProcess { const line = this.stderrBuffer.slice(0, end).replace(/\r$/, ''); this.stderrBuffer = this.stderrBuffer.slice(end + 1); if (line.trim() === '') continue; + // A question this bridge is asked to carry is the driver's, not the + // log's: the plugin pushes it here because stdout belongs to ACP. + if (line.includes(QUESTION_MARKER)) { + this.hooks.question(line); + continue; + } this.hooks.log(`[deepseek] ${line}`); const failure = MCP_FAILURE.exec(line); if (failure?.[1] !== undefined) this.failures.set(failure[1], line); @@ -302,6 +313,19 @@ export class DeepSeekRuntime { } } + /** + * Resolve the runtime now — installing it when the machine has none — so a + * session that comes later does not wait for the download. A failure is + * only logged: the next session asks again, and reports it then. + */ + async prepare(): Promise { + try { + await this.entryPoint(); + } catch (error) { + this.log(`[deepseek] the DeepSeek Harness runtime is not ready yet: ${error instanceof Error ? error.message : String(error)}`); + } + } + /** * The runtime's own `node_modules`: every `@deepseek-ai/*` package the * harness ships resolves from here, which is where a shipped bundle's @@ -318,19 +342,6 @@ export class DeepSeekRuntime { return undefined; } - /** - * Resolve the runtime now — installing it when the machine has none — so a - * session that comes later does not wait for the download. A failure is - * only logged: the next session asks again, and reports it then. - */ - async prepare(): Promise { - try { - await this.entryPoint(); - } catch (error) { - this.log(`[deepseek] the DeepSeek Harness runtime is not ready yet: ${error instanceof Error ? error.message : String(error)}`); - } - } - /** Close every process. Called on host shutdown. */ async close(): Promise { this.stopping = true; @@ -383,6 +394,7 @@ export class DeepSeekRuntime { this.options.configVersion?.() ?? 0, { log: this.log, + question: (line) => events.question?.(line), gone: (gone) => this.forget(context.key, context, gone), release: (released) => this.release(context, released), ended: (sessionIds, error) => events.ended(sessionIds, error), From 5d14275e73a660a26302d31cd85b0556a0cfa766 Mon Sep 17 00:00:00 2001 From: deymosh <232244450+deymosh@users.noreply.github.com> Date: Sun, 4 Oct 2026 22:49:54 +0200 Subject: [PATCH 11/22] feat(agent-host): the harness's plan review, on the phone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The harness's `exit_plan_mode` presents a finished plan through the same `user-questions` service the question tool uses, and it asked in a shape the answerer did not read: a plan review names no call id where the plugin looked for one, so the ask was left unanswered and the tool died reading `answers` off nothing. That id is on the question's intent for this ask, and a request this bridge cannot show at all is now handed down the chain with `next()` — a waterfall listener that merely returns has vetoed the chain, which is what turned an unreadable request into that crash. Reaching the phone, a plan review is shown the way Claude Code's is, since it is the same exchange: the plan as a plan of its own, and the choice as the approval card, wearing the harness's own labels — that label is the verdict the tool reads. A plan the user did not approve goes back to the model to revise, with their feedback arriving as their next message, as it does for the other agent. The plan review's own tool rows are hidden with the question tool's: the plan would otherwise be in the transcript a second time, as raw arguments. Co-Authored-By: Claude Code --- docs/DEEPSEEK.md | 34 +++-- .../__tests__/deepseek-adapter.test.ts | 33 +++++ .../__tests__/deepseekCommands.test.ts | 122 +++++++++++++++++- .../deepseek/__tests__/deepseekDriver.test.ts | 61 +++++++++ .../src/drivers/deepseek/adapter.ts | 14 +- .../agent-host/src/drivers/deepseek/driver.ts | 72 +++++++---- .../agent-host/src/drivers/deepseek/plugin.ts | 30 +++-- .../src/drivers/deepseek/questions.ts | 68 ++++++++-- 8 files changed, 367 insertions(+), 67 deletions(-) diff --git a/docs/DEEPSEEK.md b/docs/DEEPSEEK.md index 3e91edf8..e34eb565 100644 --- a/docs/DEEPSEEK.md +++ b/docs/DEEPSEEK.md @@ -139,15 +139,24 @@ command's own words come back as the agent's answer (`/plan` answers "Plan mode on", `/goal set X` answers with the goal it now holds). **Questions.** The harness's model can put a decision to the user — its -`ask_user_question` tool and its plan review both ask through the same service -— and that service's answerer is a panel in the harness's own apps. Without -one, the tool fails with "no user-questions answerer configured", which is -what a plain setup does. The plugin composes an answerer instead: the question -is pushed to the host as a marker line on the harness's stderr (the one stream -that is not ACP's), the phone shows it as the very card the other agents' ask -uses, and the answer goes back the way the harness takes one — the labels of -the chosen options, or the text the user typed. Each question carries its own -id, so a batch of them comes back matched to what was asked. +`ask_user_question` tool, that tool's timed form, and the plan review +`exit_plan_mode` presents all ask through one service — and that service's +answerer is a panel in the harness's own apps. Without one the ask fails with +"no user-questions answerer configured", which is what a plain setup does. The +plugin composes an answerer instead: the ask is pushed to the host as a marker +line on the harness's stderr (the one stream that is not ACP's), the phone +shows it as the very card the other agents' ask uses, and the answer goes back +the way the harness takes one — the labels of the chosen options, or the text +the user typed. Each question carries its own id, so a batch of them comes +back matched to what was asked. + +A plan review arrives as the same exchange Claude Code's is, because it is the +same one: the plan as a plan of its own, and the choice as the approval card, +wearing the harness's own labels (approve, or keep planning). The labels are +the verdict — the harness's tool looks for the one its intent declared — so a +plan the user did not approve goes back to the model to revise, with their +feedback arriving as their next message, exactly as it does for the other +agent. The socket is a file in the bridge's home (`/data/codedeck/dsh-bridge.sock`, a named pipe on Windows, named after the home). Nothing else about the profile @@ -155,9 +164,10 @@ changes, and the plugin is harmless if the harness moves under it: a list that cannot be read means the phone offers no commands, an unanswerable question reads as one the user did not answer, and a slash line is ordinary text again — a session never fails over either. Two things it does not do: a command that -takes attachments gets none (this bridge sends the line alone), and the -question tool's own row is hidden in the transcript, since the question card is -the exchange. +takes attachments gets none (this bridge sends the line alone), and the rows of +the calls that ask the user — the question tool's and the plan review's — are +hidden in the transcript, since the card is the exchange (the plan review's row +would be the plan again, as raw arguments). ## MCP servers diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts index 4191138f..e255db89 100644 --- a/packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseek-adapter.test.ts @@ -124,6 +124,39 @@ describe('tool calls', () => { }); }); + it('hides the rows of the calls whose card is the exchange', () => { + // The question tool and the plan review both ask through the harness's + // user-questions service: the bridge shows the ask and sends back the + // answer, so their own rows would be a second, emptier copy of it — and + // for the plan review that copy is the plan again, as raw arguments. + const calls = started('ask_user_question', { questions: [{ id: 'q1', question: 'Q?' }] }); + const review = entries( + { + sessionUpdate: 'tool_call', + toolCallId: 'c2', + title: 'exit_plan_mode', + kind: 'other', + status: 'in_progress', + rawInput: { plan: '# Ship it\n\nDo the thing.' }, + }, + calls, + ); + expect(review).toEqual([]); + // The result is as invisible as the call, and neither is left behind. + expect( + entries( + { + sessionUpdate: 'tool_call_update', + toolCallId: 'c2', + status: 'completed', + content: [{ type: 'content', content: { type: 'text', text: 'Plan approved' } }], + }, + calls, + ), + ).toEqual([]); + expect(calls.size).toBe(1); + }); + it('keeps the tool name of an MCP tool', () => { const call = entries({ sessionUpdate: 'tool_call', diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts index 84d95a44..51be1572 100644 --- a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekCommands.test.ts @@ -11,7 +11,7 @@ import { pathToFileURL } from 'node:url'; import { describe, expect, it, vi } from 'vitest'; import { askPlugin, bridgeSocketPath, listSessionCommands, runSessionCommand } from '../bridge'; import { HARNESS_PLUGIN, QUESTION_MARKER, installHarnessPlugin } from '../plugin'; -import { parseQuestionLine, toAnswerItems, toQuestionSpecs } from '../questions'; +import { parseQuestionLine, planReviewOf, toAnswerItems, toQuestionSpecs } from '../questions'; const socketPathIn = (dir: string): string => path.join(dir, 'commands.sock'); @@ -227,11 +227,90 @@ describe('questions, through the plugin', () => { for (const cleanup of cleanups) cleanup(); }); - it('leaves a question it cannot key to another answerer', async () => { + it('shows a plan review, whose ask names no wait, and returns the verdict', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, socket, listeners } = await runPlugin(dir, { list: () => [], execute: () => Promise.resolve(undefined) }); + await waitForSocket(socket); + const pushed: string[] = []; + const stderr = vi.spyOn(process.stderr, 'write').mockImplementation((chunk: unknown) => { + pushed.push(String(chunk)); + return true; + }); + // The plan review of `exit_plan_mode` asks the same service the question + // tool does: the plan is the question's detail, and the call id is on its + // intent — there is no `wait` to read it from. + const review = { + questions: [ + { + id: 'plan-review', + header: 'Plan review', + question: 'Approve this plan and leave plan mode?', + detail: '# Ship the harness\n\nDo the thing.', + options: [{ label: 'Approve' }, { label: 'Keep planning' }], + intent: { kind: 'plan-review', approve: 'Approve', callId: 'call-7' }, + }, + ], + agent: { session: { id: 's1' } }, + signal: new AbortController().signal, + }; + const pending = listeners.get('user-questions/request')!(review as never, () => Promise.reject(new Error('delegated')) as never); + stderr.mockRestore(); + + const parsed = parseQuestionLine(pushed.find((chunk) => chunk.includes(QUESTION_MARKER))!, QUESTION_MARKER)!; + expect(parsed).toMatchObject({ sessionId: 's1', callId: 'call-7' }); + expect(toQuestionSpecs(parsed.questions)).toEqual([ + { + question: 'Approve this plan and leave plan mode?\n\n# Ship the harness\n\nDo the thing.', + header: 'Plan review', + options: [{ label: 'Approve' }, { label: 'Keep planning' }], + }, + ]); + + // The verdict travels back as the harness reads it: the chosen label. + await askPlugin( + socket, + { method: 'answer', callId: 'call-7', sessionId: 's1', answer: toAnswerItems(parsed.questions, ['Approve']) }, + 2_000, + () => {}, + ); + expect(await pending).toEqual({ answers: [{ id: 'plan-review', selected: ['Approve'] }] }); + for (const cleanup of cleanups) cleanup(); + }); + + it('asks under a key of its own when the request names none', async () => { + const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); + const { cleanups, socket, listeners } = await runPlugin(dir, { list: () => [], execute: () => Promise.resolve(undefined) }); + await waitForSocket(socket); + const pushed: string[] = []; + const stderr = vi.spyOn(process.stderr, 'write').mockImplementation((chunk: unknown) => { + pushed.push(String(chunk)); + return true; + }); + const pending = listeners.get('user-questions/request')!( + { questions: [{ id: 'q1', question: 'And now?' }], agent: { session: { id: 's1' } } } as never, + () => Promise.reject(new Error('delegated')) as never, + ); + stderr.mockRestore(); + + const parsed = parseQuestionLine(pushed.find((chunk) => chunk.includes(QUESTION_MARKER))!, QUESTION_MARKER)!; + expect(parsed.callId).not.toBe(''); + await askPlugin(socket, { method: 'answer', callId: parsed.callId, sessionId: 's1', answer: [{ id: 'q1', selected: [] }] }, 2_000, () => {}); + expect(await pending).toEqual({ answers: [{ id: 'q1', selected: [] }] }); + for (const cleanup of cleanups) cleanup(); + }); + + it('hands a request it cannot show to the next answerer', async () => { const dir = mkdtempSync(path.join(tmpdir(), 'codedeck-dsh-cmd-')); const { cleanups, listeners } = await runPlugin(dir, { list: () => [], execute: () => Promise.resolve(undefined) }); const listener = listeners.get('user-questions/request')!; - expect(await listener({ questions: [] } as never, () => Promise.reject(new Error('delegated')) as never)).toBeUndefined(); + // `next()` is how a waterfall listener passes a request on. Returning + // without it vetoes the chain and leaves the caller with `undefined` where + // the answer batch belongs — a crash wherever the ask's result is read. + const delegated = vi.fn(() => Promise.resolve({ answers: [] })); + const nothingAsked = await listener({ questions: [], agent: { session: { id: 's1' } } } as never, delegated as never); + const noSession = await listener({ questions: [{ id: 'q1', question: 'Q?' }] } as never, delegated as never); + expect([nothingAsked, noSession]).toEqual([{ answers: [] }, { answers: [] }]); + expect(delegated).toHaveBeenCalledTimes(2); for (const cleanup of cleanups) cleanup(); }); }); @@ -278,6 +357,43 @@ describe('what the host makes of a question', () => { expect(parseQuestionLine('the harness logging something', QUESTION_MARKER)).toBeUndefined(); expect(parseQuestionLine(`${QUESTION_MARKER}not json`, QUESTION_MARKER)).toBeUndefined(); expect(parseQuestionLine(`${QUESTION_MARKER}{"questions":[]}`, QUESTION_MARKER)).toBeUndefined(); + // What an ask is for travels with it: a plan review is told from a plain + // question by nothing else. + const withIntent = `${QUESTION_MARKER}${JSON.stringify({ + sessionId: 's1', + callId: 'c1', + questions: [{ id: 'q1', question: 'Q?', intent: { kind: 'plan-review', approve: 'Approve' } }], + })}`; + expect(parseQuestionLine(withIntent, QUESTION_MARKER)?.questions[0]?.intent).toEqual({ kind: 'plan-review', approve: 'Approve' }); + }); + + it('reads a plan review out of an ask, and leaves plain questions alone', () => { + expect(planReviewOf([{ id: 'q1', question: 'Q?' }])).toBeUndefined(); + // Nothing to show, or nothing to choose: an ordinary question either way. + expect(planReviewOf([{ id: 'q1', question: 'Q?', intent: { kind: 'plan-review' } }])).toBeUndefined(); + expect( + planReviewOf([{ id: 'q1', question: 'Q?', detail: '# P', intent: { kind: 'plan-review' } }]), + ).toBeUndefined(); + expect( + planReviewOf([ + { + id: 'plan-review', + header: 'Plan review', + question: 'Approve this plan and leave plan mode?', + detail: '# Ship it', + options: [{ label: 'Approve', description: 'Go.' }, { label: 'Keep planning' }], + intent: { kind: 'plan-review', approve: 'Approve' }, + }, + ]), + ).toEqual({ + id: 'plan-review', + plan: '# Ship it', + // The label is the option id: that is what the harness reads back. + options: [ + { id: 'Approve', label: 'Approve', description: 'Go.' }, + { id: 'Keep planning', label: 'Keep planning' }, + ], + }); }); }); diff --git a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts index 0063a85f..f496e824 100644 --- a/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts +++ b/packages/agent-host/src/drivers/deepseek/__tests__/deepseekDriver.test.ts @@ -900,6 +900,67 @@ describe('the questions the model asks', () => { socket.close(); }); + /** A plan review as the plugin pushes it: `exit_plan_mode` asks through the + * same service as the question tool, with the plan as one question's + * detail and the verdicts as its options. */ + const pushedPlan = (callId: string): string => + `${QUESTION_MARKER}${JSON.stringify({ + sessionId: 's1', + callId, + questions: [ + { + id: 'plan-review', + header: 'Plan review', + question: 'Approve this plan and leave plan mode?', + detail: '# Ship the harness\n\nDo the thing.', + options: [{ label: 'Approve', description: 'Leave plan mode.' }, { label: 'Keep planning' }], + intent: { kind: 'plan-review', approve: 'Approve' }, + }, + ], + })}\n`; + + it('shows a plan review as the plan plus an approval, and sends the verdict', async () => { + const ready = withDriver(); + const socket = await bridge(ready); + const ctx = recordingContext({ + plan: (requestId, options) => { + expect(requestId).toBe('c9'); + // The harness's own labels are the choices: they are what the tool + // reads its verdict from. + expect(options).toEqual([ + { id: 'Approve', label: 'Approve', description: 'Leave plan mode.' }, + { id: 'Keep planning', label: 'Keep planning' }, + ]); + return { outcome: 'selected', optionId: 'Approve' }; + }, + }); + await started(ready, {}, ctx); + ready.harness.child.stderr.write(pushedPlan('c9')); + await vi.waitFor(() => expect(socket.requests.some((request) => request.method === 'answer')).toBe(true)); + // The plan is a plan of its own, the way Claude Code's plan review shows + // it — not a question card with a plan in its body. + expect(ctx.entries().some((entry) => entry.entryType === 'plan' && entry.text === '# Ship the harness\n\nDo the thing.')).toBe(true); + expect(ctx.questions).toEqual([]); + expect(socket.requests.find((request) => request.method === 'answer')).toMatchObject({ + sessionId: 's1', + callId: 'c9', + answer: [{ id: 'plan-review', selected: ['Approve'] }], + }); + socket.close(); + }); + + it('leaves a plan the user did not approve unanswered, so the tool says so', async () => { + const ready = withDriver(); + const socket = await bridge(ready); + const ctx = recordingContext({ plan: () => ({ outcome: 'cancelled', reason: 'the phone went away' }) }); + await started(ready, {}, ctx); + ready.harness.child.stderr.write(pushedPlan('c9')); + await vi.waitFor(() => expect(socket.requests.some((request) => request.method === 'answer')).toBe(true)); + const answer = socket.requests.find((request) => request.method === 'answer')!; + expect(answer.answer).toBeUndefined(); + socket.close(); + }); + it('keeps a pushed question out of the harness log', async () => { const ready = withDriver(); const socket = await bridge(ready); diff --git a/packages/agent-host/src/drivers/deepseek/adapter.ts b/packages/agent-host/src/drivers/deepseek/adapter.ts index 1fad81a6..e262a0a9 100644 --- a/packages/agent-host/src/drivers/deepseek/adapter.ts +++ b/packages/agent-host/src/drivers/deepseek/adapter.ts @@ -22,11 +22,13 @@ import { MAX_DIFF_LINES, truncateToolResult, toDiffLines, type DiffPayload } fro import type { OutputEntry } from '../../types'; /** - * The harness's question tool. Its card is the question itself — the bridge - * shows it, and the answer goes back through the command bridge — so its own - * tool rows would be a second, emptier copy of the same exchange. + * The tools whose card *is* the exchange. The question tool asks through the + * harness's `user-questions` service and so does the plan review + * (`exit_plan_mode`); the bridge shows each as a question card and sends the + * answer back, so their own tool rows would be a second, emptier copy — and + * for a plan review the copy is its raw arguments, the whole plan as JSON. */ -const QUESTION_TOOL = 'ask_user_question'; +const QUESTION_TOOLS = new Set(['ask_user_question', 'exit_plan_mode']); /** What a tool call's own update carried: its result update repeats neither * the tool's name nor its input. */ @@ -70,7 +72,7 @@ function toolCallEntries( const name = toolNameOf(update); const input = record(update.rawInput); calls.set(update.toolCallId, { name, input }); - if (name === QUESTION_TOOL) return []; + if (QUESTION_TOOLS.has(name)) return []; const locations = fileLocations(name, input); const full = toolInput(name, input); const todos = todosOf(input); @@ -102,7 +104,7 @@ function toolResultEntries( if (status !== 'completed' && status !== 'failed') return []; const facts = calls.get(update.toolCallId); calls.delete(update.toolCallId); - if (facts?.name === QUESTION_TOOL) return []; + if (facts !== undefined && QUESTION_TOOLS.has(facts.name)) return []; const text = contentText(update.content); const entries: OutputEntry[] = [ { diff --git a/packages/agent-host/src/drivers/deepseek/driver.ts b/packages/agent-host/src/drivers/deepseek/driver.ts index 8b8132dd..f3599afd 100644 --- a/packages/agent-host/src/drivers/deepseek/driver.ts +++ b/packages/agent-host/src/drivers/deepseek/driver.ts @@ -39,7 +39,7 @@ import { deepseekUpdateToEntries, type ToolCallMemory } from './adapter'; import { DEEPSEEK_API_KEY_CREDENTIAL, DEEPSEEK_API_KEY_ENV, DEEPSEEK_BASE_URL_ENV, buildDeepSeekEnv } from './env'; import { askPlugin, bridgeSocketPath, listSessionCommands, runSessionCommand } from './bridge'; import { HARNESS_PLUGIN, installHarnessPlugin, QUESTION_MARKER } from './plugin'; -import { parseQuestionLine, toAnswerItems, toQuestionSpecs, type PushedQuestionLine } from './questions'; +import { parseQuestionLine, planReviewOf, toAnswerItems, toQuestionSpecs, type PlanReview, type PushedQuestionLine } from './questions'; import { gatewayModelsUrl, syncGatewayCatalog } from './gateway'; import { DSH_LABEL } from './install'; import { DeepSeekMcp } from './mcp'; @@ -543,33 +543,55 @@ export class DeepSeekSession implements DriverSession { /** * The harness's model asked the user something, and the plugin pushed it - * here. It goes to the phone as the same question card the other agents - * send, and the answer goes back the way the harness takes it — labels for - * a chosen option, free text for a typed one. An unanswered question (the + * here. A question goes to the phone as the same card the other agents send, + * and the answer goes back the way the harness takes it — labels for a + * chosen option, free text for a typed one. An unanswered question (the * phone is gone, the user cancelled, the turn ended) is answered with * nothing, which the harness reports to the model as a question that was * not answered. */ askQuestion(pushed: PushedQuestionLine): void { - const specs = toQuestionSpecs(pushed.questions); - void this.ctx - .askQuestion(pushed.callId, specs) - .then((outcome) => - askPlugin( - this.deps.pluginSocket, - { - method: 'answer', - sessionId: this.nativeId, - callId: pushed.callId, - ...(outcome.outcome === 'answered' ? { answer: toAnswerItems(pushed.questions, outcome.answers) } : {}), - }, - QUESTION_TIMEOUT_MS, - this.ctx.log, - ), - ) - .catch((error: unknown) => { - this.ctx.log(`[deepseek] could not pass a question on: ${error instanceof Error ? error.message : String(error)}`); - }); + const review = planReviewOf(pushed.questions); + void (review === undefined ? this.showQuestion(pushed) : this.showPlanReview(pushed, review)).catch((error: unknown) => { + this.ctx.log(`[deepseek] could not pass a question on: ${error instanceof Error ? error.message : String(error)}`); + }); + } + + private async showQuestion(pushed: PushedQuestionLine): Promise { + const outcome = await this.ctx.askQuestion(pushed.callId, toQuestionSpecs(pushed.questions)); + await this.answerHarness(pushed.callId, { + ...(outcome.outcome === 'answered' ? { answer: toAnswerItems(pushed.questions, outcome.answers) } : {}), + }); + } + + /** + * A plan review is the harness's `exit_plan_mode` asking whether to leave + * plan mode. It is the same exchange Claude Code's driver has — a plan the + * user reads and then approves or sends back — so it gets the same two + * pieces on the phone: the plan as a plan of its own, and the approval card, + * whose choices are the harness's own labels because that is what the tool + * reads its verdict from. The user's feedback on a plan they did not approve + * arrives as their next message, as it does for the other agent. + */ + private async showPlanReview(pushed: PushedQuestionLine, review: PlanReview): Promise { + this.deliver({ entryType: 'plan', text: review.plan, timestamp: now() }); + const outcome = await this.ctx.requestPlanApproval(pushed.callId, review.options); + await this.answerHarness(pushed.callId, { + // The chosen label is the whole verdict: the tool looks for the one its + // intent declared as the approval. + ...(outcome.outcome === 'selected' ? { answer: [{ id: review.id, selected: [outcome.optionId] }] } : {}), + }); + } + + /** What the phone decided, back to the harness: the plugin is holding the + * ask open, and an answer it is not given is one the user did not make. */ + private answerHarness(callId: string, answer: Record): Promise { + return askPlugin( + this.deps.pluginSocket, + { method: 'answer', sessionId: this.nativeId, callId, ...answer }, + QUESTION_TIMEOUT_MS, + this.ctx.log, + ); } /** What this session's harness can run, asked of the harness itself (the @@ -825,8 +847,8 @@ export class DeepSeekDriver implements Driver { providers: true, gsd: true, interrupt: true, - // Through the command plugin this driver installs into the profile - // (commandsPlugin.ts): the harness's registry is reachable from + // Through the plugin this driver installs into the profile + // (plugin.ts): the harness's command registry is reachable from // inside its process, never over ACP. commands: true, plugins: true, diff --git a/packages/agent-host/src/drivers/deepseek/plugin.ts b/packages/agent-host/src/drivers/deepseek/plugin.ts index e61722fc..63f601aa 100644 --- a/packages/agent-host/src/drivers/deepseek/plugin.ts +++ b/packages/agent-host/src/drivers/deepseek/plugin.ts @@ -5,8 +5,9 @@ * Both exist in this profile and neither is reachable from outside it. ACP has * no command list and no way to invoke one, and the harness keeps commands and * human-interaction for its own UI modules; the same is true of the - * `user-questions` service, whose answerer is a browser panel. Inside the - * process both are ordinary services. + * `user-questions` service, whose answerer is a browser panel and which every + * ask goes through — the question tool, the timed one, and the plan review + * `exit_plan_mode` presents. Inside the process both are ordinary services. * * So CodeDeck brings its own transport: this plugin, installed into the * profile, holds the command registry and composes the questions answerer, and @@ -47,7 +48,8 @@ export const QUESTION_MARKER = 'codedeck-question:'; * it as it is, so nothing here may need a build step, and it must not import * anything of CodeDeck's — the profile has no idea this host exists. */ -const SOURCE = `import { mkdirSync, rmSync } from 'node:fs'; +const SOURCE = `import { randomUUID } from 'node:crypto'; +import { mkdirSync, rmSync } from 'node:fs'; import net from 'node:net'; import path from 'node:path'; @@ -68,13 +70,23 @@ export function apply(ctx, config) { /** Questions waiting for the host's answer, by call id. */ const pending = new Map(); - ctx.on('user-questions/request', async (request) => { - // The card is keyed by the tool call, and the host needs the session; a - // request without either is one this bridge cannot show, so another - // answerer — or the harness's own error — has it. - const callId = request?.wait?.callId; + ctx.on('user-questions/request', async (request, next) => { + const questions = Array.isArray(request?.questions) ? request.questions : []; const sessionId = request?.agent?.session?.id; - if (callId === undefined || sessionId === undefined) return undefined; + // A request this bridge cannot show — nothing asked, or no live session to + // put it to — goes on down the chain, where the harness's own answerer or + // its "no answerer" error has it. That hand-off is next(): a listener that + // simply returns has *vetoed* the chain, which leaves the caller with + // undefined where an answer batch belongs. + if (questions.length === 0 || typeof sessionId !== 'string') return next(); + // The card is keyed by the tool call. An ask usually names it (in wait; + // the timed one adds the deadline), a plan review names it on the + // question's intent instead, and anything else gets a key of ours — it + // only has to come back with the answer. + const callId = + [request?.wait?.callId, ...questions.map((question) => question?.intent?.callId)].find( + (id) => typeof id === 'string' && id !== '', + ) ?? randomUUID(); const job = {}; job.promise = new Promise((resolve, reject) => { job.resolve = resolve; diff --git a/packages/agent-host/src/drivers/deepseek/questions.ts b/packages/agent-host/src/drivers/deepseek/questions.ts index 8539bcf7..d1e7294e 100644 --- a/packages/agent-host/src/drivers/deepseek/questions.ts +++ b/packages/agent-host/src/drivers/deepseek/questions.ts @@ -1,19 +1,20 @@ /** * The questions the harness's model asks, on their way to the phone and back. * - * The harness has a `user-questions` service and a tool that uses it: the - * model can put a decision to the user — with options, or free text — and wait - * for the answer. Its answerer is a UI panel in the harness's own apps; in the - * automation profile there is none, so the tool fails with "no user-questions - * answerer configured". Our plugin composes one (plugin.ts), which pushes the - * question to the host over stderr and waits for the answer on its socket. + * The harness has a `user-questions` service, and everything that needs the + * user asks through it: the model's question tool, its timed form, and the + * plan review `exit_plan_mode` presents. Its answerer is a UI panel in the + * harness's own apps; in the automation profile there is none, so the ask + * fails with "no user-questions answerer configured". Our plugin composes one + * (plugin.ts), which pushes the ask to the host over stderr and waits for the + * answer on its socket. * - * This module is the host's half: what a pushed question becomes on the phone - * (`QuestionSpec`, the same shape the other drivers send), and what the - * phone's answer becomes for the harness. Both are the harness's own shapes - * (its `AskUserQuestionItem` and `AskUserQuestionAnswer`), which is what makes - * the round trip exact: option labels are what a selected answer carries, and - * free text is what a typed one does. + * This module is the host's half: what a pushed ask becomes on the phone + * (`QuestionSpec` for a question, a plan and an approval for a plan review), + * and what the phone's answer becomes for the harness. Both are the harness's + * own shapes (its `AskUserQuestionItem` and `AskUserQuestionAnswer`), which is + * what makes the round trip exact: option labels are what a selected answer + * carries, and free text is what a typed one does. */ import type { QuestionSpec } from '../../types'; @@ -25,6 +26,10 @@ export interface PushedQuestion { detail?: string; options?: Array<{ label: string; description?: string }>; multiSelect?: boolean; + /** What the ask is for, when the harness says. A plan review declares + * `{kind: 'plan-review', approve: