diff --git a/packages/dsh-plugin/README.md b/packages/dsh-plugin/README.md new file mode 100644 index 000000000..6a591c13c --- /dev/null +++ b/packages/dsh-plugin/README.md @@ -0,0 +1,60 @@ +# dsh-plugin-reactive-resume + +Connect [Reactive Resume](https://rxresu.me) to [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness). Read, create, and edit your resumes and job applications from a Harness session. + +## Install + +```bash +dsh plugin --profile add dsh-plugin-reactive-resume +``` + +This package declares `dsh.bundle`, so the profile picks it up as a layer and mounts it automatically. Until you configure a key it mounts nothing and logs a warning, so installing it never leaves a profile unbootable. + +## Configure + +Mint an API key at `https://rxresu.me/dashboard/settings/api-keys` and export it as `RXRESUME_API_KEY` — the bundle patch reads that variable. To set it explicitly, or to change any other option, patch the row by id from your profile's `cordis.patch.yml`: + +```yaml +- id: reactive-resume + config: + apiKey: !!js process.env.RXRESUME_API_KEY +``` + +### Options + +| Key | Default | Description | +|---|---|---| +| `apiKey` | `''` | API key from `/dashboard/settings/api-keys`. Empty mounts nothing. | +| `url` | `https://rxresu.me` | Origin of your instance. Set this if you self-host. | +| `serverName` | `resume` | Tool namespace. Tools reach the model as `mcp____`. | +| `toolCallTimeoutMs` | `60000` | Per-tool-call timeout. | + +Every tool Reactive Resume publishes is exposed. Narrowing that set is not currently possible from a plugin: Harness's `ctx.tools.restrict()` requires an agent-scoped context, which a plugin context is not. + +### Self-hosted + +```yaml +- id: reactive-resume + config: + apiKey: !!js process.env.RXRESUME_API_KEY + url: http://localhost:3000 +``` + +## What it does + +Bridges Reactive Resume's MCP server into `ctx.tools`, and contributes a system-prompt section covering the things models get wrong about resume editing: reading before patching, RFC 6902 path construction against the published schema, UUID-keyed section entries, and locked resumes. + +You could wire the bridge yourself with a raw `@deepseek-ai/dsh-mcp-client` row. What you cannot do that way is contribute the prompt section — that is what this package adds. + +## Development + +This package lives in the [Reactive Resume monorepo](https://github.com/amruthpillai/reactive-resume) at `packages/dsh-plugin`, next to `packages/mcp` — the server it bridges. `src/tool-names.test.ts` checks every tool the prompt guide names against `@reactive-resume/mcp/tool-names`, so renaming a tool breaks this package in the same pull request. + +```bash +pnpm --filter dsh-plugin-reactive-resume test +pnpm --filter dsh-plugin-reactive-resume build +``` + +## License + +MIT diff --git a/packages/dsh-plugin/cordis.patch.yml b/packages/dsh-plugin/cordis.patch.yml new file mode 100644 index 000000000..737db08ad --- /dev/null +++ b/packages/dsh-plugin/cordis.patch.yml @@ -0,0 +1,17 @@ +# dsh-plugin-reactive-resume bundle patch: one insert over the profile root. +# `dsh plugin add` joins this layer to the profile's bundle stack automatically. +# Override any field by patching the row by id from your profile's own +# cordis.patch.yml (the last write wins per row) — for a self-hosted instance: +# +# - id: reactive-resume +# config: +# apiKey: !!js process.env.RXRESUME_API_KEY +# url: http://localhost:3000 +# +# With no apiKey the row loads and mounts nothing, so installing this plugin +# before configuring it leaves the profile bootable. +- insert: + - id: reactive-resume + name: dsh-plugin-reactive-resume + config: + apiKey: !!js process.env.RXRESUME_API_KEY ?? '' diff --git a/packages/dsh-plugin/docs/2026-08-16-design.md b/packages/dsh-plugin/docs/2026-08-16-design.md new file mode 100644 index 000000000..04d592c21 --- /dev/null +++ b/packages/dsh-plugin/docs/2026-08-16-design.md @@ -0,0 +1,166 @@ +# DeepSeek Harness Plugin for Reactive Resume — Design + +**Date:** 2026-08-16 +**Status:** Approved, ready for implementation planning +**Package:** `dsh-plugin-reactive-resume` + +> **Post-implementation note:** the `tools` config key and `ctx.tools.restrict()` call described below (Config, `apply()` step 2, "Tool-name generation and drift detection") were cut from v0.1.0. `docs/spikes/2026-08-16-restrict-semantics.md` found that `restrict()` cannot reach tools a plugin's own `ctx.plugin(mcpClient, …)` registers — it throws when called from an unscoped plugin context, and even from a real agent scope it refuses to touch a scope's own (as opposed to inherited) registrations. There is no arrangement reachable from this plugin's `apply(ctx, config)` where curation works, so 0.1.0 ships all tools unfiltered, per that spike's documented fallback. The rest of this document is left as originally written for history; it does not describe what shipped. + +## Goal + +Distribute a DeepSeek Harness plugin that connects Harness to a Reactive Resume account, so a DSH user can read, create, and edit resumes and job applications from their agent session with one config row and an API key. + +## Context + +### What Reactive Resume already ships + +Reactive Resume exposes a complete remote MCP server. Nothing on the server side needs to change for this plugin to work. + +- `packages/mcp` registers 33 tools (`list_resumes`, `read_resume`, `apply_resume_patch`, `tailor_resume_for_application`, …), 3 prompts, and 2 resources. +- `apps/server/src/http/app.ts` mounts `/mcp` and `/mcp/*` (Streamable HTTP) plus `/.well-known/mcp/server-card.json` (SEP-1649). +- `apps/server/src/mcp/auth.ts` accepts either an OAuth `Authorization: Bearer` token or an `x-api-key` header. The API key path needs no interactive flow. +- The web app already ships API key management at `/dashboard/settings/api-keys`, so user provisioning is a solved problem. + +### What DeepSeek Harness provides + +Verified against the published packages, not only the docs. + +- A plugin is a TypeScript module exporting `name`, optional `inject`, and `apply(ctx, config)`. Config schemas use `@deepseek-ai/schemastery`. +- `@deepseek-ai/dsh-mcp-client` (v0.0.1-rc.1) bridges one external MCP server per plugin instance. Its `StreamableHttpConfig` is exactly: + + ```ts + interface StreamableHttpConfig { + transport: 'streamable-http' + serverName: string // [A-Za-z0-9_-]{1,32}, unique across live instances + url: string + headers: Record + toolCallTimeoutMs: number + failOnStartupError: boolean + } + ``` + + Bridged tools become model-facing as `mcp____`. +- `ctx.tools` is a `ToolRegistry` exposing `restrict(filter: ToolRestriction): () => void`, where `ToolRestriction` is `{ allow?: readonly string[]; deny?: readonly string[] }`. +- `ctx.systemPrompt` (from `@deepseek-ai/dsh-system-prompt`) exposes `section(section: PromptSection): () => void`, where `PromptSection` is `{ name, order, text, complete? }`. Convention: `-100` is harness identity, `0` the deployment persona, and `100–199` is tool guidance. +- Plugins are distributed on npm and discovered through the `dsh-plugin` GitHub topic. + +### The gap this plugin fills + +`dsh-mcp-client` has no tool filtering and no way to contribute prompt text. A user pasting a raw MCP row into `cordis.yml` gets all 33 tool schemas in their context budget and no guidance on Reactive Resume's JSON Patch semantics. Those two things are the plugin's reason to exist. + +## Decisions + +| Decision | Choice | Why | +|---|---|---| +| Scope | Thin MCP bridge + prompt section | The tool layer already exists and is maintained in Reactive Resume. Reimplementing 33 tool contracts against oRPC would drift every release. | +| Repo | Standalone, outside the Reactive Resume monorepo | The plugin imports nothing from Reactive Resume — it speaks HTTP. The monorepo has no npm publish pipeline: root and every package are `private: true`, there is no build output, no changesets, no `NPM_TOKEN`, and no publish workflow. Adding one to ship a dependency-free package is cost without benefit. | +| Auth | `x-api-key` only | Two clicks in Reactive Resume settings. OAuth needs a token store and an interactive flow for no gain. | +| Drift protection | Server-card contract test in CI | Replaces the lockstep the monorepo would have given, without the pipeline. | + +## Architecture + +### Package shape + +Namespace plugin, mirroring `dsh-mcp-client`'s own export form: + +```ts +export const name = 'reactive-resume' +export const inject = ['tools', 'systemPrompt'] +export const Config: z +export async function apply(ctx: Context, config: Config): Promise +``` + +`@deepseek-ai/cordis`, `@deepseek-ai/dsh-tools`, `@deepseek-ai/dsh-system-prompt`, and `@deepseek-ai/dsh-mcp-client` are `peerDependencies` so the plugin binds to the host's versions rather than installing a second copy of the runtime. + +### Config + +```ts +interface Config { + /** API key from /dashboard/settings/api-keys. */ + apiKey: string + /** Reactive Resume instance origin. Default 'https://rxresu.me'. */ + url?: string + /** Tool namespace: tools appear as mcp____. Default 'resume'. */ + serverName?: string + /** Which tool group to expose. Default 'all'. */ + tools?: 'resume' | 'applications' | 'all' + /** Per-tool-call timeout. Default inherited from dsh-mcp-client. */ + toolCallTimeoutMs?: number +} +``` + +`url` accepts any origin so self-hosted instances work unchanged. + +### apply() + +Three steps, in order: + +1. **Mount the bridge.** `ctx.plugin(mcpClient, { transport: 'streamable-http', serverName, url:`${url}/mcp`, headers: { 'x-api-key': apiKey }, toolCallTimeoutMs, failOnStartupError: true })`. `failOnStartupError: true` turns a bad API key into a loud activation failure instead of tools that silently fail at call time. + +2. **Curate the tool surface.** When `tools !== 'all'`, call `ctx.tools.restrict({ deny: [...] })` with the namespaced names of the excluded group, computed from the generated tool-name list. See "Open risk" below. + +3. **Contribute prompt guidance.** `ctx.systemPrompt.section({ name: 'reactive-resume', order: 150, text: PATCH_GUIDE })`. + +All three return disposers; Cordis effect scoping unwinds them on unload, so no manual cleanup is needed beyond returning them where the API expects it. + +### PATCH_GUIDE + +The plugin's substance. Roughly 40 lines covering the failure modes Reactive Resume already encodes as error hints in `packages/mcp/src/tools.ts` (`errorHint`) — those hints exist precisely because models get these wrong: + +- Call `read_resume` before `apply_resume_patch`; never patch blind. +- `apply_resume_patch` takes RFC-6902 operations against the resume data document. +- Fetch the `resume://_meta/schema` resource before constructing paths. +- Section entries are arrays of objects keyed by UUID; ids are not indices. +- A locked resume rejects writes — call `unlock_resume` first. +- `list_resumes` is the way to recover a valid id after a 404. + +Written as static text, not a provider function — it does not vary per assembly. + +### Tool-name generation and drift detection + +> **Superseded by the move into the monorepo.** The plugin now sits beside the MCP server it bridges, so `src/tool-names.test.ts` reads `@reactive-resume/mcp/tool-names` directly. A tool rename fails that test on the same pull request. The generated snapshot, the fetch script, and the scheduled network job described below no longer exist. + +- Build step fetches `/.well-known/mcp/server-card.json` and emits `src/tool-names.generated.ts` containing the raw tool names split into the `resume` and `applications` groups. +- The generated file is committed, so `npm install` never needs network access. +- A scheduled CI job refetches from `https://rxresu.me` and fails when the committed list no longer matches the live card. That failure is the signal to cut a new plugin release. + +### Install UX + +README's copy-paste block: + +```yaml +- insert: + - id: reactive-resume + name: dsh-plugin-reactive-resume + config: + apiKey: !!js process.env.RXRESUME_API_KEY +``` + +## Open risk + +`ToolRegistry.restrict`'s contract reads: *"Per-scope filter over the tools a scope INHERITS — the global layer and every ancestor layer on its chain. Restrictions intersect, and do not affect the scope's own registrations."* + +`ctx.plugin(mcpClient, …)` mounts the bridge in a **child** scope of the plugin's context. The bridged tools are therefore registered in a descendant, not an ancestor, of the scope calling `restrict`. Whether a parent-scope restriction reaches them is unverified. + +This must be settled by a spike before the config surface is committed, because `tools` is a public config key and removing it later is a breaking change. + +**Fallback if `restrict` does not reach the child scope:** ship 0.1.0 without the `tools` key (equivalent to `'all'`), and solve curation in 0.2.0 — possibly by mounting the bridge at the same scope level rather than as a child. The prompt section alone justifies the release. + +## Testing + +- **Spike (blocking):** run a local Reactive Resume (`dotenvx run -f .env.local -- pnpm dev`, port 3000), point a scratch Harness config at `http://localhost:3000/mcp` with an `x-api-key`, and confirm (a) the Streamable HTTP bridge connects and lists 33 tools, and (b) whether `ctx.tools.restrict` from the plugin's scope hides bridged tools. +- **Unit:** `Config` schema defaults and validation; the deny-list computation from the generated tool names; `PATCH_GUIDE` section registers at order 150 with the expected name. +- **Contract:** server-card fetch matches `src/tool-names.generated.ts`. +- **Manual smoke before publish:** in a real Harness session against rxresu.me — list resumes, read one, apply a patch, verify the change in the web UI. + +## Out of scope + +OAuth support, `ctx.commands` shortcuts, a bundled Harness skill, local resume caching, and PDF rendering inside Harness. Each is additive and none blocks a useful 0.1.0. + +## Build order + +0. Spike `restrict()` semantics and the Streamable HTTP bridge against localhost. +1. Repo scaffold, `Config` schema, bridge mount, README. End-to-end working install. +2. `PATCH_GUIDE` prompt section. +3. Tool profiles, generated name list, drift CI. +4. Publish 0.1.0, tag the repo with the `dsh-plugin` topic, submit to `awesome-deepseek-harness`. diff --git a/packages/dsh-plugin/docs/plans/2026-08-16-implementation.md b/packages/dsh-plugin/docs/plans/2026-08-16-implementation.md new file mode 100644 index 000000000..40cc2b0f2 --- /dev/null +++ b/packages/dsh-plugin/docs/plans/2026-08-16-implementation.md @@ -0,0 +1,1107 @@ +# dsh-plugin-reactive-resume Implementation Plan + +> **Historical record.** This plan was written and executed while the plugin lived in its own repository. It has since moved into the Reactive Resume monorepo at `packages/dsh-plugin`, where tests are colocated in `src/*.test.ts`, the build emits `dist/`, and the generated tool-name snapshot and its scheduled drift job were replaced by a local check against `@reactive-resume/mcp/tool-names`. Paths below are not current. + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Ship an npm-distributed DeepSeek Harness plugin that connects a Harness session to a Reactive Resume account through the existing `/mcp` endpoint, curates the tool surface, and teaches the model Reactive Resume's JSON Patch semantics. + +**Architecture:** A namespace Cordis plugin exporting `name`, `inject`, `Config`, and `apply(ctx, config)`. `apply` mounts `@deepseek-ai/dsh-mcp-client` over Streamable HTTP with an `x-api-key` header, optionally narrows the bridged tools with `ctx.tools.restrict`, and registers one system-prompt section via `ctx.systemPrompt.section`. The plugin holds no Reactive Resume code — it speaks HTTP to a server that already exists. + +**Tech Stack:** TypeScript, pnpm, `tsdown` (build), Vitest (test), Biome (lint/format), `@deepseek-ai/cordis` + `@deepseek-ai/dsh-mcp-client` + `@deepseek-ai/dsh-tools` + `@deepseek-ai/dsh-system-prompt` + `@deepseek-ai/schemastery` (peer deps). + +**Spec:** `docs/2026-08-16-design.md` + +## Global Constraints + +- Node `^22.19.0 || >=24.0.0`. Package manager: pnpm. +- `type: "module"`. ESM only. No CJS build. +- All four `@deepseek-ai/*` runtime packages are `peerDependencies` at `^0.0.1-rc.1`, never `dependencies`. The host supplies them. +- Public tool names bridged by `dsh-mcp-client` are `mcp____`. Default `serverName` is `resume`. +- `serverName` must match `[A-Za-z0-9_-]{1,32}`. +- System prompt section `order` must be in the 100–199 tool-guidance band. This plan uses `150`. +- Default Reactive Resume origin is `https://rxresu.me` with no trailing slash. +- Auth header is exactly `x-api-key` (lowercase). +- Never commit an API key. Tests use the literal string `test-key`. + +--- + +### Task 1: Spike — does `restrict()` reach a child scope's tools? + +This task produces a written finding, not shipped code. It gates the `tools` config key in Task 3 and the `ctx.tools.restrict` call in Task 6. + +`ToolRegistry.restrict` documents itself as filtering only what a scope **inherits** from ancestors: *"Per-scope filter over the tools a scope INHERITS — the global layer and every ancestor layer on its chain. Restrictions intersect, and do not affect the scope's own registrations."* But `ctx.plugin(mcpClient, …)` mounts the bridge in a **child** scope of the plugin's context. If a parent-scope restriction cannot reach a child scope's registrations, the `tools` key must not ship in 0.1.0 — removing a public config key later is a breaking change. + +The question is purely about Cordis scope semantics. It does not need a live MCP server, a Reactive Resume instance, or an API key: a stub plugin that registers one tool in a child scope reproduces the exact topology. Verify it that way. + +**Files:** +- Create: `docs/spikes/2026-08-16-restrict-semantics.md` + +- [ ] **Step 1: Scaffold a throwaway workspace** + +```bash +mkdir -p /tmp/dsh-spike && cd /tmp/dsh-spike +pnpm init +pnpm add @deepseek-ai/cordis @deepseek-ai/dsh-tools @deepseek-ai/schemastery +``` + +- [ ] **Step 2: Write the probe** + +Create `/tmp/dsh-spike/probe.ts`. The goal is to reproduce the plugin's topology: a parent context loads a child plugin, the child registers a tool, and the parent tries to hide it. + +```ts +import { Context } from '@deepseek-ai/cordis' +import * as tools from '@deepseek-ai/dsh-tools' + +const root = new Context() +await root.plugin(tools) + +/** Stands in for dsh-mcp-client: registers one tool in whatever scope loads it. */ +const stubBridge = { + name: 'stub-bridge', + inject: ['tools'], + apply(ctx: Context) { + ctx.tools.register({ + name: 'mcp__resume__list_applications', + description: 'stub', + parameters: { type: 'object', properties: {} }, + async execute() { + return { content: [{ type: 'text', text: 'ok' }] } + }, + }) + }, +} + +// The plugin under design mounts the bridge as a child, exactly like this. +await root.plugin(stubBridge) + +const names = () => root.tools.schemas().map((s) => s.name) +console.log('BEFORE', names()) + +const dispose = root.tools.restrict({ deny: ['mcp__resume__list_applications'] }) +console.log('AFTER', names()) + +dispose() +console.log('DISPOSED', names()) +``` + +The `register` call's exact shape must match `ToolDefinition` in `@deepseek-ai/dsh-tools`. Read `node_modules/@deepseek-ai/dsh-tools/lib/types/index.d.ts` and adjust the object to whatever that interface actually requires — the fields above are a best guess and compile errors here are expected, not a blocker. Same for how `ctx.tools` gets bootstrapped: if `root.plugin(tools)` is not how the registry is installed, read the type definitions and find the right way. Record whatever you had to do. + +- [ ] **Step 3: Run the probe** + +```bash +cd /tmp/dsh-spike && node --experimental-strip-types probe.ts +``` + +Three outcomes: +- `AFTER` omits `mcp__resume__list_applications` → verdict **YES**. Tasks 3 and 6 ship as written. +- `AFTER` still lists it → verdict **NO**. The `tools` key is deferred per Task 6's fallback note. +- The probe cannot be made to run at all (registry will not bootstrap standalone, API shapes do not line up) → verdict **INCONCLUSIVE**. Treat that identically to NO: ship without the key rather than shipping one that may not work. + +- [ ] **Step 4: Try the sibling topology if the verdict is NO** + +Only if Step 3 returned NO. Instead of `root.plugin(stubBridge)`, try restricting from a context that is a descendant of the bridge's scope, or registering the restriction inside the same scope the bridge loads into. If any arrangement reachable from the plugin's own `apply(ctx, config)` succeeds, record it — that changes the verdict to YES with a note on the required arrangement. + +Do not spend more than 30 minutes here. An unresolved NO is a perfectly good outcome; the plugin ships without tool curation and the prompt section still carries 0.1.0. + +- [ ] **Step 5: Write the finding** + +Create `docs/spikes/2026-08-16-restrict-semantics.md` recording: how `ctx.tools` had to be bootstrapped, the actual `ToolDefinition` shape used, the exact `BEFORE`/`AFTER`/`DISPOSED` output, anything tried in Step 4, and a verdict line reading exactly one of: + +``` +restrict reaches child-scope tools: YES +restrict reaches child-scope tools: NO +restrict reaches child-scope tools: INCONCLUSIVE +``` + +- [ ] **Step 6: Commit** + +```bash +git add docs/spikes/2026-08-16-restrict-semantics.md +git commit -m "docs: spike findings on restrict() reach over child-scope tools" +``` + +- [ ] **Step 7: Tear down** + +```bash +rm -rf /tmp/dsh-spike +``` + +--- + +### Task 2: Repo scaffold with a green build and test cycle + +**Files:** +- Create: `package.json`, `tsconfig.json`, `tsdown.config.ts`, `biome.json`, `.gitignore`, `vitest.config.ts` +- Create: `src/index.ts` +- Test: `test/smoke.test.ts` + +**Interfaces:** +- Consumes: nothing. +- Produces: a working `pnpm build`, `pnpm test`, `pnpm typecheck`, and `pnpm check`. Every later task depends on these commands existing. + +- [ ] **Step 1: Write `package.json`** + +```json +{ + "name": "dsh-plugin-reactive-resume", + "version": "0.1.0", + "description": "DeepSeek Harness plugin for Reactive Resume: bridges your resumes and job applications into a Harness session over MCP.", + "keywords": ["dsh-plugin", "deepseek-harness", "mcp", "reactive-resume", "resume"], + "license": "MIT", + "type": "module", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "default": "./lib/index.js" + }, + "./package.json": "./package.json" + }, + "files": ["lib"], + "publishConfig": { "access": "public" }, + "engines": { "node": "^22.19.0 || >=24.0.0" }, + "scripts": { + "build": "tsdown", + "test": "vitest run", + "typecheck": "tsc --noEmit", + "check": "biome check --write .", + "generate:tool-names": "node --experimental-strip-types scripts/generate-tool-names.ts", + "prepublishOnly": "pnpm build" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1-rc.1", + "@deepseek-ai/dsh-mcp-client": "^0.0.1-rc.1", + "@deepseek-ai/dsh-system-prompt": "^0.0.1-rc.1", + "@deepseek-ai/dsh-tools": "^0.0.1-rc.1", + "@deepseek-ai/schemastery": "^3.18.1-rc.1" + }, + "devDependencies": { + "@biomejs/biome": "^2.5.8", + "@deepseek-ai/cordis": "^4.0.1-rc.1", + "@deepseek-ai/dsh-mcp-client": "^0.0.1-rc.1", + "@deepseek-ai/dsh-system-prompt": "^0.0.1-rc.1", + "@deepseek-ai/dsh-tools": "^0.0.1-rc.1", + "@deepseek-ai/schemastery": "^3.18.1-rc.1", + "@types/node": "^24.0.0", + "tsdown": "^0.22.0", + "typescript": "^5.9.0", + "vitest": "^4.1.10" + } +} +``` + +Note: the `@deepseek-ai/*` packages appear in BOTH `peerDependencies` (what consumers must supply) and `devDependencies` (so this repo can typecheck and test). That is the standard pattern and is not a mistake. + +- [ ] **Step 2: Write the tooling config files** + +`tsconfig.json`: + +```json +{ + "compilerOptions": { + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noUncheckedIndexedAccess": true, + "verbatimModuleSyntax": true, + "allowImportingTsExtensions": true, + "skipLibCheck": true, + "noEmit": true, + "types": ["node"] + }, + "include": ["src", "test", "scripts"] +} +``` + +`tsdown.config.ts`: + +```ts +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: ['src/index.ts'], + outDir: 'lib', + format: ['esm'], + dts: true, + clean: true, +}) +``` + +`vitest.config.ts`: + +```ts +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { include: ['test/**/*.test.ts'] }, +}) +``` + +`biome.json`: + +```json +{ + "$schema": "https://biomejs.dev/schemas/2.5.8/schema.json", + "formatter": { "indentStyle": "tab", "lineWidth": 120 }, + "javascript": { "formatter": { "quoteStyle": "single", "semicolons": "asNeeded" } }, + "linter": { "enabled": true, "rules": { "recommended": true } } +} +``` + +`.gitignore`: + +``` +node_modules +lib +*.tgz +.env +.env.local +``` + +- [ ] **Step 3: Write the failing smoke test** + +`test/smoke.test.ts`: + +```ts +import { expect, it } from 'vitest' +import { name } from '../src/index.ts' + +it('exports the cordis plugin name', () => { + expect(name).toBe('reactive-resume') +}) +``` + +- [ ] **Step 4: Run it to verify it fails** + +```bash +pnpm install +pnpm test +``` + +Expected: FAIL — `Failed to resolve import "../src/index.ts"`. + +- [ ] **Step 5: Write the minimal implementation** + +`src/index.ts`: + +```ts +/** + * DeepSeek Harness plugin for Reactive Resume. + * @module dsh-plugin-reactive-resume + */ + +/** Cordis plugin name used by loader diagnostics. */ +export const name = 'reactive-resume' +``` + +- [ ] **Step 6: Run tests, typecheck, and build** + +```bash +pnpm test && pnpm typecheck && pnpm build +``` + +Expected: test PASS, no type errors, `lib/index.js` and `lib/index.d.ts` produced. + +- [ ] **Step 7: Commit** + +```bash +git add -A +git commit -m "chore: scaffold the plugin package with build, test, and lint" +``` + +--- + +### Task 3: Config schema + +**Files:** +- Create: `src/config.ts` +- Modify: `src/index.ts` +- Test: `test/config.test.ts` + +**Interfaces:** +- Consumes: nothing from earlier tasks. +- Produces: + - `export interface Config { apiKey: string; url: string; serverName: string; tools: ToolProfile; toolCallTimeoutMs: number }` + - `export type ToolProfile = 'resume' | 'applications' | 'all'` + - `export const Config: z` — a schemastery schema whose parse result has every field populated. + + Task 4 and Task 6 both read the parsed `Config`. Note that the parsed type has NO optional fields — defaults are applied by the schema, so downstream code never handles `undefined`. + +**Gated on Task 1.** The `tools` key ships only if the spike verdict was YES. If it was NO or INCONCLUSIVE, omit `tools` from both `ToolProfile`'s use in `Config` and the schema, and drop the two `tools` assertions from the test. `ToolProfile` itself still ships — Task 6 uses it. The dispatch for this task will state the verdict; do not guess it. + +- [ ] **Step 1: Write the failing test** + +`test/config.test.ts`: + +```ts +import { expect, it } from 'vitest' +import { Config } from '../src/config.ts' + +it('applies defaults for every optional field', () => { + const parsed = Config({ apiKey: 'test-key' }) + + expect(parsed).toEqual({ + apiKey: 'test-key', + url: 'https://rxresu.me', + serverName: 'resume', + tools: 'all', + toolCallTimeoutMs: 60_000, + }) +}) + +it('keeps explicit values', () => { + const parsed = Config({ + apiKey: 'test-key', + url: 'http://localhost:3000', + serverName: 'rr', + tools: 'resume', + toolCallTimeoutMs: 5_000, + }) + + expect(parsed.url).toBe('http://localhost:3000') + expect(parsed.serverName).toBe('rr') + expect(parsed.tools).toBe('resume') + expect(parsed.toolCallTimeoutMs).toBe(5_000) +}) + +it('rejects a missing apiKey', () => { + expect(() => Config({})).toThrow() +}) + +it('rejects an unknown tools profile', () => { + expect(() => Config({ apiKey: 'test-key', tools: 'everything' })).toThrow() +}) +``` + +- [ ] **Step 2: Run it to verify it fails** + +```bash +pnpm vitest run test/config.test.ts +``` + +Expected: FAIL — cannot resolve `../src/config.ts`. + +- [ ] **Step 3: Write the implementation** + +`src/config.ts`: + +```ts +import z from '@deepseek-ai/schemastery' + +/** Which group of Reactive Resume tools to expose to the model. */ +export type ToolProfile = 'resume' | 'applications' | 'all' + +/** Resolved plugin configuration. Every field is populated after parsing. */ +export interface Config { + /** API key minted at `/dashboard/settings/api-keys`. */ + apiKey: string + /** Reactive Resume origin, no trailing slash. */ + url: string + /** Tool namespace: tools reach the model as `mcp____`. */ + serverName: string + /** Tool group to expose. */ + tools: ToolProfile + /** Per-tool-call timeout in milliseconds. */ + toolCallTimeoutMs: number +} + +export const Config: z = z.object({ + apiKey: z.string().required().description('API key from /dashboard/settings/api-keys.'), + url: z + .string() + .default('https://rxresu.me') + .description('Reactive Resume origin. Set this for a self-hosted instance.'), + serverName: z + .string() + .default('resume') + .description('Tool namespace. Must match [A-Za-z0-9_-]{1,32} and be unique across live MCP instances.'), + tools: z + .union(['resume', 'applications', 'all'] as const) + .default('all') + .description('Which Reactive Resume tool group the model sees.'), + toolCallTimeoutMs: z.natural().default(60_000).description('Per-tool-call timeout in milliseconds.'), +}) +``` + +- [ ] **Step 4: Run the test to verify it passes** + +```bash +pnpm vitest run test/config.test.ts && pnpm typecheck +``` + +Expected: 4 tests PASS, no type errors. + +If `z.union([...] as const)` does not produce the literal union type, replace it with `z.union([z.const('resume'), z.const('applications'), z.const('all')])` — `const(value: T): Schema` is available and gives the same runtime behaviour. + +- [ ] **Step 5: Re-export from the entrypoint** + +Modify `src/index.ts` — append: + +```ts +export { Config, type ToolProfile } from './config.ts' +``` + +- [ ] **Step 6: Commit** + +```bash +git add -A +git commit -m "feat: add the plugin config schema with defaults" +``` + +--- + +### Task 4: Mount the MCP bridge + +**Files:** +- Modify: `src/index.ts` +- Test: `test/apply.test.ts` + +**Interfaces:** +- Consumes: `Config` from Task 3. +- Produces: + - `export const inject: string[]` + - `export async function apply(ctx: Context, config: Config): Promise` + + Task 5 and Task 6 extend the same `apply` function. + +The test does not boot a real Harness. It passes a hand-rolled fake context that records what `apply` calls — enough to pin the bridge config exactly, which is what matters. + +- [ ] **Step 1: Write the failing test** + +`test/apply.test.ts`: + +```ts +import { expect, it, vi } from 'vitest' +import { Config } from '../src/config.ts' +import { apply, inject } from '../src/index.ts' + +/** Minimal stand-in for the parts of the Cordis context `apply` touches. */ +function fakeContext() { + return { + plugin: vi.fn(async () => undefined), + tools: { restrict: vi.fn(() => () => undefined) }, + systemPrompt: { section: vi.fn(() => () => undefined) }, + } +} + +it('declares the services it needs', () => { + expect(inject).toEqual(['tools', 'systemPrompt']) +}) + +it('mounts the MCP bridge with streamable-http and the api key header', async () => { + const ctx = fakeContext() + + await apply(ctx as never, Config({ apiKey: 'test-key' })) + + expect(ctx.plugin).toHaveBeenCalledTimes(1) + expect(ctx.plugin.mock.calls[0]?.[1]).toEqual({ + transport: 'streamable-http', + serverName: 'resume', + url: 'https://rxresu.me/mcp', + headers: { 'x-api-key': 'test-key' }, + toolCallTimeoutMs: 60_000, + failOnStartupError: true, + }) +}) + +it('strips a trailing slash from the configured url', async () => { + const ctx = fakeContext() + + await apply(ctx as never, Config({ apiKey: 'test-key', url: 'http://localhost:3000/' })) + + expect(ctx.plugin.mock.calls[0]?.[1]).toMatchObject({ url: 'http://localhost:3000/mcp' }) +}) + +it('rejects a serverName the bridge would refuse', async () => { + const ctx = fakeContext() + + await expect(apply(ctx as never, Config({ apiKey: 'test-key', serverName: 'has spaces' }))).rejects.toThrow( + /serverName/, + ) +}) +``` + +- [ ] **Step 2: Run it to verify it fails** + +```bash +pnpm vitest run test/apply.test.ts +``` + +Expected: FAIL — `apply` and `inject` are not exported from `src/index.ts`. + +- [ ] **Step 3: Write the implementation** + +Modify `src/index.ts` to read in full: + +```ts +/** + * DeepSeek Harness plugin for Reactive Resume. + * @module dsh-plugin-reactive-resume + */ + +import type { Context } from '@deepseek-ai/cordis' +import * as mcpClient from '@deepseek-ai/dsh-mcp-client' +import type { Config } from './config.ts' + +// Re-exports the interface AND the schema — `config.ts` exports both under the +// name `Config`, and Cordis reads the schema export to validate config before +// this plugin starts. +export { Config, type ToolProfile } from './config.ts' + +/** Cordis plugin name used by loader diagnostics. */ +export const name = 'reactive-resume' + +/** Services required by this plugin. */ +export const inject = ['tools', 'systemPrompt'] + +/** `dsh-mcp-client` reserves this shape for a server namespace. */ +const SERVER_NAME_PATTERN = /^[A-Za-z0-9_-]{1,32}$/ + +/** + * Connect a Reactive Resume account to the session. + * @param ctx - plugin context carrying the tool registry and prompt assembly. + * @param config - resolved plugin configuration. + */ +export async function apply(ctx: Context, config: Config): Promise { + if (!SERVER_NAME_PATTERN.test(config.serverName)) { + throw new Error(`Invalid serverName "${config.serverName}": must match ${SERVER_NAME_PATTERN.source}`) + } + + const origin = config.url.replace(/\/+$/, '') + + await ctx.plugin(mcpClient, { + transport: 'streamable-http', + serverName: config.serverName, + url: `${origin}/mcp`, + headers: { 'x-api-key': config.apiKey }, + toolCallTimeoutMs: config.toolCallTimeoutMs, + failOnStartupError: true, + }) +} +``` + +- [ ] **Step 4: Run the tests to verify they pass** + +```bash +pnpm vitest run && pnpm typecheck +``` + +Expected: all tests PASS. + +- [ ] **Step 5: Commit** + +```bash +git add -A +git commit -m "feat: mount the Reactive Resume MCP bridge over streamable http" +``` + +--- + +### Task 5: System prompt section + +**Files:** +- Create: `src/prompt.ts` +- Modify: `src/index.ts` +- Test: `test/prompt.test.ts` + +**Interfaces:** +- Consumes: `apply` from Task 4. +- Produces: `export const PATCH_GUIDE: string`. + +This is the plugin's substance — the reason it exists rather than a raw `dsh-mcp-client` row. Its content mirrors the error hints Reactive Resume already emits from `packages/mcp/src/tools.ts` (`errorHint`), which exist because models get exactly these things wrong. + +- [ ] **Step 1: Write the failing test** + +`test/prompt.test.ts`: + +```ts +import { expect, it, vi } from 'vitest' +import { Config } from '../src/config.ts' +import { apply } from '../src/index.ts' +import { PATCH_GUIDE } from '../src/prompt.ts' + +function fakeContext() { + return { + plugin: vi.fn(async () => undefined), + tools: { restrict: vi.fn(() => () => undefined) }, + systemPrompt: { section: vi.fn(() => () => undefined) }, + } +} + +it('registers one prompt section in the tool-guidance order band', async () => { + const ctx = fakeContext() + + await apply(ctx as never, Config({ apiKey: 'test-key' })) + + expect(ctx.systemPrompt.section).toHaveBeenCalledTimes(1) + const section = ctx.systemPrompt.section.mock.calls[0]?.[0] + expect(section.name).toBe('reactive-resume') + expect(section.order).toBeGreaterThanOrEqual(100) + expect(section.order).toBeLessThanOrEqual(199) + expect(section.text).toBe(PATCH_GUIDE) +}) + +it('names the tools it references with the configured namespace', async () => { + const ctx = fakeContext() + + await apply(ctx as never, Config({ apiKey: 'test-key', serverName: 'rr' })) + + const section = ctx.systemPrompt.section.mock.calls[0]?.[0] + expect(section.text).toContain('mcp__rr__read_resume') + expect(section.text).not.toContain('mcp__resume__read_resume') +}) + +it('covers the documented failure modes', () => { + for (const phrase of ['RFC 6902', 'resume://_meta/schema', 'unlock_resume', 'list_resumes']) { + expect(PATCH_GUIDE).toContain(phrase) + } +}) +``` + +Note the second test: the guide must be namespace-aware, so `PATCH_GUIDE` is a template built per `serverName`, not a frozen constant. The third test still asserts against the default-namespace export. + +- [ ] **Step 2: Run it to verify it fails** + +```bash +pnpm vitest run test/prompt.test.ts +``` + +Expected: FAIL — cannot resolve `../src/prompt.ts`. + +- [ ] **Step 3: Write the implementation** + +`src/prompt.ts`: + +```ts +/** + * Build the Reactive Resume system-prompt section for one tool namespace. + * @param serverName - the MCP namespace bridged tools are published under. + * @returns prompt text naming tools exactly as the model will see them. + */ +export function buildPatchGuide(serverName: string): string { + const t = (raw: string) => `\`mcp__${serverName}__${raw}\`` + + return [ + '## Reactive Resume', + '', + "These tools operate on the user's real, live resumes and job applications. Changes are immediate and visible in their account.", + '', + '### Reading before writing', + '', + `- Call ${t('list_resumes')} to discover resume IDs. IDs are UUIDs, never titles or slugs.`, + `- Call ${t('read_resume')} before any edit. Never patch a resume you have not read this session.`, + `- If a call fails with "not found", re-run ${t('list_resumes')} rather than guessing an ID.`, + '', + '### Editing', + '', + `- ${t('apply_resume_patch')} takes RFC 6902 JSON Patch operations applied to the resume data document.`, + `- Read the \`resume://_meta/schema\` resource before constructing paths. Do not infer path shapes from the resume you read — the schema is authoritative about which keys are permitted.`, + '- Section entries are arrays of objects, each with its own UUID `id`. Address an existing entry by locating its index from the document you just read; never treat an `id` as an index.', + '- Prefer one patch with several operations over several single-operation patches. Operations apply in order and the whole patch fails atomically.', + `- Use ${t('update_resume')} only for whole-document replacement. For anything smaller, patch.`, + '', + '### Locking', + '', + `- A locked resume rejects every write. When a call fails because the resume is locked, call ${t('unlock_resume')}, make the change, and leave the lock as you found it.`, + '', + '### Scope', + '', + '- Never delete a resume or an application unless the user asked for that specific deletion in this conversation.', + '- When the user describes a change in prose, restate the concrete edit you are about to make before making it.', + ].join('\n') +} + +/** The prompt section for the default `resume` namespace. */ +export const PATCH_GUIDE: string = buildPatchGuide('resume') +``` + +- [ ] **Step 4: Register it in `apply`** + +In `src/index.ts`, add the import: + +```ts +import { buildPatchGuide } from './prompt.ts' +``` + +and append to the end of `apply`, after the `ctx.plugin(...)` call: + +```ts + ctx.systemPrompt.section({ + name: 'reactive-resume', + order: 150, + text: buildPatchGuide(config.serverName), + }) +``` + +- [ ] **Step 5: Run the tests to verify they pass** + +```bash +pnpm vitest run && pnpm typecheck +``` + +Expected: all tests PASS. + +- [ ] **Step 6: Commit** + +```bash +git add -A +git commit -m "feat: teach the model Reactive Resume patch semantics" +``` + +--- + +### Task 6: Generated tool names and drift detection + +**Files:** +- Create: `scripts/generate-tool-names.ts` +- Create: `src/tool-names.generated.ts` +- Modify: `src/config.ts` +- Test: `test/tool-names.test.ts` +- Test: `test/tool-names-drift.test.ts` +- Create: `.github/workflows/drift.yml` + +**Interfaces:** +- Consumes: `buildPatchGuide` from Task 5. +- Produces: `export const TOOL_NAMES: readonly string[]` (raw, un-namespaced names) from `src/tool-names.generated.ts`. + +**This task was rescoped after Task 1.** As originally written it built `groupOf()` and `deniedToolNames()` to support a `tools` config key. Task 1's spike found `ctx.tools.restrict()` throws from a plugin context, that key was cut, and those two functions now have no consumer in this package — they would ship as dead code for a feature that may never live here at all. They are dropped. + +What survives, and why it is not dead: `buildPatchGuide` (Task 5) names five specific tools — `list_resumes`, `read_resume`, `apply_resume_patch`, `update_resume`, `unlock_resume`. If Reactive Resume renames or removes one, the prompt section starts instructing the model to call a tool that does not exist, silently. The generated name list plus the two tests below are what catch that. The guide is this release's entire product, so guarding its accuracy is the point. + +- [ ] **Step 1: Write the generator** + +`scripts/generate-tool-names.ts`: + +```ts +/** + * Regenerate `src/tool-names.generated.ts` from a live Reactive Resume server card. + * Usage: node --experimental-strip-types scripts/generate-tool-names.ts [origin] + */ +import { writeFileSync } from 'node:fs' + +const origin = (process.argv[2] ?? 'https://rxresu.me').replace(/\/+$/, '') + +const response = await fetch(`${origin}/.well-known/mcp/server-card.json`) +if (!response.ok) throw new Error(`Server card fetch failed: ${response.status} ${response.statusText}`) + +const card = (await response.json()) as { tools: { name: string }[] } +const names = card.tools.map((tool) => tool.name).sort() + +if (names.length === 0) throw new Error('Server card listed no tools') + +const body = [ + '// Generated by scripts/generate-tool-names.ts. Do not edit by hand.', + `// Source: ${origin}/.well-known/mcp/server-card.json`, + '', + '/** Raw (un-namespaced) tool names published by Reactive Resume. */', + 'export const TOOL_NAMES = [', + ...names.map((name) => `\t'${name}',`), + '] as const satisfies readonly string[]', + '', +].join('\n') + +writeFileSync(new URL('../src/tool-names.generated.ts', import.meta.url), body) +console.log(`Wrote ${names.length} tool names from ${origin}`) +``` + +- [ ] **Step 2: Run the generator against the live server** + +```bash +pnpm generate:tool-names +``` + +Expected: `Wrote 33 tool names from https://rxresu.me` and a new `src/tool-names.generated.ts`. A different count is fine — Reactive Resume may have shipped tools since this plan was written. Use the real number when reporting. + +- [ ] **Step 3: Write the failing guide-coverage test** + +This is the test that gives the generated list a consumer. It extracts every tool the prompt guide references and asserts the server actually publishes it. + +`test/tool-names.test.ts`: + +```ts +import { expect, it } from 'vitest' +import { buildPatchGuide } from '../src/prompt.ts' +import { TOOL_NAMES } from '../src/tool-names.generated.ts' + +/** Every raw tool name the prompt guide instructs the model to call. */ +function toolsReferencedByGuide(): string[] { + const guide = buildPatchGuide('resume') + const matches = guide.matchAll(/mcp__resume__([a-z0-9_]+)/g) + return [...new Set([...matches].map((match) => match[1] as string))] +} + +it('references at least one tool', () => { + // Guards the regex itself: a guide rewrite that drops the namespaced form + // would otherwise make the next test pass vacuously. + expect(toolsReferencedByGuide().length).toBeGreaterThan(0) +}) + +it('only references tools Reactive Resume actually publishes', () => { + const published: readonly string[] = TOOL_NAMES + + for (const referenced of toolsReferencedByGuide()) { + expect(published).toContain(referenced) + } +}) +``` + +- [ ] **Step 4: Run it to verify it fails** + +```bash +pnpm vitest run test/tool-names.test.ts +``` + +Expected: FAIL — cannot resolve `../src/tool-names.generated.ts` if Step 2 has not been run yet. If Step 2 already produced the file, temporarily rename it to observe the RED state, then restore it. + +- [ ] **Step 5: Run it to verify it passes** + +```bash +pnpm vitest run test/tool-names.test.ts && pnpm typecheck +``` + +Expected: 2 tests PASS. + +If the second test fails, that is a real finding, not a test bug: the guide names a tool the live server does not publish. Report it — do not edit the guide to match without saying so, because Task 5's guide text was transcribed deliberately. + +- [ ] **Step 6: Remove the now-dead `ToolProfile` export** + +Task 3 exported `ToolProfile` solely so this task could consume it. With `groupOf` and `deniedToolNames` dropped, nothing does. + +In `src/config.ts`, delete: + +```ts +/** Which group of Reactive Resume tools to expose to the model. */ +export type ToolProfile = 'resume' | 'applications' | 'all' +``` + +In `src/index.ts`, change the re-export from: + +```ts +export { Config, type ToolProfile } from './config.ts' +``` + +to: + +```ts +export { Config } from './config.ts' +``` + +Then run `pnpm typecheck` to confirm nothing else referenced it. + +- [ ] **Step 7: Write the drift test** + +`test/tool-names-drift.test.ts`: + +```ts +import { expect, it } from 'vitest' +import { TOOL_NAMES } from '../src/tool-names.generated.ts' + +const ORIGIN = process.env.RXRESUME_ORIGIN ?? 'https://rxresu.me' + +// Network test: skipped unless RXRESUME_CHECK_DRIFT=1, so ordinary `pnpm test` +// stays offline and deterministic. CI sets the flag on a schedule. +it.runIf(process.env.RXRESUME_CHECK_DRIFT === '1')( + 'matches the live server card', + async () => { + const response = await fetch(`${ORIGIN}/.well-known/mcp/server-card.json`) + expect(response.ok).toBe(true) + + const card = (await response.json()) as { tools: { name: string }[] } + const live = card.tools.map((tool) => tool.name).sort() + + expect(live).toEqual([...TOOL_NAMES]) + }, + 30_000, +) +``` + +- [ ] **Step 8: Run the full suite twice — offline, then against the live card** + +```bash +pnpm test +RXRESUME_CHECK_DRIFT=1 pnpm vitest run test/tool-names-drift.test.ts +``` + +Expected: the first run passes with the drift test skipped; the second passes with it executed. + +- [ ] **Step 9: Add the scheduled CI workflow** + +Create `.github/workflows/drift.yml`: + +```yaml +name: tool-name drift + +on: + schedule: + - cron: '0 6 * * 1' + workflow_dispatch: + +jobs: + drift: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm vitest run test/tool-names-drift.test.ts + env: + RXRESUME_CHECK_DRIFT: '1' +``` + +Note: `pnpm install` needs no `--config` flags here — `pnpm-workspace.yaml` (added in Task 2) carries `autoInstallPeers: false`, `strictPeerDependencies: false`, and `verifyDepsBeforeRun: false`, which is what makes the unpublished `@deepseek-ai/dsh-type-meta` peer a non-issue on a clean runner. + +- [ ] **Step 10: Verify and commit** + +```bash +pnpm test && pnpm typecheck && pnpm build && pnpm check +git add -A +git commit -m "feat: guard the prompt guide against tool-name drift" +``` + +--- + +### Task 7: CI, README, and publish 0.1.0 + +**Files:** +- Create: `.github/workflows/ci.yml` +- Create: `README.md` +- Create: `LICENSE` + +**Interfaces:** +- Consumes: everything from Tasks 2–6. +- Produces: a published `dsh-plugin-reactive-resume@0.1.0` on npm. + +- [ ] **Step 1: Add the CI workflow** + +`.github/workflows/ci.yml`: + +```yaml +name: ci + +on: + push: + branches: [main] + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm biome ci . + - run: pnpm typecheck + - run: pnpm test + - run: pnpm build +``` + +- [ ] **Step 2: Write the README** + +`README.md`: + +````markdown +# dsh-plugin-reactive-resume + +Connect [Reactive Resume](https://rxresu.me) to [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness). Read, create, and edit your resumes and job applications from a Harness session. + +## Install + +```bash +pnpm add dsh-plugin-reactive-resume +``` + +## Configure + +Mint an API key at `https://rxresu.me/dashboard/settings/api-keys`, then add a row to your `cordis.yml`: + +```yaml +- insert: + - id: reactive-resume + name: dsh-plugin-reactive-resume + config: + apiKey: !!js process.env.RXRESUME_API_KEY +``` + +### Options + +| Key | Default | Description | +|---|---|---| +| `apiKey` | *(required)* | API key from `/dashboard/settings/api-keys`. | +| `url` | `https://rxresu.me` | Origin of your instance. Set this if you self-host. | +| `serverName` | `resume` | Tool namespace. Tools reach the model as `mcp____`. | +| `toolCallTimeoutMs` | `60000` | Per-tool-call timeout. | + +All 33 of Reactive Resume's tools are exposed. Narrowing that set is not currently possible from a plugin: Harness's `ctx.tools.restrict()` requires an agent-scoped context, which a plugin context is not. + +### Self-hosted + +```yaml +config: + apiKey: !!js process.env.RXRESUME_API_KEY + url: http://localhost:3000 +``` + +## What it does + +Bridges Reactive Resume's MCP server into `ctx.tools`, and contributes a system-prompt section covering the things models get wrong about resume editing: reading before patching, RFC 6902 path construction against the published schema, UUID-keyed section entries, and locked resumes. + +You could wire the bridge yourself with a raw `@deepseek-ai/dsh-mcp-client` row. What you cannot do that way is contribute the prompt section — that is what this package adds. + +## License + +MIT +```` + +- [ ] **Step 3: Add the MIT license** + +Create `LICENSE` with the standard MIT text, copyright `2026 Amruth Pillai`. + +- [ ] **Step 4: Verify the package contents before publishing** + +```bash +pnpm build && pnpm pack --dry-run +``` + +Expected: the tarball lists only `lib/**`, `package.json`, `README.md`, and `LICENSE`. If `src/` or `test/` appear, fix the `files` field. + +- [ ] **Step 5: Smoke test against a real Harness session** + +Install the packed tarball into a Harness workspace, add the `cordis.yml` row with a real key, start a session, and confirm end to end: + +1. "List my resumes" returns real titles. +2. "Read " returns real content. +3. "Change my headline to X" applies and is visible at `https://rxresu.me`. +4. With `tools: resume`, no `mcp__resume__*application*` tool appears (skip if the spike verdict was `NO`). + +Do not publish until all of these pass. + +- [ ] **Step 6: Publish** + +```bash +npm publish --access public +``` + +- [ ] **Step 7: Make it discoverable** + +- Add the `dsh-plugin` topic to the GitHub repository. This is how Harness's plugin catalog finds it. +- Open a PR adding the plugin to [awesome-deepseek-harness](https://github.com/Dominic789654/awesome-deepseek-harness). + +- [ ] **Step 8: Tag the release** + +```bash +git tag v0.1.0 +git push --tags +``` diff --git a/packages/dsh-plugin/docs/spikes/2026-08-16-restrict-semantics.md b/packages/dsh-plugin/docs/spikes/2026-08-16-restrict-semantics.md new file mode 100644 index 000000000..2a1a71ca1 --- /dev/null +++ b/packages/dsh-plugin/docs/spikes/2026-08-16-restrict-semantics.md @@ -0,0 +1,382 @@ +# Spike: does `ctx.tools.restrict()` reach a child scope's tools? + +**Verdict up front:** `restrict reaches child-scope tools: NO` + +The plugin's own `apply(ctx, config)` — a bare Cordis plugin context that +never mints a `dsh-scope` scope — cannot call `ctx.tools.restrict()` at all. +It throws. When the arrangement is fixed so `restrict()` is at least +callable (a real agent-style scope), it still refuses to touch a tool the +bridge registered inside that same scope's own layer. Neither path reaches +the topology this plugin needs. The `tools` config key must not ship in +0.1.0. + +## Environment and bootstrapping + +Scaffolded a throwaway workspace at `/tmp/dsh-spike` (deleted after this +spike; nothing there is part of the plugin repo). + +```bash +mkdir -p /tmp/dsh-spike && cd /tmp/dsh-spike && pnpm init +``` + +**Version resolution problem.** `pnpm add @deepseek-ai/cordis @deepseek-ai/dsh-tools @deepseek-ai/schemastery` +with no version pins resolves `dsh-tools` to its `next` dist-tag +(`0.1.0-rc.6`), whose peer chain requires `@deepseek-ai/dsh-agent` and +`@deepseek-ai/dsh-session`, both of which peer-depend on +`@deepseek-ai/dsh-type-meta` — a package that returns a plain 404 from the +public npm registry (confirmed directly: `npm view @deepseek-ai/dsh-type-meta` +→ `404 Not Found`). Pinning `dsh-tools` to `0.0.1-rc.1` (the version this +plugin actually targets — confirmed via `npm view @deepseek-ai/dsh-tools +dist-tags`, where `latest` is `0.0.1-rc.1`) does not by itself fix this: pnpm +still auto-installs peer dependencies for the lockfile, so the same +`dsh-type-meta` 404 recurs indirectly through `dsh-agent`'s and +`dsh-session`'s peer graph. + +**Fix that worked:** disable pnpm's peer auto-install and add only the +packages `dsh-tools`'s *compiled* `lib/index.js` actually imports at +runtime (checked directly — `import type` lines don't need the package on +disk, real `import` lines do): + +``` +import { Service } from "@deepseek-ai/cordis"; +import z from "@deepseek-ai/schemastery"; +import { AnonymousEntries, NamedEntries, ScopedLayers, scopeOf, scopeTarget } from "@deepseek-ai/dsh-scope"; +import { CallId, HarnessError, assertNever, deepFreeze } from "@deepseek-ai/dsh-llm"; +import { isJsonValue, snapshotJsonValue } from "@deepseek-ai/dsh-session"; +``` + +`.npmrc`: + +``` +auto-install-peers=false +strict-peer-dependencies=false +``` + +Install commands, in order (each added only after the previous run's +`ERR_MODULE_NOT_FOUND` named the next missing runtime import): + +```bash +pnpm add @deepseek-ai/cordis@^4.0.1-rc.1 @deepseek-ai/dsh-tools@0.0.1-rc.1 @deepseek-ai/schemastery@^3.18.1-rc.1 \ + --config.auto-install-peers=false --config.strict-peer-dependencies=false +pnpm add @deepseek-ai/dsh-scope@0.0.1-rc.1 @deepseek-ai/dsh-llm@0.0.1-rc.1 @deepseek-ai/dsh-session@0.0.1-rc.1 \ + --config.auto-install-peers=false --config.strict-peer-dependencies=false +pnpm add @deepseek-ai/dsh-system-prompt@0.0.1-rc.1 @deepseek-ai/dsh-invariants@0.0.1-rc.1 \ + --config.auto-install-peers=false --config.strict-peer-dependencies=false +pnpm add @deepseek-ai/dsh-timeout@0.0.1-rc.1 \ + --config.auto-install-peers=false --config.strict-peer-dependencies=false +``` + +`dsh-system-prompt` and `dsh-invariants` were needed for a second reason, +not just a `dsh-tools` runtime import: `ToolRegistry.inject = ["systemPrompt"]` +and its constructor calls `ctx.systemPrompt.tools(...)` immediately, so a +`systemPrompt` service must be mounted on `ctx` *before* `ToolRegistry` is. +`dsh-timeout` surfaced one level further down, as a real (non-type) import +inside `dsh-llm`'s compiled output. + +None of the packages actually needed at `0.0.1-rc.1` depend on +`dsh-type-meta` — only `dsh-agent` and `dsh-session`'s *peer* list does +(`dsh-session` doesn't import it at runtime, so it was never installed and +never missed). Final resolved set: `cordis@4.0.1`, `dsh-tools@0.0.1-rc.1`, +`schemastery@3.18.1`, `dsh-scope@0.0.1-rc.1`, `dsh-llm@0.0.1-rc.1`, +`dsh-session@0.0.1-rc.1`, `dsh-system-prompt@0.0.1-rc.1`, +`dsh-invariants@0.0.1-rc.1`, `dsh-timeout@0.0.1-rc.1`. + +**Dead end worth recording:** before finding the npm-registry version-pin +fix, I found a fully-resolved install of these packages already on disk at +`~/.local/share/mise/installs/node/24.19.0/lib/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/*` +(the globally-installed `dsh` CLI's own bundled `node_modules`). That +install is `dsh-tools@0.1.0-rc.6`, not `0.0.1-rc.1` — a different minor +line with a renamed class (`ToolRuntime`, not `ToolRegistry`) and a +different `register`/`restrict`/`schemas` signature (`scope?: ScopeKey` +parameter instead of implicit calling-context resolution). I did **not** +use this install for the verdict below — it's the wrong pinned version for +this plugin — but it's why the bootstrapping path above took several +iterations: I initially assumed the API surface from that install, then had +to re-derive it from the actually-pinned `0.0.1-rc.1` types. + +## The actual `ToolDefinition` shape (0.0.1-rc.1) + +The brief's guessed shape (`parameters`, bare `async execute() { return +{content:[...]} }`) doesn't compile against `node_modules/@deepseek-ai/dsh-tools/lib/types/index.d.ts`. +The real shape: + +```ts +export interface ToolDefinition extends ToolSchema { + // ToolSchema = { name: string; description: string; parameters: Record<string, unknown> } + readonly output: ToolOutputDefinition; // MANDATORY, not optional + execute(args: unknown, exec: ToolRunContext): Promise<unknown>; // returns the canonical value, not ContentBlock[] + finalizeContent?(...): ContentBlock[] | undefined; + timeoutMs?: number; + isConcurrencySafe?(args: unknown): boolean; + presentCall?(args: unknown): ToolCallView | undefined; + presentResult?(args: unknown, result: ToolResult): ToolResultView | undefined; +} +interface ToolOutputDefinition { + readonly schema: JsonSchemaNode; // enforced JSON Schema subset + render(args: unknown, value: JsonValue): ContentBlock[]; // projects the canonical value to model-facing content + presentationMeta?(args: unknown, value: JsonValue): JsonValue; +} +``` + +`execute()` returns the tool's canonical JSON value (validated against +`output.schema`); `output.render()` is what turns that value into +`ContentBlock[]`. `register()` throws a `TypeError` if `output` is missing +or `output.render` isn't a function — confirmed by reading +`ToolRegistry.register` in the compiled `lib/index.js`. + +`ToolRegistry` itself: `export { ToolRegistry, ToolRegistry as default }` — +it's a Cordis `Service` subclass (`super(ctx, "tools")`), so it's mounted +with `ctx.plugin(ToolRegistry, config)`, not `ctx.plugin(tools)` where +`tools` is the whole module namespace (the brief's guess). + +## The mechanism (read from the compiled source, then verified by running it) + +`declare module '@deepseek-ai/cordis' { interface Context { tools: ToolRegistry } }` +— `ctx.tools` is one Cordis **service singleton**, shared down the whole +context tree exactly like every other Cordis service. There is no +per-Cordis-child-context instance of the registry; nesting a plugin under +`ctx.plugin(...)` does not give it a private `tools`. + +What actually gates `register()`/`restrict()`'s visibility isn't the Cordis +plugin-context tree at all — it's a **separate, opt-in scoping layer** from +`@deepseek-ai/dsh-scope`: + +- `scopeOf(ctx)` reads "the nearest scope tag inherited by a context" — and + a context only carries a scope tag if something called + `createScope(ctx, key)` on it (or a Cordis ancestor of it). A plain + `ctx.plugin(child)` context is **not** scoped by that call alone. +- `ToolRegistry.register(definition)`: `this.layers.effect(this.ctx, (layer) => layer.tools.insert(name, definition), ...)` — + lands in whatever layer `scopeOf(this.ctx)` resolves to (the global layer + if unscoped). No scope requirement to call it. +- `ToolRegistry.restrict(filter)`: the **first line** is + `const scope = scopeOf(this.ctx); if (scope === void 0) throw new Error("tools.restrict() requires a scoped context (agent.ctx): ...")`. + It is unconditionally unusable from an unscoped context — this is not a + silent no-op, it's a thrown error. +- Even when `scope !== undefined`, `restrict()` computes + `known = this.view(scope).restrictableNames` (the scope's *inherited* + surface — global + ancestor layers) and rejects any name not in that set: + `"a restriction filters what this scope inherits, never what it registers itself"`. + A tool registered as a **child** of the exact scope doing the restricting + is, by construction, in that scope's own layer, not its inherited surface + — so it is unconditionally unreachable by that scope's own `restrict()` + call, confirmed by the second probe below. + +This is a stricter, more mechanical version of what the `ToolRestriction` +docstring already said in prose (`"do not affect the scope's own +registrations"`) — the two probes below hit it from two different angles +and got two different thrown errors, not one graceful no-op. + +## Probe 1 — the literal topology from the task brief + +`ctx.plugin(mcpClient)` mounts the bridge as a Cordis **child** of the +plugin's own `apply(ctx, config)`; the plugin then calls +`ctx.tools.restrict(...)` from its own (parent, unscoped) `ctx`. This +reproduces the plugin's real design as literally as a stub allows. + +`/tmp/dsh-spike/probe.ts`: + +```ts +import { Context } from "@deepseek-ai/cordis"; +import SystemPrompt from "@deepseek-ai/dsh-system-prompt"; +import ToolRegistry from "@deepseek-ai/dsh-tools"; + +const root = new Context(); + +// ToolRegistry.inject = ["systemPrompt"], and its constructor calls +// ctx.systemPrompt.tools(...) immediately, so systemPrompt must be mounted first. +await root.plugin(SystemPrompt); +await root.plugin(ToolRegistry); + +/** Stands in for dsh-mcp-client: registers one tool in whatever scope loads it. */ +const stubBridge = { + name: "stub-bridge", + inject: ["tools"], + apply(ctx: Context) { + ctx.tools.register({ + name: "mcp__resume__list_applications", + description: "stub", + parameters: { type: "object", properties: {} }, + output: { + schema: { type: "string" }, + render: (_args: unknown, value: unknown) => [{ type: "text", text: String(value) }], + }, + async execute() { + return "ok"; + }, + }); + }, +}; + +// The plugin under design mounts the bridge as a child, exactly like this. +await root.plugin(stubBridge); + +const names = () => root.tools.schemas().map((s) => s.name); +console.log("BEFORE", names()); + +try { + const dispose = root.tools.restrict({ deny: ["mcp__resume__list_applications"] }); + console.log("AFTER", names()); + dispose(); + console.log("DISPOSED", names()); +} catch (err) { + console.log("RESTRICT_THREW", (err as Error).message); +} +``` + +Run with `node --experimental-strip-types probe.ts`. Actual output, +verbatim: + +``` +BEFORE [ 'mcp__resume__list_applications' ] +RESTRICT_THREW tools.restrict() requires a scoped context (agent.ctx): a context-global restriction would mask every agent — deny the tool for the intended agent instead +``` + +`restrict()` never gets a chance to filter anything — it throws before +touching the tool set, because `root` (and every context under it, absent +an explicit `createScope()`) is unscoped. + +## Probe 2 (Step 4) — the best-case sibling arrangement + +Per the brief's Step 4, tried fixing the exception by giving the plugin a +real `dsh-scope` scope (what `createScope()` provides) and calling +`restrict()` from *inside* that scope, matching "registering the +restriction inside the same scope the bridge loads into." + +Where a real agent gets this: `@deepseek-ai/dsh-agent-loop@0.0.1-rc.1` +`lib/index.js:375` — + +```js +this.scope = createScope(loopCtx, this); +this.ctx = this.scope.ctx.extend({ agent: this }); +``` + +— **not** `dsh-agent`, which never calls `createScope` (its compiled +`lib/index.js` only calls `scopeTarget`, for event routing, not for minting +a scope). This is the exact line that builds `agent.ctx` — the thing +`ToolRegistry`'s thrown error message names as what `restrict()` requires. +Confirmed directly: installed both `dsh-agent@0.0.1-rc.1` and +`dsh-agent-loop@0.0.1-rc.1` with the same +`--config.auto-install-peers=false --config.strict-peer-dependencies=false` +workaround used for the rest of the dependency tree (`dsh-type-meta` is only +a *peer* dependency of `dsh-agent`, never a runtime import — same situation +as `dsh-session`/`dsh-scope` above — so it's never actually needed on disk), +then grepped the installed `lib/index.js` files for `createScope`. + +`/tmp/dsh-spike/probe2.ts`: + +```ts +import { Context } from "@deepseek-ai/cordis"; +import { createScope } from "@deepseek-ai/dsh-scope"; +import SystemPrompt from "@deepseek-ai/dsh-system-prompt"; +import ToolRegistry from "@deepseek-ai/dsh-tools"; + +const root = new Context(); +await root.plugin(SystemPrompt); +await root.plugin(ToolRegistry); + +const stubBridge = { + name: "stub-bridge", + inject: ["tools"], + apply(ctx: Context) { + ctx.tools.register({ + name: "mcp__resume__list_applications", + description: "stub", + parameters: { type: "object", properties: {} }, + output: { + schema: { type: "string" }, + render: (_args: unknown, value: unknown) => [{ type: "text", text: String(value) }], + }, + async execute() { + return "ok"; + }, + }); + }, +}; + +// Mint a dsh-scope "Scope" (what dsh-agent-loop does to build agent.ctx -- +// see lib/index.js:375) and mount the bridge as a CHILD of that scope's ctx +// -- i.e. an inherited/ancestor registration relative to the scope itself, +// not the scope's own layer. +const scopeKey = {}; +const scope = createScope(root, scopeKey); +await scope.ctx.plugin(stubBridge); + +const namesFor = (ctx: Context) => ctx.tools.schemas(scopeKey).map((s) => s.name); +console.log("BEFORE(scoped view)", namesFor(root)); + +// Cordis requires a plugin to declare inject: ['tools'] to bare-access +// ctx.tools; call restrict() from inside a plugin mounted on scope.ctx so +// the "calling scope" Cordis sees is the scope itself (agent.ctx-equivalent). +let disposeRestrict: (() => void) | undefined; +const restrictor = { + name: "stub-restrictor", + inject: ["tools"], + apply(ctx: Context) { + try { + disposeRestrict = ctx.tools.restrict({ deny: ["mcp__resume__list_applications"] }); + console.log("AFTER(scoped view)", namesFor(root)); + } catch (err) { + console.log("RESTRICT_THREW", (err as Error).message); + } + }, +}; +await scope.ctx.plugin(restrictor); + +if (disposeRestrict) { + disposeRestrict(); + console.log("DISPOSED(scoped view)", namesFor(root)); +} +``` + +Run with `node --experimental-strip-types probe2.ts`. Actual output, +verbatim: + +``` +BEFORE(scoped view) [ 'mcp__resume__list_applications' ] +RESTRICT_THREW tools.restrict() names unknown inherited tool "mcp__resume__list_applications"; a restriction filters what this scope inherits, never what it registers itself. Restrictable tools: (none) +``` + +`restrict()` is now at least *callable*, but it explicitly refuses: the +bridge's tool lives in the same scope's own layer (it was mounted as a +Cordis child of `scope.ctx`, which is what makes it inherit that scope +tag), and `restrict()`'s error message says outright that it will never +touch a scope's own registrations, only what it inherits from an ancestor. +`Restrictable tools: (none)` — there was nothing in this arrangement for +the scope to restrict, because nothing was registered in any ancestor of +it. + +I did not chase the remaining permutation (bridge registered as an +*ancestor* scope's own layer, restrict called from a *descendant* scope of +that ancestor) — the class-level doc comment in `dsh-tools` confirms that +shape is the one `restrict()` is actually built for (a parent scope curbing +what a child scope inherits from it), but it doesn't match this plugin's +topology: the plugin's `apply(ctx, config)` runs once at harness startup, +before any real agent scope exists, and isn't in a position to be an +ancestor of the eventual agent's scope. Chasing it further would still not +produce an arrangement reachable from this plugin's own `apply(ctx, config)`, +which is the brief's actual bar for flipping the verdict to YES. Time spent +on Step 4: about 15 minutes, well under the 30-minute cap. + +I did not spin up a full agent loop from `dsh-agent`/`dsh-agent-loop` (the +stub plugins above stand in for one, per the brief's instruction not to need +a live agent) — but I did install both packages and grep their compiled +output to confirm the `createScope()` attribution above, as noted earlier in +this section. No residual gap remains on that point. + +## Verdict + +``` +restrict reaches child-scope tools: NO +``` + +Both the literal plugin topology (unscoped `restrict()` call → throws +immediately) and the best-case fix for that (scoped `restrict()` call → +throws with "unknown inherited tool" because the bridge's registration is +the scope's own, not inherited) fail to hide the child-registered tool. The +`tools` config key is deferred out of 0.1.0, per Task 6's fallback note. + +## Cleanup + +```bash +rm -rf /tmp/dsh-spike +``` diff --git a/packages/dsh-plugin/package.json b/packages/dsh-plugin/package.json new file mode 100644 index 000000000..29ba3b7f9 --- /dev/null +++ b/packages/dsh-plugin/package.json @@ -0,0 +1,75 @@ +{ + "name": "dsh-plugin-reactive-resume", + "version": "0.1.0", + "description": "DeepSeek Harness plugin for Reactive Resume: bridges your resumes and job applications into a Harness session over MCP.", + "keywords": [ + "dsh-plugin", + "deepseek-harness", + "mcp", + "reactive-resume", + "resume" + ], + "license": "MIT", + "author": "Amruth Pillai", + "repository": { + "type": "git", + "url": "git+https://github.com/amruthpillai/reactive-resume.git", + "directory": "packages/dsh-plugin" + }, + "homepage": "https://github.com/amruthpillai/reactive-resume/tree/main/packages/dsh-plugin#readme", + "bugs": { + "url": "https://github.com/amruthpillai/reactive-resume/issues" + }, + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "cordis.patch.yml" + ], + "publishConfig": { + "access": "public" + }, + "engines": { + "node": "^22.19.0 || >=24.0.0" + }, + "scripts": { + "build": "tsdown", + "typecheck": "tsgo --noEmit", + "test": "vitest run --passWithNoTests", + "test:coverage": "vitest run --coverage --passWithNoTests", + "test:ci": "vitest run --coverage --reporter=default --reporter=github-actions --reporter=json --reporter=junit --outputFile.json=reports/vitest-results.json --outputFile.junit=reports/vitest-junit.xml --passWithNoTests", + "test:agent": "vitest run --reporter=agent --reporter=json --outputFile.json=reports/vitest-results.json --passWithNoTests", + "prepublishOnly": "pnpm build" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-mcp-client": "^0.1.0-rc.6", + "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1" + }, + "devDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-mcp-client": "^0.1.0-rc.6", + "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6", + "@deepseek-ai/schemastery": "^3.18.1", + "@reactive-resume/config": "workspace:*", + "@reactive-resume/mcp": "workspace:*", + "@typescript/native-preview": "7.0.0-dev.20260707.2", + "tsdown": "^0.22.0", + "typescript": "^7.0.2", + "vitest": "^4.1.10" + }, + "dsh": { + "bundle": { + "patch": "./cordis.patch.yml" + } + } +} diff --git a/packages/dsh-plugin/src/config.test.ts b/packages/dsh-plugin/src/config.test.ts new file mode 100644 index 000000000..25b6b00e0 --- /dev/null +++ b/packages/dsh-plugin/src/config.test.ts @@ -0,0 +1,30 @@ +import { expect, it } from "vitest"; +import { Config } from "./config"; + +it("applies defaults for every optional field", () => { + const parsed = Config({ apiKey: "test-key" }); + + expect(parsed).toEqual({ + apiKey: "test-key", + url: "https://rxresu.me", + serverName: "resume", + toolCallTimeoutMs: 60_000, + }); +}); + +it("keeps explicit values", () => { + const parsed = Config({ + apiKey: "test-key", + url: "http://localhost:3000", + serverName: "rr", + toolCallTimeoutMs: 5_000, + }); + + expect(parsed.url).toBe("http://localhost:3000"); + expect(parsed.serverName).toBe("rr"); + expect(parsed.toolCallTimeoutMs).toBe(5_000); +}); + +it("defaults apiKey to empty rather than throwing, so an unconfigured row still loads", () => { + expect(Config({}).apiKey).toBe(""); +}); diff --git a/packages/dsh-plugin/src/config.ts b/packages/dsh-plugin/src/config.ts new file mode 100644 index 000000000..d0bc9b51c --- /dev/null +++ b/packages/dsh-plugin/src/config.ts @@ -0,0 +1,34 @@ +import z from "@deepseek-ai/schemastery"; + +/** `dsh-mcp-client` reserves this shape for a server namespace. */ +const SERVER_NAME_PATTERN = /^[A-Za-z0-9_-]{1,32}$/; + +/** Resolved plugin configuration. Every field is populated after parsing. */ +export interface Config { + /** API key minted at `<url>/dashboard/settings/api-keys`. */ + apiKey: string; + /** Reactive Resume origin, no trailing slash. */ + url: string; + /** Tool namespace: tools reach the model as `mcp__<serverName>__<rawName>`. */ + serverName: string; + /** Per-tool-call timeout in milliseconds. */ + toolCallTimeoutMs: number; +} + +export const Config = z.object({ + // Not `.required()`: the bundle patch mounts this plugin as soon as the + // package is installed, so a missing key has to be an inert no-op rather + // than a validation error that takes the whole profile down at boot. + // `apply` warns and mounts nothing instead. + apiKey: z.string().default("").description("API key from <url>/dashboard/settings/api-keys."), + url: z + .string() + .default("https://rxresu.me") + .description("Reactive Resume origin. Set this for a self-hosted instance."), + serverName: z + .string() + .pattern(SERVER_NAME_PATTERN) + .default("resume") + .description("Tool namespace. Must match [A-Za-z0-9_-]{1,32} and be unique across live MCP instances."), + toolCallTimeoutMs: z.natural().default(60_000).description("Per-tool-call timeout in milliseconds."), +}); diff --git a/packages/dsh-plugin/src/index.test.ts b/packages/dsh-plugin/src/index.test.ts new file mode 100644 index 000000000..aaccb97df --- /dev/null +++ b/packages/dsh-plugin/src/index.test.ts @@ -0,0 +1,58 @@ +import { expect, it, vi } from "vitest"; +import { Config } from "./config"; +import { apply, inject, name } from "./index"; + +/** Minimal stand-in for the parts of the Cordis context `apply` touches. */ +function fakeContext() { + return { + plugin: vi.fn(async (_plugin: unknown, _config: unknown) => undefined), + systemPrompt: { section: vi.fn(() => () => undefined) }, + logger: { warn: vi.fn() }, + }; +} + +it("exports the cordis plugin name", () => { + expect(name).toBe("reactive-resume"); +}); + +it("declares the services it needs", () => { + expect(inject).toEqual(["systemPrompt"]); +}); + +it("mounts the MCP bridge with streamable-http and the api key header", async () => { + const ctx = fakeContext(); + + await apply(ctx as never, Config({ apiKey: "test-key" })); + + expect(ctx.plugin).toHaveBeenCalledTimes(1); + expect(ctx.plugin.mock.calls[0]?.[1]).toEqual({ + transport: "streamable-http", + serverName: "resume", + url: "https://rxresu.me/mcp", + headers: { "x-api-key": "test-key" }, + toolCallTimeoutMs: 60_000, + failOnStartupError: true, + }); +}); + +it("strips a trailing slash from the configured url", async () => { + const ctx = fakeContext(); + + await apply(ctx as never, Config({ apiKey: "test-key", url: "http://localhost:3000/" })); + + expect(ctx.plugin.mock.calls[0]?.[1]).toMatchObject({ url: "http://localhost:3000/mcp" }); +}); + +it("rejects a serverName the bridge would refuse at config-parse time, before apply runs", () => { + expect(() => Config({ apiKey: "test-key", serverName: "has spaces" })).toThrow(/serverName/); +}); + +it("mounts nothing when no apiKey is configured, so an unconfigured install still boots", async () => { + const ctx = fakeContext(); + + await apply(ctx as never, Config({})); + + expect(ctx.plugin).not.toHaveBeenCalled(); + expect(ctx.systemPrompt.section).not.toHaveBeenCalled(); + expect(ctx.logger.warn).toHaveBeenCalledTimes(1); +}); diff --git a/packages/dsh-plugin/src/index.ts b/packages/dsh-plugin/src/index.ts new file mode 100644 index 000000000..2dc540b03 --- /dev/null +++ b/packages/dsh-plugin/src/index.ts @@ -0,0 +1,66 @@ +/** + * DeepSeek Harness plugin for Reactive Resume. + * @module dsh-plugin-reactive-resume + */ + +import type { Context } from "@deepseek-ai/cordis"; +// Side-effect import: pulls in the `Context.systemPrompt` module augmentation +// this plugin relies on below. No runtime value is used from this module. +import type {} from "@deepseek-ai/dsh-system-prompt"; +import type { Config } from "./config"; +import * as mcpClient from "@deepseek-ai/dsh-mcp-client"; +import { buildPatchGuide } from "./prompt"; + +// Re-exports the interface AND the schema — `config.ts` exports both under the +// name `Config`, and Cordis reads the schema export to validate config before +// this plugin starts. +export { Config } from "./config"; + +/** Cordis plugin name used by loader diagnostics. */ +export const name = "reactive-resume"; + +/** + * Services required by this plugin. + * + * `tools` is deliberately not injected here: `ctx.tools.restrict()` requires + * an agent-scoped context, which a plugin's own `apply(ctx, config)` never + * is, and this plugin never calls it. `@deepseek-ai/dsh-mcp-client` declares + * its own dependency on the tools service, so the bridge still gets what it + * needs without this plugin waiting on it. + */ +export const inject = ["systemPrompt"]; + +/** + * Connect a Reactive Resume account to the session. + * @param ctx - plugin context carrying prompt assembly. + * @param config - resolved plugin configuration. `Config` already rejects an + * invalid `serverName` at parse time, before `apply` ever runs. + */ +export async function apply(ctx: Context, config: Config): Promise<void> { + // The bundle patch mounts this row on install, before anyone has minted a + // key. Mount nothing rather than failing the profile's boot: `dsh plugin + // add` should never leave the harness unbootable. + if (config.apiKey === "") { + ctx.logger.warn("no apiKey configured — set one at %s/dashboard/settings/api-keys to enable the tools", config.url); + return; + } + + const origin = config.url.replace(/\/+$/, ""); + + await ctx.plugin(mcpClient, { + transport: "streamable-http", + serverName: config.serverName, + url: `${origin}/mcp`, + headers: { "x-api-key": config.apiKey }, + toolCallTimeoutMs: config.toolCallTimeoutMs, + failOnStartupError: true, + }); + + ctx.systemPrompt.section({ + // Namespaced by `serverName` so a second instance (e.g. a self-hosted + // account alongside the hosted one) doesn't collide on section name. + name: `reactive-resume:${config.serverName}`, + order: 150, + text: buildPatchGuide(config.serverName), + }); +} diff --git a/packages/dsh-plugin/src/prompt.test.ts b/packages/dsh-plugin/src/prompt.test.ts new file mode 100644 index 000000000..1ebdf9db1 --- /dev/null +++ b/packages/dsh-plugin/src/prompt.test.ts @@ -0,0 +1,61 @@ +import type { PromptSection } from "@deepseek-ai/dsh-system-prompt"; +import { expect, it, vi } from "vitest"; +import { Config } from "./config"; +import { apply } from "./index"; +import { PATCH_GUIDE } from "./prompt"; + +function fakeContext() { + return { + plugin: vi.fn(async (_plugin: unknown, _config: unknown) => undefined), + systemPrompt: { section: vi.fn((_section: PromptSection) => () => undefined) }, + }; +} + +it("registers one prompt section in the tool-guidance order band", async () => { + const ctx = fakeContext(); + + await apply(ctx as never, Config({ apiKey: "test-key" })); + + expect(ctx.systemPrompt.section).toHaveBeenCalledTimes(1); + const section = ctx.systemPrompt.section.mock.calls[0]?.[0] as PromptSection; + expect(section.name).toBe("reactive-resume:resume"); + expect(section.order).toBeGreaterThanOrEqual(100); + expect(section.order).toBeLessThanOrEqual(199); + expect(section.text).toBe(PATCH_GUIDE); +}); + +it("derives the section name from serverName so a second instance can coexist", async () => { + const first = fakeContext(); + const second = fakeContext(); + + await apply(first as never, Config({ apiKey: "test-key" })); + await apply(second as never, Config({ apiKey: "test-key", serverName: "self-hosted" })); + + const firstSection = first.systemPrompt.section.mock.calls[0]?.[0] as PromptSection; + const secondSection = second.systemPrompt.section.mock.calls[0]?.[0] as PromptSection; + expect(firstSection.name).not.toBe(secondSection.name); +}); + +it("names the tools it references with the configured namespace", async () => { + const ctx = fakeContext(); + + await apply(ctx as never, Config({ apiKey: "test-key", serverName: "rr" })); + + const section = ctx.systemPrompt.section.mock.calls[0]?.[0] as PromptSection; + expect(section.text).toContain("mcp__rr__read_resume"); + expect(section.text).not.toContain("mcp__resume__read_resume"); +}); + +it("covers the documented failure modes", () => { + for (const phrase of ["RFC 6902", "unlock_resume", "lock_resume", "list_resumes"]) { + expect(PATCH_GUIDE).toContain(phrase); + } +}); + +it("does not point at the unreachable schema resource", () => { + expect(PATCH_GUIDE).not.toContain("resume://_meta/schema"); +}); + +it("does not claim update_resume replaces resume content", () => { + expect(PATCH_GUIDE).toContain("only changes metadata"); +}); diff --git a/packages/dsh-plugin/src/prompt.ts b/packages/dsh-plugin/src/prompt.ts new file mode 100644 index 000000000..de7861e66 --- /dev/null +++ b/packages/dsh-plugin/src/prompt.ts @@ -0,0 +1,40 @@ +/** + * Build the Reactive Resume system-prompt section for one tool namespace. + * @param serverName - the MCP namespace bridged tools are published under. + * @returns prompt text naming tools exactly as the model will see them. + */ +export function buildPatchGuide(serverName: string): string { + const t = (raw: string) => `\`mcp__${serverName}__${raw}\``; + + return [ + "## Reactive Resume", + "", + "These tools operate on the user's real, live resumes and job applications. Changes are immediate and visible in their account.", + "", + "### Reading before writing", + "", + `- Call ${t("list_resumes")} to discover resume IDs. IDs are UUIDs, never titles or slugs.`, + `- Call ${t("read_resume")} before any edit. Never patch a resume you have not read this session.`, + `- If a call fails with "not found", re-run ${t("list_resumes")} rather than guessing an ID.`, + "", + "### Editing", + "", + `- ${t("apply_resume_patch")} takes RFC 6902 JSON Patch operations applied to the resume data document.`, + `- Construct paths from the resume you already read this session — do not guess. ${t("apply_resume_patch")}'s own tool description ships concrete path examples (for example \`/basics/name\`, \`/sections/experience/items/-\`, \`/sections/experience/items/0/company\`, \`/metadata/template\`); match those shapes.`, + "- Section entries are arrays of objects, each with its own UUID `id`. Address an existing entry by locating its index from the document you just read; never treat an `id` as an index.", + "- Prefer one patch with several operations over several single-operation patches. Operations apply in order and the whole patch fails atomically.", + `- ${t("update_resume")} only changes metadata — name, slug, tags, and public visibility. It cannot touch resume content; use ${t("apply_resume_patch")} for that. No tool replaces an existing resume's content wholesale: ${t("import_resume")} creates a brand-new resume from a full data document, it does not overwrite one you already have.`, + "", + "### Locking", + "", + `- A locked resume rejects every write. When a call fails because the resume is locked, call ${t("unlock_resume")}, make the change, then call ${t("lock_resume")} to leave the lock as you found it.`, + "", + "### Scope", + "", + "- Never delete a resume or an application unless the user asked for that specific deletion in this conversation.", + "- When the user describes a change in prose, restate the concrete edit you are about to make before making it.", + ].join("\n"); +} + +/** The prompt section for the default `resume` namespace. */ +export const PATCH_GUIDE: string = buildPatchGuide("resume"); diff --git a/packages/dsh-plugin/src/tool-names.test.ts b/packages/dsh-plugin/src/tool-names.test.ts new file mode 100644 index 000000000..0e29bef9b --- /dev/null +++ b/packages/dsh-plugin/src/tool-names.test.ts @@ -0,0 +1,27 @@ +import { expect, it } from "vitest"; +import { MCP_TOOL_NAME } from "@reactive-resume/mcp/tool-names"; +import { buildPatchGuide } from "./prompt"; + +/** Every raw tool name the prompt guide instructs the model to call. */ +function toolsReferencedByGuide(): string[] { + const guide = buildPatchGuide("resume"); + const matches = guide.matchAll(/mcp__resume__([a-z0-9_]+)/g); + return [...new Set([...matches].map((match) => match[1] as string))]; +} + +it("references at least one tool", () => { + // Guards the regex itself: a guide rewrite that drops the namespaced form + // would otherwise make the next test pass vacuously. + expect(toolsReferencedByGuide().length).toBeGreaterThan(0); +}); + +it("only references tools the MCP server actually publishes", () => { + // Reads the server's own tool-name table rather than a generated snapshot of + // a live server card, so renaming a tool in `packages/mcp` fails here on the + // same PR instead of drifting until a scheduled network check notices. + const published: readonly string[] = Object.values(MCP_TOOL_NAME); + + for (const referenced of toolsReferencedByGuide()) { + expect(published).toContain(referenced); + } +}); diff --git a/packages/dsh-plugin/tsconfig.json b/packages/dsh-plugin/tsconfig.json new file mode 100644 index 000000000..4dd8bf05f --- /dev/null +++ b/packages/dsh-plugin/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@reactive-resume/config/tsconfig.base.json", + "compilerOptions": { + "noEmit": true + }, + // Scoped to `src` so tsdown's declaration emit does not follow + // `vitest.config.ts` into the root `vitest.shared.ts` and drop a stray + // `vitest.shared.d.ts` at the repository root. + "include": ["src"] +} diff --git a/packages/dsh-plugin/tsdown.config.ts b/packages/dsh-plugin/tsdown.config.ts new file mode 100644 index 000000000..fd5be6d52 --- /dev/null +++ b/packages/dsh-plugin/tsdown.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm"], + dts: true, + clean: true, + outExtensions: () => ({ js: ".js" }), +}); diff --git a/packages/dsh-plugin/turbo.json b/packages/dsh-plugin/turbo.json new file mode 100644 index 000000000..e422835a2 --- /dev/null +++ b/packages/dsh-plugin/turbo.json @@ -0,0 +1,4 @@ +{ + "extends": ["//"], + "tags": ["runtime:server", "role:adapter"] +} diff --git a/packages/dsh-plugin/vitest.config.ts b/packages/dsh-plugin/vitest.config.ts new file mode 100644 index 000000000..0b883614c --- /dev/null +++ b/packages/dsh-plugin/vitest.config.ts @@ -0,0 +1,8 @@ +import { fileURLToPath } from "node:url"; +// @boundaries-ignore root shared Vitest config +import { createVitestProjectConfig } from "../../vitest.shared"; + +export default createVitestProjectConfig({ + name: "dsh-plugin-reactive-resume", + dirname: fileURLToPath(new URL(".", import.meta.url)), +}); diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 7354d2b59..f2b800839 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -5,7 +5,8 @@ "private": true, "exports": { ".": "./src/index.ts", - "./server-card": "./src/mcp-server-card.ts" + "./server-card": "./src/mcp-server-card.ts", + "./tool-names": "./src/mcp-tool-names.ts" }, "scripts": { "typecheck": "tsgo --noEmit", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28eb6d36c..5ad976244 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,7 +80,7 @@ importers: version: 7.0.2 vitest: specifier: ^4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) apps/server: dependencies: @@ -128,19 +128,19 @@ importers: version: 3.1111.0 '@better-auth/api-key': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) '@better-auth/drizzle-adapter': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3)) '@better-auth/infra': specifier: ^0.3.7 - version: 0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3) + version: 0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3) '@better-auth/oauth-provider': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) '@better-auth/passkey': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) '@bramus/specificity': specifier: ^2.4.2 version: 2.4.2 @@ -152,22 +152,22 @@ importers: version: 1.30.0(supports-color@7.2.0)(zod@4.4.3) '@orpc/client': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1) + version: 1.15.0 '@orpc/experimental-ratelimit': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@orpc/json-schema': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@orpc/openapi': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@orpc/server': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@orpc/zod': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(@orpc/contract@1.15.0(@opentelemetry/api@1.9.1))(@orpc/server@1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3))(ws@8.21.3)(zod@4.4.3) + version: 1.15.0(@orpc/contract@1.15.0)(@orpc/server@1.15.0(ws@8.21.3))(ws@8.21.3)(zod@4.4.3) '@react-pdf/renderer': specifier: ^4.6.1 version: 4.6.1(react@19.2.8) @@ -209,7 +209,7 @@ importers: version: 6.0.0 better-auth: specifier: 1.6.29 - version: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + version: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) cjk-regex: specifier: ^3.4.0 version: 3.4.0 @@ -221,10 +221,10 @@ importers: version: 8.0.1 drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + version: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) drizzle-zod: specifier: 1.0.0-beta.14-a36c63d - version: 1.0.0-beta.14-a36c63d(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(zod@4.4.3) + version: 1.0.0-beta.14-a36c63d(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(zod@4.4.3) es-toolkit: specifier: ^1.51.0 version: 1.51.0 @@ -306,7 +306,7 @@ importers: version: 7.0.2 vitest: specifier: ^4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) apps/web: dependencies: @@ -318,16 +318,16 @@ importers: version: 1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@better-auth/api-key': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) '@better-auth/infra': specifier: ^0.3.7 - version: 0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3) + version: 0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3) '@better-auth/oauth-provider': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) '@better-auth/passkey': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) '@codemirror/autocomplete': specifier: ^6.20.3 version: 6.20.3 @@ -369,13 +369,13 @@ importers: version: 6.6.0(@babel/core@8.0.1)(@babel/types@7.29.8)(babel-plugin-macros@3.1.0)(react@19.2.8) '@orpc/client': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1) + version: 1.15.0 '@orpc/server': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@orpc/tanstack-query': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(@orpc/client@1.15.0(@opentelemetry/api@1.9.1))(@tanstack/query-core@5.101.4) + version: 1.15.0(@orpc/client@1.15.0)(@tanstack/query-core@5.101.4) '@phosphor-icons/react': specifier: ^2.1.10 version: 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -465,7 +465,7 @@ importers: version: 7.0.66(zod@4.4.3) better-auth: specifier: 1.6.29 - version: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + version: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -474,7 +474,7 @@ importers: version: 1.1.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + version: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) es-toolkit: specifier: ^1.51.0 version: 1.51.0 @@ -686,13 +686,13 @@ importers: version: 3.1111.0 '@orpc/client': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1) + version: 1.15.0 '@orpc/experimental-ratelimit': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@orpc/server': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@reactive-resume/ai': specifier: workspace:* version: link:../ai @@ -725,13 +725,13 @@ importers: version: 6.0.0 better-auth: specifier: 1.6.29 - version: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + version: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + version: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) drizzle-zod: specifier: 1.0.0-beta.14-a36c63d - version: 1.0.0-beta.14-a36c63d(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(zod@4.4.3) + version: 1.0.0-beta.14-a36c63d(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(zod@4.4.3) es-toolkit: specifier: ^1.51.0 version: 1.51.0 @@ -774,19 +774,19 @@ importers: dependencies: '@better-auth/api-key': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) '@better-auth/drizzle-adapter': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3)) '@better-auth/infra': specifier: ^0.3.7 - version: 0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3) + version: 0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3) '@better-auth/oauth-provider': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) '@better-auth/passkey': specifier: ^1.6.29 - version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) + version: 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1) '@reactive-resume/db': specifier: workspace:* version: link:../db @@ -804,10 +804,10 @@ importers: version: 6.0.0 better-auth: specifier: 1.6.29 - version: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + version: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + version: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) jose: specifier: ^6.2.9 version: 6.2.9 @@ -846,7 +846,7 @@ importers: version: link:../utils drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + version: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) pg: specifier: ^8.23.0 version: 8.23.0 @@ -889,6 +889,39 @@ importers: specifier: ^7.0.2 version: 7.0.2 + packages/dsh-plugin: + devDependencies: + '@deepseek-ai/cordis': + specifier: ^4.0.1 + version: 4.0.1 + '@deepseek-ai/dsh-mcp-client': + specifier: ^0.1.0-rc.6 + version: 0.1.0-rc.7(643751aaaeb654b3b5aacaeafb53d493) + '@deepseek-ai/dsh-system-prompt': + specifier: ^0.1.0-rc.6 + version: 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-llm@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))))(@deepseek-ai/dsh-scope@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/schemastery': + specifier: ^3.18.1 + version: 3.18.1 + '@reactive-resume/config': + specifier: workspace:* + version: link:../config + '@reactive-resume/mcp': + specifier: workspace:* + version: link:../mcp + '@typescript/native-preview': + specifier: 7.0.0-dev.20260707.2 + version: 7.0.0-dev.20260707.2 + tsdown: + specifier: ^0.22.0 + version: 0.22.14(@typescript/native-preview@7.0.0-dev.20260707.2)(oxc-resolver@11.24.2)(tsx@4.23.12)(typescript@7.0.2) + typescript: + specifier: ^7.0.2 + version: 7.0.2 + vitest: + specifier: ^4.1.10 + version: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + packages/email: dependencies: '@reactive-resume/env': @@ -906,7 +939,7 @@ importers: devDependencies: '@react-email/ui': specifier: ^6.9.2 - version: 6.9.2(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 6.9.2(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@reactive-resume/config': specifier: workspace:* version: link:../config @@ -996,7 +1029,7 @@ importers: version: 1.30.0(supports-color@7.2.0)(zod@4.4.3) '@orpc/server': specifier: ^1.15.0 - version: 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) + version: 1.15.0(ws@8.21.3) '@reactive-resume/ai': specifier: workspace:* version: link:../ai @@ -1027,7 +1060,7 @@ importers: version: 7.0.2 vitest: specifier: ^4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) packages/pdf: dependencies: @@ -1267,7 +1300,7 @@ importers: version: 7.0.0-dev.20260707.2 drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + version: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) pg: specifier: ^8.23.0 version: 8.23.0 @@ -1276,7 +1309,7 @@ importers: version: 4.23.12 vitest: specifier: ^4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) packages: @@ -2004,6 +2037,146 @@ packages: resolution: {integrity: sha512-GsCw/qu92GI0EX6s7fxUi/SG1lmFjG9XZivxxEDZXqztuQKCn5o5wKdz4v005zci0Md7EZzgAwmQLoIEDZoaow==} engines: {node: '>=22'} + '@deepseek-ai/cordis@4.0.1': + resolution: {integrity: sha512-YBdskTU2Po1kru3GgcUWUbkTsPMA9LkSQDAY8rBkFJeajdgcQad3QPJZE26JyK99Xb6HaASvoXg2DSUTeN/0Nw==} + hasBin: true + peerDependencies: + '@deepseek-ai/cordis-plugin-include': ^1.0.6 + '@deepseek-ai/cordis-plugin-loader': ^1.0.2 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-include': + optional: true + '@deepseek-ai/cordis-plugin-loader': + optional: true + + '@deepseek-ai/cosmokit@1.8.2': + resolution: {integrity: sha512-muBOKtSrUKU5m/xpq8ZXWL6hQ/jgd4PhU2PqH97bcxIiLEJfNwZOGQEx4t/aS/GgxRAR+ra9pMHPMtTHU4sqqA==} + + '@deepseek-ai/dsh-agent@0.1.0-rc.7': + resolution: {integrity: sha512-AqBQavJYgbCUUYBHP7OGCaw8WN5082NXYQOoOfNRO72bub3E+/nWkl8b4B7BAJdFfyLo9ce+Kgb1BCHSJU/JLg==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + '@deepseek-ai/dsh-llm': ^0.1.0-rc.7 + '@deepseek-ai/dsh-scope': ^0.1.0-rc.7 + '@deepseek-ai/dsh-session': ^0.1.0-rc.7 + '@deepseek-ai/dsh-system-prompt': ^0.1.0-rc.7 + '@deepseek-ai/dsh-typert-protocol': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-attachment@0.1.0-rc.7': + resolution: {integrity: sha512-rsR/xVNOGIig8gXxhrKnkd6YD7aYliGtA/e7b4DlPawMpLhsItAh0HQ832n8LJn1aGZxKf68y9PRgzfljsveOQ==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-brand': ^0.1.0-rc.7 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-brand@0.1.0-rc.7': + resolution: {integrity: sha512-P7+w0fN40yXXQkV360p6jQi63pcl68OOWebNGN5gf8w8sguvni2mA1cU8RLZzDkRNFSZD+BCw3D4uWYM+hhh7A==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-code-runtime@0.1.0-rc.7': + resolution: {integrity: sha512-vzW82eU4so0qJQ/XS7BGBUSguJMAgEOW3GaJJW0g+W5ysBJg+UC/Jjo1Np8mPjSpjjl4eoyXpshJzrwjoxCpRg==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-invariants@0.1.0-rc.7': + resolution: {integrity: sha512-PnO1F4aZGUmqZPyuPJpBUfQ4DZmjCGCNGr0yuN2iURTP/e6h0kGnTNTYgR2NqMvAtpP66WNiHhvH2LMqumk1+A==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + + '@deepseek-ai/dsh-llm@0.1.0-rc.7': + resolution: {integrity: sha512-VaB9kQ8XOA+R5jtsWf92QMc1WpaatEAFUvQePGUYrzQ7Z86b9VhQQzmchh5VmknT4oRSSdn0re5tReCvfcYNXQ==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-attachment': ^0.1.0-rc.7 + '@deepseek-ai/dsh-brand': ^0.1.0-rc.7 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + '@deepseek-ai/dsh-timeout': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-mcp-client@0.1.0-rc.7': + resolution: {integrity: sha512-hjdki2TTXfyZMJuddOVXV0lEhZjdku2aoPagVKV4TOhqz3jDJE0mQds87mtDOI9J4pyRGWfYXky6HN9Bi/usgg==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-attachment': ^0.1.0-rc.7 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + '@deepseek-ai/dsh-llm': ^0.1.0-rc.7 + '@deepseek-ai/dsh-subprocess': ^0.1.0-rc.7 + '@deepseek-ai/dsh-timeout': ^0.1.0-rc.7 + '@deepseek-ai/dsh-tools': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-scope@0.1.0-rc.7': + resolution: {integrity: sha512-8gn+sANXhpv+9egbNwq49/uI3XhbmB33obo9yMyzyzruan3zFoxeH4UV54jTC2hjbu8gFNPsyNam9AAtRV8/Cg==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-session@0.1.0-rc.7': + resolution: {integrity: sha512-02WVTkqIH+TyDL7dhMN3Hm+qcTEdhD0fVDC0aIAyND2fBdXj3CagEXXvpmt3mzwWfKwOTGL1RdxtC6pMA4Bl1A==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-brand': ^0.1.0-rc.7 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + '@deepseek-ai/dsh-llm': ^0.1.0-rc.7 + '@deepseek-ai/dsh-scope': ^0.1.0-rc.7 + '@deepseek-ai/dsh-typert-protocol': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-subprocess@0.1.0-rc.7': + resolution: {integrity: sha512-xiHD61S2trIZ0CzhSMgXxZJVyJ2c76DkX4eqP3Of4mBEnm6C7g7FChII6uL0z5v1bnOnTmpHzwPX8YCwqb7dbg==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-system-prompt@0.1.0-rc.7': + resolution: {integrity: sha512-Rair2ZkzgoIIr+UstYVYeqeUgORNPIW1LNcsXz3Zjglx4FGjsmzs0UALdNYvSBpBvCLNmt4E6+XQIrBbS/s9jw==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + '@deepseek-ai/dsh-llm': ^0.1.0-rc.7 + '@deepseek-ai/dsh-scope': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-timeout@0.1.0-rc.7': + resolution: {integrity: sha512-Ufl9G7zP7Tky/zkXscavEiolEfAwutfbPeLb5sUU/tPQlDykhh1NwGrarNJ11fdR723zmA/3co4LgxtDtWCOEQ==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-tools@0.1.0-rc.7': + resolution: {integrity: sha512-7Kq3EEv354aNcxbS0NRfxxyJiZhCsvFV/03a3MdkYO/gG2eM9+E4xQum0N2FL5bw7JiGlgw8jdLMkcNGmavEaA==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-agent': ^0.1.0-rc.7 + '@deepseek-ai/dsh-code-runtime': ^0.1.0-rc.7 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + '@deepseek-ai/dsh-llm': ^0.1.0-rc.7 + '@deepseek-ai/dsh-scope': ^0.1.0-rc.7 + '@deepseek-ai/dsh-session': ^0.1.0-rc.7 + '@deepseek-ai/dsh-system-prompt': ^0.1.0-rc.7 + '@deepseek-ai/dsh-user-approval': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-typert-protocol@0.1.0-rc.7': + resolution: {integrity: sha512-R7qdvaRRHbz5xijoVOxueeBB/VT0eDzuQNQN4iNEBUbI/L9xG9bZutktTQlgrIlBSn1sPH4pLqiCiM6ErQPTaQ==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + + '@deepseek-ai/dsh-user-approval@0.1.0-rc.7': + resolution: {integrity: sha512-kYMpU6eg1m1BcfSC4FLWUcNH/QAE8tcu0WRkQzqzoCw8bK/Nl3dqHtd2qSVzI/emIviTulM5I230e4wPi/kuVg==} + peerDependencies: + '@deepseek-ai/cordis': ^4.0.1 + '@deepseek-ai/dsh-agent': ^0.1.0-rc.7 + '@deepseek-ai/dsh-brand': ^0.1.0-rc.7 + '@deepseek-ai/dsh-invariants': ^0.1.0-rc.7 + '@deepseek-ai/dsh-llm': ^0.1.0-rc.7 + '@deepseek-ai/dsh-scope': ^0.1.0-rc.7 + '@deepseek-ai/dsh-session': ^0.1.0-rc.7 + '@deepseek-ai/dsh-system-prompt': ^0.1.0-rc.7 + + '@deepseek-ai/schemastery@3.18.1': + resolution: {integrity: sha512-Qn0FCSwCQnpnj6SB31I6i2sIKgKWnkbJM8O0EU91Gv2UsYVvtZTl6IA0sCwk2e2MZf5S8w5hpq9QkeVvK9qwxg==} + '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -2549,41 +2722,6 @@ packages: cpu: [x64] os: [win32] - '@inquirer/ansi@2.0.7': - resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - - '@inquirer/confirm@6.1.1': - resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/core@11.2.1': - resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/figures@2.0.7': - resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - - '@inquirer/type@4.0.7': - resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@ioredis/commands@2.0.0': resolution: {integrity: sha512-vrx0AE/T0h7cRZwfo1M39Cr+ZhZrkf0V8mQN75wucKCxCLD9l/VX6no3gFvrLqD1IlG/1LtzWovqEw3t0Vr9zg==} @@ -2732,10 +2870,6 @@ packages: '@cfworker/json-schema': optional: true - '@mswjs/interceptors@0.41.9': - resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} - engines: {node: '>=18'} - '@napi-rs/canvas-android-arm64@1.0.6': resolution: {integrity: sha512-CZUmZEyN/cmSN1OhRJ44vBE6xyb5ekBbsIF8dqNgizbnAiHSFNi8eAA4oyyIAe5KzJ72K16OKC2lAynZLhv32Q==} engines: {node: '>= 10'} @@ -2811,13 +2945,6 @@ packages: resolution: {integrity: sha512-Ud4d0jLr9vSaakvfOTIjgP3hoY8kMIYgHC4mtE4L0bP3St9lf6TyCVsInvFIOEofzcUeMfDydHDy8Fs2WuWz+A==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.2.2': - resolution: {integrity: sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} - peerDependencies: - '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.3 - '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.3 - '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -2917,22 +3044,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@open-draft/deferred-promise@2.2.0': - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - - '@open-draft/deferred-promise@3.0.0': - resolution: {integrity: sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==} - - '@open-draft/logger@0.3.0': - resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} - - '@open-draft/until@2.1.0': - resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - - '@opentelemetry/api@1.9.1': - resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} - engines: {node: '>=8.0.0'} - '@opentelemetry/semantic-conventions@1.41.1': resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} engines: {node: '>=14'} @@ -3652,73 +3763,36 @@ packages: '@react-pdf/types@2.11.3': resolution: {integrity: sha512-/3jG6KUOsSERDDmz2zq+pLI2NcHqupzYtLP+hEnO39FgzWUpAnD44eJdoDtARkoqX/Yhahu4Luu8N6XK9u0/pw==} - '@rolldown/binding-android-arm64@1.2.3': - resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@rolldown/binding-android-arm64@1.2.4': resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.3': - resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@rolldown/binding-darwin-arm64@1.2.4': resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.3': - resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@rolldown/binding-darwin-x64@1.2.4': resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.3': - resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@rolldown/binding-freebsd-x64@1.2.4': resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.3': - resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.2.4': resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.3': - resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.2.4': resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3726,13 +3800,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.3': - resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.2.4': resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3740,13 +3807,6 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.3': - resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.2.4': resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3754,13 +3814,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.3': - resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.4': resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3768,13 +3821,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.3': - resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.4': resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3782,13 +3828,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.3': - resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@rolldown/binding-linux-x64-musl@1.2.4': resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3796,36 +3835,18 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.3': - resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.2.4': resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.3': - resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.2.4': resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.3': - resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.4': resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4597,12 +4618,6 @@ packages: '@types/react@19.2.18': resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} - '@types/set-cookie-parser@2.4.10': - resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} - - '@types/statuses@2.0.6': - resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -5166,11 +5181,6 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.11.13: - resolution: {integrity: sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==} - engines: {node: '>=6.0.0'} - hasBin: true - baseline-browser-mapping@2.11.15: resolution: {integrity: sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==} engines: {node: '>=6.0.0'} @@ -5390,17 +5400,9 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - cliui@9.0.1: resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} engines: {node: '>=20'} @@ -6042,18 +6044,9 @@ packages: fast-json-patch@3.1.1: resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} - fast-string-truncated-width@3.0.3: - resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} - - fast-string-width@3.0.2: - resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.5: resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} - fast-wrap-ansi@0.2.2: - resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -6218,10 +6211,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphql@16.14.2: - resolution: {integrity: sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - happy-dom@20.11.2: resolution: {integrity: sha512-7MB+bJLkxu3SowAfBJbjW+c55kNz5tkR45gu2qzrxznezhLeN5YIlJbwUgSzlGc+qWoZ8Ykg71H5ezz69xixrw==} engines: {node: '>=20.0.0'} @@ -6251,9 +6240,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - headers-polyfill@5.0.1: - resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} - hono@4.13.2: resolution: {integrity: sha512-JydRilDRkYBQMt9qR9U92mXxmbGqsqSn/IKOrh4e7/gEbn+0zSr8igTu0obwJoNGN4sez28DIql7FBHWydoJpA==} engines: {node: '>=16.9.0'} @@ -6410,9 +6396,6 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -7150,20 +7133,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.14.6: - resolution: {integrity: sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - typescript: '>= 4.8.x' - peerDependenciesMeta: - typescript: - optional: true - - mute-stream@3.0.0: - resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} - engines: {node: ^20.17.0 || >=22.9.0} - 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} @@ -7315,9 +7284,6 @@ packages: orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - outvariant@1.4.3: - resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - oxc-parser@0.120.0: resolution: {integrity: sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -7397,9 +7363,6 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} @@ -7810,10 +7773,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -7847,9 +7806,6 @@ packages: resumable-stream@2.2.12: resolution: {integrity: sha512-e6boHekmb72MdWDn7vSV9kiuRb9K3CepcDj+3Z0NNhdAfld7uHbVU8+NKlHRf3LO2Chtj4cXuWL88StLg64eIw==} - rettime@0.11.11: - resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -7878,11 +7834,6 @@ packages: vue-tsc: optional: true - rolldown@1.2.3: - resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - rolldown@1.2.4: resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -8105,9 +8056,6 @@ packages: resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} - strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8262,13 +8210,6 @@ packages: resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} - tldts-core@7.4.6: - resolution: {integrity: sha512-TkQNGJIhlEphpHCjKodMTSe23egUZr/g+flI2qkLgiJ/maAzSgXypSLRTNH3nCmqgayEmtcJBiLcfODSAr1xoA==} - - tldts@7.4.6: - resolution: {integrity: sha512-rbP0Gyx8b3Ae9yO//CU2wbSnQNoQ66m1nJdSbSHmnwKwzkkz/u8mERYU8T2rmlmy+bJvRNn84yNCW8gYqox44Q==} - hasBin: true - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -8277,10 +8218,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tough-cookie@6.0.1: - resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} - engines: {node: '>=16'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -8475,9 +8412,6 @@ packages: webpack: optional: true - until-async@3.0.2: - resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} - update-browserslist-db@1.3.1: resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} hasBin: true @@ -8663,10 +8597,6 @@ packages: wildcard-match@5.1.4: resolution: {integrity: sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -8721,18 +8651,10 @@ packages: engines: {node: '>= 14.6'} hasBin: true - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - yargs-parser@22.0.0: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@17.7.3: - resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} - engines: {node: '>=12'} - yargs@18.1.0: resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} @@ -9390,15 +9312,15 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@better-auth/api-key@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/api-key@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 - better-auth: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + better-auth: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) better-call: 1.4.0(zod@4.4.3) zod: 4.4.3 - '@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)': + '@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1)': dependencies: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -9409,74 +9331,72 @@ snapshots: kysely: 0.29.5 nanostores: 1.5.1 zod: 4.4.3 - optionalDependencies: - '@opentelemetry/api': 1.9.1 - '@better-auth/drizzle-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))': + '@better-auth/drizzle-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 optionalDependencies: - drizzle-orm: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + drizzle-orm: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) - '@better-auth/infra@0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3)': + '@better-auth/infra@0.3.7(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(zod@4.4.3)': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.3 '@better-fetch/fetch': 1.3.1 - better-auth: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + better-auth: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) better-call: 1.3.7(zod@4.4.3) jose: 6.2.9 libphonenumber-js: 1.13.11 zod: 4.4.3 - '@better-auth/kysely-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(kysely@0.29.5)': + '@better-auth/kysely-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(kysely@0.29.5)': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 optionalDependencies: kysely: 0.29.5 - '@better-auth/memory-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)': + '@better-auth/memory-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)': + '@better-auth/mongo-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 - '@better-auth/oauth-provider@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/oauth-provider@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + better-auth: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) better-call: 1.4.0(zod@4.4.3) jose: 6.2.9 zod: 4.4.3 - '@better-auth/passkey@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1)': + '@better-auth/passkey@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))(nanostores@1.5.1)': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@simplewebauthn/browser': 13.3.0 '@simplewebauthn/server': 13.3.2 - better-auth: 1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) + better-auth: 1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10) better-call: 1.4.0(zod@4.4.3) nanostores: 1.5.1 zod: 4.4.3 - '@better-auth/prisma-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)': + '@better-auth/prisma-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 - '@better-auth/telemetry@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': + '@better-auth/telemetry@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -9709,6 +9629,136 @@ snapshots: '@conventional-changelog/template@1.3.0': {} + '@deepseek-ai/cordis@4.0.1': + dependencies: + '@deepseek-ai/cosmokit': 1.8.2 + '@standard-schema/spec': 1.1.0 + + '@deepseek-ai/cosmokit@1.8.2': {} + + '@deepseek-ai/dsh-agent@0.1.0-rc.7(1e28fca6adb316c000fd361f8e5f3a08)': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + '@deepseek-ai/dsh-llm': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-scope': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-session': 0.1.0-rc.7(1dcde9bfc9fa0140c66648fbcb67b346) + '@deepseek-ai/dsh-system-prompt': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-llm@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))))(@deepseek-ai/dsh-scope@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-typert-protocol': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + + '@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-brand': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + + '@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + + '@deepseek-ai/dsh-code-runtime@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + + '@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/schemastery': 3.18.1 + + '@deepseek-ai/dsh-llm@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-attachment': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-brand': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + '@deepseek-ai/dsh-timeout': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/schemastery': 3.18.1 + + '@deepseek-ai/dsh-mcp-client@0.1.0-rc.7(643751aaaeb654b3b5aacaeafb53d493)': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-attachment': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + '@deepseek-ai/dsh-llm': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-subprocess': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-timeout': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-tools': 0.1.0-rc.7(38c91eb2d47c5b4ba2c8ead86dfcb4aa) + '@deepseek-ai/schemastery': 3.18.1 + '@modelcontextprotocol/sdk': 1.30.0(supports-color@7.2.0)(zod@4.4.3) + zod: 4.4.3 + transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color + + '@deepseek-ai/dsh-scope@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + + '@deepseek-ai/dsh-session@0.1.0-rc.7(1dcde9bfc9fa0140c66648fbcb67b346)': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-brand': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + '@deepseek-ai/dsh-llm': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-scope': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-typert-protocol': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + + '@deepseek-ai/dsh-subprocess@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + + '@deepseek-ai/dsh-system-prompt@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-llm@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))))(@deepseek-ai/dsh-scope@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + '@deepseek-ai/dsh-llm': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-scope': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/schemastery': 3.18.1 + + '@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + + '@deepseek-ai/dsh-tools@0.1.0-rc.7(38c91eb2d47c5b4ba2c8ead86dfcb4aa)': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-agent': 0.1.0-rc.7(1e28fca6adb316c000fd361f8e5f3a08) + '@deepseek-ai/dsh-code-runtime': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + '@deepseek-ai/dsh-llm': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-scope': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-session': 0.1.0-rc.7(1dcde9bfc9fa0140c66648fbcb67b346) + '@deepseek-ai/dsh-system-prompt': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-llm@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))))(@deepseek-ai/dsh-scope@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-user-approval': 0.1.0-rc.7(6b8cefd624fd84694a941b103cc9b3fb) + '@deepseek-ai/schemastery': 3.18.1 + + '@deepseek-ai/dsh-typert-protocol@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + + '@deepseek-ai/dsh-user-approval@0.1.0-rc.7(6b8cefd624fd84694a941b103cc9b3fb)': + dependencies: + '@deepseek-ai/cordis': 4.0.1 + '@deepseek-ai/dsh-agent': 0.1.0-rc.7(1e28fca6adb316c000fd361f8e5f3a08) + '@deepseek-ai/dsh-brand': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-invariants': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1) + '@deepseek-ai/dsh-llm': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/dsh-scope': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)) + '@deepseek-ai/dsh-session': 0.1.0-rc.7(1dcde9bfc9fa0140c66648fbcb67b346) + '@deepseek-ai/dsh-system-prompt': 0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-llm@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-attachment@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-brand@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)))(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))(@deepseek-ai/dsh-timeout@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))))(@deepseek-ai/dsh-scope@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1)(@deepseek-ai/dsh-invariants@0.1.0-rc.7(@deepseek-ai/cordis@4.0.1))) + '@deepseek-ai/schemastery': 3.18.1 + + '@deepseek-ai/schemastery@3.18.1': + dependencies: + '@deepseek-ai/cosmokit': 1.8.2 + '@standard-schema/spec': 1.1.0 + '@dnd-kit/accessibility@3.1.1(react@19.2.8)': dependencies: react: 19.2.8 @@ -10065,38 +10115,6 @@ snapshots: '@img/sharp-win32-x64@0.35.3': optional: true - '@inquirer/ansi@2.0.7': - optional: true - - '@inquirer/confirm@6.1.1(@types/node@26.2.0)': - dependencies: - '@inquirer/core': 11.2.1(@types/node@26.2.0) - '@inquirer/type': 4.0.7(@types/node@26.2.0) - optionalDependencies: - '@types/node': 26.2.0 - optional: true - - '@inquirer/core@11.2.1(@types/node@26.2.0)': - dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/figures': 2.0.7 - '@inquirer/type': 4.0.7(@types/node@26.2.0) - cli-width: 4.1.0 - fast-wrap-ansi: 0.2.2 - mute-stream: 3.0.0 - signal-exit: 4.1.0 - optionalDependencies: - '@types/node': 26.2.0 - optional: true - - '@inquirer/figures@2.0.7': - optional: true - - '@inquirer/type@4.0.7(@types/node@26.2.0)': - optionalDependencies: - '@types/node': 26.2.0 - optional: true - '@ioredis/commands@2.0.0': {} '@isaacs/fs-minipass@4.0.1': @@ -10325,16 +10343,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@mswjs/interceptors@0.41.9': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 - optional: true - '@napi-rs/canvas-android-arm64@1.0.6': optional: true @@ -10382,7 +10390,7 @@ snapshots: '@napi-rs/canvas-win32-arm64-msvc': 1.0.6 '@napi-rs/canvas-win32-x64-msvc': 1.0.6 - '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 @@ -10449,50 +10457,32 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@open-draft/deferred-promise@2.2.0': - optional: true - - '@open-draft/deferred-promise@3.0.0': - optional: true - - '@open-draft/logger@0.3.0': - dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.3 - optional: true - - '@open-draft/until@2.1.0': - optional: true - - '@opentelemetry/api@1.9.1': - optional: true - '@opentelemetry/semantic-conventions@1.41.1': {} - '@orpc/client@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/client@1.15.0': dependencies: - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-fetch': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-peer': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 + '@orpc/standard-server-fetch': 1.15.0 + '@orpc/standard-server-peer': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/contract@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/contract@1.15.0': dependencies: - '@orpc/client': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/client': 1.15.0 + '@orpc/shared': 1.15.0 '@standard-schema/spec': 1.1.0 openapi-types: 12.1.3 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/experimental-ratelimit@1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3)': + '@orpc/experimental-ratelimit@1.15.0(ws@8.21.3)': dependencies: - '@orpc/client': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/server': 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/client': 1.15.0 + '@orpc/server': 1.15.0(ws@8.21.3) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - crossws @@ -10501,13 +10491,13 @@ snapshots: '@orpc/interop@1.15.0': {} - '@orpc/json-schema@1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3)': + '@orpc/json-schema@1.15.0(ws@8.21.3)': dependencies: - '@orpc/contract': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/contract': 1.15.0 '@orpc/interop': 1.15.0 - '@orpc/openapi': 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) - '@orpc/server': 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/openapi': 1.15.0(ws@8.21.3) + '@orpc/server': 1.15.0(ws@8.21.3) + '@orpc/shared': 1.15.0 json-schema-typed: 8.0.2 transitivePeerDependencies: - '@opentelemetry/api' @@ -10515,24 +10505,24 @@ snapshots: - fastify - ws - '@orpc/openapi-client@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/openapi-client@1.15.0': dependencies: - '@orpc/client': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/contract': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/client': 1.15.0 + '@orpc/contract': 1.15.0 + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/openapi@1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3)': + '@orpc/openapi@1.15.0(ws@8.21.3)': dependencies: - '@orpc/client': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/contract': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/client': 1.15.0 + '@orpc/contract': 1.15.0 '@orpc/interop': 1.15.0 - '@orpc/openapi-client': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/server': 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/openapi-client': 1.15.0 + '@orpc/server': 1.15.0(ws@8.21.3) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 json-schema-typed: 8.0.2 rou3: 0.7.12 transitivePeerDependencies: @@ -10541,18 +10531,18 @@ snapshots: - fastify - ws - '@orpc/server@1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3)': + '@orpc/server@1.15.0(ws@8.21.3)': dependencies: - '@orpc/client': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/contract': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/client': 1.15.0 + '@orpc/contract': 1.15.0 '@orpc/interop': 1.15.0 - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-aws-lambda': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-fastify': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-fetch': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-node': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-peer': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 + '@orpc/standard-server-aws-lambda': 1.15.0 + '@orpc/standard-server-fastify': 1.15.0 + '@orpc/standard-server-fetch': 1.15.0 + '@orpc/standard-server-node': 1.15.0 + '@orpc/standard-server-peer': 1.15.0 cookie: 1.1.1 optionalDependencies: ws: 8.21.3 @@ -10560,73 +10550,71 @@ snapshots: - '@opentelemetry/api' - fastify - '@orpc/shared@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/shared@1.15.0': dependencies: radash: 12.1.1 type-fest: 5.8.0 - optionalDependencies: - '@opentelemetry/api': 1.9.1 - '@orpc/standard-server-aws-lambda@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/standard-server-aws-lambda@1.15.0': dependencies: - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-fetch': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-node': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 + '@orpc/standard-server-fetch': 1.15.0 + '@orpc/standard-server-node': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/standard-server-fastify@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/standard-server-fastify@1.15.0': dependencies: - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-node': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 + '@orpc/standard-server-node': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/standard-server-fetch@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/standard-server-fetch@1.15.0': dependencies: - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/standard-server-node@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/standard-server-node@1.15.0': dependencies: - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server-fetch': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 + '@orpc/standard-server-fetch': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/standard-server-peer@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/standard-server-peer@1.15.0': dependencies: - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/standard-server': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 + '@orpc/standard-server': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/standard-server@1.15.0(@opentelemetry/api@1.9.1)': + '@orpc/standard-server@1.15.0': dependencies: - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/shared': 1.15.0 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/tanstack-query@1.15.0(@opentelemetry/api@1.9.1)(@orpc/client@1.15.0(@opentelemetry/api@1.9.1))(@tanstack/query-core@5.101.4)': + '@orpc/tanstack-query@1.15.0(@orpc/client@1.15.0)(@tanstack/query-core@5.101.4)': dependencies: - '@orpc/client': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/client': 1.15.0 + '@orpc/shared': 1.15.0 '@tanstack/query-core': 5.101.4 transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/zod@1.15.0(@opentelemetry/api@1.9.1)(@orpc/contract@1.15.0(@opentelemetry/api@1.9.1))(@orpc/server@1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3))(ws@8.21.3)(zod@4.4.3)': + '@orpc/zod@1.15.0(@orpc/contract@1.15.0)(@orpc/server@1.15.0(ws@8.21.3))(ws@8.21.3)(zod@4.4.3)': dependencies: - '@orpc/contract': 1.15.0(@opentelemetry/api@1.9.1) - '@orpc/json-schema': 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) - '@orpc/openapi': 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) - '@orpc/server': 1.15.0(@opentelemetry/api@1.9.1)(ws@8.21.3) - '@orpc/shared': 1.15.0(@opentelemetry/api@1.9.1) + '@orpc/contract': 1.15.0 + '@orpc/json-schema': 1.15.0(ws@8.21.3) + '@orpc/openapi': 1.15.0(ws@8.21.3) + '@orpc/server': 1.15.0(ws@8.21.3) + '@orpc/shared': 1.15.0 escape-string-regexp: 5.0.0 wildcard-match: 5.1.4 zod: 4.4.3 @@ -10816,7 +10804,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 - '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': @@ -11086,10 +11074,10 @@ snapshots: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - '@react-email/ui@6.9.2(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@react-email/ui@6.9.2(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: esbuild: 0.28.1 - next: 16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + next: 16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -11204,87 +11192,45 @@ snapshots: '@react-pdf/primitives': 4.3.0 '@react-pdf/stylesheet': 6.2.3 - '@rolldown/binding-android-arm64@1.2.3': - optional: true - '@rolldown/binding-android-arm64@1.2.4': optional: true - '@rolldown/binding-darwin-arm64@1.2.3': - optional: true - '@rolldown/binding-darwin-arm64@1.2.4': optional: true - '@rolldown/binding-darwin-x64@1.2.3': - optional: true - '@rolldown/binding-darwin-x64@1.2.4': optional: true - '@rolldown/binding-freebsd-x64@1.2.3': - optional: true - '@rolldown/binding-freebsd-x64@1.2.4': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.3': - optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.4': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.3': - optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.4': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.3': - optional: true - '@rolldown/binding-linux-arm64-musl@1.2.4': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.3': - optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.4': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.3': - optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.4': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.3': - optional: true - '@rolldown/binding-linux-x64-gnu@1.2.4': optional: true - '@rolldown/binding-linux-x64-musl@1.2.3': - optional: true - '@rolldown/binding-linux-x64-musl@1.2.4': optional: true - '@rolldown/binding-openharmony-arm64@1.2.3': - optional: true - '@rolldown/binding-openharmony-arm64@1.2.4': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.3': - optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.4': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.3': - optional: true - '@rolldown/binding-win32-x64-msvc@1.2.4': optional: true @@ -11760,7 +11706,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 optionalDependencies: - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -12098,14 +12044,6 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/set-cookie-parser@2.4.10': - dependencies: - '@types/node': 26.2.0 - optional: true - - '@types/statuses@2.0.6': - optional: true - '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -12285,7 +12223,7 @@ snapshots: obug: 2.1.4 std-env: 4.2.0 tinyrainbow: 3.1.1 - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/expect@4.1.10': dependencies: @@ -12296,13 +12234,12 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.10(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.14.6(@types/node@26.2.0)(typescript@7.0.2) vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': @@ -12525,8 +12462,6 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.11.13: {} - baseline-browser-mapping@2.11.15: {} bcrypt@6.0.0: @@ -12534,15 +12469,15 @@ snapshots: node-addon-api: 8.9.2 node-gyp-build: 4.8.4 - better-auth@1.6.29(@opentelemetry/api@1.9.1)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10): + better-auth@1.6.29(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(solid-js@1.9.14)(vitest@4.1.10): dependencies: - '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) - '@better-auth/drizzle-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3)) - '@better-auth/kysely-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(kysely@0.29.5) - '@better-auth/memory-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) - '@better-auth/mongo-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) - '@better-auth/prisma-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) - '@better-auth/telemetry': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1) + '@better-auth/drizzle-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3)) + '@better-auth/kysely-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(kysely@0.29.5) + '@better-auth/memory-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) + '@better-auth/prisma-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@noble/ciphers': 2.3.0 @@ -12554,13 +12489,13 @@ snapshots: nanostores: 1.5.1 zod: 4.4.3 optionalDependencies: - drizzle-orm: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) - next: 16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + drizzle-orm: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + next: 16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) pg: 8.23.0 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) solid-js: 1.9.14 - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -12712,18 +12647,8 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 - cli-width@4.1.0: - optional: true - client-only@0.0.1: {} - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - optional: true - cliui@9.0.1: dependencies: string-width: 7.2.0 @@ -13003,16 +12928,15 @@ snapshots: get-tsconfig: 4.14.2 jiti: 2.7.0 - drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3): + drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3): optionalDependencies: - '@opentelemetry/api': 1.9.1 '@types/pg': 8.23.0 pg: 8.23.0 zod: 4.4.3 - drizzle-zod@1.0.0-beta.14-a36c63d(drizzle-orm@1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(zod@4.4.3): + drizzle-zod@1.0.0-beta.14-a36c63d(drizzle-orm@1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3))(zod@4.4.3): dependencies: - drizzle-orm: 1.0.0-rc.4(@opentelemetry/api@1.9.1)(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) + drizzle-orm: 1.0.0-rc.4(@types/pg@8.23.0)(pg@8.23.0)(zod@4.4.3) zod: 4.4.3 dts-resolver@3.0.0(oxc-resolver@11.24.2): @@ -13266,21 +13190,8 @@ snapshots: fast-json-patch@3.1.1: {} - fast-string-truncated-width@3.0.3: - optional: true - - fast-string-width@3.0.2: - dependencies: - fast-string-truncated-width: 3.0.3 - optional: true - fast-uri@3.1.5: {} - fast-wrap-ansi@0.2.2: - dependencies: - fast-string-width: 3.0.2 - optional: true - fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -13448,9 +13359,6 @@ snapshots: graceful-fs@4.2.11: {} - graphql@16.14.2: - optional: true - happy-dom@20.11.2: dependencies: '@types/node': 26.2.0 @@ -13503,12 +13411,6 @@ snapshots: he@1.2.0: {} - headers-polyfill@5.0.1: - dependencies: - '@types/set-cookie-parser': 2.4.10 - set-cookie-parser: 3.1.2 - optional: true - hono@4.13.2: {} hookable@6.1.1: {} @@ -13637,9 +13539,6 @@ snapshots: is-interactive@2.0.0: {} - is-node-process@1.2.0: - optional: true - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -14493,35 +14392,6 @@ snapshots: ms@2.1.3: {} - msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2): - dependencies: - '@inquirer/confirm': 6.1.1(@types/node@26.2.0) - '@mswjs/interceptors': 0.41.9 - '@open-draft/deferred-promise': 3.0.0 - '@types/statuses': 2.0.6 - cookie: 1.1.1 - graphql: 16.14.2 - headers-polyfill: 5.0.1 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - picocolors: 1.1.1 - rettime: 0.11.11 - statuses: 2.0.2 - strict-event-emitter: 0.5.1 - tough-cookie: 6.0.1 - type-fest: 5.8.0 - until-async: 3.0.2 - yargs: 17.7.3 - optionalDependencies: - typescript: 7.0.2 - transitivePeerDependencies: - - '@types/node' - optional: true - - mute-stream@3.0.0: - optional: true - nanoid@3.3.18: {} nanoid@5.1.16: {} @@ -14532,11 +14402,11 @@ snapshots: negotiator@1.0.0: {} - next@16.3.0(@babel/core@8.0.1)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + next@16.3.0(@babel/core@8.0.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@next/env': 16.3.0 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.11.13 + baseline-browser-mapping: 2.11.15 caniuse-lite: 1.0.30001809 postcss: 8.5.23 react: 19.2.8 @@ -14551,7 +14421,6 @@ snapshots: '@next/swc-linux-x64-musl': 16.3.0 '@next/swc-win32-arm64-msvc': 16.3.0 '@next/swc-win32-x64-msvc': 16.3.0 - '@opentelemetry/api': 1.9.1 '@playwright/test': 1.62.1 babel-plugin-react-compiler: 1.0.0 sharp: 0.35.3(@types/node@26.2.0) @@ -14678,9 +14547,6 @@ snapshots: orderedmap@2.1.1: {} - outvariant@1.4.3: - optional: true - oxc-parser@0.120.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3): dependencies: '@oxc-project/types': 0.120.0 @@ -14818,9 +14684,6 @@ snapshots: lru-cache: 11.5.2 minipass: 7.1.3 - path-to-regexp@6.3.0: - optional: true - path-to-regexp@8.4.2: {} path-type@4.0.0: {} @@ -15285,9 +15148,6 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - require-directory@2.1.1: - optional: true - require-from-string@2.0.2: {} reselect@5.2.0: {} @@ -15314,9 +15174,6 @@ snapshots: resumable-stream@2.2.12: {} - rettime@0.11.11: - optional: true - reusify@1.1.0: {} rimraf@6.1.3: @@ -15339,26 +15196,6 @@ snapshots: transitivePeerDependencies: - oxc-resolver - rolldown@1.2.3: - dependencies: - '@oxc-project/types': 0.143.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.2.3 - '@rolldown/binding-darwin-arm64': 1.2.3 - '@rolldown/binding-darwin-x64': 1.2.3 - '@rolldown/binding-freebsd-x64': 1.2.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.3 - '@rolldown/binding-linux-arm64-gnu': 1.2.3 - '@rolldown/binding-linux-arm64-musl': 1.2.3 - '@rolldown/binding-linux-ppc64-gnu': 1.2.3 - '@rolldown/binding-linux-s390x-gnu': 1.2.3 - '@rolldown/binding-linux-x64-gnu': 1.2.3 - '@rolldown/binding-linux-x64-musl': 1.2.3 - '@rolldown/binding-openharmony-arm64': 1.2.3 - '@rolldown/binding-win32-arm64-msvc': 1.2.3 - '@rolldown/binding-win32-x64-msvc': 1.2.3 - rolldown@1.2.4: dependencies: '@oxc-project/types': 0.144.0 @@ -15653,9 +15490,6 @@ snapshots: stdin-discarder@0.3.2: {} - strict-event-emitter@0.5.1: - optional: true - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -15792,25 +15626,12 @@ snapshots: tinyrainbow@3.1.1: {} - tldts-core@7.4.6: - optional: true - - tldts@7.4.6: - dependencies: - tldts-core: 7.4.6 - optional: true - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toidentifier@1.0.1: {} - tough-cookie@6.0.1: - dependencies: - tldts: 7.4.6 - optional: true - tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -15998,9 +15819,6 @@ snapshots: rolldown: 1.2.4 vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) - until-async@3.0.2: - optional: true - update-browserslist-db@1.3.1(browserslist@4.28.8): dependencies: browserslist: 4.28.8 @@ -16062,7 +15880,7 @@ snapshots: lightningcss: 1.33.0 picomatch: 4.0.5 postcss: 8.5.26 - rolldown: 1.2.3 + rolldown: 1.2.4 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.2.0 @@ -16072,10 +15890,10 @@ snapshots: tsx: 4.23.12 yaml: 2.9.0 - vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + vitest@4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(happy-dom@20.11.2)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(msw@2.14.6(@types/node@26.2.0)(typescript@7.0.2))(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -16095,7 +15913,6 @@ snapshots: vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@opentelemetry/api': 1.9.1 '@types/node': 26.2.0 '@vitest/coverage-v8': 4.1.10(vitest@4.1.10) happy-dom: 20.11.2 @@ -16127,13 +15944,6 @@ snapshots: wildcard-match@5.1.4: {} - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - optional: true - wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 @@ -16167,22 +15977,8 @@ snapshots: yaml@2.9.0: {} - yargs-parser@21.1.1: - optional: true - yargs-parser@22.0.0: {} - yargs@17.7.3: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - optional: true - yargs@18.1.0: dependencies: cliui: 9.0.1