diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index ac9a38ab..0a0368b3 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -10,7 +10,7 @@ "plugins": [ { "name": "claude-mem", - "version": "10.4.1", + "version": "10.4.2", "source": "./plugin", "description": "Persistent memory system for Claude Code - context compression across sessions" } diff --git a/.plan/endless-mode-rebase.md b/.plan/endless-mode-rebase.md new file mode 100644 index 00000000..305882c2 --- /dev/null +++ b/.plan/endless-mode-rebase.md @@ -0,0 +1,214 @@ +# Plan: Endless Mode Re-implementation on Current Main + +## Context + +Endless mode was implemented on `beta/endless-mode` branch (diverged at v7.0.0). Main is now at v10.4.1 — **902 commits ahead**. Rebasing is impractical. This plan re-implements endless mode on top of current main, using the old branch as a reference for concepts only. + +### What Endless Mode Does + +When enabled, after each tool execution: +1. The PostToolUse hook waits for the SDK agent to process the observation +2. The processed observation (title, narrative, facts) is injected back into Claude's context via `additionalContext` +3. Large tool inputs are cleared from the transcript to save tokens +4. Net effect: Claude sees compressed observations instead of raw tool data → extends effective context window + +### Key Problem from Previous Attempt + +The save-hook blocked for 60-90s waiting for SDK processing, making sessions unusably slow. The fundamental tension: AI-processed observations require time, but hooks have a 120s hard limit. + +### Branch Strategy + +Create a new branch `feature/endless-mode-v2` from current main. Do NOT touch the old `beta/endless-mode` branch. + +--- + +## Phase 0: Documentation Discovery (Reference Gathering) + +### 0.1 — Read old branch implementation for reference patterns +- `git show beta/endless-mode:src/hooks/save-hook.ts` — synchronous wait pattern +- `git show beta/endless-mode:src/hooks/context-injection.ts` — observation formatting +- `git show beta/endless-mode:src/hooks/pre-tool-use-hook.ts` — tool_use_id tracking +- `git show beta/endless-mode:src/services/worker/SessionManager.ts` — `waitForNextObservation()` +- `git show beta/endless-mode:docs/context/state-of-endless.md` — architecture doc + +### 0.2 — Read current main integration points +- `src/hooks/hook-response.ts:1-15` — current hook response format +- `src/services/worker/SessionManager.ts:21-100` — current session management +- `src/services/worker/SDKAgent.ts:43-150` — current SDK agent flow, event emission +- `src/services/worker/http/routes/SessionRoutes.ts:498-573` — current observation endpoint +- `src/services/sqlite/SessionStore.ts:1503-1560` — current storeObservation +- `src/shared/SettingsDefaultsManager.ts:77-133` — current settings defaults + +### 0.3 — Identify Claude Code hook contract +- `plugin/plugin.json` — current hook configuration (which hooks exist, their types) +- Check if `PreToolUse` hook type is available in Claude Code plugin spec +- Check `additionalContext` field availability in hook response contract + +### Deliverable +List of exact APIs, file locations, and patterns available for each integration point. Anti-pattern list of methods that existed on the old branch but don't exist on current main. + +--- + +## Phase 1: Database Schema — Add `tool_use_id` Column + +### What to implement +- Add migration 20 to `src/services/sqlite/SessionStore.ts` (after migration 19 at ~line 53) +- Add nullable `tool_use_id TEXT` column to observations table +- Add index: `CREATE INDEX idx_observations_tool_use_id ON observations(tool_use_id)` +- Add `getObservationsByToolUseId(toolUseId: string)` method to SessionStore +- Update `storeObservation()` signature to accept optional `tool_use_id?: string` + +### Files to modify +- `src/services/sqlite/SessionStore.ts` — migration + store method +- `src/services/sqlite/observations/types.ts` — add tool_use_id to StoreObservationResult +- `src/types/transcript.ts` — verify ToolResultContent.tool_use_id matches Claude's format + +### Verification +- `npm run build` succeeds +- Worker starts without errors +- New column appears in observations table: `sqlite3 ~/.claude-mem/claude-mem.db ".schema observations"` + +### Anti-patterns +- Do NOT make tool_use_id NOT NULL — old observations won't have it +- Do NOT modify existing migrations — only append new ones + +--- + +## Phase 2: Settings — Add Endless Mode Configuration + +### What to implement +- Add to `SettingsDefaultsManager.ts` DEFAULTS (~line 77): + - `CLAUDE_MEM_ENDLESS_MODE`: `'false'` (disabled by default) + - `CLAUDE_MEM_ENDLESS_WAIT_TIMEOUT_MS`: `'90000'` (90 second timeout) +- Add helper method `isEndlessModeEnabled(): boolean` + +### Files to modify +- `src/shared/SettingsDefaultsManager.ts` + +### Verification +- Settings load correctly with defaults +- Can override via `~/.claude-mem/settings.json` +- Can override via environment variable + +### Anti-patterns +- Do NOT add UI for toggling yet — settings.json is sufficient for beta + +--- + +## Phase 3: Worker-Side — Event-Based Observation Completion Signaling + +### What to implement +- In `SessionManager.ts`: Add `waitForNextObservation(sessionDbId, toolUseId, timeoutMs)` method + - Uses existing `sessionQueues` EventEmitter infrastructure + - Waits for `observation_saved` event matching toolUseId + - Returns the observation or null on timeout +- In `SDKAgent.ts`: After `storeObservation()` call, emit `observation_saved` event with observation data and toolUseId +- In `SessionRoutes.ts`: + - Accept `tool_use_id` in observation POST body + - Accept `wait_until_observation_is_saved=true` query parameter + - When waiting: call `SessionManager.waitForNextObservation()` before responding + - When not waiting (default): existing fire-and-forget behavior + +### Files to modify +- `src/services/worker/SessionManager.ts` +- `src/services/worker/SDKAgent.ts` +- `src/services/worker/http/routes/SessionRoutes.ts` + +### Verification +- Worker builds and starts +- Default (non-endless) observation flow is unaffected +- Can POST with `wait_until_observation_is_saved=true` and get observation back in response + +### Anti-patterns +- Do NOT add SSE/streaming — simple HTTP request/response with await is sufficient +- Do NOT modify the existing fire-and-forget path — only add the new waiting path +- Do NOT add a pre-tool-use endpoint yet — tool_use_id comes from the hook, not a separate call + +--- + +## Phase 4: Hook-Side — PostToolUse Synchronous Injection + +### What to implement +- Modify the PostToolUse hook (save-hook) to: + 1. Check if endless mode is enabled via settings + 2. Extract `tool_use_id` from the hook input (Claude Code provides this) + 3. If endless mode ON: POST observation with `wait_until_observation_is_saved=true` and `tool_use_id` + 4. Receive processed observation in HTTP response + 5. Format observation as markdown (copy pattern from old `context-injection.ts`) + 6. Return hook response with `additionalContext` field containing formatted observation + 7. If endless mode OFF: existing fire-and-forget behavior (unchanged) +- Create `src/hooks/observation-formatter.ts` utility for markdown formatting + +### Files to modify +- `src/hooks/save-hook.ts` (or whatever the current PostToolUse hook source is) +- `src/hooks/observation-formatter.ts` (NEW) +- `src/hooks/hook-response.ts` — add `additionalContext` support to response type + +### Verification +- With endless mode OFF: behavior identical to current +- With endless mode ON: observations appear in Claude's context after tool use +- Hook respects 120s Claude Code timeout (90s observation wait + buffer) + +### Anti-patterns +- Do NOT add transcript clearing in this phase — that's a separate optimization +- Do NOT block indefinitely — always use timeout with graceful fallback +- Do NOT swallow errors in the wait path — if it fails, fall back to fire-and-forget + +--- + +## Phase 5: Build, Test, and Validate + +### What to implement +- `npm run build-and-sync` — full build +- Manual testing: + 1. Enable endless mode in settings.json + 2. Start a Claude Code session + 3. Execute tool uses and verify observations appear in context + 4. Verify non-endless mode is unaffected +- Add basic unit tests in `tests/endless-mode/` + +### Verification checklist +- [ ] `npm run build` succeeds with zero errors +- [ ] Worker starts without errors +- [ ] Non-endless mode behavior unchanged (regression check) +- [ ] With endless mode ON: observation appears in Claude's context after tool use +- [ ] Timeout fallback works (kill worker mid-processing, verify graceful degradation) +- [ ] Settings toggle works (on/off without restart) +- [ ] Database migration applies cleanly on fresh and existing databases + +### Anti-patterns +- Do NOT ship to npm/release yet — this is beta +- Do NOT add documentation updates yet — feature must be validated first +- Do NOT add telemetry or analytics in initial implementation + +--- + +## Phase 6: Transcript Clearing Optimization (Optional, After Validation) + +### What to implement +- After observation injection is working, add transcript clearing: + - After successful observation injection, clear the large `tool_input` from Claude's transcript JSONL + - This is the actual token savings mechanism — compressed observation replaces raw tool data +- Read from old branch: `git show beta/endless-mode:src/hooks/context-injection.ts` for `clearToolInputInTranscript()` + +### Files to modify +- `src/hooks/save-hook.ts` — add transcript clearing after successful injection +- `src/hooks/transcript-clearer.ts` (NEW) — utility for JSONL manipulation + +### Verification +- Token count decreases after observation injection +- Transcript JSONL remains valid after clearing +- Claude Code doesn't break when transcript entries are modified + +### Anti-patterns +- Do NOT clear transcript if observation injection failed — leave raw data intact +- Do NOT modify transcript entries other than the current tool use +- Do NOT implement until Phase 5 validation is complete + +--- + +## Decisions Needed from User + +1. **Branch name**: `feature/endless-mode-v2` (proposed) — acceptable? +2. **Scope**: Phases 1-5 are core. Phase 6 is optional. Should Phase 6 be included? +3. **Pre-tool-use hook**: The old branch had a separate PreToolUse hook to send tool_use_id before execution. The PostToolUse hook already receives tool_use_id from Claude Code. Do we need PreToolUse, or is PostToolUse sufficient? diff --git a/.plan/hook-bugs-investigation.md b/.plan/hook-bugs-investigation.md new file mode 100644 index 00000000..d92ec568 --- /dev/null +++ b/.plan/hook-bugs-investigation.md @@ -0,0 +1,231 @@ +# Hook Bugs Investigation & Fix Plan + +## Problem Summary + +Two open issues report hook failures affecting users on v10.4.0+: + +### Issue #1215 — Stop hooks fail: `${CLAUDE_PLUGIN_ROOT}` not injected +- **Root cause**: Upstream Claude Code bug — `${CLAUDE_PLUGIN_ROOT}` is not set when Claude Code executes Stop hooks +- **Scope**: On macOS, only Stop hooks affected. On Linux (Claude Code v2.1.51), ALL hooks affected +- **Upstream refs**: `anthropics/claude-code#24529`, `anthropics/claude-code#27145` +- **Impact**: Session-end summarization and session-complete never run + +### Issue #1220 — PostToolUse hooks crash on stdin +- **Bug 1**: `start` command exits 1 when stdin has data (every PostToolUse call sends stdin to all commands in the hook group, including `start` which doesn't need it) +- **Bug 2**: `observation` command crashes on payloads > ~350 bytes +- **Impact**: Every tool call produces 2x `PostToolUse: hook error` messages; observation data never processed + +## Root Cause Analysis + +### Issue #1215 (CLAUDE_PLUGIN_ROOT) +This is an **upstream Claude Code bug**, not a regression we introduced. The `${CLAUDE_PLUGIN_ROOT}` variable is supposed to be set by Claude Code's hook executor for all hook types, but Stop hooks don't receive it. Our hooks.json uses this variable in all commands: +``` +node "${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js" "${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs" ... +``` +When not set, the path resolves to `/scripts/bun-runner.js` which doesn't exist. + +### Issue #1220 (stdin crashes) — ROOT CAUSE IDENTIFIED + +Three compounding code-level bugs: + +**1. Missing `break` statements in switch — `src/services/worker-service.ts:1022-1204`** +Only the `hook` case (line 1142) has a `break`. All 7 other cases (`start`, `stop`, `restart`, `status`, `cursor`, `generate`, `clean`) rely on `process.exit()` to prevent fall-through. This is fragile — if any async operation throws before `process.exit()` is reached, execution falls through to the next case. For `start`, if `ensureWorkerStarted()` throws, it falls through into `stop` → `restart` → etc. + +**2. Unhandled promise rejection — `src/services/worker-service.ts:1213`** +`main()` is called as `Hge && Fge()` (compiled) without a `.catch()`. The `ensureWorkerStarted()` function CAN throw — specifically via `getInstalledPluginVersion()` in `src/services/infrastructure/HealthMonitor.ts:132` which calls `readFileSync()` and can throw on non-ENOENT/EBUSY errors. An unhandled rejection causes Bun to exit with code 1 silently — matching the reported symptoms exactly. + +**3. Redundant `start` command in hooks.json — `plugin/hooks/hooks.json:65`** +The PostToolUse hook group has a standalone `start` command that receives stdin it doesn't need. This is redundant because the `hook` case at `worker-service.ts:1101` already calls `ensureWorkerStarted()` internally. The extra `start` command adds latency (bun-runner.js waits up to 5s for stdin EOF via `collectStdin()`) and triggers the crash path described above. + +**Why Bug 2 (large payloads) manifests at ~350 bytes:** +The same unhandled-rejection chain. When `ensureWorkerStarted()` inside the `hook` case throws before `hookCommand()` reads stdin, the process exits 1. Larger payloads affect the timing of stdin buffering vs. the concurrent HTTP health check calls, making the throw more likely to occur before stdin is fully consumed. + +## Phases + +### Phase 0: Documentation Discovery & Reproduction + +**Tasks:** +1. Read Claude Code's hook documentation to understand the stdin contract: + - Does Claude Code pass stdin to all commands in a hook group, or only specific ones? + - Does Claude Code close stdin after writing, or leave it open? + - What are the expected exit code semantics? + +2. Check Claude Code upstream issues for any resolution on CLAUDE_PLUGIN_ROOT: + - `anthropics/claude-code#24529` + - `anthropics/claude-code#27145` + +3. Reproduce issue #1220 locally: + ```bash + # Bug 1: start with stdin + echo '{"tool_name":"Read","tool_response":"test"}' | bun plugin/scripts/worker-service.cjs start + echo $? # Expected: 1 (broken), should be: 0 + + # Bug 2: observation with large payload + python3 -c "import json; print(json.dumps({'tool_name':'Read','tool_response':'x'*400,'session_id':'test','cwd':'/tmp'}))" | bun plugin/scripts/worker-service.cjs hook claude-code observation + echo $? # Expected: 1 (broken), should be: 0 + ``` + +4. Check `bun-runner.js` stdin timeout behavior: + ```bash + # Time how long the start command takes through bun-runner + time echo '{}' | node plugin/scripts/bun-runner.js plugin/scripts/worker-service.cjs start + # If this takes ~5s, the collectStdin timeout is the bottleneck + ``` + +**Verification:** Issue #1220 bugs reproduced locally with exact exit codes documented. + +### Phase 1: Fix the three root causes (#1220) + +**Fix 1: Add `break` statements to all switch cases** + +File: `src/services/worker-service.ts:1022-1204` + +Add `break` after every case in the switch statement. Currently only the `hook` case has one. Every other case relies on `process.exit()` which is fragile if the preceding async code throws. + +```typescript +case 'start': { + const success = await ensureWorkerStarted(port); + if (success) { + exitWithStatus('ready'); + } else { + exitWithStatus('error', 'Failed to start worker'); + } + break; // ADD THIS +} + +case 'stop': { + // ... + process.exit(0); + break; // ADD THIS (defensive, even after process.exit) +} +// ... same for restart, status, cursor, generate, clean +``` + +**Fix 2: Add `.catch()` to `main()` invocation** + +File: `src/services/worker-service.ts:1213` + +The compiled code calls `Fge()` (main) without error handling. Add a catch: + +```typescript +if (isMainModule) { + main().catch((error) => { + logger.error('SYSTEM', 'Fatal error in main', {}, error instanceof Error ? error : undefined); + process.exit(0); // Exit 0: don't block Claude Code, don't leave Windows Terminal tabs open + }); +} +``` + +**Fix 3: Remove redundant `start` command from hook groups** + +File: `plugin/hooks/hooks.json` + +Remove the standalone `start` command from PostToolUse, UserPromptSubmit, and Stop hook groups. The `hook` case in worker-service.ts already calls `ensureWorkerStarted()` internally (line 1101), making the separate `start` command redundant. This also eliminates: +- The 5s stdin timeout delay in bun-runner.js `collectStdin()` +- The stdin-crash path entirely + +Before: +```json +"PostToolUse": [{ + "matcher": "*", + "hooks": [ + { "command": "... worker-service.cjs start", "timeout": 60 }, + { "command": "... worker-service.cjs hook claude-code observation", "timeout": 120 } + ] +}] +``` + +After: +```json +"PostToolUse": [{ + "matcher": "*", + "hooks": [ + { "command": "... worker-service.cjs hook claude-code observation", "timeout": 120 } + ] +}] +``` + +Apply the same removal to UserPromptSubmit and Stop groups. + +**Files to modify:** +- `src/services/worker-service.ts` — add break statements + .catch() on main() +- `plugin/hooks/hooks.json` — remove redundant `start` commands from PostToolUse, UserPromptSubmit, Stop + +**Verification:** +```bash +# Bug 1 fixed — start no longer called from hooks, but also safe if called directly +echo '{"tool_name":"Read","tool_response":"test"}' | bun plugin/scripts/worker-service.cjs start +echo $? # Should be 0 + +# Bug 2 fixed — observation handles large payloads +python3 -c "import json; print(json.dumps({'tool_name':'Read','tool_response':'x'*2000,'session_id':'test','cwd':'/tmp'}))" | bun plugin/scripts/worker-service.cjs hook claude-code observation +echo $? # Should be 0 + +# No error messages in Claude Code UI during normal tool use +``` + +### Phase 2: Workaround for CLAUDE_PLUGIN_ROOT (#1215) + +Since this is an upstream Claude Code bug, our options are limited: + +**Option 1: Resolve paths at Setup time (preferred)** +In the `Setup` hook (which DOES receive CLAUDE_PLUGIN_ROOT), write the resolved path to a file: +```bash +# In setup.sh +echo "${CLAUDE_PLUGIN_ROOT}" > ~/.claude-mem/.plugin-root +``` +Then in bun-runner.js, fall back to reading this file when CLAUDE_PLUGIN_ROOT is empty. + +**Option 2: Self-resolve using __dirname** +The scripts know their own location on disk. Instead of relying on CLAUDE_PLUGIN_ROOT, resolve the plugin root from the script's own path: +```javascript +const PLUGIN_ROOT = path.resolve(__dirname, '..'); +``` +Then use this instead of the environment variable. + +**Option 3: Document the workaround** +Add to README/docs: users can run `sed` to replace `${CLAUDE_PLUGIN_ROOT}` with absolute paths in hooks.json. + +**Files to modify:** +- `plugin/scripts/bun-runner.js` — add PLUGIN_ROOT self-resolution fallback +- `plugin/hooks/hooks.json` — potentially use self-resolving paths +- Docs — document the upstream issue and workaround + +**Anti-patterns to avoid:** +- Don't hardcode absolute paths in hooks.json (varies per installation) +- Don't remove CLAUDE_PLUGIN_ROOT usage entirely (it works on most platforms) + +**Verification:** +```bash +# Simulate missing CLAUDE_PLUGIN_ROOT +unset CLAUDE_PLUGIN_ROOT +node plugin/scripts/bun-runner.js plugin/scripts/worker-service.cjs start +echo $? # Should be 0 (falls back to self-resolved path) +``` + +### Phase 3: Verification & Testing + +1. Run existing hook tests: + ```bash + npm test -- --grep "hook" + ``` + +2. Verify all 5 hook types work end-to-end: + - SessionStart: context injection + - UserPromptSubmit: session-init + - PostToolUse: observation (small AND large payloads) + - Stop: summarize + session-complete (if CLAUDE_PLUGIN_ROOT is available) + +3. Check for regressions: + - No error messages in Claude Code UI during normal operation + - Observations are stored correctly + - Worker starts reliably + +4. Build and verify: + ```bash + npm run build-and-sync + ``` + +**Anti-patterns to avoid:** +- Don't suppress errors that indicate real bugs (the stderr suppression from PR #1214 may be hiding issues) +- Don't add try/catch blocks that swallow errors silently during development diff --git a/package.json b/package.json index 470156e7..bf3a5a55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claude-mem", - "version": "10.4.1", + "version": "10.4.2", "description": "Memory compression system for Claude Code - persist context across sessions", "keywords": [ "claude", diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index e07c5cbc..14e7b508 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "claude-mem", - "version": "10.4.0", + "version": "10.4.2", "description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions", "author": { "name": "Alex Newman" diff --git a/plugin/package.json b/plugin/package.json index 1a667920..b4e6ca72 100644 --- a/plugin/package.json +++ b/plugin/package.json @@ -1,6 +1,6 @@ { "name": "claude-mem-plugin", - "version": "10.4.1", + "version": "10.4.2", "private": true, "description": "Runtime dependencies for claude-mem bundled hooks", "type": "module", diff --git a/plugin/scripts/mcp-server.cjs b/plugin/scripts/mcp-server.cjs index ffb5569a..47bf0529 100755 --- a/plugin/scripts/mcp-server.cjs +++ b/plugin/scripts/mcp-server.cjs @@ -54,7 +54,7 @@ ${i.stack}`:` ${i.message}`:this.getLevel()===0&&typeof i=="object"?l=` Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of t.seen.entries()){let s=a[1];if(e===a[0]){i(a);continue}if(t.external){let u=t.external.registry.get(a[0])?.id;if(e!==a[0]&&u){i(a);continue}}if(t.metadataRegistry.get(a[0])?.id){i(a);continue}if(s.cycle){i(a);continue}if(s.count>1&&t.reused==="ref"){i(a);continue}}}function Yi(t,e){let r=t.seen.get(e);if(!r)throw new Error("Unprocessed schema. This is a bug in Zod.");let n=a=>{let s=t.seen.get(a);if(s.ref===null)return;let c=s.def??s.schema,u={...c},l=s.ref;if(s.ref=null,l){n(l);let m=t.seen.get(l),f=m.schema;if(f.$ref&&(t.target==="draft-07"||t.target==="draft-04"||t.target==="openapi-3.0")?(c.allOf=c.allOf??[],c.allOf.push(f)):Object.assign(c,f),Object.assign(c,u),a._zod.parent===l)for(let v in c)v==="$ref"||v==="allOf"||v in u||delete c[v];if(f.$ref)for(let v in c)v==="$ref"||v==="allOf"||v in m.def&&JSON.stringify(c[v])===JSON.stringify(m.def[v])&&delete c[v]}let d=a._zod.parent;if(d&&d!==l){n(d);let m=t.seen.get(d);if(m?.schema.$ref&&(c.$ref=m.schema.$ref,m.def))for(let f in c)f==="$ref"||f==="allOf"||f in m.def&&JSON.stringify(c[f])===JSON.stringify(m.def[f])&&delete c[f]}t.override({zodSchema:a,jsonSchema:c,path:s.path??[]})};for(let a of[...t.seen.entries()].reverse())n(a[0]);let o={};if(t.target==="draft-2020-12"?o.$schema="https://json-schema.org/draft/2020-12/schema":t.target==="draft-07"?o.$schema="http://json-schema.org/draft-07/schema#":t.target==="draft-04"?o.$schema="http://json-schema.org/draft-04/schema#":t.target,t.external?.uri){let a=t.external.registry.get(e)?.id;if(!a)throw new Error("Schema is missing an `id` property");o.$id=t.external.uri(a)}Object.assign(o,r.def??r.schema);let i=t.external?.defs??{};for(let a of t.seen.entries()){let s=a[1];s.def&&s.defId&&(i[s.defId]=s.def)}t.external||Object.keys(i).length>0&&(t.target==="draft-2020-12"?o.$defs=i:o.definitions=i);try{let a=JSON.parse(JSON.stringify(o));return Object.defineProperty(a,"~standard",{value:{...e["~standard"],jsonSchema:{input:fo(e,"input",t.processors),output:fo(e,"output",t.processors)}},enumerable:!1,writable:!1}),a}catch{throw new Error("Error converting schema to JSON.")}}function Ue(t,e){let r=e??{seen:new Set};if(r.seen.has(t))return!1;r.seen.add(t);let n=t._zod.def;if(n.type==="transform")return!0;if(n.type==="array")return Ue(n.element,r);if(n.type==="set")return Ue(n.valueType,r);if(n.type==="lazy")return Ue(n.getter(),r);if(n.type==="promise"||n.type==="optional"||n.type==="nonoptional"||n.type==="nullable"||n.type==="readonly"||n.type==="default"||n.type==="prefault")return Ue(n.innerType,r);if(n.type==="intersection")return Ue(n.left,r)||Ue(n.right,r);if(n.type==="record"||n.type==="map")return Ue(n.keyType,r)||Ue(n.valueType,r);if(n.type==="pipe")return Ue(n.in,r)||Ue(n.out,r);if(n.type==="object"){for(let o in n.shape)if(Ue(n.shape[o],r))return!0;return!1}if(n.type==="union"){for(let o of n.options)if(Ue(o,r))return!0;return!1}if(n.type==="tuple"){for(let o of n.items)if(Ue(o,r))return!0;return!!(n.rest&&Ue(n.rest,r))}return!1}var Pm=(t,e={})=>r=>{let n=Bi({...r,processors:e});return de(t,n),Xi(n,t),Yi(n,t)},fo=(t,e,r={})=>n=>{let{libraryOptions:o,target:i}=n??{},a=Bi({...o??{},target:i,io:e,processors:r});return de(t,a),Xi(a,t),Yi(a,t)};var wb={guid:"uuid",url:"uri",datetime:"date-time",json_string:"json-string",regex:""},Om=(t,e,r,n)=>{let o=r;o.type="string";let{minimum:i,maximum:a,format:s,patterns:c,contentEncoding:u}=t._zod.bag;if(typeof i=="number"&&(o.minLength=i),typeof a=="number"&&(o.maxLength=a),s&&(o.format=wb[s]??s,o.format===""&&delete o.format,s==="time"&&delete o.format),u&&(o.contentEncoding=u),c&&c.size>0){let l=[...c];l.length===1?o.pattern=l[0].source:l.length>1&&(o.allOf=[...l.map(d=>({...e.target==="draft-07"||e.target==="draft-04"||e.target==="openapi-3.0"?{type:"string"}:{},pattern:d.source}))])}},jm=(t,e,r,n)=>{let o=r,{minimum:i,maximum:a,format:s,multipleOf:c,exclusiveMaximum:u,exclusiveMinimum:l}=t._zod.bag;typeof s=="string"&&s.includes("int")?o.type="integer":o.type="number",typeof l=="number"&&(e.target==="draft-04"||e.target==="openapi-3.0"?(o.minimum=l,o.exclusiveMinimum=!0):o.exclusiveMinimum=l),typeof i=="number"&&(o.minimum=i,typeof l=="number"&&e.target!=="draft-04"&&(l>=i?delete o.minimum:delete o.exclusiveMinimum)),typeof u=="number"&&(e.target==="draft-04"||e.target==="openapi-3.0"?(o.maximum=u,o.exclusiveMaximum=!0):o.exclusiveMaximum=u),typeof a=="number"&&(o.maximum=a,typeof u=="number"&&e.target!=="draft-04"&&(u<=a?delete o.maximum:delete o.exclusiveMaximum)),typeof c=="number"&&(o.multipleOf=c)},Dm=(t,e,r,n)=>{r.type="boolean"},Nm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("BigInt cannot be represented in JSON Schema")},Rm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Symbols cannot be represented in JSON Schema")},Am=(t,e,r,n)=>{e.target==="openapi-3.0"?(r.type="string",r.nullable=!0,r.enum=[null]):r.type="null"},Um=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Undefined cannot be represented in JSON Schema")},Mm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Void cannot be represented in JSON Schema")},Cm=(t,e,r,n)=>{r.not={}},Zm=(t,e,r,n)=>{},Lm=(t,e,r,n)=>{},qm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Date cannot be represented in JSON Schema")},Fm=(t,e,r,n)=>{let o=t._zod.def,i=Nn(o.entries);i.every(a=>typeof a=="number")&&(r.type="number"),i.every(a=>typeof a=="string")&&(r.type="string"),r.enum=i},Vm=(t,e,r,n)=>{let o=t._zod.def,i=[];for(let a of o.values)if(a===void 0){if(e.unrepresentable==="throw")throw new Error("Literal `undefined` cannot be represented in JSON Schema")}else if(typeof a=="bigint"){if(e.unrepresentable==="throw")throw new Error("BigInt literals cannot be represented in JSON Schema");i.push(Number(a))}else i.push(a);if(i.length!==0)if(i.length===1){let a=i[0];r.type=a===null?"null":typeof a,e.target==="draft-04"||e.target==="openapi-3.0"?r.enum=[a]:r.const=a}else i.every(a=>typeof a=="number")&&(r.type="number"),i.every(a=>typeof a=="string")&&(r.type="string"),i.every(a=>typeof a=="boolean")&&(r.type="boolean"),i.every(a=>a===null)&&(r.type="null"),r.enum=i},Jm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("NaN cannot be represented in JSON Schema")},Km=(t,e,r,n)=>{let o=r,i=t._zod.pattern;if(!i)throw new Error("Pattern not found in template literal");o.type="string",o.pattern=i.source},Hm=(t,e,r,n)=>{let o=r,i={type:"string",format:"binary",contentEncoding:"binary"},{minimum:a,maximum:s,mime:c}=t._zod.bag;a!==void 0&&(i.minLength=a),s!==void 0&&(i.maxLength=s),c?c.length===1?(i.contentMediaType=c[0],Object.assign(o,i)):(Object.assign(o,i),o.anyOf=c.map(u=>({contentMediaType:u}))):Object.assign(o,i)},Wm=(t,e,r,n)=>{r.type="boolean"},Gm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Custom types cannot be represented in JSON Schema")},Bm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Function types cannot be represented in JSON Schema")},Xm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Transforms cannot be represented in JSON Schema")},Ym=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Map cannot be represented in JSON Schema")},Qm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Set cannot be represented in JSON Schema")},eh=(t,e,r,n)=>{let o=r,i=t._zod.def,{minimum:a,maximum:s}=t._zod.bag;typeof a=="number"&&(o.minItems=a),typeof s=="number"&&(o.maxItems=s),o.type="array",o.items=de(i.element,e,{...n,path:[...n.path,"items"]})},th=(t,e,r,n)=>{let o=r,i=t._zod.def;o.type="object",o.properties={};let a=i.shape;for(let u in a)o.properties[u]=de(a[u],e,{...n,path:[...n.path,"properties",u]});let s=new Set(Object.keys(a)),c=new Set([...s].filter(u=>{let l=i.shape[u]._zod;return e.io==="input"?l.optin===void 0:l.optout===void 0}));c.size>0&&(o.required=Array.from(c)),i.catchall?._zod.def.type==="never"?o.additionalProperties=!1:i.catchall?i.catchall&&(o.additionalProperties=de(i.catchall,e,{...n,path:[...n.path,"additionalProperties"]})):e.io==="output"&&(o.additionalProperties=!1)},hl=(t,e,r,n)=>{let o=t._zod.def,i=o.inclusive===!1,a=o.options.map((s,c)=>de(s,e,{...n,path:[...n.path,i?"oneOf":"anyOf",c]}));i?r.oneOf=a:r.anyOf=a},rh=(t,e,r,n)=>{let o=t._zod.def,i=de(o.left,e,{...n,path:[...n.path,"allOf",0]}),a=de(o.right,e,{...n,path:[...n.path,"allOf",1]}),s=u=>"allOf"in u&&Object.keys(u).length===1,c=[...s(i)?i.allOf:[i],...s(a)?a.allOf:[a]];r.allOf=c},nh=(t,e,r,n)=>{let o=r,i=t._zod.def;o.type="array";let a=e.target==="draft-2020-12"?"prefixItems":"items",s=e.target==="draft-2020-12"||e.target==="openapi-3.0"?"items":"additionalItems",c=i.items.map((m,f)=>de(m,e,{...n,path:[...n.path,a,f]})),u=i.rest?de(i.rest,e,{...n,path:[...n.path,s,...e.target==="openapi-3.0"?[i.items.length]:[]]}):null;e.target==="draft-2020-12"?(o.prefixItems=c,u&&(o.items=u)):e.target==="openapi-3.0"?(o.items={anyOf:c},u&&o.items.anyOf.push(u),o.minItems=c.length,u||(o.maxItems=c.length)):(o.items=c,u&&(o.additionalItems=u));let{minimum:l,maximum:d}=t._zod.bag;typeof l=="number"&&(o.minItems=l),typeof d=="number"&&(o.maxItems=d)},oh=(t,e,r,n)=>{let o=r,i=t._zod.def;o.type="object";let a=i.keyType,c=a._zod.bag?.patterns;if(i.mode==="loose"&&c&&c.size>0){let l=de(i.valueType,e,{...n,path:[...n.path,"patternProperties","*"]});o.patternProperties={};for(let d of c)o.patternProperties[d.source]=l}else(e.target==="draft-07"||e.target==="draft-2020-12")&&(o.propertyNames=de(i.keyType,e,{...n,path:[...n.path,"propertyNames"]})),o.additionalProperties=de(i.valueType,e,{...n,path:[...n.path,"additionalProperties"]});let u=a._zod.values;if(u){let l=[...u].filter(d=>typeof d=="string"||typeof d=="number");l.length>0&&(o.required=l)}},ih=(t,e,r,n)=>{let o=t._zod.def,i=de(o.innerType,e,n),a=e.seen.get(t);e.target==="openapi-3.0"?(a.ref=o.innerType,r.nullable=!0):r.anyOf=[i,{type:"null"}]},ah=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType},sh=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType,r.default=JSON.parse(JSON.stringify(o.defaultValue))},ch=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType,e.io==="input"&&(r._prefault=JSON.parse(JSON.stringify(o.defaultValue)))},uh=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType;let a;try{a=o.catchValue(void 0)}catch{throw new Error("Dynamic catch values are not supported in JSON Schema")}r.default=a},lh=(t,e,r,n)=>{let o=t._zod.def,i=e.io==="input"?o.in._zod.def.type==="transform"?o.out:o.in:o.out;de(i,e,n);let a=e.seen.get(t);a.ref=i},dh=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType,r.readOnly=!0},ph=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType},gl=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType},fh=(t,e,r,n)=>{let o=t._zod.innerType;de(o,e,n);let i=e.seen.get(t);i.ref=o};function Br(t){return!!t._zod}function Yt(t,e){return Br(t)?Jr(t,e):t.safeParse(e)}function Qi(t){if(!t)return;let e;if(Br(t)?e=t._zod?.def?.shape:e=t.shape,!!e){if(typeof e=="function")try{return e()}catch{return}return e}}function vh(t){if(Br(t)){let i=t._zod?.def;if(i){if(i.value!==void 0)return i.value;if(Array.isArray(i.values)&&i.values.length>0)return i.values[0]}}let r=t._def;if(r){if(r.value!==void 0)return r.value;if(Array.isArray(r.values)&&r.values.length>0)return r.values[0]}let n=t.value;if(n!==void 0)return n}var mo={};yn(mo,{ZodAny:()=>Rh,ZodArray:()=>Ch,ZodBase64:()=>Zl,ZodBase64URL:()=>Ll,ZodBigInt:()=>ca,ZodBigIntFormat:()=>Vl,ZodBoolean:()=>sa,ZodCIDRv4:()=>Ml,ZodCIDRv6:()=>Cl,ZodCUID:()=>Ol,ZodCUID2:()=>jl,ZodCatch:()=>ig,ZodCodec:()=>Xl,ZodCustom:()=>fa,ZodCustomStringFormat:()=>go,ZodDate:()=>Kl,ZodDefault:()=>Qh,ZodDiscriminatedUnion:()=>Lh,ZodE164:()=>ql,ZodEmail:()=>El,ZodEmoji:()=>Tl,ZodEnum:()=>ho,ZodExactOptional:()=>Bh,ZodFile:()=>Wh,ZodFunction:()=>mg,ZodGUID:()=>ta,ZodIPv4:()=>Al,ZodIPv6:()=>Ul,ZodIntersection:()=>qh,ZodJWT:()=>Fl,ZodKSUID:()=>Rl,ZodLazy:()=>dg,ZodLiteral:()=>Hh,ZodMAC:()=>Oh,ZodMap:()=>Jh,ZodNaN:()=>sg,ZodNanoID:()=>Pl,ZodNever:()=>Uh,ZodNonOptional:()=>Gl,ZodNull:()=>Nh,ZodNullable:()=>Yh,ZodNumber:()=>aa,ZodNumberFormat:()=>Xr,ZodObject:()=>ua,ZodOptional:()=>Wl,ZodPipe:()=>Bl,ZodPrefault:()=>tg,ZodPromise:()=>fg,ZodReadonly:()=>cg,ZodRecord:()=>pa,ZodSet:()=>Kh,ZodString:()=>oa,ZodStringFormat:()=>ce,ZodSuccess:()=>og,ZodSymbol:()=>jh,ZodTemplateLiteral:()=>lg,ZodTransform:()=>Gh,ZodTuple:()=>Fh,ZodType:()=>q,ZodULID:()=>Dl,ZodURL:()=>ia,ZodUUID:()=>Rt,ZodUndefined:()=>Dh,ZodUnion:()=>la,ZodUnknown:()=>Ah,ZodVoid:()=>Mh,ZodXID:()=>Nl,ZodXor:()=>Zh,_ZodString:()=>Il,_default:()=>eg,_function:()=>Fx,any:()=>wx,array:()=>G,base64:()=>cx,base64url:()=>ux,bigint:()=>$x,boolean:()=>_e,catch:()=>ag,check:()=>Vx,cidrv4:()=>ax,cidrv6:()=>sx,codec:()=>Zx,cuid:()=>Yb,cuid2:()=>Qb,custom:()=>Yl,date:()=>Ix,describe:()=>Jx,discriminatedUnion:()=>da,e164:()=>lx,email:()=>qb,emoji:()=>Bb,enum:()=>Te,exactOptional:()=>Xh,file:()=>Ax,float32:()=>gx,float64:()=>vx,function:()=>Fx,guid:()=>Fb,hash:()=>hx,hex:()=>mx,hostname:()=>fx,httpUrl:()=>Gb,instanceof:()=>Hx,int:()=>zl,int32:()=>_x,int64:()=>bx,intersection:()=>_o,ipv4:()=>nx,ipv6:()=>ix,json:()=>Gx,jwt:()=>dx,keyof:()=>Ex,ksuid:()=>rx,lazy:()=>pg,literal:()=>T,looseObject:()=>Ee,looseRecord:()=>jx,mac:()=>ox,map:()=>Dx,meta:()=>Kx,nan:()=>Cx,nanoid:()=>Xb,nativeEnum:()=>Rx,never:()=>Jl,nonoptional:()=>ng,null:()=>vo,nullable:()=>ra,nullish:()=>Ux,number:()=>ne,object:()=>z,optional:()=>fe,partialRecord:()=>Ox,pipe:()=>na,prefault:()=>rg,preprocess:()=>ma,promise:()=>qx,readonly:()=>ug,record:()=>pe,refine:()=>hg,set:()=>Nx,strictObject:()=>Tx,string:()=>h,stringFormat:()=>px,stringbool:()=>Wx,success:()=>Mx,superRefine:()=>gg,symbol:()=>kx,templateLiteral:()=>Lx,transform:()=>Hl,tuple:()=>Vh,uint32:()=>yx,uint64:()=>xx,ulid:()=>ex,undefined:()=>Sx,union:()=>ie,unknown:()=>ue,url:()=>Wb,uuid:()=>Vb,uuidv4:()=>Jb,uuidv6:()=>Kb,uuidv7:()=>Hb,void:()=>zx,xid:()=>tx,xor:()=>Px});var ea={};yn(ea,{endsWith:()=>ao,gt:()=>Dt,gte:()=>Ae,includes:()=>oo,length:()=>Wr,lowercase:()=>ro,lt:()=>jt,lte:()=>We,maxLength:()=>Hr,maxSize:()=>gr,mime:()=>so,minLength:()=>Xt,minSize:()=>Nt,multipleOf:()=>hr,negative:()=>ol,nonnegative:()=>al,nonpositive:()=>il,normalize:()=>co,overwrite:()=>_t,positive:()=>nl,property:()=>sl,regex:()=>to,size:()=>Kr,slugify:()=>Gi,startsWith:()=>io,toLowerCase:()=>lo,toUpperCase:()=>po,trim:()=>uo,uppercase:()=>no});var vr={};yn(vr,{ZodISODate:()=>$l,ZodISODateTime:()=>_l,ZodISODuration:()=>Sl,ZodISOTime:()=>xl,date:()=>bl,datetime:()=>yl,duration:()=>wl,time:()=>kl});var _l=p("ZodISODateTime",(t,e)=>{jc.init(t,e),ce.init(t,e)});function yl(t){return Nu(_l,t)}var $l=p("ZodISODate",(t,e)=>{Dc.init(t,e),ce.init(t,e)});function bl(t){return Ru($l,t)}var xl=p("ZodISOTime",(t,e)=>{Nc.init(t,e),ce.init(t,e)});function kl(t){return Au(xl,t)}var Sl=p("ZodISODuration",(t,e)=>{Rc.init(t,e),ce.init(t,e)});function wl(t){return Uu(Sl,t)}var _h=(t,e)=>{mi.init(t,e),t.name="ZodError",Object.defineProperties(t,{format:{value:r=>gi(t,r)},flatten:{value:r=>hi(t,r)},addIssue:{value:r=>{t.issues.push(r),t.message=JSON.stringify(t.issues,qr,2)}},addIssues:{value:r=>{t.issues.push(...r),t.message=JSON.stringify(t.issues,qr,2)}},isEmpty:{get(){return t.issues.length===0}}})},LN=p("ZodError",_h),Ge=p("ZodError",_h,{Parent:Error});var yh=Zn(Ge),$h=qn(Ge),bh=Vn(Ge),xh=Jn(Ge),kh=Df(Ge),Sh=Nf(Ge),wh=Rf(Ge),zh=Af(Ge),Ih=Uf(Ge),Eh=Mf(Ge),Th=Cf(Ge),Ph=Zf(Ge);var q=p("ZodType",(t,e)=>(Z.init(t,e),Object.assign(t["~standard"],{jsonSchema:{input:fo(t,"input"),output:fo(t,"output")}}),t.toJSONSchema=Pm(t,{}),t.def=e,t.type=e.type,Object.defineProperty(t,"_def",{value:e}),t.check=(...r)=>t.clone(y.mergeDefs(e,{checks:[...e.checks??[],...r.map(n=>typeof n=="function"?{_zod:{check:n,def:{check:"custom"},onattach:[]}}:n)]}),{parent:!0}),t.with=t.check,t.clone=(r,n)=>Ne(t,r,n),t.brand=()=>t,t.register=((r,n)=>(r.add(t,n),t)),t.parse=(r,n)=>yh(t,r,n,{callee:t.parse}),t.safeParse=(r,n)=>bh(t,r,n),t.parseAsync=async(r,n)=>$h(t,r,n,{callee:t.parseAsync}),t.safeParseAsync=async(r,n)=>xh(t,r,n),t.spa=t.safeParseAsync,t.encode=(r,n)=>kh(t,r,n),t.decode=(r,n)=>Sh(t,r,n),t.encodeAsync=async(r,n)=>wh(t,r,n),t.decodeAsync=async(r,n)=>zh(t,r,n),t.safeEncode=(r,n)=>Ih(t,r,n),t.safeDecode=(r,n)=>Eh(t,r,n),t.safeEncodeAsync=async(r,n)=>Th(t,r,n),t.safeDecodeAsync=async(r,n)=>Ph(t,r,n),t.refine=(r,n)=>t.check(hg(r,n)),t.superRefine=r=>t.check(gg(r)),t.overwrite=r=>t.check(_t(r)),t.optional=()=>fe(t),t.exactOptional=()=>Xh(t),t.nullable=()=>ra(t),t.nullish=()=>fe(ra(t)),t.nonoptional=r=>ng(t,r),t.array=()=>G(t),t.or=r=>ie([t,r]),t.and=r=>_o(t,r),t.transform=r=>na(t,Hl(r)),t.default=r=>eg(t,r),t.prefault=r=>rg(t,r),t.catch=r=>ag(t,r),t.pipe=r=>na(t,r),t.readonly=()=>ug(t),t.describe=r=>{let n=t.clone();return Re.add(n,{description:r}),n},Object.defineProperty(t,"description",{get(){return Re.get(t)?.description},configurable:!0}),t.meta=(...r)=>{if(r.length===0)return Re.get(t);let n=t.clone();return Re.add(n,r[0]),n},t.isOptional=()=>t.safeParse(void 0).success,t.isNullable=()=>t.safeParse(null).success,t.apply=r=>r(t),t)),Il=p("_ZodString",(t,e)=>{mr.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>Om(t,n,o,i);let r=t._zod.bag;t.format=r.format??null,t.minLength=r.minimum??null,t.maxLength=r.maximum??null,t.regex=(...n)=>t.check(to(...n)),t.includes=(...n)=>t.check(oo(...n)),t.startsWith=(...n)=>t.check(io(...n)),t.endsWith=(...n)=>t.check(ao(...n)),t.min=(...n)=>t.check(Xt(...n)),t.max=(...n)=>t.check(Hr(...n)),t.length=(...n)=>t.check(Wr(...n)),t.nonempty=(...n)=>t.check(Xt(1,...n)),t.lowercase=n=>t.check(ro(n)),t.uppercase=n=>t.check(no(n)),t.trim=()=>t.check(uo()),t.normalize=(...n)=>t.check(co(...n)),t.toLowerCase=()=>t.check(lo()),t.toUpperCase=()=>t.check(po()),t.slugify=()=>t.check(Gi())}),oa=p("ZodString",(t,e)=>{mr.init(t,e),Il.init(t,e),t.email=r=>t.check(Ti(El,r)),t.url=r=>t.check(eo(ia,r)),t.jwt=r=>t.check(Wi(Fl,r)),t.emoji=r=>t.check(Ni(Tl,r)),t.guid=r=>t.check(Qn(ta,r)),t.uuid=r=>t.check(Pi(Rt,r)),t.uuidv4=r=>t.check(Oi(Rt,r)),t.uuidv6=r=>t.check(ji(Rt,r)),t.uuidv7=r=>t.check(Di(Rt,r)),t.nanoid=r=>t.check(Ri(Pl,r)),t.guid=r=>t.check(Qn(ta,r)),t.cuid=r=>t.check(Ai(Ol,r)),t.cuid2=r=>t.check(Ui(jl,r)),t.ulid=r=>t.check(Mi(Dl,r)),t.base64=r=>t.check(Ji(Zl,r)),t.base64url=r=>t.check(Ki(Ll,r)),t.xid=r=>t.check(Ci(Nl,r)),t.ksuid=r=>t.check(Zi(Rl,r)),t.ipv4=r=>t.check(Li(Al,r)),t.ipv6=r=>t.check(qi(Ul,r)),t.cidrv4=r=>t.check(Fi(Ml,r)),t.cidrv6=r=>t.check(Vi(Cl,r)),t.e164=r=>t.check(Hi(ql,r)),t.datetime=r=>t.check(yl(r)),t.date=r=>t.check(bl(r)),t.time=r=>t.check(kl(r)),t.duration=r=>t.check(wl(r))});function h(t){return ju(oa,t)}var ce=p("ZodStringFormat",(t,e)=>{oe.init(t,e),Il.init(t,e)}),El=p("ZodEmail",(t,e)=>{kc.init(t,e),ce.init(t,e)});function qb(t){return Ti(El,t)}var ta=p("ZodGUID",(t,e)=>{bc.init(t,e),ce.init(t,e)});function Fb(t){return Qn(ta,t)}var Rt=p("ZodUUID",(t,e)=>{xc.init(t,e),ce.init(t,e)});function Vb(t){return Pi(Rt,t)}function Jb(t){return Oi(Rt,t)}function Kb(t){return ji(Rt,t)}function Hb(t){return Di(Rt,t)}var ia=p("ZodURL",(t,e)=>{Sc.init(t,e),ce.init(t,e)});function Wb(t){return eo(ia,t)}function Gb(t){return eo(ia,{protocol:/^https?$/,hostname:Qe.domain,...y.normalizeParams(t)})}var Tl=p("ZodEmoji",(t,e)=>{wc.init(t,e),ce.init(t,e)});function Bb(t){return Ni(Tl,t)}var Pl=p("ZodNanoID",(t,e)=>{zc.init(t,e),ce.init(t,e)});function Xb(t){return Ri(Pl,t)}var Ol=p("ZodCUID",(t,e)=>{Ic.init(t,e),ce.init(t,e)});function Yb(t){return Ai(Ol,t)}var jl=p("ZodCUID2",(t,e)=>{Ec.init(t,e),ce.init(t,e)});function Qb(t){return Ui(jl,t)}var Dl=p("ZodULID",(t,e)=>{Tc.init(t,e),ce.init(t,e)});function ex(t){return Mi(Dl,t)}var Nl=p("ZodXID",(t,e)=>{Pc.init(t,e),ce.init(t,e)});function tx(t){return Ci(Nl,t)}var Rl=p("ZodKSUID",(t,e)=>{Oc.init(t,e),ce.init(t,e)});function rx(t){return Zi(Rl,t)}var Al=p("ZodIPv4",(t,e)=>{Ac.init(t,e),ce.init(t,e)});function nx(t){return Li(Al,t)}var Oh=p("ZodMAC",(t,e)=>{Mc.init(t,e),ce.init(t,e)});function ox(t){return Du(Oh,t)}var Ul=p("ZodIPv6",(t,e)=>{Uc.init(t,e),ce.init(t,e)});function ix(t){return qi(Ul,t)}var Ml=p("ZodCIDRv4",(t,e)=>{Cc.init(t,e),ce.init(t,e)});function ax(t){return Fi(Ml,t)}var Cl=p("ZodCIDRv6",(t,e)=>{Zc.init(t,e),ce.init(t,e)});function sx(t){return Vi(Cl,t)}var Zl=p("ZodBase64",(t,e)=>{Lc.init(t,e),ce.init(t,e)});function cx(t){return Ji(Zl,t)}var Ll=p("ZodBase64URL",(t,e)=>{qc.init(t,e),ce.init(t,e)});function ux(t){return Ki(Ll,t)}var ql=p("ZodE164",(t,e)=>{Fc.init(t,e),ce.init(t,e)});function lx(t){return Hi(ql,t)}var Fl=p("ZodJWT",(t,e)=>{Vc.init(t,e),ce.init(t,e)});function dx(t){return Wi(Fl,t)}var go=p("ZodCustomStringFormat",(t,e)=>{Jc.init(t,e),ce.init(t,e)});function px(t,e,r={}){return Gr(go,t,e,r)}function fx(t){return Gr(go,"hostname",Qe.hostname,t)}function mx(t){return Gr(go,"hex",Qe.hex,t)}function hx(t,e){let r=e?.enc??"hex",n=`${t}_${r}`,o=Qe[n];if(!o)throw new Error(`Unrecognized hash format: ${n}`);return Gr(go,n,o,e)}var aa=p("ZodNumber",(t,e)=>{wi.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>jm(t,n,o,i),t.gt=(n,o)=>t.check(Dt(n,o)),t.gte=(n,o)=>t.check(Ae(n,o)),t.min=(n,o)=>t.check(Ae(n,o)),t.lt=(n,o)=>t.check(jt(n,o)),t.lte=(n,o)=>t.check(We(n,o)),t.max=(n,o)=>t.check(We(n,o)),t.int=n=>t.check(zl(n)),t.safe=n=>t.check(zl(n)),t.positive=n=>t.check(Dt(0,n)),t.nonnegative=n=>t.check(Ae(0,n)),t.negative=n=>t.check(jt(0,n)),t.nonpositive=n=>t.check(We(0,n)),t.multipleOf=(n,o)=>t.check(hr(n,o)),t.step=(n,o)=>t.check(hr(n,o)),t.finite=()=>t;let r=t._zod.bag;t.minValue=Math.max(r.minimum??Number.NEGATIVE_INFINITY,r.exclusiveMinimum??Number.NEGATIVE_INFINITY)??null,t.maxValue=Math.min(r.maximum??Number.POSITIVE_INFINITY,r.exclusiveMaximum??Number.POSITIVE_INFINITY)??null,t.isInt=(r.format??"").includes("int")||Number.isSafeInteger(r.multipleOf??.5),t.isFinite=!0,t.format=r.format??null});function ne(t){return Mu(aa,t)}var Xr=p("ZodNumberFormat",(t,e)=>{Kc.init(t,e),aa.init(t,e)});function zl(t){return Cu(Xr,t)}function gx(t){return Zu(Xr,t)}function vx(t){return Lu(Xr,t)}function _x(t){return qu(Xr,t)}function yx(t){return Fu(Xr,t)}var sa=p("ZodBoolean",(t,e)=>{Bn.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Dm(t,r,n,o)});function _e(t){return Vu(sa,t)}var ca=p("ZodBigInt",(t,e)=>{zi.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>Nm(t,n,o,i),t.gte=(n,o)=>t.check(Ae(n,o)),t.min=(n,o)=>t.check(Ae(n,o)),t.gt=(n,o)=>t.check(Dt(n,o)),t.gte=(n,o)=>t.check(Ae(n,o)),t.min=(n,o)=>t.check(Ae(n,o)),t.lt=(n,o)=>t.check(jt(n,o)),t.lte=(n,o)=>t.check(We(n,o)),t.max=(n,o)=>t.check(We(n,o)),t.positive=n=>t.check(Dt(BigInt(0),n)),t.negative=n=>t.check(jt(BigInt(0),n)),t.nonpositive=n=>t.check(We(BigInt(0),n)),t.nonnegative=n=>t.check(Ae(BigInt(0),n)),t.multipleOf=(n,o)=>t.check(hr(n,o));let r=t._zod.bag;t.minValue=r.minimum??null,t.maxValue=r.maximum??null,t.format=r.format??null});function $x(t){return Ju(ca,t)}var Vl=p("ZodBigIntFormat",(t,e)=>{Hc.init(t,e),ca.init(t,e)});function bx(t){return Ku(Vl,t)}function xx(t){return Hu(Vl,t)}var jh=p("ZodSymbol",(t,e)=>{Wc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Rm(t,r,n,o)});function kx(t){return Wu(jh,t)}var Dh=p("ZodUndefined",(t,e)=>{Gc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Um(t,r,n,o)});function Sx(t){return Gu(Dh,t)}var Nh=p("ZodNull",(t,e)=>{Bc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Am(t,r,n,o)});function vo(t){return Bu(Nh,t)}var Rh=p("ZodAny",(t,e)=>{Xc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Zm(t,r,n,o)});function wx(){return Xu(Rh)}var Ah=p("ZodUnknown",(t,e)=>{Yc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Lm(t,r,n,o)});function ue(){return Yu(Ah)}var Uh=p("ZodNever",(t,e)=>{Qc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Cm(t,r,n,o)});function Jl(t){return Qu(Uh,t)}var Mh=p("ZodVoid",(t,e)=>{eu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Mm(t,r,n,o)});function zx(t){return el(Mh,t)}var Kl=p("ZodDate",(t,e)=>{tu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>qm(t,n,o,i),t.min=(n,o)=>t.check(Ae(n,o)),t.max=(n,o)=>t.check(We(n,o));let r=t._zod.bag;t.minDate=r.minimum?new Date(r.minimum):null,t.maxDate=r.maximum?new Date(r.maximum):null});function Ix(t){return tl(Kl,t)}var Ch=p("ZodArray",(t,e)=>{ru.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>eh(t,r,n,o),t.element=e.element,t.min=(r,n)=>t.check(Xt(r,n)),t.nonempty=r=>t.check(Xt(1,r)),t.max=(r,n)=>t.check(Hr(r,n)),t.length=(r,n)=>t.check(Wr(r,n)),t.unwrap=()=>t.element});function G(t,e){return Tm(Ch,t,e)}function Ex(t){let e=t._zod.def.shape;return Te(Object.keys(e))}var ua=p("ZodObject",(t,e)=>{Im.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>th(t,r,n,o),y.defineLazy(t,"shape",()=>e.shape),t.keyof=()=>Te(Object.keys(t._zod.def.shape)),t.catchall=r=>t.clone({...t._zod.def,catchall:r}),t.passthrough=()=>t.clone({...t._zod.def,catchall:ue()}),t.loose=()=>t.clone({...t._zod.def,catchall:ue()}),t.strict=()=>t.clone({...t._zod.def,catchall:Jl()}),t.strip=()=>t.clone({...t._zod.def,catchall:void 0}),t.extend=r=>y.extend(t,r),t.safeExtend=r=>y.safeExtend(t,r),t.merge=r=>y.merge(t,r),t.pick=r=>y.pick(t,r),t.omit=r=>y.omit(t,r),t.partial=(...r)=>y.partial(Wl,t,r[0]),t.required=(...r)=>y.required(Gl,t,r[0])});function z(t,e){let r={type:"object",shape:t??{},...y.normalizeParams(e)};return new ua(r)}function Tx(t,e){return new ua({type:"object",shape:t,catchall:Jl(),...y.normalizeParams(e)})}function Ee(t,e){return new ua({type:"object",shape:t,catchall:ue(),...y.normalizeParams(e)})}var la=p("ZodUnion",(t,e)=>{Xn.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>hl(t,r,n,o),t.options=e.options});function ie(t,e){return new la({type:"union",options:t,...y.normalizeParams(e)})}var Zh=p("ZodXor",(t,e)=>{la.init(t,e),nu.init(t,e),t._zod.processJSONSchema=(r,n,o)=>hl(t,r,n,o),t.options=e.options});function Px(t,e){return new Zh({type:"union",options:t,inclusive:!1,...y.normalizeParams(e)})}var Lh=p("ZodDiscriminatedUnion",(t,e)=>{la.init(t,e),ou.init(t,e)});function da(t,e,r){return new Lh({type:"union",options:e,discriminator:t,...y.normalizeParams(r)})}var qh=p("ZodIntersection",(t,e)=>{iu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>rh(t,r,n,o)});function _o(t,e){return new qh({type:"intersection",left:t,right:e})}var Fh=p("ZodTuple",(t,e)=>{Ii.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>nh(t,r,n,o),t.rest=r=>t.clone({...t._zod.def,rest:r})});function Vh(t,e,r){let n=e instanceof Z,o=n?r:e,i=n?e:null;return new Fh({type:"tuple",items:t,rest:i,...y.normalizeParams(o)})}var pa=p("ZodRecord",(t,e)=>{au.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>oh(t,r,n,o),t.keyType=e.keyType,t.valueType=e.valueType});function pe(t,e,r){return new pa({type:"record",keyType:t,valueType:e,...y.normalizeParams(r)})}function Ox(t,e,r){let n=Ne(t);return n._zod.values=void 0,new pa({type:"record",keyType:n,valueType:e,...y.normalizeParams(r)})}function jx(t,e,r){return new pa({type:"record",keyType:t,valueType:e,mode:"loose",...y.normalizeParams(r)})}var Jh=p("ZodMap",(t,e)=>{su.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Ym(t,r,n,o),t.keyType=e.keyType,t.valueType=e.valueType,t.min=(...r)=>t.check(Nt(...r)),t.nonempty=r=>t.check(Nt(1,r)),t.max=(...r)=>t.check(gr(...r)),t.size=(...r)=>t.check(Kr(...r))});function Dx(t,e,r){return new Jh({type:"map",keyType:t,valueType:e,...y.normalizeParams(r)})}var Kh=p("ZodSet",(t,e)=>{cu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Qm(t,r,n,o),t.min=(...r)=>t.check(Nt(...r)),t.nonempty=r=>t.check(Nt(1,r)),t.max=(...r)=>t.check(gr(...r)),t.size=(...r)=>t.check(Kr(...r))});function Nx(t,e){return new Kh({type:"set",valueType:t,...y.normalizeParams(e)})}var ho=p("ZodEnum",(t,e)=>{uu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>Fm(t,n,o,i),t.enum=e.entries,t.options=Object.values(e.entries);let r=new Set(Object.keys(e.entries));t.extract=(n,o)=>{let i={};for(let a of n)if(r.has(a))i[a]=e.entries[a];else throw new Error(`Key ${a} not found in enum`);return new ho({...e,checks:[],...y.normalizeParams(o),entries:i})},t.exclude=(n,o)=>{let i={...e.entries};for(let a of n)if(r.has(a))delete i[a];else throw new Error(`Key ${a} not found in enum`);return new ho({...e,checks:[],...y.normalizeParams(o),entries:i})}});function Te(t,e){let r=Array.isArray(t)?Object.fromEntries(t.map(n=>[n,n])):t;return new ho({type:"enum",entries:r,...y.normalizeParams(e)})}function Rx(t,e){return new ho({type:"enum",entries:t,...y.normalizeParams(e)})}var Hh=p("ZodLiteral",(t,e)=>{lu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Vm(t,r,n,o),t.values=new Set(e.values),Object.defineProperty(t,"value",{get(){if(e.values.length>1)throw new Error("This schema contains multiple valid literal values. Use `.values` instead.");return e.values[0]}})});function T(t,e){return new Hh({type:"literal",values:Array.isArray(t)?t:[t],...y.normalizeParams(e)})}var Wh=p("ZodFile",(t,e)=>{du.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Hm(t,r,n,o),t.min=(r,n)=>t.check(Nt(r,n)),t.max=(r,n)=>t.check(gr(r,n)),t.mime=(r,n)=>t.check(so(Array.isArray(r)?r:[r],n))});function Ax(t){return cl(Wh,t)}var Gh=p("ZodTransform",(t,e)=>{pu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Xm(t,r,n,o),t._zod.parse=(r,n)=>{if(n.direction==="backward")throw new dr(t.constructor.name);r.addIssue=i=>{if(typeof i=="string")r.issues.push(y.issue(i,r.value,e));else{let a=i;a.fatal&&(a.continue=!1),a.code??(a.code="custom"),a.input??(a.input=r.value),a.inst??(a.inst=t),r.issues.push(y.issue(a))}};let o=e.transform(r.value,r);return o instanceof Promise?o.then(i=>(r.value=i,r)):(r.value=o,r)}});function Hl(t){return new Gh({type:"transform",transform:t})}var Wl=p("ZodOptional",(t,e)=>{Ei.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>gl(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function fe(t){return new Wl({type:"optional",innerType:t})}var Bh=p("ZodExactOptional",(t,e)=>{fu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>gl(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function Xh(t){return new Bh({type:"optional",innerType:t})}var Yh=p("ZodNullable",(t,e)=>{mu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ih(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function ra(t){return new Yh({type:"nullable",innerType:t})}function Ux(t){return fe(ra(t))}var Qh=p("ZodDefault",(t,e)=>{hu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>sh(t,r,n,o),t.unwrap=()=>t._zod.def.innerType,t.removeDefault=t.unwrap});function eg(t,e){return new Qh({type:"default",innerType:t,get defaultValue(){return typeof e=="function"?e():y.shallowClone(e)}})}var tg=p("ZodPrefault",(t,e)=>{gu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ch(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function rg(t,e){return new tg({type:"prefault",innerType:t,get defaultValue(){return typeof e=="function"?e():y.shallowClone(e)}})}var Gl=p("ZodNonOptional",(t,e)=>{vu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ah(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function ng(t,e){return new Gl({type:"nonoptional",innerType:t,...y.normalizeParams(e)})}var og=p("ZodSuccess",(t,e)=>{_u.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Wm(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function Mx(t){return new og({type:"success",innerType:t})}var ig=p("ZodCatch",(t,e)=>{yu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>uh(t,r,n,o),t.unwrap=()=>t._zod.def.innerType,t.removeCatch=t.unwrap});function ag(t,e){return new ig({type:"catch",innerType:t,catchValue:typeof e=="function"?e:()=>e})}var sg=p("ZodNaN",(t,e)=>{$u.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Jm(t,r,n,o)});function Cx(t){return rl(sg,t)}var Bl=p("ZodPipe",(t,e)=>{bu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>lh(t,r,n,o),t.in=e.in,t.out=e.out});function na(t,e){return new Bl({type:"pipe",in:t,out:e})}var Xl=p("ZodCodec",(t,e)=>{Bl.init(t,e),Yn.init(t,e)});function Zx(t,e,r){return new Xl({type:"pipe",in:t,out:e,transform:r.decode,reverseTransform:r.encode})}var cg=p("ZodReadonly",(t,e)=>{xu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>dh(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function ug(t){return new cg({type:"readonly",innerType:t})}var lg=p("ZodTemplateLiteral",(t,e)=>{ku.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Km(t,r,n,o)});function Lx(t,e){return new lg({type:"template_literal",parts:t,...y.normalizeParams(e)})}var dg=p("ZodLazy",(t,e)=>{zu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>fh(t,r,n,o),t.unwrap=()=>t._zod.def.getter()});function pg(t){return new dg({type:"lazy",getter:t})}var fg=p("ZodPromise",(t,e)=>{wu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ph(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function qx(t){return new fg({type:"promise",innerType:t})}var mg=p("ZodFunction",(t,e)=>{Su.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Bm(t,r,n,o)});function Fx(t){return new mg({type:"function",input:Array.isArray(t?.input)?Vh(t?.input):t?.input??G(ue()),output:t?.output??ue()})}var fa=p("ZodCustom",(t,e)=>{Iu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Gm(t,r,n,o)});function Vx(t){let e=new se({check:"custom"});return e._zod.check=t,e}function Yl(t,e){return ul(fa,t??(()=>!0),e)}function hg(t,e={}){return ll(fa,t,e)}function gg(t){return dl(t)}var Jx=pl,Kx=fl;function Hx(t,e={}){let r=new fa({type:"custom",check:"custom",fn:n=>n instanceof t,abort:!0,...y.normalizeParams(e)});return r._zod.bag.Class=t,r._zod.check=n=>{n.value instanceof t||n.issues.push({code:"invalid_type",expected:t.name,input:n.value,inst:r,path:[...r._zod.def.path??[]]})},r}var Wx=(...t)=>ml({Codec:Xl,Boolean:sa,String:oa},...t);function Gx(t){let e=pg(()=>ie([h(t),ne(),_e(),vo(),G(e),pe(h(),e)]));return e}function ma(t,e){return na(Hl(t),e)}var vg;vg||(vg={});var GN={...mo,...ea,iso:vr};ye(Eu());var ed="2025-11-25";var _g=[ed,"2025-06-18","2025-03-26","2024-11-05","2024-10-07"],Qt="io.modelcontextprotocol/related-task",ga="2.0",be=Yl(t=>t!==null&&(typeof t=="object"||typeof t=="function")),yg=ie([h(),ne().int()]),$g=h(),m4=Ee({ttl:ie([ne(),vo()]).optional(),pollInterval:ne().optional()}),Qx=z({ttl:ne().optional()}),ek=z({taskId:h()}),td=Ee({progressToken:yg.optional(),[Qt]:ek.optional()}),Be=z({_meta:td.optional()}),yo=Be.extend({task:Qx.optional()}),bg=t=>yo.safeParse(t).success,xe=z({method:h(),params:Be.loose().optional()}),et=z({_meta:td.optional()}),tt=z({method:h(),params:et.loose().optional()}),ke=Ee({_meta:td.optional()}),va=ie([h(),ne().int()]),xg=z({jsonrpc:T(ga),id:va,...xe.shape}).strict(),rd=t=>xg.safeParse(t).success,kg=z({jsonrpc:T(ga),...tt.shape}).strict(),Sg=t=>kg.safeParse(t).success,nd=z({jsonrpc:T(ga),id:va,result:ke}).strict(),$o=t=>nd.safeParse(t).success;var Y;(function(t){t[t.ConnectionClosed=-32e3]="ConnectionClosed",t[t.RequestTimeout=-32001]="RequestTimeout",t[t.ParseError=-32700]="ParseError",t[t.InvalidRequest=-32600]="InvalidRequest",t[t.MethodNotFound=-32601]="MethodNotFound",t[t.InvalidParams=-32602]="InvalidParams",t[t.InternalError=-32603]="InternalError",t[t.UrlElicitationRequired=-32042]="UrlElicitationRequired"})(Y||(Y={}));var od=z({jsonrpc:T(ga),id:va.optional(),error:z({code:ne().int(),message:h(),data:ue().optional()})}).strict();var wg=t=>od.safeParse(t).success;var zg=ie([xg,kg,nd,od]),h4=ie([nd,od]),_a=ke.strict(),tk=et.extend({requestId:va.optional(),reason:h().optional()}),ya=tt.extend({method:T("notifications/cancelled"),params:tk}),rk=z({src:h(),mimeType:h().optional(),sizes:G(h()).optional(),theme:Te(["light","dark"]).optional()}),bo=z({icons:G(rk).optional()}),Yr=z({name:h(),title:h().optional()}),Ig=Yr.extend({...Yr.shape,...bo.shape,version:h(),websiteUrl:h().optional(),description:h().optional()}),nk=_o(z({applyDefaults:_e().optional()}),pe(h(),ue())),ok=ma(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0?{form:{}}:t,_o(z({form:nk.optional(),url:be.optional()}),pe(h(),ue()).optional())),ik=Ee({list:be.optional(),cancel:be.optional(),requests:Ee({sampling:Ee({createMessage:be.optional()}).optional(),elicitation:Ee({create:be.optional()}).optional()}).optional()}),ak=Ee({list:be.optional(),cancel:be.optional(),requests:Ee({tools:Ee({call:be.optional()}).optional()}).optional()}),sk=z({experimental:pe(h(),be).optional(),sampling:z({context:be.optional(),tools:be.optional()}).optional(),elicitation:ok.optional(),roots:z({listChanged:_e().optional()}).optional(),tasks:ik.optional()}),ck=Be.extend({protocolVersion:h(),capabilities:sk,clientInfo:Ig}),id=xe.extend({method:T("initialize"),params:ck});var uk=z({experimental:pe(h(),be).optional(),logging:be.optional(),completions:be.optional(),prompts:z({listChanged:_e().optional()}).optional(),resources:z({subscribe:_e().optional(),listChanged:_e().optional()}).optional(),tools:z({listChanged:_e().optional()}).optional(),tasks:ak.optional()}),lk=ke.extend({protocolVersion:h(),capabilities:uk,serverInfo:Ig,instructions:h().optional()}),ad=tt.extend({method:T("notifications/initialized"),params:et.optional()});var $a=xe.extend({method:T("ping"),params:Be.optional()}),dk=z({progress:ne(),total:fe(ne()),message:fe(h())}),pk=z({...et.shape,...dk.shape,progressToken:yg}),ba=tt.extend({method:T("notifications/progress"),params:pk}),fk=Be.extend({cursor:$g.optional()}),xo=xe.extend({params:fk.optional()}),ko=ke.extend({nextCursor:$g.optional()}),mk=Te(["working","input_required","completed","failed","cancelled"]),So=z({taskId:h(),status:mk,ttl:ie([ne(),vo()]),createdAt:h(),lastUpdatedAt:h(),pollInterval:fe(ne()),statusMessage:fe(h())}),Qr=ke.extend({task:So}),hk=et.merge(So),wo=tt.extend({method:T("notifications/tasks/status"),params:hk}),xa=xe.extend({method:T("tasks/get"),params:Be.extend({taskId:h()})}),ka=ke.merge(So),Sa=xe.extend({method:T("tasks/result"),params:Be.extend({taskId:h()})}),g4=ke.loose(),wa=xo.extend({method:T("tasks/list")}),za=ko.extend({tasks:G(So)}),Ia=xe.extend({method:T("tasks/cancel"),params:Be.extend({taskId:h()})}),Eg=ke.merge(So),Tg=z({uri:h(),mimeType:fe(h()),_meta:pe(h(),ue()).optional()}),Pg=Tg.extend({text:h()}),sd=h().refine(t=>{try{return atob(t),!0}catch{return!1}},{message:"Invalid Base64 string"}),Og=Tg.extend({blob:sd}),zo=Te(["user","assistant"]),en=z({audience:G(zo).optional(),priority:ne().min(0).max(1).optional(),lastModified:vr.datetime({offset:!0}).optional()}),jg=z({...Yr.shape,...bo.shape,uri:h(),description:fe(h()),mimeType:fe(h()),annotations:en.optional(),_meta:fe(Ee({}))}),gk=z({...Yr.shape,...bo.shape,uriTemplate:h(),description:fe(h()),mimeType:fe(h()),annotations:en.optional(),_meta:fe(Ee({}))}),vk=xo.extend({method:T("resources/list")}),_k=ko.extend({resources:G(jg)}),yk=xo.extend({method:T("resources/templates/list")}),$k=ko.extend({resourceTemplates:G(gk)}),cd=Be.extend({uri:h()}),bk=cd,xk=xe.extend({method:T("resources/read"),params:bk}),kk=ke.extend({contents:G(ie([Pg,Og]))}),Sk=tt.extend({method:T("notifications/resources/list_changed"),params:et.optional()}),wk=cd,zk=xe.extend({method:T("resources/subscribe"),params:wk}),Ik=cd,Ek=xe.extend({method:T("resources/unsubscribe"),params:Ik}),Tk=et.extend({uri:h()}),Pk=tt.extend({method:T("notifications/resources/updated"),params:Tk}),Ok=z({name:h(),description:fe(h()),required:fe(_e())}),jk=z({...Yr.shape,...bo.shape,description:fe(h()),arguments:fe(G(Ok)),_meta:fe(Ee({}))}),Dk=xo.extend({method:T("prompts/list")}),Nk=ko.extend({prompts:G(jk)}),Rk=Be.extend({name:h(),arguments:pe(h(),h()).optional()}),Ak=xe.extend({method:T("prompts/get"),params:Rk}),ud=z({type:T("text"),text:h(),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),ld=z({type:T("image"),data:sd,mimeType:h(),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),dd=z({type:T("audio"),data:sd,mimeType:h(),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),Uk=z({type:T("tool_use"),name:h(),id:h(),input:pe(h(),ue()),_meta:pe(h(),ue()).optional()}),Mk=z({type:T("resource"),resource:ie([Pg,Og]),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),Ck=jg.extend({type:T("resource_link")}),pd=ie([ud,ld,dd,Ck,Mk]),Zk=z({role:zo,content:pd}),Lk=ke.extend({description:h().optional(),messages:G(Zk)}),qk=tt.extend({method:T("notifications/prompts/list_changed"),params:et.optional()}),Fk=z({title:h().optional(),readOnlyHint:_e().optional(),destructiveHint:_e().optional(),idempotentHint:_e().optional(),openWorldHint:_e().optional()}),Vk=z({taskSupport:Te(["required","optional","forbidden"]).optional()}),Dg=z({...Yr.shape,...bo.shape,description:h().optional(),inputSchema:z({type:T("object"),properties:pe(h(),be).optional(),required:G(h()).optional()}).catchall(ue()),outputSchema:z({type:T("object"),properties:pe(h(),be).optional(),required:G(h()).optional()}).catchall(ue()).optional(),annotations:Fk.optional(),execution:Vk.optional(),_meta:pe(h(),ue()).optional()}),fd=xo.extend({method:T("tools/list")}),Jk=ko.extend({tools:G(Dg)}),Ea=ke.extend({content:G(pd).default([]),structuredContent:pe(h(),ue()).optional(),isError:_e().optional()}),v4=Ea.or(ke.extend({toolResult:ue()})),Kk=yo.extend({name:h(),arguments:pe(h(),ue()).optional()}),Io=xe.extend({method:T("tools/call"),params:Kk}),Hk=tt.extend({method:T("notifications/tools/list_changed"),params:et.optional()}),_4=z({autoRefresh:_e().default(!0),debounceMs:ne().int().nonnegative().default(300)}),Eo=Te(["debug","info","notice","warning","error","critical","alert","emergency"]),Wk=Be.extend({level:Eo}),md=xe.extend({method:T("logging/setLevel"),params:Wk}),Gk=et.extend({level:Eo,logger:h().optional(),data:ue()}),Bk=tt.extend({method:T("notifications/message"),params:Gk}),Xk=z({name:h().optional()}),Yk=z({hints:G(Xk).optional(),costPriority:ne().min(0).max(1).optional(),speedPriority:ne().min(0).max(1).optional(),intelligencePriority:ne().min(0).max(1).optional()}),Qk=z({mode:Te(["auto","required","none"]).optional()}),eS=z({type:T("tool_result"),toolUseId:h().describe("The unique identifier for the corresponding tool call."),content:G(pd).default([]),structuredContent:z({}).loose().optional(),isError:_e().optional(),_meta:pe(h(),ue()).optional()}),tS=da("type",[ud,ld,dd]),ha=da("type",[ud,ld,dd,Uk,eS]),rS=z({role:zo,content:ie([ha,G(ha)]),_meta:pe(h(),ue()).optional()}),nS=yo.extend({messages:G(rS),modelPreferences:Yk.optional(),systemPrompt:h().optional(),includeContext:Te(["none","thisServer","allServers"]).optional(),temperature:ne().optional(),maxTokens:ne().int(),stopSequences:G(h()).optional(),metadata:be.optional(),tools:G(Dg).optional(),toolChoice:Qk.optional()}),oS=xe.extend({method:T("sampling/createMessage"),params:nS}),hd=ke.extend({model:h(),stopReason:fe(Te(["endTurn","stopSequence","maxTokens"]).or(h())),role:zo,content:tS}),gd=ke.extend({model:h(),stopReason:fe(Te(["endTurn","stopSequence","maxTokens","toolUse"]).or(h())),role:zo,content:ie([ha,G(ha)])}),iS=z({type:T("boolean"),title:h().optional(),description:h().optional(),default:_e().optional()}),aS=z({type:T("string"),title:h().optional(),description:h().optional(),minLength:ne().optional(),maxLength:ne().optional(),format:Te(["email","uri","date","date-time"]).optional(),default:h().optional()}),sS=z({type:Te(["number","integer"]),title:h().optional(),description:h().optional(),minimum:ne().optional(),maximum:ne().optional(),default:ne().optional()}),cS=z({type:T("string"),title:h().optional(),description:h().optional(),enum:G(h()),default:h().optional()}),uS=z({type:T("string"),title:h().optional(),description:h().optional(),oneOf:G(z({const:h(),title:h()})),default:h().optional()}),lS=z({type:T("string"),title:h().optional(),description:h().optional(),enum:G(h()),enumNames:G(h()).optional(),default:h().optional()}),dS=ie([cS,uS]),pS=z({type:T("array"),title:h().optional(),description:h().optional(),minItems:ne().optional(),maxItems:ne().optional(),items:z({type:T("string"),enum:G(h())}),default:G(h()).optional()}),fS=z({type:T("array"),title:h().optional(),description:h().optional(),minItems:ne().optional(),maxItems:ne().optional(),items:z({anyOf:G(z({const:h(),title:h()}))}),default:G(h()).optional()}),mS=ie([pS,fS]),hS=ie([lS,dS,mS]),gS=ie([hS,iS,aS,sS]),vS=yo.extend({mode:T("form").optional(),message:h(),requestedSchema:z({type:T("object"),properties:pe(h(),gS),required:G(h()).optional()})}),_S=yo.extend({mode:T("url"),message:h(),elicitationId:h(),url:h().url()}),yS=ie([vS,_S]),$S=xe.extend({method:T("elicitation/create"),params:yS}),bS=et.extend({elicitationId:h()}),xS=tt.extend({method:T("notifications/elicitation/complete"),params:bS}),Ta=ke.extend({action:Te(["accept","decline","cancel"]),content:ma(t=>t===null?void 0:t,pe(h(),ie([h(),ne(),_e(),G(h())])).optional())}),kS=z({type:T("ref/resource"),uri:h()});var SS=z({type:T("ref/prompt"),name:h()}),wS=Be.extend({ref:ie([SS,kS]),argument:z({name:h(),value:h()}),context:z({arguments:pe(h(),h()).optional()}).optional()}),zS=xe.extend({method:T("completion/complete"),params:wS});var IS=ke.extend({completion:Ee({values:G(h()).max(100),total:fe(ne().int()),hasMore:fe(_e())})}),ES=z({uri:h().startsWith("file://"),name:h().optional(),_meta:pe(h(),ue()).optional()}),TS=xe.extend({method:T("roots/list"),params:Be.optional()}),vd=ke.extend({roots:G(ES)}),PS=tt.extend({method:T("notifications/roots/list_changed"),params:et.optional()}),y4=ie([$a,id,zS,md,Ak,Dk,vk,yk,xk,zk,Ek,Io,fd,xa,Sa,wa,Ia]),$4=ie([ya,ba,ad,PS,wo]),b4=ie([_a,hd,gd,Ta,vd,ka,za,Qr]),x4=ie([$a,oS,$S,TS,xa,Sa,wa,Ia]),k4=ie([ya,ba,Bk,Pk,Sk,Hk,qk,wo,xS]),S4=ie([_a,lk,IS,Lk,Nk,_k,$k,kk,Ea,Jk,ka,za,Qr]),J=class t extends Error{constructor(e,r,n){super(`MCP error ${e}: ${r}`),this.code=e,this.data=n,this.name="McpError"}static fromError(e,r,n){if(e===Y.UrlElicitationRequired&&n){let o=n;if(o.elicitations)return new Ql(o.elicitations,r)}return new t(e,r,n)}},Ql=class extends J{constructor(e,r=`URL elicitation${e.length>1?"s":""} required`){super(Y.UrlElicitationRequired,r,{elicitations:e})}get elicitations(){return this.data?.elicitations??[]}};function er(t){return t==="completed"||t==="failed"||t==="cancelled"}var oR=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function _d(t){let r=Qi(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=vh(r);if(typeof n!="string")throw new Error("Schema method literal must be a string");return n}function yd(t,e){let r=Yt(t,e);if(!r.success)throw r.error;return r.data}var AS=6e4,Pa=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(ya,r=>{this._oncancel(r)}),this.setNotificationHandler(ba,r=>{this._onprogress(r)}),this.setRequestHandler($a,r=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(xa,async(r,n)=>{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new J(Y.InvalidParams,"Failed to retrieve task: Task not found");return{...o}}),this.setRequestHandler(Sa,async(r,n)=>{let o=async()=>{let i=r.params.taskId;if(this._taskMessageQueue){let s;for(;s=await this._taskMessageQueue.dequeue(i,n.sessionId);){if(s.type==="response"||s.type==="error"){let c=s.message,u=c.id,l=this._requestResolvers.get(u);if(l)if(this._requestResolvers.delete(u),s.type==="response")l(c);else{let d=c,m=new J(d.error.code,d.error.message,d.error.data);l(m)}else{let d=s.type==="response"?"Response":"Error";this._onerror(new Error(`${d} handler missing for request ${u}`))}continue}await this._transport?.send(s.message,{relatedRequestId:n.requestId})}}let a=await this._taskStore.getTask(i,n.sessionId);if(!a)throw new J(Y.InvalidParams,`Task not found: ${i}`);if(!er(a.status))return await this._waitForTaskUpdate(i,n.signal),await o();if(er(a.status)){let s=await this._taskStore.getTaskResult(i,n.sessionId);return this._clearTaskQueue(i),{...s,_meta:{...s._meta,[Qt]:{taskId:i}}}}return await o()};return await o()}),this.setRequestHandler(wa,async(r,n)=>{try{let{tasks:o,nextCursor:i}=await this._taskStore.listTasks(r.params?.cursor,n.sessionId);return{tasks:o,nextCursor:i,_meta:{}}}catch(o){throw new J(Y.InvalidParams,`Failed to list tasks: ${o instanceof Error?o.message:String(o)}`)}}),this.setRequestHandler(Ia,async(r,n)=>{try{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new J(Y.InvalidParams,`Task not found: ${r.params.taskId}`);if(er(o.status))throw new J(Y.InvalidParams,`Cannot cancel task in terminal status: ${o.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",n.sessionId),this._clearTaskQueue(r.params.taskId);let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new J(Y.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return{_meta:{},...i}}catch(o){throw o instanceof J?o:new J(Y.InvalidRequest,`Failed to cancel task: ${o instanceof Error?o.message:String(o)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,r,n,o,i=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(o,r),startTime:Date.now(),timeout:r,maxTotalTimeout:n,resetTimeoutOnProgress:i,onTimeout:o})}_resetTimeout(e){let r=this._timeoutInfo.get(e);if(!r)return!1;let n=Date.now()-r.startTime;if(r.maxTotalTimeout&&n>=r.maxTotalTimeout)throw this._timeoutInfo.delete(e),J.fromError(Y.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:r.maxTotalTimeout,totalElapsed:n});return clearTimeout(r.timeoutId),r.timeoutId=setTimeout(r.onTimeout,r.timeout),!0}_cleanupTimeout(e){let r=this._timeoutInfo.get(e);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(e))}async connect(e){this._transport=e;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose()};let n=this.transport?.onerror;this._transport.onerror=i=>{n?.(i),this._onerror(i)};let o=this._transport?.onmessage;this._transport.onmessage=(i,a)=>{o?.(i,a),$o(i)||wg(i)?this._onresponse(i):rd(i)?this._onrequest(i,a):Sg(i)?this._onnotification(i):this._onerror(new Error(`Unknown message type: ${JSON.stringify(i)}`))},await this._transport.start()}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();let r=J.fromError(Y.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let n of e.values())n(r)}_onerror(e){this.onerror?.(e)}_onnotification(e){let r=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(e)).catch(n=>this._onerror(new Error(`Uncaught error in notification handler: ${n}`)))}_onrequest(e,r){let n=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,o=this._transport,i=e.params?._meta?.[Qt]?.taskId;if(n===void 0){let l={jsonrpc:"2.0",id:e.id,error:{code:Y.MethodNotFound,message:"Method not found"}};i&&this._taskMessageQueue?this._enqueueTaskMessage(i,{type:"error",message:l,timestamp:Date.now()},o?.sessionId).catch(d=>this._onerror(new Error(`Failed to enqueue error response: ${d}`))):o?.send(l).catch(d=>this._onerror(new Error(`Failed to send an error response: ${d}`)));return}let a=new AbortController;this._requestHandlerAbortControllers.set(e.id,a);let s=bg(e.params)?e.params.task:void 0,c=this._taskStore?this.requestTaskStore(e,o?.sessionId):void 0,u={signal:a.signal,sessionId:o?.sessionId,_meta:e.params?._meta,sendNotification:async l=>{let d={relatedRequestId:e.id};i&&(d.relatedTask={taskId:i}),await this.notification(l,d)},sendRequest:async(l,d,m)=>{let f={...m,relatedRequestId:e.id};i&&!f.relatedTask&&(f.relatedTask={taskId:i});let g=f.relatedTask?.taskId??i;return g&&c&&await c.updateTaskStatus(g,"input_required"),await this.request(l,d,f)},authInfo:r?.authInfo,requestId:e.id,requestInfo:r?.requestInfo,taskId:i,taskStore:c,taskRequestedTtl:s?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{s&&this.assertTaskHandlerCapability(e.method)}).then(()=>n(e,u)).then(async l=>{if(a.signal.aborted)return;let d={result:l,jsonrpc:"2.0",id:e.id};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"response",message:d,timestamp:Date.now()},o?.sessionId):await o?.send(d)},async l=>{if(a.signal.aborted)return;let d={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(l.code)?l.code:Y.InternalError,message:l.message??"Internal error",...l.data!==void 0&&{data:l.data}}};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"error",message:d,timestamp:Date.now()},o?.sessionId):await o?.send(d)}).catch(l=>this._onerror(new Error(`Failed to send response: ${l}`))).finally(()=>{this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:r,...n}=e.params,o=Number(r),i=this._progressHandlers.get(o);if(!i){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let a=this._responseHandlers.get(o),s=this._timeoutInfo.get(o);if(s&&a&&s.resetTimeoutOnProgress)try{this._resetTimeout(o)}catch(c){this._responseHandlers.delete(o),this._progressHandlers.delete(o),this._cleanupTimeout(o),a(c);return}i(n)}_onresponse(e){let r=Number(e.id),n=this._requestResolvers.get(r);if(n){if(this._requestResolvers.delete(r),$o(e))n(e);else{let a=new J(e.error.code,e.error.message,e.error.data);n(a)}return}let o=this._responseHandlers.get(r);if(o===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let i=!1;if($o(e)&&e.result&&typeof e.result=="object"){let a=e.result;if(a.task&&typeof a.task=="object"){let s=a.task;typeof s.taskId=="string"&&(i=!0,this._taskProgressTokens.set(s.taskId,r))}}if(i||this._progressHandlers.delete(r),$o(e))o(e);else{let a=J.fromError(e.error.code,e.error.message,e.error.data);o(a)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,r,n){let{task:o}=n??{};if(!o){try{yield{type:"result",result:await this.request(e,r,n)}}catch(a){yield{type:"error",error:a instanceof J?a:new J(Y.InternalError,String(a))}}return}let i;try{let a=await this.request(e,Qr,n);if(a.task)i=a.task.taskId,yield{type:"taskCreated",task:a.task};else throw new J(Y.InternalError,"Task creation did not return a task");for(;;){let s=await this.getTask({taskId:i},n);if(yield{type:"taskStatus",task:s},er(s.status)){s.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:i},r,n)}:s.status==="failed"?yield{type:"error",error:new J(Y.InternalError,`Task ${i} failed`)}:s.status==="cancelled"&&(yield{type:"error",error:new J(Y.InternalError,`Task ${i} was cancelled`)});return}if(s.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:i},r,n)};return}let c=s.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(u=>setTimeout(u,c)),n?.signal?.throwIfAborted()}}catch(a){yield{type:"error",error:a instanceof J?a:new J(Y.InternalError,String(a))}}}request(e,r,n){let{relatedRequestId:o,resumptionToken:i,onresumptiontoken:a,task:s,relatedTask:c}=n??{};return new Promise((u,l)=>{let d=O=>{l(O)};if(!this._transport){d(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),s&&this.assertTaskCapability(e.method)}catch(O){d(O);return}n?.signal?.throwIfAborted();let m=this._requestMessageId++,f={...e,jsonrpc:"2.0",id:m};n?.onprogress&&(this._progressHandlers.set(m,n.onprogress),f.params={...e.params,_meta:{...e.params?._meta||{},progressToken:m}}),s&&(f.params={...f.params,task:s}),c&&(f.params={...f.params,_meta:{...f.params?._meta||{},[Qt]:c}});let g=O=>{this._responseHandlers.delete(m),this._progressHandlers.delete(m),this._cleanupTimeout(m),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:m,reason:String(O)}},{relatedRequestId:o,resumptionToken:i,onresumptiontoken:a}).catch(M=>this._onerror(new Error(`Failed to send cancellation: ${M}`)));let I=O instanceof J?O:new J(Y.RequestTimeout,String(O));l(I)};this._responseHandlers.set(m,O=>{if(!n?.signal?.aborted){if(O instanceof Error)return l(O);try{let I=Yt(r,O.result);I.success?u(I.data):l(I.error)}catch(I){l(I)}}}),n?.signal?.addEventListener("abort",()=>{g(n?.signal?.reason)});let v=n?.timeout??AS,$=()=>g(J.fromError(Y.RequestTimeout,"Request timed out",{timeout:v}));this._setupTimeout(m,v,n?.maxTotalTimeout,$,n?.resetTimeoutOnProgress??!1);let x=c?.taskId;if(x){let O=I=>{let M=this._responseHandlers.get(m);M?M(I):this._onerror(new Error(`Response handler missing for side-channeled request ${m}`))};this._requestResolvers.set(m,O),this._enqueueTaskMessage(x,{type:"request",message:f,timestamp:Date.now()}).catch(I=>{this._cleanupTimeout(m),l(I)})}else this._transport.send(f,{relatedRequestId:o,resumptionToken:i,onresumptiontoken:a}).catch(O=>{this._cleanupTimeout(m),l(O)})})}async getTask(e,r){return this.request({method:"tasks/get",params:e},ka,r)}async getTaskResult(e,r,n){return this.request({method:"tasks/result",params:e},r,n)}async listTasks(e,r){return this.request({method:"tasks/list",params:e},za,r)}async cancelTask(e,r){return this.request({method:"tasks/cancel",params:e},Eg,r)}async notification(e,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let n=r?.relatedTask?.taskId;if(n){let s={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[Qt]:r.relatedTask}}};await this._enqueueTaskMessage(n,{type:"notification",message:s,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let s={...e,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[Qt]:r.relatedTask}}}),this._transport?.send(s,r).catch(c=>this._onerror(c))});return}let a={...e,jsonrpc:"2.0"};r?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[Qt]:r.relatedTask}}}),await this._transport.send(a,r)}setRequestHandler(e,r){let n=_d(e);this.assertRequestHandlerCapability(n),this._requestHandlers.set(n,(o,i)=>{let a=yd(e,o);return Promise.resolve(r(a,i))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,r){let n=_d(e);this._notificationHandlers.set(n,o=>{let i=yd(e,o);return Promise.resolve(r(i))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let r=this._taskProgressTokens.get(e);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,r,n){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let o=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,r,n,o)}async _clearTaskQueue(e,r){if(this._taskMessageQueue){let n=await this._taskMessageQueue.dequeueAll(e,r);for(let o of n)if(o.type==="request"&&rd(o.message)){let i=o.message.id,a=this._requestResolvers.get(i);a?(a(new J(Y.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(i)):this._onerror(new Error(`Resolver missing for request ${i} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,r){let n=this._options?.defaultTaskPollInterval??1e3;try{let o=await this._taskStore?.getTask(e);o?.pollInterval&&(n=o.pollInterval)}catch{}return new Promise((o,i)=>{if(r.aborted){i(new J(Y.InvalidRequest,"Request cancelled"));return}let a=setTimeout(o,n);r.addEventListener("abort",()=>{clearTimeout(a),i(new J(Y.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,r){let n=this._taskStore;if(!n)throw new Error("No task store configured");return{createTask:async o=>{if(!e)throw new Error("No request provided");return await n.createTask(o,e.id,{method:e.method,params:e.params},r)},getTask:async o=>{let i=await n.getTask(o,r);if(!i)throw new J(Y.InvalidParams,"Failed to retrieve task: Task not found");return i},storeTaskResult:async(o,i,a)=>{await n.storeTaskResult(o,i,a,r);let s=await n.getTask(o,r);if(s){let c=wo.parse({method:"notifications/tasks/status",params:s});await this.notification(c),er(s.status)&&this._cleanupTaskProgressHandler(o)}},getTaskResult:o=>n.getTaskResult(o,r),updateTaskStatus:async(o,i,a)=>{let s=await n.getTask(o,r);if(!s)throw new J(Y.InvalidParams,`Task "${o}" not found - it may have been cleaned up`);if(er(s.status))throw new J(Y.InvalidParams,`Cannot update task "${o}" from terminal status "${s.status}" to "${i}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await n.updateTaskStatus(o,i,a,r);let c=await n.getTask(o,r);if(c){let u=wo.parse({method:"notifications/tasks/status",params:c});await this.notification(u),er(c.status)&&this._cleanupTaskProgressHandler(o)}},listTasks:o=>n.listTasks(o,r)}}};function Ng(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Rg(t,e){let r={...t};for(let n in e){let o=n,i=e[o];if(i===void 0)continue;let a=r[o];Ng(a)&&Ng(i)?r[o]={...a,...i}:r[o]=i}return r}var by=si(of(),1),xy=si($y(),1);function zT(){let t=new by.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,xy.default)(t),t}var fs=class{constructor(e){this._ajv=e??zT()}getValidator(e){let r="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return n=>r(n)?{valid:!0,data:n,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var ms=class{constructor(e){this._server=e}requestStream(e,r,n){return this._server.requestStream(e,r,n)}async getTask(e,r){return this._server.getTask({taskId:e},r)}async getTaskResult(e,r,n){return this._server.getTaskResult({taskId:e},r,n)}async listTasks(e,r){return this._server.listTasks(e?{cursor:e}:void 0,r)}async cancelTask(e,r){return this._server.cancelTask({taskId:e},r)}};function ky(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${e})`);break;default:break}}function Sy(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var hs=class extends Pa{constructor(e,r){super(r),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(Eo.options.map((n,o)=>[n,o])),this.isMessageIgnored=(n,o)=>{let i=this._loggingLevels.get(o);return i?this.LOG_LEVEL_SEVERITY.get(n)this._oninitialize(n)),this.setNotificationHandler(ad,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(md,async(n,o)=>{let i=o.sessionId||o.requestInfo?.headers["mcp-session-id"]||void 0,{level:a}=n.params,s=Eo.safeParse(a);return s.success&&this._loggingLevels.set(i,s.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new ms(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=Rg(this._capabilities,e)}setRequestHandler(e,r){let o=Qi(e)?.method;if(!o)throw new Error("Schema is missing a method literal");let i;if(Br(o)){let s=o;i=s._zod?.def?.value??s.value}else{let s=o;i=s._def?.value??s.value}if(typeof i!="string")throw new Error("Schema method literal must be a string");if(i==="tools/call"){let s=async(c,u)=>{let l=Yt(Io,c);if(!l.success){let g=l.error instanceof Error?l.error.message:String(l.error);throw new J(Y.InvalidParams,`Invalid tools/call request: ${g}`)}let{params:d}=l.data,m=await Promise.resolve(r(c,u));if(d.task){let g=Yt(Qr,m);if(!g.success){let v=g.error instanceof Error?g.error.message:String(g.error);throw new J(Y.InvalidParams,`Invalid task creation result: ${v}`)}return g.data}let f=Yt(Ea,m);if(!f.success){let g=f.error instanceof Error?f.error.message:String(f.error);throw new J(Y.InvalidParams,`Invalid tools/call result: ${g}`)}return f.data};return super.setRequestHandler(e,s)}return super.setRequestHandler(e,r)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){Sy(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&ky(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let r=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:_g.includes(r)?r:ed,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},_a)}async createMessage(e,r){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let n=e.messages[e.messages.length-1],o=Array.isArray(n.content)?n.content:[n.content],i=o.some(u=>u.type==="tool_result"),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,s=a?Array.isArray(a.content)?a.content:[a.content]:[],c=s.some(u=>u.type==="tool_use");if(i){if(o.some(u=>u.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let u=new Set(s.filter(d=>d.type==="tool_use").map(d=>d.id)),l=new Set(o.filter(d=>d.type==="tool_result").map(d=>d.toolUseId));if(u.size!==l.size||![...u].every(d=>l.has(d)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},gd,r):this.request({method:"sampling/createMessage",params:e},hd,r)}async elicitInput(e,r){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let o=e;return this.request({method:"elicitation/create",params:o},Ta,r)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let o=e.mode==="form"?e:{...e,mode:"form"},i=await this.request({method:"elicitation/create",params:o},Ta,r);if(i.action==="accept"&&i.content&&o.requestedSchema)try{let s=this._jsonSchemaValidator.getValidator(o.requestedSchema)(i.content);if(!s.valid)throw new J(Y.InvalidParams,`Elicitation response content does not match requested schema: ${s.errorMessage}`)}catch(a){throw a instanceof J?a:new J(Y.InternalError,`Error validating elicitation response: ${a instanceof Error?a.message:String(a)}`)}return i}}}createElicitationCompletionNotifier(e,r){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},r)}async listRoots(e,r){return this.request({method:"roots/list",params:e},vd,r)}async sendLoggingMessage(e,r){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,r))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};var ff=si(require("node:process"),1);var gs=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(` `);if(e===-1)return null;let r=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),IT(r)}clear(){this._buffer=void 0}};function IT(t){return zg.parse(JSON.parse(t))}function wy(t){return JSON.stringify(t)+` -`}var vs=class{constructor(e=ff.default.stdin,r=ff.default.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new gs,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let n=wy(e);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};var hf=si(require("path"),1);var mf={DEFAULT:3e5,HEALTH_CHECK:3e3,POST_SPAWN_WAIT:5e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function zy(t){return process.platform==="win32"?Math.round(t*mf.WINDOWS_MULTIPLIER):t}var wt=require("fs"),_s=require("path"),Ty=require("os");var Iy="bugfix,feature,refactor,discovery,decision,change",Ey="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var qt=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-5",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,_s.join)((0,Ty.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:Iy,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:Ey,CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static getBool(e){let r=this.get(e);return r==="true"||r===!0}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS))process.env[n]!==void 0&&(r[n]=process.env[n]);return r}static loadFromFile(e){try{if(!(0,wt.existsSync)(e)){let a=this.getAllDefaults();try{let s=(0,_s.dirname)(e);(0,wt.existsSync)(s)||(0,wt.mkdirSync)(s,{recursive:!0}),(0,wt.writeFileSync)(e,JSON.stringify(a,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(s){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,s)}return this.applyEnvOverrides(a)}let r=(0,wt.readFileSync)(e,"utf-8"),n=JSON.parse(r),o=n;if(n.env&&typeof n.env=="object"){o=n.env;try{(0,wt.writeFileSync)(e,JSON.stringify(o,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a)}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return this.applyEnvOverrides(i)}catch(r){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,r),this.applyEnvOverrides(this.getAllDefaults())}}};var $e=require("path"),Py=require("os");var Oy=require("url");var PT={};function ET(){return typeof __dirname<"u"?__dirname:(0,$e.dirname)((0,Oy.fileURLToPath)(PT.url))}var LM=ET(),Ft=qt.get("CLAUDE_MEM_DATA_DIR"),ys=process.env.CLAUDE_CONFIG_DIR||(0,$e.join)((0,Py.homedir)(),".claude"),TT=(0,$e.join)(ys,"plugins","marketplaces","thedotmack"),qM=(0,$e.join)(Ft,"archives"),FM=(0,$e.join)(Ft,"logs"),VM=(0,$e.join)(Ft,"trash"),JM=(0,$e.join)(Ft,"backups"),KM=(0,$e.join)(Ft,"modes"),HM=(0,$e.join)(Ft,"settings.json"),WM=(0,$e.join)(Ft,"claude-mem.db"),GM=(0,$e.join)(Ft,"vector-db"),BM=(0,$e.join)(Ft,"observer-sessions"),XM=(0,$e.join)(ys,"settings.json"),YM=(0,$e.join)(ys,"commands"),QM=(0,$e.join)(ys,"CLAUDE.md");var iC=(()=>{let t=process.env.CLAUDE_MEM_HEALTH_TIMEOUT_MS;if(t){let e=parseInt(t,10);if(Number.isFinite(e)&&e>=500&&e<=3e5)return e;ge.warn("SYSTEM","Invalid CLAUDE_MEM_HEALTH_TIMEOUT_MS, using default",{value:t,min:500,max:3e5})}return zy(mf.HEALTH_CHECK)})();var $s=null,bs=null;function jy(){if($s!==null)return $s;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json"),e=qt.loadFromFile(t);return $s=parseInt(e.CLAUDE_MEM_WORKER_PORT,10),$s}function Dy(){if(bs!==null)return bs;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json");return bs=qt.loadFromFile(t).CLAUDE_MEM_WORKER_HOST,bs}var OT="10.4.1";console.log=(...t)=>{ge.error("CONSOLE","Intercepted console output (MCP protocol protection)",void 0,{args:t})};var jT=jy(),DT=Dy(),ai=`http://${DT}:${jT}`,Ny={search:"/api/search",timeline:"/api/timeline"};async function Ry(t,e){ge.debug("SYSTEM","\u2192 Worker API",void 0,{endpoint:t,params:e});try{let r=new URLSearchParams;for(let[a,s]of Object.entries(e))s!=null&&r.append(a,String(s));let n=`${ai}${t}?${r}`,o=await fetch(n);if(!o.ok){let a=await o.text();throw new Error(`Worker API error (${o.status}): ${a}`)}let i=await o.json();return ge.debug("SYSTEM","\u2190 Worker API success",void 0,{endpoint:t}),i}catch(r){return ge.error("SYSTEM","\u2190 Worker API error",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function Ay(t,e){ge.debug("HTTP","Worker API request (POST)",void 0,{endpoint:t});try{let r=`${ai}${t}`,n=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!n.ok){let i=await n.text();throw new Error(`Worker API error (${n.status}): ${i}`)}let o=await n.json();return ge.debug("HTTP","Worker API success (POST)",void 0,{endpoint:t}),{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}catch(r){return ge.error("HTTP","Worker API error (POST)",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function NT(){try{return(await fetch(`${ai}/api/health`)).ok}catch(t){return ge.debug("SYSTEM","Worker health check failed",{},t),!1}}var Uy=[{name:"__IMPORTANT",description:`3-LAYER WORKFLOW (ALWAYS FOLLOW): +`}var vs=class{constructor(e=ff.default.stdin,r=ff.default.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new gs,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let n=wy(e);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};var hf=si(require("path"),1);var mf={DEFAULT:3e5,HEALTH_CHECK:3e3,POST_SPAWN_WAIT:5e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function zy(t){return process.platform==="win32"?Math.round(t*mf.WINDOWS_MULTIPLIER):t}var wt=require("fs"),_s=require("path"),Ty=require("os");var Iy="bugfix,feature,refactor,discovery,decision,change",Ey="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var qt=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-5",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,_s.join)((0,Ty.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:Iy,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:Ey,CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static getBool(e){let r=this.get(e);return r==="true"||r===!0}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS))process.env[n]!==void 0&&(r[n]=process.env[n]);return r}static loadFromFile(e){try{if(!(0,wt.existsSync)(e)){let a=this.getAllDefaults();try{let s=(0,_s.dirname)(e);(0,wt.existsSync)(s)||(0,wt.mkdirSync)(s,{recursive:!0}),(0,wt.writeFileSync)(e,JSON.stringify(a,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(s){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,s)}return this.applyEnvOverrides(a)}let r=(0,wt.readFileSync)(e,"utf-8"),n=JSON.parse(r),o=n;if(n.env&&typeof n.env=="object"){o=n.env;try{(0,wt.writeFileSync)(e,JSON.stringify(o,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a)}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return this.applyEnvOverrides(i)}catch(r){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,r),this.applyEnvOverrides(this.getAllDefaults())}}};var $e=require("path"),Py=require("os");var Oy=require("url");var PT={};function ET(){return typeof __dirname<"u"?__dirname:(0,$e.dirname)((0,Oy.fileURLToPath)(PT.url))}var LM=ET(),Ft=qt.get("CLAUDE_MEM_DATA_DIR"),ys=process.env.CLAUDE_CONFIG_DIR||(0,$e.join)((0,Py.homedir)(),".claude"),TT=(0,$e.join)(ys,"plugins","marketplaces","thedotmack"),qM=(0,$e.join)(Ft,"archives"),FM=(0,$e.join)(Ft,"logs"),VM=(0,$e.join)(Ft,"trash"),JM=(0,$e.join)(Ft,"backups"),KM=(0,$e.join)(Ft,"modes"),HM=(0,$e.join)(Ft,"settings.json"),WM=(0,$e.join)(Ft,"claude-mem.db"),GM=(0,$e.join)(Ft,"vector-db"),BM=(0,$e.join)(Ft,"observer-sessions"),XM=(0,$e.join)(ys,"settings.json"),YM=(0,$e.join)(ys,"commands"),QM=(0,$e.join)(ys,"CLAUDE.md");var iC=(()=>{let t=process.env.CLAUDE_MEM_HEALTH_TIMEOUT_MS;if(t){let e=parseInt(t,10);if(Number.isFinite(e)&&e>=500&&e<=3e5)return e;ge.warn("SYSTEM","Invalid CLAUDE_MEM_HEALTH_TIMEOUT_MS, using default",{value:t,min:500,max:3e5})}return zy(mf.HEALTH_CHECK)})();var $s=null,bs=null;function jy(){if($s!==null)return $s;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json"),e=qt.loadFromFile(t);return $s=parseInt(e.CLAUDE_MEM_WORKER_PORT,10),$s}function Dy(){if(bs!==null)return bs;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json");return bs=qt.loadFromFile(t).CLAUDE_MEM_WORKER_HOST,bs}var OT="10.4.2";console.log=(...t)=>{ge.error("CONSOLE","Intercepted console output (MCP protocol protection)",void 0,{args:t})};var jT=jy(),DT=Dy(),ai=`http://${DT}:${jT}`,Ny={search:"/api/search",timeline:"/api/timeline"};async function Ry(t,e){ge.debug("SYSTEM","\u2192 Worker API",void 0,{endpoint:t,params:e});try{let r=new URLSearchParams;for(let[a,s]of Object.entries(e))s!=null&&r.append(a,String(s));let n=`${ai}${t}?${r}`,o=await fetch(n);if(!o.ok){let a=await o.text();throw new Error(`Worker API error (${o.status}): ${a}`)}let i=await o.json();return ge.debug("SYSTEM","\u2190 Worker API success",void 0,{endpoint:t}),i}catch(r){return ge.error("SYSTEM","\u2190 Worker API error",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function Ay(t,e){ge.debug("HTTP","Worker API request (POST)",void 0,{endpoint:t});try{let r=`${ai}${t}`,n=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!n.ok){let i=await n.text();throw new Error(`Worker API error (${n.status}): ${i}`)}let o=await n.json();return ge.debug("HTTP","Worker API success (POST)",void 0,{endpoint:t}),{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}catch(r){return ge.error("HTTP","Worker API error (POST)",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function NT(){try{return(await fetch(`${ai}/api/health`)).ok}catch(t){return ge.debug("SYSTEM","Worker health check failed",{},t),!1}}var Uy=[{name:"__IMPORTANT",description:`3-LAYER WORKFLOW (ALWAYS FOLLOW): 1. search(query) \u2192 Get index with IDs (~50-100 tokens/result) 2. timeline(anchor=ID) \u2192 Get context around interesting results 3. get_observations([IDs]) \u2192 Fetch full details ONLY for filtered IDs diff --git a/plugin/scripts/worker-service.cjs b/plugin/scripts/worker-service.cjs index 4ec18e9e..3ee994ab 100755 --- a/plugin/scripts/worker-service.cjs +++ b/plugin/scripts/worker-service.cjs @@ -920,7 +920,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs. WHERE s.project = ? `).get(r);w.info("CHROMA_SYNC","Backfilling user prompts",{project:r,missing:m.length,existing:n.prompts.size,total:y.count});let v=[];for(let b of m)v.push(this.formatUserPromptDoc(b));for(let b=0;bs.trim()).find(s=>s.length>0)||null}catch{return null}}function rK(t={}){let e=t.platform??process.platform,r=t.execPath??process.execPath;if(e!=="win32"||sA(r))return r;let n=t.env??process.env,i=t.homeDirectory??(0,N0.homedir)(),s=t.pathExists??Bt.existsSync,o=t.lookupInPath??tK,a=[n.BUN,n.BUN_PATH,bi.default.join(i,".bun","bin","bun.exe"),bi.default.join(i,".bun","bin","bun"),n.USERPROFILE?bi.default.join(n.USERPROFILE,".bun","bin","bun.exe"):void 0,n.LOCALAPPDATA?bi.default.join(n.LOCALAPPDATA,"bun","bun.exe"):void 0,n.LOCALAPPDATA?bi.default.join(n.LOCALAPPDATA,"bun","bin","bun.exe"):void 0];for(let c of a){let u=c?.trim();if(u&&(sA(u)&&s(u)||u.toLowerCase()==="bun"))return u}return o("bun",e)}function aA(t){(0,Bt.mkdirSync)(M0,{recursive:!0}),(0,Bt.writeFileSync)(Si,JSON.stringify(t,null,2))}function Um(){if(!(0,Bt.existsSync)(Si))return null;try{return JSON.parse((0,Bt.readFileSync)(Si,"utf-8"))}catch(t){return w.warn("SYSTEM","Failed to parse PID file",{path:Si},t),null}}function Yn(){if((0,Bt.existsSync)(Si))try{(0,Bt.unlinkSync)(Si)}catch(t){w.warn("SYSTEM","Failed to remove PID file",{path:Si},t)}}function Os(t){return process.platform==="win32"?Math.round(t*2):t}async function cA(t){if(process.platform!=="win32")return[];if(!Number.isInteger(t)||t<=0)return w.warn("SYSTEM","Invalid parent PID for child process enumeration",{parentPid:t}),[];try{let e=`powershell -NoProfile -NonInteractive -Command "Get-CimInstance Win32_Process -Filter 'ParentProcessId=${t}' | Select-Object -ExpandProperty ProcessId"`,{stdout:r}=await zm(e,{timeout:Cr.POWERSHELL_COMMAND,windowsHide:!0});return r.split(` `).map(n=>n.trim()).filter(n=>n.length>0&&/^\d+$/.test(n)).map(n=>parseInt(n,10)).filter(n=>n>0)}catch(e){return w.error("SYSTEM","Failed to enumerate child processes",{parentPid:t},e),[]}}async function uA(t){if(!Number.isInteger(t)||t<=0){w.warn("SYSTEM","Invalid PID for force kill",{pid:t});return}try{process.platform==="win32"?await zm(`taskkill /PID ${t} /T /F`,{timeout:Cr.POWERSHELL_COMMAND,windowsHide:!0}):process.kill(t,"SIGKILL"),w.info("SYSTEM","Killed process",{pid:t})}catch(e){w.debug("SYSTEM","Process already exited during force kill",{pid:t},e)}}async function lA(t,e){let r=Date.now();for(;Date.now()-r{try{return process.kill(i,0),!0}catch{return!1}});if(n.length===0){w.info("SYSTEM","All child processes exited");return}w.debug("SYSTEM","Waiting for processes to exit",{stillAlive:n}),await new Promise(i=>setTimeout(i,100))}w.warn("SYSTEM","Timeout waiting for child processes to exit")}function nK(t){if(!t||t.trim()==="")return-1;let e=t.trim(),r=0,n=e.match(/^(\d+)-(\d+):(\d+):(\d+)$/);if(n)return r=parseInt(n[1],10)*24*60+parseInt(n[2],10)*60+parseInt(n[3],10),r;let i=e.match(/^(\d+):(\d+):(\d+)$/);if(i)return r=parseInt(i[1],10)*60+parseInt(i[2],10),r;let s=e.match(/^(\d+):(\d+)$/);return s?parseInt(s[1],10):-1}var A0=["worker-service.cjs","chroma-mcp"],iK=["mcp-server.cjs"];async function dA(){let t=process.platform==="win32",e=process.pid,r=[],n=[...A0,...iK];try{if(t){let s=`powershell -NoProfile -NonInteractive -Command "Get-CimInstance Win32_Process -Filter '(${n.map(l=>`CommandLine LIKE '%${l}%'`).join(" OR ")}) AND ProcessId != ${e}' | Select-Object ProcessId, CommandLine, CreationDate | ConvertTo-Json"`,{stdout:o}=await zm(s,{timeout:Cr.POWERSHELL_COMMAND,windowsHide:!0});if(!o.trim()||o.trim()==="null"){w.debug("SYSTEM","No orphaned claude-mem processes found (Windows)");return}let a=JSON.parse(o),c=Array.isArray(a)?a:[a],u=Date.now();for(let l of c){let d=l.ProcessId;if(!Number.isInteger(d)||d<=0||d===e)continue;let p=l.CommandLine||"";if(A0.some(g=>p.includes(g)))r.push(d),w.debug("SYSTEM","Found orphaned process (aggressive)",{pid:d,commandLine:p.substring(0,80)});else{let g=l.CreationDate?.match(/\/Date\((\d+)\)\//);if(g){let _=parseInt(g[1],10),h=(u-_)/(1e3*60);h>=iA&&(r.push(d),w.debug("SYSTEM","Found orphaned process (age-gated)",{pid:d,ageMinutes:Math.round(h)}))}}}}else{let i=n.join("|"),{stdout:s}=await zm(`ps -eo pid,etime,command | grep -E "${i}" | grep -v grep || true`);if(!s.trim()){w.debug("SYSTEM","No orphaned claude-mem processes found (Unix)");return}let o=s.trim().split(` -`);for(let a of o){let c=a.trim().match(/^(\d+)\s+(\S+)\s+(.*)$/);if(!c)continue;let u=parseInt(c[1],10),l=c[2],d=c[3];if(!Number.isInteger(u)||u<=0||u===e)continue;if(A0.some(f=>d.includes(f)))r.push(u),w.debug("SYSTEM","Found orphaned process (aggressive)",{pid:u,command:d.substring(0,80)});else{let f=nK(l);f>=iA&&(r.push(u),w.debug("SYSTEM","Found orphaned process (age-gated)",{pid:u,ageMinutes:f,command:d.substring(0,80)}))}}}}catch(i){w.error("SYSTEM","Failed to enumerate orphaned processes during aggressive cleanup",{},i);return}if(r.length!==0){if(w.info("SYSTEM","Aggressive startup cleanup: killing orphaned processes",{platform:t?"Windows":"Unix",count:r.length,pids:r}),t){for(let i of r)if(!(!Number.isInteger(i)||i<=0))try{(0,Yi.execSync)(`taskkill /PID ${i} /T /F`,{timeout:Cr.POWERSHELL_COMMAND,stdio:"ignore",windowsHide:!0})}catch(s){w.debug("SYSTEM","Failed to kill process, may have already exited",{pid:i},s)}}else for(let i of r)try{process.kill(i,"SIGKILL")}catch(s){w.debug("SYSTEM","Process already exited",{pid:i},s)}w.info("SYSTEM","Aggressive startup cleanup complete",{count:r.length})}}var sK=".chroma-cleaned-v10.3";function pA(t){let e=t??M0,r=bi.default.join(e,sK),n=bi.default.join(e,"chroma");if((0,Bt.existsSync)(r)){w.debug("SYSTEM","Chroma migration marker exists, skipping wipe");return}w.warn("SYSTEM","Running one-time chroma data wipe (upgrade from pre-v10.3)",{chromaDir:n}),(0,Bt.existsSync)(n)&&((0,Bt.rmSync)(n,{recursive:!0,force:!0}),w.info("SYSTEM","Chroma data directory removed",{chromaDir:n})),(0,Bt.mkdirSync)(e,{recursive:!0}),(0,Bt.writeFileSync)(r,new Date().toISOString()),w.info("SYSTEM","Chroma migration marker written",{markerPath:r})}function D0(t,e,r={}){let n=process.platform==="win32",i={...process.env,CLAUDE_MEM_WORKER_PORT:String(e),...r};if(n){let a=rK();if(!a){w.error("SYSTEM","Failed to locate Bun runtime for Windows worker spawn");return}let c=a.replace(/'/g,"''"),u=t.replace(/'/g,"''"),l=`Start-Process -FilePath '${c}' -ArgumentList '${u}','--daemon' -WindowStyle Hidden`;try{return(0,Yi.execSync)(`powershell -NoProfile -Command "${l}"`,{stdio:"ignore",windowsHide:!0,env:i}),0}catch(d){w.error("SYSTEM","Failed to spawn worker daemon on Windows",{runtimePath:a},d);return}}let s="/usr/bin/setsid";if((0,Bt.existsSync)(s)){let a=(0,Yi.spawn)(s,[process.execPath,t,"--daemon"],{detached:!0,stdio:"ignore",env:i});return a.pid===void 0?void 0:(a.unref(),a.pid)}let o=(0,Yi.spawn)(process.execPath,[t,"--daemon"],{detached:!0,stdio:"ignore",env:i});if(o.pid!==void 0)return o.unref(),o.pid}function j0(t){if(t===0)return!0;if(!Number.isInteger(t)||t<0)return!1;try{return process.kill(t,0),!0}catch(e){return e.code==="EPERM"}}function fA(t=15e3){try{let e=(0,Bt.statSync)(Si);return Date.now()-e.mtimeMs{if(e.value){w.warn("SYSTEM",`Received ${r} but shutdown already in progress`);return}e.value=!0,w.info("SYSTEM",`Received ${r}, shutting down...`);try{await t(),process.exit(0)}catch(n){w.error("SYSTEM","Error during shutdown",{},n),process.exit(0)}}}var vA=nt(require("path"),1),yA=require("fs");ge();Zt();async function Wa(t){try{return(await fetch(`http://127.0.0.1:${t}/api/health`)).ok}catch{return!1}}async function _A(t,e,r,n){let i=Date.now();for(;Date.now()-isetTimeout(s,500))}return!1}function Ka(t,e=3e4){return _A(t,"/api/health",e,"Service not ready yet, will retry")}function bA(t,e=3e4){return _A(t,"/api/readiness",e,"Worker not ready yet, will retry")}async function Lm(t,e=1e4){let r=Date.now();for(;Date.now()-rsetTimeout(n,500))}return!1}async function qm(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/admin/shutdown`,{method:"POST"});return e.ok?!0:(w.warn("SYSTEM","Shutdown request returned error",{port:t,status:e.status}),!1)}catch(e){return e instanceof Error&&e.message?.includes("ECONNREFUSED")?(w.debug("SYSTEM","Worker already stopped",{port:t},e),!1):(w.error("SYSTEM","Shutdown request failed unexpectedly",{port:t},e),!1)}}function oK(){try{let t=vA.default.join(Ki,"package.json");return JSON.parse((0,yA.readFileSync)(t,"utf-8")).version}catch(t){let e=t.code;if(e==="ENOENT"||e==="EBUSY")return w.debug("SYSTEM","Could not read plugin version (shutdown race)",{code:e}),"unknown";throw t}}async function aK(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/version`);return e.ok?(await e.json()).version:null}catch{return w.debug("SYSTEM","Could not fetch worker version",{port:t}),null}}async function SA(t){let e=oK(),r=await aK(t);return!r||e==="unknown"?{matches:!0,pluginVersion:e,workerVersion:r}:{matches:e===r,pluginVersion:e,workerVersion:r}}ge();async function xA(t){w.info("SYSTEM","Shutdown initiated"),Yn();let e=await cA(process.pid);if(w.info("SYSTEM","Found child processes",{count:e.length,pids:e}),t.server&&(await cK(t.server),w.info("SYSTEM","HTTP server closed")),await t.sessionManager.shutdownAll(),t.mcpClient&&(await t.mcpClient.close(),w.info("SYSTEM","MCP client closed")),t.chromaMcpManager&&(w.info("SHUTDOWN","Stopping Chroma MCP connection..."),await t.chromaMcpManager.stop(),w.info("SHUTDOWN","Chroma MCP connection stopped")),t.dbManager&&await t.dbManager.close(),e.length>0){w.info("SYSTEM","Force killing remaining children");for(let r of e)await uA(r);await lA(e,5e3)}w.info("SYSTEM","Worker shutdown complete")}async function cK(t){t.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{t.close(n=>n?r(n):e())}),process.platform==="win32"&&(await new Promise(e=>setTimeout(e,500)),w.info("SYSTEM","Waited for Windows port cleanup"))}var M2=nt(Kh(),1),HE=nt(require("fs"),1),Td=nt(require("path"),1);var x2=["search","context","summarize","import","export"],w2=["workflow","search_params","examples","all"];ge();var LE=nt(Kh(),1),O2=nt(I2(),1),R2=nt(require("path"),1);Zt();ge();function qE(t){let e=[];e.push(LE.default.json({limit:"50mb"})),e.push((0,O2.default)({origin:(i,s)=>{!i||i.startsWith("http://localhost:")||i.startsWith("http://127.0.0.1:")?s(null,!0):s(new Error("CORS not allowed"))},methods:["GET","HEAD","POST","PUT","PATCH","DELETE"],allowedHeaders:["Content-Type","Authorization","X-Requested-With"],credentials:!1})),e.push((i,s,o)=>{let c=[".html",".js",".css",".svg",".png",".jpg",".jpeg",".webp",".woff",".woff2",".ttf",".eot"].some(g=>i.path.endsWith(g)),u=i.path==="/api/logs";if(i.path.startsWith("/health")||i.path==="/"||c||u)return o();let l=Date.now(),d=`${i.method}-${Date.now()}`,p=t(i.method,i.path,i.body);w.info("HTTP",`\u2192 ${i.method} ${i.path}`,{requestId:d},p);let f=s.send.bind(s);s.send=function(g){let _=Date.now()-l;return w.info("HTTP",`\u2190 ${s.statusCode} ${i.path}`,{requestId:d,duration:`${_}ms`}),f(g)},o()});let r=tn(),n=R2.default.join(r,"plugin","ui");return e.push(LE.default.static(n)),e}function Jh(t,e,r){let n=t.ip||t.connection.remoteAddress||"";if(!(n==="127.0.0.1"||n==="::1"||n==="::ffff:127.0.0.1"||n==="localhost")){w.warn("SECURITY","Admin endpoint access denied - not localhost",{endpoint:t.path,clientIp:n,method:t.method}),e.status(403).json({error:"Forbidden",message:"Admin endpoints are only accessible from localhost"});return}r()}function FE(t,e,r){if(!r||Object.keys(r).length===0||e.includes("/init"))return"";if(e.includes("/observations")){let n=r.tool_name||"?",i=r.tool_input;return`tool=${w.formatTool(n,i)}`}return e.includes("/summarize")?"requesting summary":""}ge();var xc=class extends Error{constructor(r,n=500,i,s){super(r);this.statusCode=n;this.code=i;this.details=s;this.name="AppError"}};function P2(t,e,r,n){let i={error:t,message:e};return r&&(i.code=r),n&&(i.details=n),i}var C2=(t,e,r,n)=>{let i=t instanceof xc?t.statusCode:500;w.error("HTTP",`Error handling ${e.method} ${e.path}`,{statusCode:i,error:t.message,code:t instanceof xc?t.code:void 0},t);let s=P2(t.name||"Error",t.message,t instanceof xc?t.code:void 0,t instanceof xc?t.details:void 0);r.status(i).json(s)};function A2(t,e){e.status(404).json(P2("NotFound",`Cannot ${t.method} ${t.path}`))}var N2="10.4.1",Xh=class{app;server=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,M2.default)(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}async listen(e,r){return new Promise((n,i)=>{this.server=this.app.listen(e,r,()=>{w.info("SYSTEM","HTTP server started",{host:r,port:e,pid:process.pid}),n()}),this.server.on("error",i)})}async close(){this.server&&(this.server.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{this.server.close(n=>n?r(n):e())}),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),this.server=null,w.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(A2),this.app.use(C2)}setupMiddleware(){qE(FE).forEach(r=>this.app.use(r))}setupCoreRoutes(){this.app.get("/api/health",(e,r)=>{r.status(200).json({status:"ok",version:N2,workerPath:this.options.workerPath,uptime:Date.now()-this.startTime,managed:process.env.CLAUDE_MEM_MANAGED==="true",hasIpc:typeof process.send=="function",platform:process.platform,pid:process.pid,initialized:this.options.getInitializationComplete(),mcpReady:this.options.getMcpReady(),ai:this.options.getAiStatus()})}),this.app.get("/api/readiness",(e,r)=>{this.options.getInitializationComplete()?r.status(200).json({status:"ready",mcpReady:this.options.getMcpReady()}):r.status(503).json({status:"initializing",message:"Worker is still initializing, please retry"})}),this.app.get("/api/version",(e,r)=>{r.status(200).json({version:N2})}),this.app.get("/api/instructions",async(e,r)=>{let n=e.query.topic||"all",i=e.query.operation;if(n&&!w2.includes(n))return r.status(400).json({error:"Invalid topic"});try{let s;if(i){if(!x2.includes(i))return r.status(400).json({error:"Invalid operation"});let o=Td.default.resolve(__dirname,"../skills/mem-search/operations"),a=Td.default.resolve(o,`${i}.md`);if(!a.startsWith(o+Td.default.sep))return r.status(400).json({error:"Invalid request"});s=await HE.promises.readFile(a,"utf-8")}else{let o=Td.default.join(__dirname,"../skills/mem-search/SKILL.md"),a=await HE.promises.readFile(o,"utf-8");s=this.extractInstructionSection(a,n)}r.json({content:[{type:"text",text:s}]})}catch{r.status(404).json({error:"Instruction not found"})}}),this.app.post("/api/admin/restart",Jh,async(e,r)=>{r.json({status:"restarting"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(w.info("SYSTEM","Sending restart request to wrapper"),process.send({type:"restart"})):setTimeout(async()=>{try{await this.options.onRestart()}finally{process.exit(0)}},100)}),this.app.post("/api/admin/shutdown",Jh,async(e,r)=>{r.json({status:"shutting_down"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(w.info("SYSTEM","Sending shutdown request to wrapper"),process.send({type:"shutdown"})):setTimeout(async()=>{try{await this.options.onShutdown()}finally{process.exit(0)}},100)})}extractInstructionSection(e,r){let n={workflow:this.extractBetween(e,"## The Workflow","## Search Parameters"),search_params:this.extractBetween(e,"## Search Parameters","## Examples"),examples:this.extractBetween(e,"## Examples","## Why This Workflow"),all:e};return n[r]||n.all}extractBetween(e,r,n){let i=e.indexOf(r),s=e.indexOf(n);return i===-1?e:s===-1?e.substring(i):e.substring(i,s).trim()}};var kt=nt(require("path"),1),Od=require("os"),rr=require("fs"),z2=require("child_process"),U2=require("util");ge();Br();Zt();var Dn=require("fs"),Id=require("path");ge();function D2(t){try{return(0,Dn.existsSync)(t)?JSON.parse((0,Dn.readFileSync)(t,"utf-8")):{}}catch(e){return w.error("CONFIG","Failed to read Cursor registry, using empty registry",{file:t,error:e instanceof Error?e.message:String(e)}),{}}}function j2(t,e){let r=(0,Id.join)(t,"..");(0,Dn.mkdirSync)(r,{recursive:!0}),(0,Dn.writeFileSync)(t,JSON.stringify(e,null,2))}function ZE(t,e){let r=(0,Id.join)(t,".cursor","rules"),n=(0,Id.join)(r,"claude-mem-context.mdc"),i=`${n}.tmp`;(0,Dn.mkdirSync)(r,{recursive:!0});let s=`--- +`);for(let a of o){let c=a.trim().match(/^(\d+)\s+(\S+)\s+(.*)$/);if(!c)continue;let u=parseInt(c[1],10),l=c[2],d=c[3];if(!Number.isInteger(u)||u<=0||u===e)continue;if(A0.some(f=>d.includes(f)))r.push(u),w.debug("SYSTEM","Found orphaned process (aggressive)",{pid:u,command:d.substring(0,80)});else{let f=nK(l);f>=iA&&(r.push(u),w.debug("SYSTEM","Found orphaned process (age-gated)",{pid:u,ageMinutes:f,command:d.substring(0,80)}))}}}}catch(i){w.error("SYSTEM","Failed to enumerate orphaned processes during aggressive cleanup",{},i);return}if(r.length!==0){if(w.info("SYSTEM","Aggressive startup cleanup: killing orphaned processes",{platform:t?"Windows":"Unix",count:r.length,pids:r}),t){for(let i of r)if(!(!Number.isInteger(i)||i<=0))try{(0,Yi.execSync)(`taskkill /PID ${i} /T /F`,{timeout:Cr.POWERSHELL_COMMAND,stdio:"ignore",windowsHide:!0})}catch(s){w.debug("SYSTEM","Failed to kill process, may have already exited",{pid:i},s)}}else for(let i of r)try{process.kill(i,"SIGKILL")}catch(s){w.debug("SYSTEM","Process already exited",{pid:i},s)}w.info("SYSTEM","Aggressive startup cleanup complete",{count:r.length})}}var sK=".chroma-cleaned-v10.3";function pA(t){let e=t??M0,r=bi.default.join(e,sK),n=bi.default.join(e,"chroma");if((0,Bt.existsSync)(r)){w.debug("SYSTEM","Chroma migration marker exists, skipping wipe");return}w.warn("SYSTEM","Running one-time chroma data wipe (upgrade from pre-v10.3)",{chromaDir:n}),(0,Bt.existsSync)(n)&&((0,Bt.rmSync)(n,{recursive:!0,force:!0}),w.info("SYSTEM","Chroma data directory removed",{chromaDir:n})),(0,Bt.mkdirSync)(e,{recursive:!0}),(0,Bt.writeFileSync)(r,new Date().toISOString()),w.info("SYSTEM","Chroma migration marker written",{markerPath:r})}function D0(t,e,r={}){let n=process.platform==="win32",i={...process.env,CLAUDE_MEM_WORKER_PORT:String(e),...r};if(n){let a=rK();if(!a){w.error("SYSTEM","Failed to locate Bun runtime for Windows worker spawn");return}let c=a.replace(/'/g,"''"),u=t.replace(/'/g,"''"),l=`Start-Process -FilePath '${c}' -ArgumentList '${u}','--daemon' -WindowStyle Hidden`;try{return(0,Yi.execSync)(`powershell -NoProfile -Command "${l}"`,{stdio:"ignore",windowsHide:!0,env:i}),0}catch(d){w.error("SYSTEM","Failed to spawn worker daemon on Windows",{runtimePath:a},d);return}}let s="/usr/bin/setsid";if((0,Bt.existsSync)(s)){let a=(0,Yi.spawn)(s,[process.execPath,t,"--daemon"],{detached:!0,stdio:"ignore",env:i});return a.pid===void 0?void 0:(a.unref(),a.pid)}let o=(0,Yi.spawn)(process.execPath,[t,"--daemon"],{detached:!0,stdio:"ignore",env:i});if(o.pid!==void 0)return o.unref(),o.pid}function j0(t){if(t===0)return!0;if(!Number.isInteger(t)||t<0)return!1;try{return process.kill(t,0),!0}catch(e){return e.code==="EPERM"}}function fA(t=15e3){try{let e=(0,Bt.statSync)(Si);return Date.now()-e.mtimeMs{if(e.value){w.warn("SYSTEM",`Received ${r} but shutdown already in progress`);return}e.value=!0,w.info("SYSTEM",`Received ${r}, shutting down...`);try{await t(),process.exit(0)}catch(n){w.error("SYSTEM","Error during shutdown",{},n),process.exit(0)}}}var vA=nt(require("path"),1),yA=require("fs");ge();Zt();async function Wa(t){try{return(await fetch(`http://127.0.0.1:${t}/api/health`)).ok}catch{return!1}}async function _A(t,e,r,n){let i=Date.now();for(;Date.now()-isetTimeout(s,500))}return!1}function Ka(t,e=3e4){return _A(t,"/api/health",e,"Service not ready yet, will retry")}function bA(t,e=3e4){return _A(t,"/api/readiness",e,"Worker not ready yet, will retry")}async function Lm(t,e=1e4){let r=Date.now();for(;Date.now()-rsetTimeout(n,500))}return!1}async function qm(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/admin/shutdown`,{method:"POST"});return e.ok?!0:(w.warn("SYSTEM","Shutdown request returned error",{port:t,status:e.status}),!1)}catch(e){return e instanceof Error&&e.message?.includes("ECONNREFUSED")?(w.debug("SYSTEM","Worker already stopped",{port:t},e),!1):(w.error("SYSTEM","Shutdown request failed unexpectedly",{port:t},e),!1)}}function oK(){try{let t=vA.default.join(Ki,"package.json");return JSON.parse((0,yA.readFileSync)(t,"utf-8")).version}catch(t){let e=t.code;if(e==="ENOENT"||e==="EBUSY")return w.debug("SYSTEM","Could not read plugin version (shutdown race)",{code:e}),"unknown";throw t}}async function aK(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/version`);return e.ok?(await e.json()).version:null}catch{return w.debug("SYSTEM","Could not fetch worker version",{port:t}),null}}async function SA(t){let e=oK(),r=await aK(t);return!r||e==="unknown"?{matches:!0,pluginVersion:e,workerVersion:r}:{matches:e===r,pluginVersion:e,workerVersion:r}}ge();async function xA(t){w.info("SYSTEM","Shutdown initiated"),Yn();let e=await cA(process.pid);if(w.info("SYSTEM","Found child processes",{count:e.length,pids:e}),t.server&&(await cK(t.server),w.info("SYSTEM","HTTP server closed")),await t.sessionManager.shutdownAll(),t.mcpClient&&(await t.mcpClient.close(),w.info("SYSTEM","MCP client closed")),t.chromaMcpManager&&(w.info("SHUTDOWN","Stopping Chroma MCP connection..."),await t.chromaMcpManager.stop(),w.info("SHUTDOWN","Chroma MCP connection stopped")),t.dbManager&&await t.dbManager.close(),e.length>0){w.info("SYSTEM","Force killing remaining children");for(let r of e)await uA(r);await lA(e,5e3)}w.info("SYSTEM","Worker shutdown complete")}async function cK(t){t.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{t.close(n=>n?r(n):e())}),process.platform==="win32"&&(await new Promise(e=>setTimeout(e,500)),w.info("SYSTEM","Waited for Windows port cleanup"))}var M2=nt(Kh(),1),HE=nt(require("fs"),1),Td=nt(require("path"),1);var x2=["search","context","summarize","import","export"],w2=["workflow","search_params","examples","all"];ge();var LE=nt(Kh(),1),O2=nt(I2(),1),R2=nt(require("path"),1);Zt();ge();function qE(t){let e=[];e.push(LE.default.json({limit:"50mb"})),e.push((0,O2.default)({origin:(i,s)=>{!i||i.startsWith("http://localhost:")||i.startsWith("http://127.0.0.1:")?s(null,!0):s(new Error("CORS not allowed"))},methods:["GET","HEAD","POST","PUT","PATCH","DELETE"],allowedHeaders:["Content-Type","Authorization","X-Requested-With"],credentials:!1})),e.push((i,s,o)=>{let c=[".html",".js",".css",".svg",".png",".jpg",".jpeg",".webp",".woff",".woff2",".ttf",".eot"].some(g=>i.path.endsWith(g)),u=i.path==="/api/logs";if(i.path.startsWith("/health")||i.path==="/"||c||u)return o();let l=Date.now(),d=`${i.method}-${Date.now()}`,p=t(i.method,i.path,i.body);w.info("HTTP",`\u2192 ${i.method} ${i.path}`,{requestId:d},p);let f=s.send.bind(s);s.send=function(g){let _=Date.now()-l;return w.info("HTTP",`\u2190 ${s.statusCode} ${i.path}`,{requestId:d,duration:`${_}ms`}),f(g)},o()});let r=tn(),n=R2.default.join(r,"plugin","ui");return e.push(LE.default.static(n)),e}function Jh(t,e,r){let n=t.ip||t.connection.remoteAddress||"";if(!(n==="127.0.0.1"||n==="::1"||n==="::ffff:127.0.0.1"||n==="localhost")){w.warn("SECURITY","Admin endpoint access denied - not localhost",{endpoint:t.path,clientIp:n,method:t.method}),e.status(403).json({error:"Forbidden",message:"Admin endpoints are only accessible from localhost"});return}r()}function FE(t,e,r){if(!r||Object.keys(r).length===0||e.includes("/init"))return"";if(e.includes("/observations")){let n=r.tool_name||"?",i=r.tool_input;return`tool=${w.formatTool(n,i)}`}return e.includes("/summarize")?"requesting summary":""}ge();var xc=class extends Error{constructor(r,n=500,i,s){super(r);this.statusCode=n;this.code=i;this.details=s;this.name="AppError"}};function P2(t,e,r,n){let i={error:t,message:e};return r&&(i.code=r),n&&(i.details=n),i}var C2=(t,e,r,n)=>{let i=t instanceof xc?t.statusCode:500;w.error("HTTP",`Error handling ${e.method} ${e.path}`,{statusCode:i,error:t.message,code:t instanceof xc?t.code:void 0},t);let s=P2(t.name||"Error",t.message,t instanceof xc?t.code:void 0,t instanceof xc?t.details:void 0);r.status(i).json(s)};function A2(t,e){e.status(404).json(P2("NotFound",`Cannot ${t.method} ${t.path}`))}var N2="10.4.2",Xh=class{app;server=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,M2.default)(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}async listen(e,r){return new Promise((n,i)=>{this.server=this.app.listen(e,r,()=>{w.info("SYSTEM","HTTP server started",{host:r,port:e,pid:process.pid}),n()}),this.server.on("error",i)})}async close(){this.server&&(this.server.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{this.server.close(n=>n?r(n):e())}),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),this.server=null,w.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(A2),this.app.use(C2)}setupMiddleware(){qE(FE).forEach(r=>this.app.use(r))}setupCoreRoutes(){this.app.get("/api/health",(e,r)=>{r.status(200).json({status:"ok",version:N2,workerPath:this.options.workerPath,uptime:Date.now()-this.startTime,managed:process.env.CLAUDE_MEM_MANAGED==="true",hasIpc:typeof process.send=="function",platform:process.platform,pid:process.pid,initialized:this.options.getInitializationComplete(),mcpReady:this.options.getMcpReady(),ai:this.options.getAiStatus()})}),this.app.get("/api/readiness",(e,r)=>{this.options.getInitializationComplete()?r.status(200).json({status:"ready",mcpReady:this.options.getMcpReady()}):r.status(503).json({status:"initializing",message:"Worker is still initializing, please retry"})}),this.app.get("/api/version",(e,r)=>{r.status(200).json({version:N2})}),this.app.get("/api/instructions",async(e,r)=>{let n=e.query.topic||"all",i=e.query.operation;if(n&&!w2.includes(n))return r.status(400).json({error:"Invalid topic"});try{let s;if(i){if(!x2.includes(i))return r.status(400).json({error:"Invalid operation"});let o=Td.default.resolve(__dirname,"../skills/mem-search/operations"),a=Td.default.resolve(o,`${i}.md`);if(!a.startsWith(o+Td.default.sep))return r.status(400).json({error:"Invalid request"});s=await HE.promises.readFile(a,"utf-8")}else{let o=Td.default.join(__dirname,"../skills/mem-search/SKILL.md"),a=await HE.promises.readFile(o,"utf-8");s=this.extractInstructionSection(a,n)}r.json({content:[{type:"text",text:s}]})}catch{r.status(404).json({error:"Instruction not found"})}}),this.app.post("/api/admin/restart",Jh,async(e,r)=>{r.json({status:"restarting"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(w.info("SYSTEM","Sending restart request to wrapper"),process.send({type:"restart"})):setTimeout(async()=>{try{await this.options.onRestart()}finally{process.exit(0)}},100)}),this.app.post("/api/admin/shutdown",Jh,async(e,r)=>{r.json({status:"shutting_down"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(w.info("SYSTEM","Sending shutdown request to wrapper"),process.send({type:"shutdown"})):setTimeout(async()=>{try{await this.options.onShutdown()}finally{process.exit(0)}},100)})}extractInstructionSection(e,r){let n={workflow:this.extractBetween(e,"## The Workflow","## Search Parameters"),search_params:this.extractBetween(e,"## Search Parameters","## Examples"),examples:this.extractBetween(e,"## Examples","## Why This Workflow"),all:e};return n[r]||n.all}extractBetween(e,r,n){let i=e.indexOf(r),s=e.indexOf(n);return i===-1?e:s===-1?e.substring(i):e.substring(i,s).trim()}};var kt=nt(require("path"),1),Od=require("os"),rr=require("fs"),z2=require("child_process"),U2=require("util");ge();Br();Zt();var Dn=require("fs"),Id=require("path");ge();function D2(t){try{return(0,Dn.existsSync)(t)?JSON.parse((0,Dn.readFileSync)(t,"utf-8")):{}}catch(e){return w.error("CONFIG","Failed to read Cursor registry, using empty registry",{file:t,error:e instanceof Error?e.message:String(e)}),{}}}function j2(t,e){let r=(0,Id.join)(t,"..");(0,Dn.mkdirSync)(r,{recursive:!0}),(0,Dn.writeFileSync)(t,JSON.stringify(e,null,2))}function ZE(t,e){let r=(0,Id.join)(t,".cursor","rules"),n=(0,Id.join)(r,"claude-mem-context.mdc"),i=`${n}.tmp`;(0,Dn.mkdirSync)(r,{recursive:!0});let s=`--- alwaysApply: true description: "Claude-mem context from past sessions (auto-updated)" --- @@ -1432,7 +1432,7 @@ Tips: `&&u++;if(u>=e||g===0)break;a=Math.min(a*2,i,o)}let l=c.split(` `);l.length>0&&l[l.length-1]===""&&l.pop();let d=Math.max(0,l.length-e),p=l.slice(d),f;if(i<=a)f=l.length;else{let g=c.length/Math.max(u,1);f=Math.round(i/g)}return{lines:p.join(` `),totalEstimate:f}}finally{(0,Sn.closeSync)(r)}}var gv=class extends jr{getLogFilePath(){let e=$e.get("CLAUDE_MEM_DATA_DIR"),r=(0,hv.join)(e,"logs"),n=new Date().toISOString().split("T")[0];return(0,hv.join)(r,`claude-mem-${n}.log`)}getLogsDir(){let e=$e.get("CLAUDE_MEM_DATA_DIR");return(0,hv.join)(e,"logs")}setupRoutes(e){e.get("/api/logs",this.handleGetLogs.bind(this)),e.post("/api/logs/clear",this.handleClearLogs.bind(this))}handleGetLogs=this.wrapHandler((e,r)=>{let n=this.getLogFilePath();if(!(0,Sn.existsSync)(n)){r.json({logs:"",path:n,exists:!1});return}let i=parseInt(e.query.lines||"1000",10),s=Math.min(i,1e4),{lines:o,totalEstimate:a}=gge(n,s),c=o===""?0:o.split(` -`).length;r.json({logs:o,path:n,exists:!0,totalLines:a,returnedLines:c})});handleClearLogs=this.wrapHandler((e,r)=>{let n=this.getLogFilePath();if(!(0,Sn.existsSync)(n)){r.json({success:!0,message:"Log file does not exist",path:n});return}(0,Sn.writeFileSync)(n,"","utf-8"),w.info("SYSTEM","Log file cleared via UI",{path:n}),r.json({success:!0,message:"Log file cleared",path:n})})};ge();var vv=class extends jr{constructor(r,n){super();this.dbManager=r;this.defaultProject=n}setupRoutes(r){r.post("/api/memory/save",this.handleSaveMemory.bind(this))}handleSaveMemory=this.wrapHandler(async(r,n)=>{let{text:i,title:s,project:o}=r.body,a=o||this.defaultProject;if(!i||typeof i!="string"||i.trim().length===0){this.badRequest(n,"text is required and must be non-empty");return}let c=this.dbManager.getSessionStore(),u=this.dbManager.getChromaSync(),l=c.getOrCreateManualSession(a),d={type:"discovery",title:s||i.substring(0,60).trim()+(i.length>60?"...":""),subtitle:"Manual memory",facts:[],narrative:i,concepts:[],files_read:[],files_modified:[]},p=c.storeObservation(l,a,d,0,0);w.info("HTTP","Manual observation saved",{id:p.id,project:a,title:d.title}),u.syncObservation(p.id,l,a,d,0,p.createdAtEpoch,0).catch(f=>{w.error("CHROMA","ChromaDB sync failed",{id:p.id},f)}),n.json({success:!0,id:p.id,title:d.title,project:a,message:`Memory saved as observation #${p.id}`})})};var Bge={},jge=120*1e3;function Rk(){return Ok.default.join($e.get("CLAUDE_MEM_DATA_DIR"),".worker-start-attempted")}function zge(){if(process.platform!=="win32")return!1;let t=Rk();if(!(0,ls.existsSync)(t))return!1;try{let e=(0,ls.statSync)(t).mtimeMs;return Date.now()-e{this.resolveInitialization=e}),this.dbManager=new Qh,this.sessionManager=new rg(this.dbManager),this.sseBroadcaster=new ng,this.sdkAgent=new qg(this.dbManager,this.sessionManager),this.geminiAgent=new Fg(this.dbManager,this.sessionManager),this.openRouterAgent=new Bg(this.dbManager,this.sessionManager),this.paginationHelper=new Vg(this.dbManager),this.settingsManager=new Gg(this.dbManager),this.sessionEventBroadcaster=new Xg(this.sseBroadcaster,this),this.sessionManager.setOnSessionDeleted(()=>{this.broadcastProcessingStatus()}),this.mcpClient=new qa({name:"worker-search-proxy",version:qge},{capabilities:{}}),this.server=new Xh({getInitializationComplete:()=>this.initializationCompleteFlag,getMcpReady:()=>this.mcpReady,onShutdown:()=>this.shutdown(),onRestart:()=>this.shutdown(),workerPath:__filename,getAiStatus:()=>{let e="claude";return Yc()&&Go()?e="openrouter":Xc()&&Vo()&&(e="gemini"),{provider:e,authMethod:Nm(),lastInteraction:this.lastAiInteraction?{timestamp:this.lastAiInteraction.timestamp,success:this.lastAiInteraction.success,...this.lastAiInteraction.error&&{error:this.lastAiInteraction.error}}:null}}}),this.registerRoutes(),this.registerSignalHandlers()}registerSignalHandlers(){let e={value:this.isShuttingDown},r=gA(()=>this.shutdown(),e);process.on("SIGTERM",()=>{this.isShuttingDown=e.value,r("SIGTERM")}),process.on("SIGINT",()=>{this.isShuttingDown=e.value,r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{w.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{this.isShuttingDown=e.value,r("SIGHUP")}))}registerRoutes(){this.server.app.get("/api/context/inject",async(e,r,n)=>{if(!this.initializationCompleteFlag||!this.searchRoutes){w.warn("SYSTEM","Context requested before initialization complete, returning empty"),r.status(200).json({content:[{type:"text",text:""}]});return}n()}),this.server.app.use("/api",async(e,r,n)=>{if(this.initializationCompleteFlag){n();return}let i=3e4,s=new Promise((o,a)=>setTimeout(()=>a(new Error("Database initialization timeout")),i));try{await Promise.race([this.initializationComplete,s]),n()}catch(o){w.error("HTTP",`Request to ${e.method} ${e.path} rejected \u2014 DB not initialized`,{},o),r.status(503).json({error:"Service initializing",message:"Database is still initializing, please retry"})}}),this.server.registerRoutes(new Qg(this.sseBroadcaster,this.dbManager,this.sessionManager)),this.server.registerRoutes(new rv(this.sessionManager,this.dbManager,this.sdkAgent,this.geminiAgent,this.openRouterAgent,this.sessionEventBroadcaster,this)),this.server.registerRoutes(new nv(this.paginationHelper,this.dbManager,this.sessionManager,this.sseBroadcaster,this,this.startTime)),this.server.registerRoutes(new mv(this.settingsManager)),this.server.registerRoutes(new gv),this.server.registerRoutes(new vv(this.dbManager,"claude-mem"))}async start(){let e=Et(),r=Am();await this.server.listen(e,r),aA({pid:process.pid,port:e,startedAt:new Date().toISOString()}),w.info("SYSTEM","Worker started",{host:r,port:e,pid:process.pid}),this.initializeBackground().catch(n=>{w.error("SYSTEM","Background initialization failed",{},n)})}async initializeBackground(){try{await dA();let{ModeManager:e}=await Promise.resolve().then(()=>(Wr(),Q2)),{SettingsDefaultsManager:r}=await Promise.resolve().then(()=>(or(),NC)),{USER_SETTINGS_PATH:n}=await Promise.resolve().then(()=>(Zt(),ZC)),i=r.loadFromFile(n);(i.CLAUDE_MEM_MODE==="local"||!i.CLAUDE_MEM_MODE)&&pA(),i.CLAUDE_MEM_CHROMA_ENABLED!=="false"?(this.chromaMcpManager=Ji.getInstance(),w.info("SYSTEM","ChromaMcpManager initialized (lazy - connects on first use)")):w.info("SYSTEM","Chroma disabled via CLAUDE_MEM_CHROMA_ENABLED=false, skipping ChromaMcpManager");let o=i.CLAUDE_MEM_MODE;e.getInstance().loadMode(o),w.info("SYSTEM",`Mode loaded: ${o}`),await this.dbManager.initialize();let{PendingMessageStore:a}=await Promise.resolve().then(()=>(Us(),jo)),u=new a(this.dbManager.getSessionStore().db,3).resetStaleProcessingMessages(0);u>0&&w.info("SYSTEM",`Reset ${u} stale processing messages to pending`);let l=new Kg,d=new Jg,p=new Wg(this.dbManager.getSessionSearch(),this.dbManager.getSessionStore(),this.dbManager.getChromaSync(),l,d);this.searchRoutes=new dv(p),this.server.registerRoutes(this.searchRoutes),w.info("WORKER","SearchManager initialized and search routes registered"),this.initializationCompleteFlag=!0,this.resolveInitialization(),w.info("SYSTEM","Core initialization complete (DB + search ready)"),this.chromaMcpManager&&Ga.backfillAllProjects().then(()=>{w.info("CHROMA_SYNC","Backfill check complete for all projects")}).catch(y=>{w.error("CHROMA_SYNC","Backfill failed (non-blocking)",{},y)});let f=Ok.default.join(__dirname,"mcp-server.cjs"),g=new Za({command:"node",args:[f],env:process.env}),_=3e5,h=this.mcpClient.connect(g),m=new Promise((y,v)=>setTimeout(()=>v(new Error("MCP connection timeout after 5 minutes")),_));await Promise.race([h,m]),this.mcpReady=!0,w.success("WORKER","MCP server connected"),this.stopOrphanReaper=X2(()=>{let y=new Set;for(let[v]of this.sessionManager.sessions)y.add(v);return y}),w.info("SYSTEM","Started orphan reaper (runs every 5 minutes)"),this.staleSessionReaperInterval=setInterval(async()=>{try{let y=await this.sessionManager.reapStaleSessions();y>0&&w.info("SYSTEM",`Reaped ${y} stale sessions`)}catch(y){w.error("SYSTEM","Stale session reaper error",{error:y instanceof Error?y.message:String(y)})}},120*1e3),this.processPendingQueues(50).then(y=>{y.sessionsStarted>0&&w.info("SYSTEM",`Auto-recovered ${y.sessionsStarted} sessions with pending work`,{totalPending:y.totalPendingSessions,started:y.sessionsStarted,sessionIds:y.startedSessionIds})}).catch(y=>{w.error("SYSTEM","Auto-recovery of pending queues failed",{},y)})}catch(e){throw w.error("SYSTEM","Background initialization failed",{},e),e}}getActiveAgent(){return Yc()&&Go()?this.openRouterAgent:Xc()&&Vo()?this.geminiAgent:this.sdkAgent}startSessionProcessor(e,r){if(!e)return;let n=e.sessionDbId,i=this.getActiveAgent(),s=i.constructor.name;e.abortController.signal.aborted&&(w.debug("SYSTEM","Replacing aborted AbortController before starting generator",{sessionId:e.sessionDbId}),e.abortController=new AbortController);let o=!1,a=!1;w.info("SYSTEM",`Starting generator (${r}) using ${s}`,{sessionId:n}),e.lastGeneratorActivity=Date.now(),e.generatorPromise=i.startSession(e,this).catch(async c=>{let u=c?.message||"";if(["Claude executable not found","CLAUDE_CODE_PATH","ENOENT","spawn","Invalid API key"].some(d=>u.includes(d))){o=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},w.error("SDK","Unrecoverable generator error - will NOT restart",{sessionId:e.sessionDbId,project:e.project,errorMessage:u});return}if(this.isSessionTerminatedError(c))return w.warn("SDK","SDK resume failed, falling back to standalone processing",{sessionId:e.sessionDbId,project:e.project,reason:c instanceof Error?c.message:String(c)}),this.runFallbackForTerminatedSession(e,c);throw(u.includes("aborted by user")||u.includes("No conversation found"))&&e.memorySessionId&&(w.warn("SDK","Detected stale resume failure, clearing memorySessionId for fresh start",{sessionId:e.sessionDbId,memorySessionId:e.memorySessionId,errorMessage:u}),this.dbManager.getSessionStore().updateMemorySessionId(e.sessionDbId,null),e.memorySessionId=null,e.forceInit=!0),w.error("SDK","Session generator failed",{sessionId:e.sessionDbId,project:e.project,provider:s},c),a=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},c}).finally(async()=>{let c=Ls(e.sessionDbId);if(c&&!c.process.killed&&c.process.exitCode===null&&await qs(c,5e3),e.generatorPromise=null,!a&&!o&&(this.lastAiInteraction={timestamp:Date.now(),success:!0,provider:s}),o){w.warn("SYSTEM","Skipping restart due to unrecoverable error",{sessionId:e.sessionDbId}),this.broadcastProcessingStatus();return}let{PendingMessageStore:u}=(Us(),su(jo)),l=new u(this.dbManager.getSessionStore().db,3);if(e.idleTimedOut){w.info("SYSTEM","Generator exited due to idle timeout, not restarting",{sessionId:e.sessionDbId}),e.idleTimedOut=!1,this.broadcastProcessingStatus();return}let d=l.getPendingCount(e.sessionDbId);d>0&&(w.info("SYSTEM","Pending work remains after generator exit, restarting with fresh AbortController",{sessionId:e.sessionDbId,pendingCount:d}),e.abortController=new AbortController,this.startSessionProcessor(e,"pending-work-restart")),this.broadcastProcessingStatus()})}isSessionTerminatedError(e){let n=(e instanceof Error?e.message:String(e)).toLowerCase();return n.includes("process aborted by user")||n.includes("processtransport")||n.includes("not ready for writing")||n.includes("session generator failed")||n.includes("claude code process")}async runFallbackForTerminatedSession(e,r){if(!e)return;let n=e.sessionDbId;if(!e.memorySessionId){let o=`fallback-${n}-${Date.now()}`;e.memorySessionId=o,this.dbManager.getSessionStore().updateMemorySessionId(n,o)}if(Vo())try{await this.geminiAgent.startSession(e,this);return}catch(o){w.warn("SDK","Fallback Gemini failed, trying OpenRouter",{sessionId:n,error:o instanceof Error?o.message:String(o)})}if(Go())try{await this.openRouterAgent.startSession(e,this);return}catch(o){w.warn("SDK","Fallback OpenRouter failed",{sessionId:n,error:o instanceof Error?o.message:String(o)})}let s=this.sessionManager.getPendingMessageStore().markAllSessionMessagesAbandoned(n);s>0&&w.warn("SDK","No fallback available; marked pending messages abandoned",{sessionId:n,abandoned:s}),this.sessionManager.removeSessionImmediate(n),this.sessionEventBroadcaster.broadcastSessionCompleted(n)}async processPendingQueues(e=10){let{PendingMessageStore:r}=await Promise.resolve().then(()=>(Us(),jo)),n=new r(this.dbManager.getSessionStore().db,3),i=this.dbManager.getSessionStore(),s=360*60*1e3,o=Date.now()-s;try{let u=i.db.prepare(` +`).length;r.json({logs:o,path:n,exists:!0,totalLines:a,returnedLines:c})});handleClearLogs=this.wrapHandler((e,r)=>{let n=this.getLogFilePath();if(!(0,Sn.existsSync)(n)){r.json({success:!0,message:"Log file does not exist",path:n});return}(0,Sn.writeFileSync)(n,"","utf-8"),w.info("SYSTEM","Log file cleared via UI",{path:n}),r.json({success:!0,message:"Log file cleared",path:n})})};ge();var vv=class extends jr{constructor(r,n){super();this.dbManager=r;this.defaultProject=n}setupRoutes(r){r.post("/api/memory/save",this.handleSaveMemory.bind(this))}handleSaveMemory=this.wrapHandler(async(r,n)=>{let{text:i,title:s,project:o}=r.body,a=o||this.defaultProject;if(!i||typeof i!="string"||i.trim().length===0){this.badRequest(n,"text is required and must be non-empty");return}let c=this.dbManager.getSessionStore(),u=this.dbManager.getChromaSync(),l=c.getOrCreateManualSession(a),d={type:"discovery",title:s||i.substring(0,60).trim()+(i.length>60?"...":""),subtitle:"Manual memory",facts:[],narrative:i,concepts:[],files_read:[],files_modified:[]},p=c.storeObservation(l,a,d,0,0);w.info("HTTP","Manual observation saved",{id:p.id,project:a,title:d.title}),u.syncObservation(p.id,l,a,d,0,p.createdAtEpoch,0).catch(f=>{w.error("CHROMA","ChromaDB sync failed",{id:p.id},f)}),n.json({success:!0,id:p.id,title:d.title,project:a,message:`Memory saved as observation #${p.id}`})})};var Bge={},jge=120*1e3;function Rk(){return Ok.default.join($e.get("CLAUDE_MEM_DATA_DIR"),".worker-start-attempted")}function zge(){if(process.platform!=="win32")return!1;let t=Rk();if(!(0,ls.existsSync)(t))return!1;try{let e=(0,ls.statSync)(t).mtimeMs;return Date.now()-e{this.resolveInitialization=e}),this.dbManager=new Qh,this.sessionManager=new rg(this.dbManager),this.sseBroadcaster=new ng,this.sdkAgent=new qg(this.dbManager,this.sessionManager),this.geminiAgent=new Fg(this.dbManager,this.sessionManager),this.openRouterAgent=new Bg(this.dbManager,this.sessionManager),this.paginationHelper=new Vg(this.dbManager),this.settingsManager=new Gg(this.dbManager),this.sessionEventBroadcaster=new Xg(this.sseBroadcaster,this),this.sessionManager.setOnSessionDeleted(()=>{this.broadcastProcessingStatus()}),this.mcpClient=new qa({name:"worker-search-proxy",version:qge},{capabilities:{}}),this.server=new Xh({getInitializationComplete:()=>this.initializationCompleteFlag,getMcpReady:()=>this.mcpReady,onShutdown:()=>this.shutdown(),onRestart:()=>this.shutdown(),workerPath:__filename,getAiStatus:()=>{let e="claude";return Yc()&&Go()?e="openrouter":Xc()&&Vo()&&(e="gemini"),{provider:e,authMethod:Nm(),lastInteraction:this.lastAiInteraction?{timestamp:this.lastAiInteraction.timestamp,success:this.lastAiInteraction.success,...this.lastAiInteraction.error&&{error:this.lastAiInteraction.error}}:null}}}),this.registerRoutes(),this.registerSignalHandlers()}registerSignalHandlers(){let e={value:this.isShuttingDown},r=gA(()=>this.shutdown(),e);process.on("SIGTERM",()=>{this.isShuttingDown=e.value,r("SIGTERM")}),process.on("SIGINT",()=>{this.isShuttingDown=e.value,r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{w.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{this.isShuttingDown=e.value,r("SIGHUP")}))}registerRoutes(){this.server.app.get("/api/context/inject",async(e,r,n)=>{if(!this.initializationCompleteFlag||!this.searchRoutes){w.warn("SYSTEM","Context requested before initialization complete, returning empty"),r.status(200).json({content:[{type:"text",text:""}]});return}n()}),this.server.app.use("/api",async(e,r,n)=>{if(this.initializationCompleteFlag){n();return}let i=3e4,s=new Promise((o,a)=>setTimeout(()=>a(new Error("Database initialization timeout")),i));try{await Promise.race([this.initializationComplete,s]),n()}catch(o){w.error("HTTP",`Request to ${e.method} ${e.path} rejected \u2014 DB not initialized`,{},o),r.status(503).json({error:"Service initializing",message:"Database is still initializing, please retry"})}}),this.server.registerRoutes(new Qg(this.sseBroadcaster,this.dbManager,this.sessionManager)),this.server.registerRoutes(new rv(this.sessionManager,this.dbManager,this.sdkAgent,this.geminiAgent,this.openRouterAgent,this.sessionEventBroadcaster,this)),this.server.registerRoutes(new nv(this.paginationHelper,this.dbManager,this.sessionManager,this.sseBroadcaster,this,this.startTime)),this.server.registerRoutes(new mv(this.settingsManager)),this.server.registerRoutes(new gv),this.server.registerRoutes(new vv(this.dbManager,"claude-mem"))}async start(){let e=Et(),r=Am();await this.server.listen(e,r),aA({pid:process.pid,port:e,startedAt:new Date().toISOString()}),w.info("SYSTEM","Worker started",{host:r,port:e,pid:process.pid}),this.initializeBackground().catch(n=>{w.error("SYSTEM","Background initialization failed",{},n)})}async initializeBackground(){try{await dA();let{ModeManager:e}=await Promise.resolve().then(()=>(Wr(),Q2)),{SettingsDefaultsManager:r}=await Promise.resolve().then(()=>(or(),NC)),{USER_SETTINGS_PATH:n}=await Promise.resolve().then(()=>(Zt(),ZC)),i=r.loadFromFile(n);(i.CLAUDE_MEM_MODE==="local"||!i.CLAUDE_MEM_MODE)&&pA(),i.CLAUDE_MEM_CHROMA_ENABLED!=="false"?(this.chromaMcpManager=Ji.getInstance(),w.info("SYSTEM","ChromaMcpManager initialized (lazy - connects on first use)")):w.info("SYSTEM","Chroma disabled via CLAUDE_MEM_CHROMA_ENABLED=false, skipping ChromaMcpManager");let o=i.CLAUDE_MEM_MODE;e.getInstance().loadMode(o),w.info("SYSTEM",`Mode loaded: ${o}`),await this.dbManager.initialize();let{PendingMessageStore:a}=await Promise.resolve().then(()=>(Us(),jo)),u=new a(this.dbManager.getSessionStore().db,3).resetStaleProcessingMessages(0);u>0&&w.info("SYSTEM",`Reset ${u} stale processing messages to pending`);let l=new Kg,d=new Jg,p=new Wg(this.dbManager.getSessionSearch(),this.dbManager.getSessionStore(),this.dbManager.getChromaSync(),l,d);this.searchRoutes=new dv(p),this.server.registerRoutes(this.searchRoutes),w.info("WORKER","SearchManager initialized and search routes registered"),this.initializationCompleteFlag=!0,this.resolveInitialization(),w.info("SYSTEM","Core initialization complete (DB + search ready)"),this.chromaMcpManager&&Ga.backfillAllProjects().then(()=>{w.info("CHROMA_SYNC","Backfill check complete for all projects")}).catch(y=>{w.error("CHROMA_SYNC","Backfill failed (non-blocking)",{},y)});let f=Ok.default.join(__dirname,"mcp-server.cjs"),g=new Za({command:"node",args:[f],env:process.env}),_=3e5,h=this.mcpClient.connect(g),m=new Promise((y,v)=>setTimeout(()=>v(new Error("MCP connection timeout after 5 minutes")),_));await Promise.race([h,m]),this.mcpReady=!0,w.success("WORKER","MCP server connected"),this.stopOrphanReaper=X2(()=>{let y=new Set;for(let[v]of this.sessionManager.sessions)y.add(v);return y}),w.info("SYSTEM","Started orphan reaper (runs every 5 minutes)"),this.staleSessionReaperInterval=setInterval(async()=>{try{let y=await this.sessionManager.reapStaleSessions();y>0&&w.info("SYSTEM",`Reaped ${y} stale sessions`)}catch(y){w.error("SYSTEM","Stale session reaper error",{error:y instanceof Error?y.message:String(y)})}},120*1e3),this.processPendingQueues(50).then(y=>{y.sessionsStarted>0&&w.info("SYSTEM",`Auto-recovered ${y.sessionsStarted} sessions with pending work`,{totalPending:y.totalPendingSessions,started:y.sessionsStarted,sessionIds:y.startedSessionIds})}).catch(y=>{w.error("SYSTEM","Auto-recovery of pending queues failed",{},y)})}catch(e){throw w.error("SYSTEM","Background initialization failed",{},e),e}}getActiveAgent(){return Yc()&&Go()?this.openRouterAgent:Xc()&&Vo()?this.geminiAgent:this.sdkAgent}startSessionProcessor(e,r){if(!e)return;let n=e.sessionDbId,i=this.getActiveAgent(),s=i.constructor.name;e.abortController.signal.aborted&&(w.debug("SYSTEM","Replacing aborted AbortController before starting generator",{sessionId:e.sessionDbId}),e.abortController=new AbortController);let o=!1,a=!1;w.info("SYSTEM",`Starting generator (${r}) using ${s}`,{sessionId:n}),e.lastGeneratorActivity=Date.now(),e.generatorPromise=i.startSession(e,this).catch(async c=>{let u=c?.message||"";if(["Claude executable not found","CLAUDE_CODE_PATH","ENOENT","spawn","Invalid API key"].some(d=>u.includes(d))){o=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},w.error("SDK","Unrecoverable generator error - will NOT restart",{sessionId:e.sessionDbId,project:e.project,errorMessage:u});return}if(this.isSessionTerminatedError(c))return w.warn("SDK","SDK resume failed, falling back to standalone processing",{sessionId:e.sessionDbId,project:e.project,reason:c instanceof Error?c.message:String(c)}),this.runFallbackForTerminatedSession(e,c);throw(u.includes("aborted by user")||u.includes("No conversation found"))&&e.memorySessionId&&(w.warn("SDK","Detected stale resume failure, clearing memorySessionId for fresh start",{sessionId:e.sessionDbId,memorySessionId:e.memorySessionId,errorMessage:u}),this.dbManager.getSessionStore().updateMemorySessionId(e.sessionDbId,null),e.memorySessionId=null,e.forceInit=!0),w.error("SDK","Session generator failed",{sessionId:e.sessionDbId,project:e.project,provider:s},c),a=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},c}).finally(async()=>{let c=Ls(e.sessionDbId);if(c&&!c.process.killed&&c.process.exitCode===null&&await qs(c,5e3),e.generatorPromise=null,!a&&!o&&(this.lastAiInteraction={timestamp:Date.now(),success:!0,provider:s}),o){w.warn("SYSTEM","Skipping restart due to unrecoverable error",{sessionId:e.sessionDbId}),this.broadcastProcessingStatus();return}let{PendingMessageStore:u}=(Us(),su(jo)),l=new u(this.dbManager.getSessionStore().db,3);if(e.idleTimedOut){w.info("SYSTEM","Generator exited due to idle timeout, not restarting",{sessionId:e.sessionDbId}),e.idleTimedOut=!1,this.broadcastProcessingStatus();return}let d=l.getPendingCount(e.sessionDbId);d>0&&(w.info("SYSTEM","Pending work remains after generator exit, restarting with fresh AbortController",{sessionId:e.sessionDbId,pendingCount:d}),e.abortController=new AbortController,this.startSessionProcessor(e,"pending-work-restart")),this.broadcastProcessingStatus()})}isSessionTerminatedError(e){let n=(e instanceof Error?e.message:String(e)).toLowerCase();return n.includes("process aborted by user")||n.includes("processtransport")||n.includes("not ready for writing")||n.includes("session generator failed")||n.includes("claude code process")}async runFallbackForTerminatedSession(e,r){if(!e)return;let n=e.sessionDbId;if(!e.memorySessionId){let o=`fallback-${n}-${Date.now()}`;e.memorySessionId=o,this.dbManager.getSessionStore().updateMemorySessionId(n,o)}if(Vo())try{await this.geminiAgent.startSession(e,this);return}catch(o){w.warn("SDK","Fallback Gemini failed, trying OpenRouter",{sessionId:n,error:o instanceof Error?o.message:String(o)})}if(Go())try{await this.openRouterAgent.startSession(e,this);return}catch(o){w.warn("SDK","Fallback OpenRouter failed",{sessionId:n,error:o instanceof Error?o.message:String(o)})}let s=this.sessionManager.getPendingMessageStore().markAllSessionMessagesAbandoned(n);s>0&&w.warn("SDK","No fallback available; marked pending messages abandoned",{sessionId:n,abandoned:s}),this.sessionManager.removeSessionImmediate(n),this.sessionEventBroadcaster.broadcastSessionCompleted(n)}async processPendingQueues(e=10){let{PendingMessageStore:r}=await Promise.resolve().then(()=>(Us(),jo)),n=new r(this.dbManager.getSessionStore().db,3),i=this.dbManager.getSessionStore(),s=360*60*1e3,o=Date.now()-s;try{let u=i.db.prepare(` SELECT id FROM sdk_sessions WHERE status = 'active' AND started_at_epoch < ? `).all(o);if(u.length>0){let l=u.map(f=>f.id),d=l.map(()=>"?").join(",");i.db.prepare(`