diff --git a/.cursor/rules/global.mdc b/.cursor/rules/global.mdc index c9ff589..ee93412 100644 --- a/.cursor/rules/global.mdc +++ b/.cursor/rules/global.mdc @@ -9,7 +9,7 @@ alwaysApply: true ## Core Concepts ``` -External World → Sense → Signal → Reflex → Workflow → Log +External World → Sense(state) → { newState, workflow? } → Workflow → Log ↑ ↑ "what to observe" "what to do" ``` @@ -20,19 +20,17 @@ External World → Sense → Signal → Reflex → Workflow → Log | Concept | What it is | |---------|-----------| -| **Sense** | A `compute()` function that samples or derives data. Returns `T \| null` — non-null emits a Signal, null is silent. Each Sense has its own SQLite database. | -| **Signal** | A notification emitted when a Sense returns non-null. Pure fact, no intent. Distributed via an in-memory Signal Bus. Not persisted. | -| **Reflex** | A declarative trigger (YAML) connecting Senses to actions. Trigger types: `interval` (periodic), `on` (react to Signals). Action types: trigger a Sense, or start a Workflow. | +| **Sense** | A stateful `compute(state)` function. Returns new state and an optional workflow trigger. State persisted as JSON. Scheduling (`interval`, `on`) is configured per sense in nerve.yaml. | | **Workflow** | A stateful multi-step execution. Contains **Roles** (actors with side effects) and a **Moderator** (pure router). Each instance is a **Thread** with a unique `runId`. | -| **Log** | Immutable audit trail. Records executions, state transitions, errors. **Cannot trigger Reflexes** — prevents feedback loops. | -| **Engine** | The kernel orchestrating everything. Holds Signal Bus, Reflex Scheduler, Process Manager, Workflow Manager. Never loads user code directly — all user code runs in isolated Workers. | +| **Log** | Immutable audit trail. Records executions, state transitions, errors. **Cannot trigger senses or workflows** — prevents feedback loops. | +| **Engine** | The kernel orchestrating everything. Holds Process Manager, Workflow Manager, Sense Scheduler. Never loads user code directly — all user code runs in isolated Workers. | | **Daemon** | The `nerve-daemon` package — engine runtime. Runs as a background process. | ### Architecture Rules -- **Three orthogonal extension points**: Sense (what to compute), Reflex (when to compute), Workflow (what to do) +- **Two orthogonal extension points**: Sense (what to observe + when), Workflow (what to do) - **Process isolation**: One worker per Sense group (long-lived), one per Workflow type (on-demand). Workers never talk to each other. -- **Causality is one-directional**: External world → Sense → Signal → Reflex → Action + Log. Logs are the end of the chain. +- **Causality is one-directional**: External world → Sense(state) → Workflow (when triggered) + Log. Logs are the end of the chain. @@ -44,18 +42,18 @@ Use `function` + `type`, not `class` + `interface`. ```typescript // ✅ Good -type Signal = { - senseId: string; - value: unknown; +type WorkflowLaunch = { + senseName: string; + workflowName: string; ts: number; }; -function createSignal(senseId: string, value: unknown): Signal { - return { senseId, value, ts: Date.now() }; +function recordWorkflowLaunch(senseName: string, workflowName: string): WorkflowLaunch { + return { senseName, workflowName, ts: Date.now() }; } // ❌ Bad — no class, no interface -class Signal implements ISignal { ... } +class WorkflowLaunch implements IWorkflowLaunch { ... } ``` ### Rules @@ -100,9 +98,9 @@ For mutually exclusive fields, use discriminated unions: ```typescript // ✅ Good -type ReflexConfig = - | { kind: "sense"; sense: string; interval: string | null; on: string[] | null } - | { kind: "workflow"; workflow: string; on: string[] | null }; +type WorkflowConfig = + | { concurrency: number; overflow: "drop" } + | { concurrency: number; overflow: "queue"; maxQueue: number }; ``` ## Modules & Exports @@ -123,9 +121,9 @@ export default function startEngine() { ... } | Type | Style | Example | |------|-------|---------| -| Files | kebab-case | `signal-bus.ts` | -| Types | PascalCase | `SignalBus` | -| Functions/variables | camelCase | `createSignalBus` | +| Files | kebab-case | `sense-scheduler.ts` | +| Types | PascalCase | `SenseScheduler` | +| Functions/variables | camelCase | `createSenseScheduler` | | Constants | UPPER_SNAKE | `MAX_RETRY_COUNT` | | Generics | Single letter or descriptive | `T`, `TValue` | diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 5972be8..532b1b2 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -3,7 +3,7 @@ ## Core Concepts ``` -External World → Sense → Signal → Reflex → Workflow → Log +External World → Sense(state) → { newState, workflow? } → Workflow → Log ↑ ↑ "what to observe" "what to do" ``` @@ -14,19 +14,17 @@ External World → Sense → Signal → Reflex → Workflow → Log | Concept | What it is | |---------|-----------| -| **Sense** | A `compute()` function that samples or derives data. Returns `T \| null` — non-null emits a Signal, null is silent. Each Sense has its own SQLite database. | -| **Signal** | A notification emitted when a Sense returns non-null. Pure fact, no intent. Distributed via an in-memory Signal Bus. Not persisted. | -| **Reflex** | A declarative trigger (YAML) connecting Senses to actions. Trigger types: `interval` (periodic), `on` (react to Signals). Action types: trigger a Sense, or start a Workflow. | +| **Sense** | A stateful `compute(state)` function. Returns new state and an optional workflow trigger. State persisted as JSON. Scheduling (`interval`, `on`) is configured per sense in nerve.yaml. | | **Workflow** | A stateful multi-step execution. Contains **Roles** (actors with side effects) and a **Moderator** (pure router). Each instance is a **Thread** with a unique `runId`. | -| **Log** | Immutable audit trail. Records executions, state transitions, errors. **Cannot trigger Reflexes** — prevents feedback loops. | -| **Engine** | The kernel orchestrating everything. Holds Signal Bus, Reflex Scheduler, Process Manager, Workflow Manager. Never loads user code directly — all user code runs in isolated Workers. | +| **Log** | Immutable audit trail. Records executions, state transitions, errors. **Cannot trigger senses or workflows** — prevents feedback loops. | +| **Engine** | The kernel orchestrating everything. Holds Process Manager, Workflow Manager, Sense Scheduler. Never loads user code directly — all user code runs in isolated Workers. | | **Daemon** | The `nerve-daemon` package — engine runtime. Runs as a background process. | ### Architecture Rules -- **Three orthogonal extension points**: Sense (what to compute), Reflex (when to compute), Workflow (what to do) +- **Two orthogonal extension points**: Sense (what to observe + when), Workflow (what to do) - **Process isolation**: One worker per Sense group (long-lived), one per Workflow type (on-demand). Workers never talk to each other. -- **Causality is one-directional**: External world → Sense → Signal → Reflex → Action + Log. Logs are the end of the chain. +- **Causality is one-directional**: External world → Sense(state) → Workflow (when triggered) + Log. Logs are the end of the chain. @@ -38,18 +36,18 @@ Use `function` + `type`, not `class` + `interface`. ```typescript // ✅ Good -type Signal = { - senseId: string; - value: unknown; +type WorkflowLaunch = { + senseName: string; + workflowName: string; ts: number; }; -function createSignal(senseId: string, value: unknown): Signal { - return { senseId, value, ts: Date.now() }; +function recordWorkflowLaunch(senseName: string, workflowName: string): WorkflowLaunch { + return { senseName, workflowName, ts: Date.now() }; } // ❌ Bad — no class, no interface -class Signal implements ISignal { ... } +class WorkflowLaunch implements IWorkflowLaunch { ... } ``` ### Rules @@ -94,9 +92,9 @@ For mutually exclusive fields, use discriminated unions: ```typescript // ✅ Good -type ReflexConfig = - | { kind: "sense"; sense: string; interval: string | null; on: string[] | null } - | { kind: "workflow"; workflow: string; on: string[] | null }; +type WorkflowConfig = + | { concurrency: number; overflow: "drop" } + | { concurrency: number; overflow: "queue"; maxQueue: number }; ``` ## Modules & Exports @@ -108,9 +106,9 @@ type ReflexConfig = | Type | Style | Example | |------|-------|---------| -| Files | kebab-case | `signal-bus.ts` | -| Types | PascalCase | `SignalBus` | -| Functions/variables | camelCase | `createSignalBus` | +| Files | kebab-case | `sense-scheduler.ts` | +| Types | PascalCase | `SenseScheduler` | +| Functions/variables | camelCase | `createSenseScheduler` | | Constants | UPPER_SNAKE | `MAX_RETRY_COUNT` | | Generics | Single letter or descriptive | `T`, `TValue` | diff --git a/.knowledge/monorepo.md b/.knowledge/monorepo.md index 33e26d2..13f3b35 100644 --- a/.knowledge/monorepo.md +++ b/.knowledge/monorepo.md @@ -5,7 +5,7 @@ nerve/ packages/ core/ # @uncaged/nerve-core — shared types, config parser, Result, spawn-safe cli/ # @uncaged/nerve-cli — CLI (init, validate, dev, daemon, knowledge) - daemon/ # @uncaged/nerve-daemon — kernel, workers, signal bus, scheduler + daemon/ # @uncaged/nerve-daemon — kernel, workers, sense scheduler, workflow manager store/ # @uncaged/nerve-store — append-only log, SQLite, CAS blob store workflow-utils/ # @uncaged/nerve-workflow-utils — role factories, extract, LLM helpers adapter-cursor/ # @uncaged/nerve-adapter-cursor — cursor-agent CLI adapter diff --git a/.knowledge/signal-routing.md b/.knowledge/signal-routing.md index 8481730..b5d07eb 100644 --- a/.knowledge/signal-routing.md +++ b/.knowledge/signal-routing.md @@ -1,91 +1,31 @@ -# Signal Routing +# Sense compute → workflow (RFC #308) -Signal routing is the core mechanism that determines how Sense outputs flow through the Nerve system. +Stateful senses no longer emit signals or pass outputs through `routeSenseComputeOutput`. The worker runs `compute(state)` and returns `{ state, workflow }`. -## Routing Logic - -When a Sense `compute()` function returns non-null, the output goes through `routeSenseComputeOutput()` in `packages/core/src/sense-workflow-directive.ts`: +## Flow ``` -Sense compute() → non-null → routeSenseComputeOutput() → { signal, workflow } - ↓ - kernel.ts → signal ALWAYS emitted + optional workflow start +Sense worker: compute(state) → { state, workflow } + ↓ + persist state JSON (data/senses/.json) + ↓ + IPC compute-result → kernel + ↓ + workflow !== null → parseWorkflowTrigger (validation) → workflowManager.startWorkflow + scheduler.onSenseCompleted(senseName) → dependents with `on: [senseName]` ``` -## Two Output Formats +## Workflow trigger shape -### 1. Explicit Format -```typescript -{ - signal: any, // emitted as signal - workflow: { // optional workflow trigger - name: string, - maxRounds: number, - prompt: string, - dryRun: boolean - } | null -} -``` +When `workflow` is non-null it must be a plain object validated by `parseWorkflowTrigger()` in `packages/core/src/sense.ts`: -### 2. Shorthand Format -Any other value is treated as: -```typescript -{ signal: payload, workflow: null } -``` +- `name`: non-empty string +- `maxRounds`: integer ≥ 1 +- `prompt`: string +- `dryRun`: boolean -## Workflow Directive Parsing +Invalid triggers are rejected by the daemon when handling the worker message (workflow is not started). -## Concrete Routing Predicates +## Scheduling -The routing decision is implemented in `routeSenseComputeOutput()` using these exact matching criteria: - -### 1. Explicit Format Detection -```typescript -if (isPlainRecord(payload) && Object.hasOwn(payload, "signal")) -``` -- Payload must be a plain object -- Must have `signal` property (any value) -- Workflow extracted from `workflow` property or defaults to null - -### 2. Workflow Validation -When workflow is non-null, it's validated via `parseWorkflowTrigger()`: -- `name`: non-empty string (trimmed) -- `maxRounds`: positive integer >= 1 -- `prompt`: string -- `dryRun`: boolean - -**Critical behavior**: Invalid workflows are silently dropped (become null) but signal emission continues. This prevents malformed workflow config from blocking signals. - -### 3. Fallback to Shorthand -Any value that doesn't match explicit format becomes: -```typescript -{ signal: payload, workflow: null } -``` - -## Processing Flow - -```typescript -// In kernel.ts handleSenseWorkerSignal() -const { signal: signalPayload, workflow } = routeResult.value; - -// Signal is ALWAYS emitted when compute returns non-null -bus.emit({ id, senseId, payload: signalPayload, timestamp }); - -// Workflow is started ONLY if workflow is non-null -if (workflow !== null) { - workflowManager.startWorkflow(workflow.name, { ... }); -} -``` - -## Legacy String Format (Deprecated) - -The old `"name|maxRounds|prompt"` string format is converted to the structured format internally but should not be used in new code. - -## Key Behaviors - -1. **Signal priority**: Every non-null compute result emits a signal, regardless of workflow -2. **Additive behavior**: Valid workflow triggers are executed in addition to signal emission -3. **Failure tolerance**: Invalid workflow directives are silently ignored, signal still emits -4. **Structure-based routing**: No complex predicates - simply checks object structure and property existence - -This routing mechanism ensures clean separation between perception (signals) and action (workflows) while maintaining backward compatibility. \ No newline at end of file +Other senses list this sense under `on` in `nerve.yaml` to be scheduled when this sense completes a successful compute (see sense scheduler reverse-index in the daemon). diff --git a/CLAUDE.md b/CLAUDE.md index 18bcf52..b76440e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,7 +3,7 @@ ## Core Concepts ``` -External World → Sense → Signal → Workflow → Log +External World → Sense(state) → { newState, workflow? } → Workflow → Log ↑ ↑ "what to observe" "what to do" ``` @@ -14,18 +14,17 @@ External World → Sense → Signal → Workflow → Log | Concept | What it is | |---------|-----------| -| **Sense** | A `compute()` function that samples or derives data. Returns `ComputeResult` — non-null emits a Signal (and optionally triggers a Workflow), null is silent. Each Sense has its own SQLite database. Scheduling (interval, on) is configured in nerve.yaml. | -| **Signal** | A notification emitted when a Sense returns non-null. Pure fact, no intent. Distributed via an in-memory Signal Bus. Not persisted. | +| **Sense** | A stateful `compute(state)` function. Returns new state and an optional workflow trigger. State persisted as JSON. Scheduling configured in nerve.yaml. | | **Workflow** | A stateful multi-step execution. Contains **Roles** (actors with side effects) and a **Moderator** (pure router). Each instance is a **Thread** with a unique `runId`. | | **Log** | Immutable audit trail. Records executions, state transitions, errors. Cannot trigger Senses — prevents feedback loops. | -| **Engine** | The kernel orchestrating everything. Holds Signal Bus, Process Manager, Workflow Manager. Never loads user code directly — all user code runs in isolated Workers. | +| **Engine** | The kernel orchestrating everything. Holds Process Manager, Workflow Manager, Sense Scheduler. Never loads user code directly — all user code runs in isolated Workers. | | **Daemon** | The `nerve-daemon` package — engine runtime. Runs as a background process. | ### Architecture Rules - **Two extension points**: Sense (what to observe + when), Workflow (what to do) - **Process isolation**: One worker per Sense group (long-lived), one per Workflow type (on-demand). Workers never talk to each other. -- **Causality is one-directional**: External world → Sense → Signal → Workflow + Log. Logs are the end of the chain. +- **Causality is one-directional**: External world → Sense(state) → Workflow (when triggered) + Log. Logs are the end of the chain. @@ -37,18 +36,18 @@ Use `function` + `type`, not `class` + `interface`. ```typescript // ✅ Good -type Signal = { - senseId: string; - value: unknown; +type WorkflowLaunch = { + senseName: string; + workflowName: string; ts: number; }; -function createSignal(senseId: string, value: unknown): Signal { - return { senseId, value, ts: Date.now() }; +function recordWorkflowLaunch(senseName: string, workflowName: string): WorkflowLaunch { + return { senseName, workflowName, ts: Date.now() }; } // ❌ Bad — no class, no interface -class Signal implements ISignal { ... } +class WorkflowLaunch implements IWorkflowLaunch { ... } ``` ### Rules @@ -92,10 +91,11 @@ type SenseConfig = { For mutually exclusive fields, use discriminated unions: ```typescript -// ✅ Good -type ComputeResult = - | null - | { signal: T; workflow: WorkflowTrigger | null }; +// ✅ Good — sense modules return explicit next state + optional workflow trigger +type SenseComputeReturn = { + state: S; + workflow: WorkflowTrigger | null; +}; ``` ### Workflow Naming @@ -139,9 +139,9 @@ const workflow: WorkflowDefinition> = { | Type | Style | Example | |------|-------|---------| -| Files | kebab-case | `signal-bus.ts` | -| Types | PascalCase | `SignalBus` | -| Functions/variables | camelCase | `createSignalBus` | +| Files | kebab-case | `sense-scheduler.ts` | +| Types | PascalCase | `SenseScheduler` | +| Functions/variables | camelCase | `createSenseScheduler` | | Constants | UPPER_SNAKE | `MAX_RETRY_COUNT` | | Generics | Single letter or descriptive | `T`, `TValue` | diff --git a/README.md b/README.md index d8ce67f..1403733 100644 --- a/README.md +++ b/README.md @@ -2,35 +2,34 @@ **Observation engine for autonomous agents** — sense the world, react to changes, run workflows. -Nerve is a lightweight daemon that continuously observes external state through **Senses**, reacts via declarative **Reflexes**, and orchestrates multi-step **Workflows**. Built for the [Uncaged](https://github.com/uncaged) agent framework. +Nerve is a lightweight daemon that continuously observes external state through **Senses** (stateful `compute(state)` + JSON persistence), schedules them via **`interval` / `on`** in `nerve.yaml`, and orchestrates multi-step **Workflows**. Built for the [Uncaged](https://github.com/uncaged) agent framework. ## Core Concepts ``` -External World → Sense ─┬→ Signal → Reflex → Sense (scheduled compute) - │ - └→ Workflow (Sense return with workflow directive) → Log +External World → Sense(state) → { newState, workflow? } → Workflow → Log + ↑ + scheduling: interval / on (per sense in nerve.yaml) ``` | Concept | Metaphor | Role | |---------|----------|------| -| **Sense** | 👁️ Perception | A `compute()` function that samples or derives data. Each sense has its own SQLite database. | -| **Reflex** | ⚡ Reaction | Declarative rules that **only schedule Sense computes** (interval and/or `on` signal names). Reflex YAML cannot reference workflows. | -| **Signal** | 📡 Notification | Emitted when a sense returns a non-null value that is routed as a normal signal (see Sense → Workflow below). Other reflexes can listen via `on`. | -| **Workflow** | 🔧 Action | Stateful multi-step execution with Roles and a Moderator. Started from a Sense return value or from CLI/daemon IPC—not from reflex YAML. | -| **Log** | 📝 Record | Immutable audit trail. Queryable by senses, but **cannot** trigger reflexes (prevents feedback loops). | +| **Sense** | 👁️ Perception | Stateful `compute(state)` returning `{ state, workflow }`. State lives in `data/senses/.json`. | +| **Schedule** | ⏱️ When | Each sense entry sets optional `interval` (periodic) and `on: [other senses]` (run after those senses complete a compute). | +| **Workflow** | 🔧 Action | Stateful multi-step execution with Roles and a Moderator. Started when `workflow` is non-null in the compute result, or via CLI/daemon IPC. | +| **Log** | 📝 Record | Immutable audit trail. **Cannot** schedule senses or workflows (prevents feedback loops). | -**Sense → Workflow:** if `compute()` returns a plain object with a string field `workflow` in the form `name|maxRounds|prompt` (only the first two `|` delimit name and rounds; the rest is the prompt), the engine starts that workflow and **does not** emit a Signal for that return. `workflow: null` or `""` means “emit a signal” and strip the key from the payload. Invalid `workflow` strings are treated like a normal signal (directive stripped). See `@uncaged/nerve-core` `routeSenseComputeOutput` / `parseSenseWorkflowDirective`. +**Sense → Workflow:** when `workflow` is a structured object `{ name, maxRounds, prompt, dryRun }`, the kernel validates it (`@uncaged/nerve-core` `parseWorkflowTrigger`) and starts that workflow. Use `workflow: null` when no run should start. -Three extension points for **what / when / multi-step action** — reflexes never replace Sense-driven workflow launches. +Two extension points for **what to observe (+ when)** vs **multi-step action** — scheduling is declarative config on each sense, not a separate YAML section. ## Packages | Package | Description | |---------|-------------| -| [`@uncaged/nerve-core`](./packages/core) | Shared types, config parser, Sense→workflow routing, daemon IPC protocol | +| [`@uncaged/nerve-core`](./packages/core) | Shared types, config parser, workflow trigger validation, daemon IPC protocol | | [`@uncaged/nerve-store`](./packages/store) | Append-only log SQLite, JSONL archive, CAS blob store, workflow run rows | -| [`@uncaged/nerve-daemon`](./packages/daemon) | Kernel, workers, signal bus, sense scheduler, workflow manager, file watcher, IPC | +| [`@uncaged/nerve-daemon`](./packages/daemon) | Kernel, sense workers, sense scheduler, workflow manager, file watcher, IPC | | [`@uncaged/nerve-cli`](./packages/cli) | CLI (`nerve`) — init, validate, daemon, dev, logs, sense, store, workflow | ## Quick Start @@ -43,24 +42,28 @@ pnpm add -g @uncaged/nerve-cli mkdir my-agent && cd my-agent nerve init -# Write a sense -cat > senses/cpu-usage/compute.ts << 'EOF' -export async function compute() { - const [load] = (await import("node:os")).loadavg(); - return load > 2.0 ? { load } : null; // signal only when load is high +# Write a sense (see `nerve init` for the full template) +mkdir -p senses/cpu-usage/src +cat > senses/cpu-usage/src/index.ts << 'EOF' +import { loadavg } from "node:os"; + +type CpuState = { lastLoad: number }; + +export const initialState: CpuState = { lastLoad: 0 }; + +export async function compute(state: CpuState) { + const [oneMin] = loadavg(); + const lastLoad = typeof oneMin === "number" && !Number.isNaN(oneMin) ? oneMin : 0; + return { state: { lastLoad }, workflow: null }; } EOF -# Configure reflexes in nerve.yaml +# Configure scheduling on each sense in nerve.yaml cat > nerve.yaml << 'EOF' senses: cpu-usage: group: system throttle: 10s - -reflexes: - - kind: sense - sense: cpu-usage interval: 30s EOF @@ -73,7 +76,7 @@ nerve logs # view logs ## Configuration -`nerve.yaml` declares senses, reflexes (sense-only), optional workflows (concurrency), and optional engine `max_rounds`: +`nerve.yaml` declares senses (each with optional `interval` / `on`), optional workflows (concurrency), and optional engine `max_rounds`. Top-level `reflexes` is **not** supported — use `interval` and `on` on each sense. ```yaml max_rounds: 100 # default moderator cap (e.g. CLI workflow trigger) @@ -84,12 +87,15 @@ senses: throttle: 10s # min interval between computes timeout: 30s # max compute duration grace_period: 5s # wait before first compute after startup - -reflexes: - - kind: sense - sense: cpu-usage interval: 30s # periodic trigger - on: [disk-pressure] # also trigger on signals from other senses + + derived-example: + group: system + throttle: null + timeout: 30s + grace_period: null + on: + - cpu-usage # run after cpu-usage completes a compute workflows: cleanup: @@ -101,17 +107,24 @@ workflows: max_queue: 20 ``` -YAML must **not** include `workflow:` under `reflexes` — the parser rejects it. Declare workflows under `workflows:` and start them from Sense `compute()` or `nerve workflow trigger`. +Declare workflows under `workflows:` and start them from Sense `compute()` (non-null `workflow`) or `nerve workflow trigger`. -**Example — Sense starts a workflow** (`senses/disk-pressure/compute.ts`): +**Example — Sense starts a workflow** (`senses/disk-pressure/src/index.ts`): ```typescript -export async function compute() { +export const initialState = { checked: false }; + +export async function compute(state: typeof initialState) { const full = await diskNearlyFull(); - if (!full) return null; + if (!full) return { state: { ...state, checked: true }, workflow: null }; return { - path: "/data", - workflow: "cleanup|10|Disk partition nearly full", // name|maxRounds|prompt + state: { ...state, checked: true }, + workflow: { + name: "cleanup", + maxRounds: 10, + prompt: "Disk partition nearly full", + dryRun: false, + }, }; } ``` @@ -138,12 +151,9 @@ export async function compute() { │ │ └──────────────┼──────────────┘ │ │ │ ▼ │ │ │ ┌──────────────┐ │ -│ │ │ Signal Bus │ │ +│ │ │Sense Scheduler │ +│ │ │(interval + on) │ │ │ └──────┬───────┘ │ -│ │ ▼ │ -│ │ ┌──────────────────┐ │ -│ │ │ Reflex Scheduler│ │ -│ │ └────────┬─────────┘ │ │ │ ▼ │ │ │ ┌───────────────────┐ │ │ └───────────────────►│ Workflow Manager │──→ @uncaged/nerve-store │ @@ -152,8 +162,7 @@ export async function compute() { ``` - **Worker pool** — one child process per sense group; isolation between groups. -- **Signal Bus** — in-memory pub/sub for signal distribution. -- **Reflex Scheduler** — interval timers + signal subscriptions, with throttle/coalesce. +- **Sense scheduler** — interval timers + `on` reverse-index (upstream sense → dependents), with throttle/coalesce. - **Workflow Manager** — concurrency (drop/queue), per-workflow workers, crash recovery. - **File watcher** — hot reload for config, sense modules, and workflow modules. - **Daemon IPC** — Unix domain socket; used by the CLI when the daemon is running. @@ -161,8 +170,8 @@ export async function compute() { ## Tech Stack -- **Zero native addons** — uses Node.js built-in `node:sqlite` (DatabaseSync) -- **Drizzle ORM** v1.0 for sense databases +- **Zero native addons** — uses Node.js built-in `node:sqlite` (DatabaseSync) for logs / workflow persistence via `@uncaged/nerve-store` +- **Sense state as JSON** — files under `data/senses/` written by sense workers - **rslib** (rspack) for building - **Biome** for formatting/linting - **Vitest** for testing @@ -180,7 +189,7 @@ pnpm -r test # run all tests ## Design Documents -- [RFC-001: Observation Engine](./docs/rfc-001-observation-engine.md) — Sense, Signal, Reflex model +- [RFC-001: Observation Engine](./docs/rfc-001-observation-engine.md) — historical sense / scheduling model (superseded in places by stateful senses — see `CLAUDE.md`) - [RFC-002: Workflow Engine](./docs/rfc-002-workflow-engine.md) — Stateful workflow execution - [Coding Conventions](./docs/coding-conventions.md) diff --git a/docs/coding-conventions.md b/docs/coding-conventions.md index ca3356c..b4e4880 100644 --- a/docs/coding-conventions.md +++ b/docs/coding-conventions.md @@ -8,25 +8,29 @@ ```typescript // ✅ Good -type Signal = { - senseId: string - value: unknown +type WorkflowLaunch = { + senseName: string + workflowName: string ts: number } -function createSignal(senseId: string, value: unknown): Signal { - return { senseId, value, ts: Date.now() } +function recordWorkflowLaunch(senseName: string, workflowName: string): WorkflowLaunch { + return { senseName, workflowName, ts: Date.now() } } // ❌ Bad -interface ISignal { - senseId: string - value: unknown +interface IWorkflowLaunch { + senseName: string + workflowName: string ts: number } -class Signal implements ISignal { - constructor(public senseId: string, public value: unknown, public ts: number) {} +class WorkflowLaunch implements IWorkflowLaunch { + constructor( + public senseName: string, + public workflowName: string, + public ts: number, + ) {} } ``` @@ -65,17 +69,16 @@ type SenseConfig = { 当多个字段互斥时,用 discriminated union 代替一堆 optional: ```typescript -// ✅ Good — 编译器保证 sense 和 workflow 不会同时出现 -type ReflexConfig = - | { kind: "sense"; sense: string; interval: string | null; on: string[] | null } - | { kind: "workflow"; workflow: string; on: string[] | null } +// ✅ Good — 编译器保证两种 overflow 形态互斥且字段完整 +type WorkflowConfig = + | { concurrency: number; overflow: "drop" } + | { concurrency: number; overflow: "queue"; maxQueue: number } -// ❌ Bad — sense 和 workflow 都 optional,运行时才知道到底填了哪个 -type ReflexConfig = { - sense?: string; - workflow?: string; - interval?: string; - on?: string[]; +// ❌ Bad — 字段一堆 optional,运行时才知道到底填了哪种并发策略 +type WorkflowConfig = { + concurrency?: number; + overflow?: string; + maxQueue?: number; } ``` @@ -103,9 +106,9 @@ export default function startEngine() { ... } | 类型 | 风格 | 示例 | |------|------|------| -| 文件 | kebab-case | `signal-bus.ts` | -| 类型 | PascalCase | `SignalBus` | -| 函数/变量 | camelCase | `createSignalBus` | +| 文件 | kebab-case | `sense-scheduler.ts` | +| 类型 | PascalCase | `SenseScheduler` | +| 函数/变量 | camelCase | `createSenseScheduler` | | 常量 | UPPER_SNAKE | `MAX_RETRY_COUNT` | | 泛型参数 | 单字母或描述性 | `T`, `TValue` | diff --git a/docs/dead-code-analysis.md b/docs/dead-code-analysis.md index 6ec0955..d1f169f 100644 --- a/docs/dead-code-analysis.md +++ b/docs/dead-code-analysis.md @@ -117,7 +117,7 @@ | 项目 | 位置 | 说明 | 置信度 | 建议 | |------|------|------|--------|------| -| 已更名 API 仍出现在 README | `packages/core/README.md` | 仍描述 `parseSenseWorkflowDirective`、`ParsedSenseWorkflowDirective`、`SenseComputeRoute`;源码已为 `parseWorkflowTrigger` / `routeSenseComputeOutput` / `RoutedSenseOutput` | **高** | **更新文档**(本次分析不改代码,仅记录)。 | +| ~~已更名 API 仍出现在 README~~ | `packages/core/README.md` | (已修正)文档与 stateful sense、`parseWorkflowTrigger` 对齐;`routeSenseComputeOutput` 已移除 | — | 关闭 | | Hermes 选项合并注释 | `packages/workflow-utils/src/shared/hermes-agent.ts` | 注释称 absorbed from `hermes-options.ts`,该文件已不存在 | **中** | **清理注释**,避免误导。 | | `KNOWN_AGENT_ADAPTER_IDS` 含 `codex` | `packages/core/src/agent.ts` | 仓内无 `codex` 适配器包;与常量未被引用叠加 | **中** | **对齐产品**:实现适配器或从列表移除。 | @@ -130,7 +130,7 @@ 1. **高优先级调查**: `createEchoAgent` 与 `KNOWN_AGENT_ADAPTER_IDS` — 要么接入运行时,要么删减以免维护假象。 2. **API 面收敛**: `parseDurationStringToMs`、`labelSenseTrigger` 若无意对外,可从 `core` 公共导出移除。 3. **`workflow-utils`**: 评估 `isDryRun` 删除;`spawnSafe` 等从 `workflow-utils` 再导出是否仍有必要。 -4. **文档**: 修正 `packages/core/README.md` 中 Sense→Workflow 路由 API 名称。 +4. ~~**文档**: 修正 `packages/core/README.md` 中 Sense→Workflow 路由 API 名称。~~(已完成) --- diff --git a/examples/nerve.yaml b/examples/nerve.yaml index c2768fa..e3c67df 100644 --- a/examples/nerve.yaml +++ b/examples/nerve.yaml @@ -1,9 +1,9 @@ -# Example nerve.yaml demonstrating Signal Bus & Reflex Scheduler (Phase 3) +# Example nerve.yaml demonstrating per-sense scheduling (interval + on) # # Layout: # - cpu-usage: periodic every 10s, throttled to 5s minimum between computes # - disk-usage: periodic every 30s -# - system-health: derived sense, triggered whenever cpu-usage OR disk-usage emits +# - system-health: derived sense, scheduled when cpu-usage OR disk-usage completes a compute senses: cpu-usage: diff --git a/package.json b/package.json index f324577..064f41b 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "scripts": { "prepare": "husky", "build": "pnpm -r run build", + "test": "pnpm -r test", "check": "biome check .", "format": "biome format --write .", "link:dev": "bash scripts/link-dev.sh" diff --git a/packages/cli/README.md b/packages/cli/README.md index 8c548ee..b895929 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -51,10 +51,10 @@ Structured rows in `data/logs.db` are surfaced via **`nerve workflow inspect`** ```bash nerve sense list # List senses (live fields from daemon IPC when running) nerve sense trigger # IPC trigger-sense — queue a compute for that sense -nerve sense query # Read-only SQL on data/senses/.db (optional SQL args) -nerve sense schema # Print CREATE TABLE statements for that sense DB ``` +Sense state is persisted as JSON under `data/senses/.json` by the sense worker after each successful compute. + ### Store maintenance ```bash diff --git a/packages/cli/src/__tests__/e2e/sense.md b/packages/cli/src/__tests__/e2e/sense.md index 4b2196b..0100e1e 100644 --- a/packages/cli/src/__tests__/e2e/sense.md +++ b/packages/cli/src/__tests__/e2e/sense.md @@ -2,7 +2,7 @@ ## sense list -- ✅ prints sense list with name, group, throttle, triggers, and last signal time +- ✅ prints sense list with name, group, throttle, triggers - 🔲 empty state — no senses registered, prints empty message - 🔲 `--json` — outputs valid JSON array @@ -11,19 +11,3 @@ - ✅ trigger known sense exits 0, stdout contains "Triggered" - ✅ trigger non-existent sense writes error to stderr and exits 1 - ✅ sends correct IPC message `{ type: trigger-sense, sense: }` to daemon - -## sense query - -- ✅ after trigger, persisted `_signals` table has at least one row -- ✅ default output lists payload column and counter count -- ✅ `--json` prints valid JSON array with payload on each row -- ✅ `--sql` runs custom read-only SQL and prints result -- 🔲 query non-existent sense — error message -- 🔲 `--limit` / `--offset` pagination - -## sense schema - -- ✅ prints CREATE TABLE statements for the sense database -- ✅ includes `_signals` table in output -- ✅ `--json` prints valid JSON array of SQL strings -- 🔲 schema for non-existent sense — error message diff --git a/packages/cli/src/__tests__/e2e/smoke.md b/packages/cli/src/__tests__/e2e/smoke.md index c2817ff..f5fdee1 100644 --- a/packages/cli/src/__tests__/e2e/smoke.md +++ b/packages/cli/src/__tests__/e2e/smoke.md @@ -2,5 +2,5 @@ Full round-trip integration tests that exercise multiple subcommands together. -- ✅ sense list + sense query after trigger — registers sense, triggers, verifies persisted signal and query output +- ✅ sense list after trigger — daemon lists configured senses; trigger queues a compute (state persisted under `data/senses/` by the worker) - 🔲 init → dev → trigger workflow → thread inspect round-trip diff --git a/packages/cli/src/__tests__/knowledge-query.test.ts b/packages/cli/src/__tests__/knowledge-query.test.ts index cbd3994..f57760d 100644 --- a/packages/cli/src/__tests__/knowledge-query.test.ts +++ b/packages/cli/src/__tests__/knowledge-query.test.ts @@ -72,8 +72,8 @@ describe("queryKnowledgeRepo (word overlap fallback)", () => { path: "a.md", slug: "a.md#0", chunkIndex: 0, - text: "the signal bus emits notifications", - contentHash: contentHash("the signal bus emits notifications"), + text: "the sense scheduler triggers computes", + contentHash: contentHash("the sense scheduler triggers computes"), embedding: fakeEmbeddingBytes("a"), }, { @@ -89,7 +89,7 @@ describe("queryKnowledgeRepo (word overlap fallback)", () => { db.close(); } - const ranked = await queryKnowledgeRepo(root, dbPath, "signal bus", 10); + const ranked = await queryKnowledgeRepo(root, dbPath, "sense scheduler", 10); expect(ranked.length).toBe(2); expect(ranked[0]?.path).toBe("a.md"); expect(ranked[1]?.path).toBe("b.md"); diff --git a/packages/core/README.md b/packages/core/README.md index 95abf44..3c7e1f6 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -4,9 +4,9 @@ Shared types and configuration parser for the [nerve](../../README.md) observati ## What's Inside -- **Type definitions** — `Signal`, `SenseConfig`, `SenseInfo`, `WorkflowConfig`, `NerveConfig`, and related types -- **Config parser** — `parseNerveConfig(yaml)` validates and parses `nerve.yaml` into `NerveConfig` (rejects reflex entries that declare a `workflow` key; reflexes only schedule senses) -- **Sense → workflow routing** — `parseWorkflowTrigger`, `routeSenseComputeOutput`, and types `WorkflowTrigger`, `RoutedSenseOutput` +- **Type definitions** — `SenseConfig`, `SenseInfo`, `SenseComputeFn`, `SenseModule`, `WorkflowConfig`, `NerveConfig`, `WorkflowTrigger`, and related types +- **Config parser** — `parseNerveConfig(yaml)` validates and parses `nerve.yaml` into `NerveConfig` (top-level `reflexes` is rejected; use `interval` / `on` on each sense) +- **Workflow triggers** — `parseWorkflowTrigger` validates structured workflow launch objects from Sense compute results or IPC - **Daemon IPC protocol** — request/response types (`DaemonIpcRequest`, `DaemonIpcResponse`, …) and `parseDaemonIpcRequest` for newline-delimited JSON on the CLI ↔ daemon socket - **Workflow automaton types** — `START` / `END` sentinel constants, `WorkflowMessage`, `StartStep`, `RoleStep`, `ModeratorContext` (`start` + `steps`; empty `steps` on first moderator call), `Moderator` (single `context` argument), `WorkflowDefinition`, `Role`, `RoleResult`, plus `DEFAULT_ENGINE_MAX_ROUNDS` - **Result type** — `Result` with `ok()` / `err()` helpers for explicit error handling (no thrown exceptions for parse paths) @@ -15,7 +15,7 @@ Shared types and configuration parser for the [nerve](../../README.md) observati ```typescript import { parseNerveConfig, ok, err } from "@uncaged/nerve-core"; -import type { NerveConfig, Signal, Result } from "@uncaged/nerve-core"; +import type { NerveConfig, Result } from "@uncaged/nerve-core"; const result: Result = parseNerveConfig(yamlString); if (result.ok) { @@ -23,10 +23,10 @@ if (result.ok) { } ``` -### Sense return → signal vs workflow +### Workflow trigger validation ```typescript -import { parseWorkflowTrigger, routeSenseComputeOutput } from "@uncaged/nerve-core"; +import { parseWorkflowTrigger } from "@uncaged/nerve-core"; const directive = parseWorkflowTrigger({ name: "my-workflow", @@ -37,23 +37,10 @@ const directive = parseWorkflowTrigger({ if (directive.ok) { console.log(directive.value.name, directive.value.maxRounds, directive.value.prompt); } - -const route = routeSenseComputeOutput({ - signal: { metric: 42 }, - workflow: { - name: "my-workflow", - maxRounds: 8, - prompt: "Run now", - dryRun: false, - }, -}); -if (route.ok && route.value.workflow !== null) { - console.log(route.value.workflow); -} else if (route.ok) { - console.log(route.value.signal); -} ``` +Sense modules return `{ state, workflow }` from `compute(state)`; when `workflow` is non-null it must satisfy the shape validated by `parseWorkflowTrigger` (the daemon validates before starting a run). + ## Duration Format Config fields like `throttle`, `timeout`, and `interval` accept human-readable durations: diff --git a/packages/core/package.json b/packages/core/package.json index b46028a..e784889 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -20,7 +20,6 @@ "test": "vitest run" }, "dependencies": { - "drizzle-orm": "1.0.0-beta.23-c10d10c", "yaml": "^2.8.3" }, "devDependencies": { diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index d526f0d..b63dac5 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -10,7 +10,7 @@ export type SenseConfig = { gracePeriod: number | null; /** Polling interval (ms). When set, the sense is triggered periodically. */ interval: number | null; - /** Other sense names whose signals trigger this sense. */ + /** Other sense names whose successful computes schedule this sense (kernel reverse-index). */ on: string[]; }; diff --git a/packages/daemon/README.md b/packages/daemon/README.md index fe35dc5..025cdc2 100644 --- a/packages/daemon/README.md +++ b/packages/daemon/README.md @@ -1,23 +1,22 @@ # @uncaged/nerve-daemon -The observation engine runtime for [nerve](../../README.md) — runs senses, routes signals, runs the sense scheduler, and manages workflows. +The observation engine runtime for [nerve](../../README.md) — runs senses, persists JSON state, runs the sense scheduler, and manages workflows. ## Architecture | Module | Source (indicative) | Responsibility | |--------|---------------------|----------------| -| **Kernel** | `kernel.ts` | Orchestrator — worker pool, signal bus, sense scheduler, workflow manager, optional file watcher and daemon IPC, config reload hooks | +| **Kernel** | `kernel.ts` | Orchestrator — worker pool, sense scheduler, workflow manager, optional file watcher and daemon IPC, config reload hooks | | **Worker pool** | `worker-pool.ts` | Fork and supervise one child process per sense group; restart/shutdown; crash cleanup hooks for scheduler state | | **Kernel sense groups** | `kernel-sense-groups.ts` | Derive sense groups from config; list senses per group for scheduling | -| **Sense runtime** | sense worker + Drizzle | Per-sense SQLite (`node:sqlite`), migrations, peer DB reads | -| **Sense worker** | `sense-worker.ts` (fork target) | Child process entry — runs `compute()` per sense in a group | -| **Signal bus** | `signal-bus.ts` | In-memory pub/sub for sense signals | -| **Sense scheduler** | `sense-scheduler.ts` | Interval + `on` subscriptions, throttle/coalesce | +| **Sense runtime** | `sense-runtime.ts` + sense worker | Loads user modules (`compute`, `initialState`), reads/writes `data/senses/.json` | +| **Sense worker** | `sense-worker.ts` (fork target) | Child process entry — runs `compute(state)` per sense in a group | +| **Sense scheduler** | `sense-scheduler.ts` | Interval + `on` subscriptions (reverse-index by upstream sense), throttle/coalesce | | **Workflow manager** | `workflow-manager.ts` | One worker per workflow name, concurrency (drop/queue), queue caps | | **Workflow worker** | `workflow-worker.ts` | Child process — runs RFC-002 threads (`start-thread`, `resume-thread` IPC) | | **IPC (parent ↔ workers)** | `ipc.ts` | Typed messages for sense and workflow workers (includes `resume-thread` for recovery) | | **Log / workflow persistence** | via `@uncaged/nerve-store` | Structured logs, `workflow_runs`, thread messages (used for recovery) | -| **Blob store** | `@uncaged/nerve-store` | CAS under `data/blobs/` — sense workers construct `createBlobStore(join(nerveRoot, "data", "blobs"))` for artifact writes | +| **Blob store** | `@uncaged/nerve-store` | CAS under `data/blobs/` — workflows use blob storage for artifacts as configured | | **File watcher** | `file-watcher.ts` | Watches workspace paths for config / sense / workflow file changes | | **Kernel file watch** | `kernel-file-watch.ts` | Maps watcher events to `reloadConfig`, sense group restart, workflow `drainAndRespawn` | | **Daemon IPC** | `daemon-ipc.ts` | Unix socket server — parses `@uncaged/nerve-core` `DaemonIpcRequest`, dispatches trigger-workflow / trigger-sense / list-senses | @@ -35,9 +34,9 @@ Hot reload (`drainAndRespawn`) uses a controlled drain: in-flight runs may be ma ## Key Design Decisions - **One worker process per sense group** — isolation between groups, shared compute within a group -- **`node:sqlite` (DatabaseSync)** — zero native addons, WAL mode, built into Node.js ≥ 22.5 +- **Sense state as JSON** — `data/senses/.json`, updated after each successful compute in the worker - **Throttle + coalesce** — if compute is in-flight, at most one pending trigger is queued (no unbounded accumulation) -- **Log ≠ Signal** — logs are queryable data assets but cannot trigger the sense scheduler or workflows (prevents feedback loops) +- **Log ≠ Sense trigger** — logs are queryable data assets but cannot schedule sense computes or workflows (prevents feedback loops) ## Usage @@ -85,7 +84,7 @@ await kernel.stop(); pnpm add @uncaged/nerve-daemon ``` -Requires Node.js ≥ 22.5 (for `node:sqlite`). +Requires Node.js ≥ 22.5 (for `node:sqlite` in the log store and related persistence). ## License diff --git a/packages/daemon/src/__tests__/file-watcher.test.ts b/packages/daemon/src/__tests__/file-watcher.test.ts index c957586..f29f30f 100644 --- a/packages/daemon/src/__tests__/file-watcher.test.ts +++ b/packages/daemon/src/__tests__/file-watcher.test.ts @@ -79,7 +79,7 @@ describe("createFileWatcher", () => { await new Promise((r) => setTimeout(r, 100)); writeFileSync( join(root, "senses", "cpu-usage", "index.js"), - "export async function compute() { return { signal: 42, workflow: null }; }", + "export const initialState = {}; export async function compute(state) { return { state, workflow: null }; }", ); await waitFor(() => changes.length > 0, 3000); diff --git a/packages/daemon/src/worker-pool.ts b/packages/daemon/src/worker-pool.ts index 9769b1e..d93560f 100644 --- a/packages/daemon/src/worker-pool.ts +++ b/packages/daemon/src/worker-pool.ts @@ -21,7 +21,7 @@ export function resolveWorkerScript(): string { export type SenseWorkerPoolOptions = { nerveRoot: string; workerScript: string; - /** Invoked for every IPC message from a worker (including ready / signal / error). */ + /** Invoked for every IPC message from a worker (including ready / compute-result / error). */ onWorkerMessage: (raw: unknown) => void; /** Sense names in a group — reserved for scheduler-aligned cleanup (kernel passes current config). */ sensesForGroup: (group: string) => string[]; diff --git a/packages/workflow-utils/src/shared/context.ts b/packages/workflow-utils/src/shared/context.ts index 6eabeb1..c08a719 100644 --- a/packages/workflow-utils/src/shared/context.ts +++ b/packages/workflow-utils/src/shared/context.ts @@ -41,7 +41,7 @@ export function readNerveYaml(options: ReadNerveYamlOptions): Result= 10'} - '@azure-rest/core-client@2.6.0': - resolution: {integrity: sha512-iuFKDm8XPzNxPfRjhyU5/xKZmcRDzSuEghXDHHk4MjBV/wFL34GmYVBZnn9wmuoLBeS1qAw9ceMdaeJBPcB1QQ==} - engines: {node: '>=20.0.0'} - - '@azure/abort-controller@2.1.2': - resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} - engines: {node: '>=18.0.0'} - - '@azure/core-auth@1.10.1': - resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} - engines: {node: '>=20.0.0'} - - '@azure/core-client@1.10.1': - resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} - engines: {node: '>=20.0.0'} - - '@azure/core-http-compat@2.4.0': - resolution: {integrity: sha512-f1P96IB399YiN2ARYHP7EpZi3Bf3wH4SN2lGzrw7JVwm7bbsVYtf2iKSBwTywD2P62NOPZGHFSZi+6jjb75JuA==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@azure/core-client': ^1.10.0 - '@azure/core-rest-pipeline': ^1.22.0 - - '@azure/core-lro@2.7.2': - resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} - engines: {node: '>=18.0.0'} - - '@azure/core-paging@1.6.2': - resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} - engines: {node: '>=18.0.0'} - - '@azure/core-rest-pipeline@1.23.0': - resolution: {integrity: sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==} - engines: {node: '>=20.0.0'} - - '@azure/core-tracing@1.3.1': - resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} - engines: {node: '>=20.0.0'} - - '@azure/core-util@1.13.1': - resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} - engines: {node: '>=20.0.0'} - - '@azure/identity@4.13.1': - resolution: {integrity: sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==} - engines: {node: '>=20.0.0'} - - '@azure/keyvault-common@2.1.0': - resolution: {integrity: sha512-aCDidWuKY06LWQ4x7/8TIXK6iRqTaRWRL3t7T+LC+j1b07HtoIsOxP/tU90G4jCSBn5TAyUTCtA4MS/y5Hudaw==} - engines: {node: '>=20.0.0'} - - '@azure/keyvault-keys@4.10.0': - resolution: {integrity: sha512-eDT7iXoBTRZ2n3fLiftuGJFD+yjkiB1GNqzU2KbY1TLYeXeSPVTVgn2eJ5vmRTZ11978jy2Kg2wI7xa9Tyr8ag==} - engines: {node: '>=18.0.0'} - - '@azure/logger@1.3.0': - resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} - engines: {node: '>=20.0.0'} - - '@azure/msal-browser@5.8.0': - resolution: {integrity: sha512-X7IZV77bN56l7sbLjkcbQJX1t3U4tgxqztDr/XFbUcUfKk+z2FavcLgKP+OYUNj0wl/pEEtV9lldW9siY8BuHQ==} - engines: {node: '>=0.8.0'} - - '@azure/msal-common@16.5.1': - resolution: {integrity: sha512-WS9w9SfI8SEYO7mTnxGeZ3UwQfhAVYCWglYF2/7GNx3ioHiAs2gPkl9eSwVs8cPrmiGh+zi9ai/OOKoq4cyzDw==} - engines: {node: '>=0.8.0'} - - '@azure/msal-node@5.1.4': - resolution: {integrity: sha512-G4LXGGggok1QC48uKu64/SV2DPRDlddmV8EieK8pflsNYMj9/Zz+Y9OHoEBhT15h+zpdwXXLYA/7PJCR/yZ8aw==} - engines: {node: '>=20'} - '@biomejs/biome@1.9.4': resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} engines: {node: '>=14.21.3'} @@ -1049,9 +975,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@js-joda/core@5.7.0': - resolution: {integrity: sha512-WBu4ULVVxySLLzK1Ppq+OdfP+adRS4ntmDQT915rzDJ++i95gc2jZkM5B6LWEAwN3lGXpfie3yPABozdD3K3Vg==} - '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: @@ -1272,15 +1195,9 @@ packages: '@swc/helpers@0.5.21': resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} - '@tediousjs/connection-string@0.5.0': - resolution: {integrity: sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==} - '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@types/better-sqlite3@7.6.13': - resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1290,22 +1207,12 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/mssql@9.1.11': - resolution: {integrity: sha512-vcujgrDbDezCxNDO4KY6gjwduLYOKfrexpRUwhoysRvcXZ3+IgZ/PMYFDgh8c3cQIxZ6skAwYo+H6ibMrBWPjQ==} - '@types/node@22.19.17': resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} '@types/node@25.6.0': resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} - '@types/readable-stream@4.0.23': - resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==} - - '@typespec/ts-http-runtime@0.3.5': - resolution: {integrity: sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==} - engines: {node: '>=20.0.0'} - '@vitest/expect@4.1.5': resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} @@ -1335,66 +1242,23 @@ packages: '@vitest/utils@4.1.5': resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - better-sqlite3@11.10.0: - resolution: {integrity: sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - bl@6.1.6: - resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==} - blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1406,164 +1270,10 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} - engines: {node: '>=18'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - drizzle-orm@1.0.0-beta.23-c10d10c: - resolution: {integrity: sha512-l7KNyUoBLlB3SiSg00VmjpvtDBIztjHXWj7+AkgbNGtsyZpLxdr6orecIUAx0GxDNYIpBp3nicMjpCks1uK69A==} - peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=4' - '@effect/sql': ^0.48.5 - '@effect/sql-pg': ^0.49.7 - '@electric-sql/pglite': '>=0.2.0' - '@libsql/client': '>=0.10.0' - '@libsql/client-wasm': '>=0.10.0' - '@neondatabase/serverless': '>=0.10.0' - '@op-engineering/op-sqlite': '>=2' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1.13' - '@sinclair/typebox': '>=0.34.8' - '@sqlitecloud/drivers': '>=1.0.653' - '@tidbcloud/serverless': '*' - '@tursodatabase/database': '>=0.2.1' - '@tursodatabase/database-common': '>=0.2.1' - '@tursodatabase/database-wasm': '>=0.2.1' - '@types/better-sqlite3': '*' - '@types/mssql': ^9.1.4 - '@types/pg': '*' - '@types/sql.js': '*' - '@upstash/redis': '>=1.34.7' - '@vercel/postgres': '>=0.8.0' - '@xata.io/client': '*' - arktype: '>=2.0.0' - better-sqlite3: '>=9.3.0' - bun-types: '*' - expo-sqlite: '>=14.0.0' - gel: '>=2' - mssql: ^11.0.1 - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - sql.js: '>=1' - sqlite3: '>=5' - typebox: '>=1.0.0' - valibot: '>=1.0.0-beta.7' - zod: ^3.25.0 || ^4.0.0 - peerDependenciesMeta: - '@aws-sdk/client-rds-data': - optional: true - '@cloudflare/workers-types': - optional: true - '@effect/sql': - optional: true - '@effect/sql-pg': - optional: true - '@electric-sql/pglite': - optional: true - '@libsql/client': - optional: true - '@libsql/client-wasm': - optional: true - '@neondatabase/serverless': - optional: true - '@op-engineering/op-sqlite': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@sinclair/typebox': - optional: true - '@sqlitecloud/drivers': - optional: true - '@tidbcloud/serverless': - optional: true - '@tursodatabase/database': - optional: true - '@tursodatabase/database-common': - optional: true - '@tursodatabase/database-wasm': - optional: true - '@types/better-sqlite3': - optional: true - '@types/mssql': - optional: true - '@types/pg': - optional: true - '@types/sql.js': - optional: true - '@upstash/redis': - optional: true - '@vercel/postgres': - optional: true - '@xata.io/client': - optional: true - arktype: - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - gel: - optional: true - mssql: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - typebox: - optional: true - valibot: - optional: true - zod: - optional: true - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -1583,18 +1293,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -1608,85 +1306,24 @@ packages: picomatch: optional: true - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - hono@4.12.15: resolution: {integrity: sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg==} engines: {node: '>=16.9.0'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} hasBin: true - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - - js-md4@0.3.2: - resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} - jsonata@2.1.0: resolution: {integrity: sha512-OCzaRMK8HobtX8fp37uIVmL8CY1IGc/a6gLsDqz3quExFR09/U78HUzWYr7T31UEB6+Eu0/8dkVD5fFDOl9a8w==} engines: {node: '>= 8'} - jsonwebtoken@9.0.3: - resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} - engines: {node: '>=12', npm: '>=6'} - - jwa@2.0.1: - resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - - jws@4.0.1: - resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -1768,34 +1405,9 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - miniflare@4.20260421.0: resolution: {integrity: sha512-7ZkNQ7brgQ2hh5ha9iQCDUjxBkLvuiG2VdDns9esRL8O8lXg+MoP6E0dO1rtp+ZY2I+vV1tPWr6td5IojkewLw==} engines: {node: '>=18.0.0'} @@ -1806,45 +1418,14 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mssql@11.0.1: - resolution: {integrity: sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w==} - engines: {node: '>=18'} - hasBin: true - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - - native-duplexpair@1.0.0: - resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} - - node-abi@3.89.0: - resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} - engines: {node: '>=10'} - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -1862,34 +1443,6 @@ packages: resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. - hasBin: true - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.0.0-rc.16: resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1911,16 +1464,6 @@ packages: typescript: optional: true - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -1933,58 +1476,20 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - sql.js@1.14.1: - resolution: {integrity: sha512-gcj8zBWU5cFsi9WUP+4bFNXAyF1iRpA3LLyS/DP5xlrNzGmPIizUeBggKa8DbDwdqaKwUcTEnChtd2grWo/x/A==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tarn@3.0.2: - resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} - engines: {node: '>=8.0.0'} - - tedious@18.6.2: - resolution: {integrity: sha512-g7jC56o3MzLkE3lHkaFe2ZdOVFBahq5bsB60/M4NYUbocw/MCrS89IOEQUFr+ba6pb8ZHczZ/VqCyYeYq0xBAg==} - engines: {node: '>=18'} - - tedious@19.2.1: - resolution: {integrity: sha512-pk1Q16Yl62iocuQB+RWbg6rFUFkIyzqOFQ6NfysCltRvQqKwfurgj8v/f2X+CKvDhSL4IJ0cCOfCHDg9PWEEYA==} - engines: {node: '>=18.17'} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -2003,9 +1508,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -2028,14 +1530,6 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - vite@8.0.9: resolution: {integrity: sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2155,9 +1649,6 @@ packages: '@cloudflare/workers-types': optional: true - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -2170,10 +1661,6 @@ packages: utf-8-validate: optional: true - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} - yaml@2.8.3: resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} @@ -2232,167 +1719,6 @@ snapshots: '@ast-grep/napi-win32-ia32-msvc': 0.37.0 '@ast-grep/napi-win32-x64-msvc': 0.37.0 - '@azure-rest/core-client@2.6.0': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 - '@azure/core-tracing': 1.3.1 - '@typespec/ts-http-runtime': 0.3.5 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/abort-controller@2.1.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@azure/core-auth@1.10.1': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.13.1 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/core-client@1.10.1': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/core-http-compat@2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0)': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 - optional: true - - '@azure/core-lro@2.7.2': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/core-paging@1.6.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@azure/core-rest-pipeline@1.23.0': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.5 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/core-tracing@1.3.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@azure/core-util@1.13.1': - dependencies: - '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.5 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/identity@4.13.1': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - '@azure/msal-browser': 5.8.0 - '@azure/msal-node': 5.1.4 - open: 10.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/keyvault-common@2.1.0': - dependencies: - '@azure-rest/core-client': 2.6.0 - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.23.0 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/keyvault-keys@4.10.0(@azure/core-client@1.10.1)': - dependencies: - '@azure-rest/core-client': 2.6.0 - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0) - '@azure/core-lro': 2.7.2 - '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.23.0 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/keyvault-common': 2.1.0 - '@azure/logger': 1.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@azure/core-client' - - supports-color - optional: true - - '@azure/logger@1.3.0': - dependencies: - '@typespec/ts-http-runtime': 0.3.5 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@azure/msal-browser@5.8.0': - dependencies: - '@azure/msal-common': 16.5.1 - optional: true - - '@azure/msal-common@16.5.1': - optional: true - - '@azure/msal-node@5.1.4': - dependencies: - '@azure/msal-common': 16.5.1 - jsonwebtoken: 9.0.3 - uuid: 8.3.2 - optional: true - '@biomejs/biome@1.9.4': optionalDependencies: '@biomejs/cli-darwin-arm64': 1.9.4 @@ -2781,9 +2107,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@js-joda/core@5.7.0': - optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -2944,19 +2267,11 @@ snapshots: dependencies: tslib: 2.8.1 - '@tediousjs/connection-string@0.5.0': - optional: true - '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true - '@types/better-sqlite3@7.6.13': - dependencies: - '@types/node': 22.19.17 - optional: true - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -2966,16 +2281,6 @@ snapshots: '@types/estree@1.0.8': {} - '@types/mssql@9.1.11(@azure/core-client@1.10.1)': - dependencies: - '@types/node': 22.19.17 - tarn: 3.0.2 - tedious: 19.2.1(@azure/core-client@1.10.1) - transitivePeerDependencies: - - '@azure/core-client' - - supports-color - optional: true - '@types/node@22.19.17': dependencies: undici-types: 6.21.0 @@ -2985,20 +2290,6 @@ snapshots: undici-types: 7.19.2 optional: true - '@types/readable-stream@4.0.23': - dependencies: - '@types/node': 22.19.17 - optional: true - - '@typespec/ts-http-runtime@0.3.5': - dependencies: - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - optional: true - '@vitest/expect@4.1.5': dependencies: '@standard-schema/spec': 1.1.0 @@ -3048,134 +2339,26 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - optional: true - - agent-base@7.1.4: - optional: true - assertion-error@2.0.1: {} - base64-js@1.5.1: - optional: true - - better-sqlite3@11.10.0: - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.3 - optional: true - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - optional: true - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - optional: true - - bl@6.1.6: - dependencies: - '@types/readable-stream': 4.0.23 - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 4.7.0 - optional: true - blake3-wasm@2.1.5: {} - buffer-equal-constant-time@1.0.1: - optional: true - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - optional: true - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - optional: true - - bundle-name@4.1.0: - dependencies: - run-applescript: 7.1.0 - optional: true - chai@6.2.2: {} - chownr@1.1.4: - optional: true - citty@0.1.6: dependencies: consola: 3.4.2 cjs-module-lexer@1.4.3: {} - commander@11.1.0: - optional: true - consola@3.4.2: {} convert-source-map@2.0.0: {} cookie@1.1.1: {} - debug@4.4.3: - dependencies: - ms: 2.1.3 - optional: true - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - optional: true - - deep-extend@0.6.0: - optional: true - - default-browser-id@5.0.1: - optional: true - - default-browser@5.5.0: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 - optional: true - - define-lazy-prop@3.0.0: - optional: true - detect-libc@2.1.2: {} - drizzle-orm@1.0.0-beta.23-c10d10c(@cloudflare/workers-types@4.20260425.1)(@types/better-sqlite3@7.6.13)(@types/mssql@9.1.11(@azure/core-client@1.10.1))(better-sqlite3@11.10.0)(mssql@11.0.1(@azure/core-client@1.10.1))(sql.js@1.14.1)(zod@4.3.6): - optionalDependencies: - '@cloudflare/workers-types': 4.20260425.1 - '@types/better-sqlite3': 7.6.13 - '@types/mssql': 9.1.11(@azure/core-client@1.10.1) - better-sqlite3: 11.10.0 - mssql: 11.0.1(@azure/core-client@1.10.1) - sql.js: 1.14.1 - zod: 4.3.6 - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - optional: true - - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - optional: true - error-stack-parser-es@1.0.5: {} es-module-lexer@2.0.0: {} @@ -3243,117 +2426,21 @@ snapshots: dependencies: '@types/estree': 1.0.8 - event-target-shim@5.0.1: - optional: true - - events@3.3.0: - optional: true - - expand-template@2.0.3: - optional: true - expect-type@1.3.0: {} fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 - file-uri-to-path@1.0.0: - optional: true - - fs-constants@1.0.0: - optional: true - fsevents@2.3.3: optional: true - github-from-package@0.0.0: - optional: true - hono@4.12.15: {} - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - husky@9.1.7: {} - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - optional: true - - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - optional: true - - ieee754@1.2.1: - optional: true - - inherits@2.0.4: - optional: true - - ini@1.3.8: - optional: true - - is-docker@3.0.0: - optional: true - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - optional: true - - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - optional: true - - js-md4@0.3.2: - optional: true - jsonata@2.1.0: {} - jsonwebtoken@9.0.3: - dependencies: - jws: 4.0.1 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.7.4 - optional: true - - jwa@2.0.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - optional: true - - jws@4.0.1: - dependencies: - jwa: 2.0.1 - safe-buffer: 5.2.1 - optional: true - kleur@4.1.5: {} layerr@3.0.0: {} @@ -3407,34 +2494,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - lodash.includes@4.3.0: - optional: true - - lodash.isboolean@3.0.3: - optional: true - - lodash.isinteger@4.0.4: - optional: true - - lodash.isnumber@3.0.3: - optional: true - - lodash.isplainobject@4.0.6: - optional: true - - lodash.isstring@4.0.1: - optional: true - - lodash.once@4.1.1: - optional: true - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - mimic-response@3.1.0: - optional: true - miniflare@4.20260421.0: dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -3459,56 +2522,10 @@ snapshots: - bufferutil - utf-8-validate - minimist@1.2.8: - optional: true - - mkdirp-classic@0.5.3: - optional: true - - ms@2.1.3: - optional: true - - mssql@11.0.1(@azure/core-client@1.10.1): - dependencies: - '@tediousjs/connection-string': 0.5.0 - commander: 11.1.0 - debug: 4.4.3 - rfdc: 1.4.1 - tarn: 3.0.2 - tedious: 18.6.2(@azure/core-client@1.10.1) - transitivePeerDependencies: - - '@azure/core-client' - - supports-color - optional: true - nanoid@3.3.11: {} - napi-build-utils@2.0.0: - optional: true - - native-duplexpair@1.0.0: - optional: true - - node-abi@3.89.0: - dependencies: - semver: 7.7.4 - optional: true - obug@2.1.1: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - optional: true - - open@10.2.0: - dependencies: - default-browser: 5.5.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - wsl-utils: 0.1.0 - optional: true - path-to-regexp@6.3.0: {} pathe@2.0.3: {} @@ -3523,58 +2540,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.1.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.89.0 - pump: 3.0.4 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.4 - tunnel-agent: 0.6.0 - optional: true - - process@0.11.10: - optional: true - - pump@3.0.4: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - optional: true - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - optional: true - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - optional: true - - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - optional: true - - rfdc@1.4.1: - optional: true - rolldown@1.0.0-rc.16: dependencies: '@oxc-project/types': 0.126.0 @@ -3603,15 +2568,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - run-applescript@7.1.0: - optional: true - - safe-buffer@5.2.1: - optional: true - - safer-buffer@2.1.2: - optional: true - semver@7.7.4: {} sharp@0.34.5: @@ -3647,92 +2603,14 @@ snapshots: siginfo@2.0.0: {} - simple-concat@1.0.1: - optional: true - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - optional: true - source-map-js@1.2.1: {} - sprintf-js@1.1.3: - optional: true - - sql.js@1.14.1: - optional: true - stackback@0.0.2: {} std-env@4.1.0: {} - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - optional: true - - strip-json-comments@2.0.1: - optional: true - supports-color@10.2.2: {} - tar-fs@2.1.4: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.4 - tar-stream: 2.2.0 - optional: true - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - optional: true - - tarn@3.0.2: - optional: true - - tedious@18.6.2(@azure/core-client@1.10.1): - dependencies: - '@azure/core-auth': 1.10.1 - '@azure/identity': 4.13.1 - '@azure/keyvault-keys': 4.10.0(@azure/core-client@1.10.1) - '@js-joda/core': 5.7.0 - '@types/node': 22.19.17 - bl: 6.1.6 - iconv-lite: 0.6.3 - js-md4: 0.3.2 - native-duplexpair: 1.0.0 - sprintf-js: 1.1.3 - transitivePeerDependencies: - - '@azure/core-client' - - supports-color - optional: true - - tedious@19.2.1(@azure/core-client@1.10.1): - dependencies: - '@azure/core-auth': 1.10.1 - '@azure/identity': 4.13.1 - '@azure/keyvault-keys': 4.10.0(@azure/core-client@1.10.1) - '@js-joda/core': 5.7.0 - '@types/node': 22.19.17 - bl: 6.1.6 - iconv-lite: 0.7.2 - js-md4: 0.3.2 - native-duplexpair: 1.0.0 - sprintf-js: 1.1.3 - transitivePeerDependencies: - - '@azure/core-client' - - supports-color - optional: true - tinybench@2.9.0: {} tinyexec@1.1.1: {} @@ -3746,11 +2624,6 @@ snapshots: tslib@2.8.1: {} - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - optional: true - typescript@5.9.3: {} ulidx@2.4.1: @@ -3768,12 +2641,6 @@ snapshots: dependencies: pathe: 2.0.3 - util-deprecate@1.0.2: - optional: true - - uuid@8.3.2: - optional: true - vite@8.0.9(@types/node@22.19.17)(esbuild@0.27.7)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 @@ -3909,16 +2776,8 @@ snapshots: - bufferutil - utf-8-validate - wrappy@1.0.2: - optional: true - ws@8.18.0: {} - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.1 - optional: true - yaml@2.8.3: {} youch-core@0.3.3: