@waynesutton/agent-memory 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.json +9 -0
- package/.claude/settings.local.json +7 -0
- package/AGENTS.md +113 -0
- package/CLAUDE.md +79 -0
- package/README.md +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +192 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parsers/claude-code.d.ts +3 -0
- package/dist/cli/parsers/claude-code.d.ts.map +1 -0
- package/dist/cli/parsers/claude-code.js +75 -0
- package/dist/cli/parsers/claude-code.js.map +1 -0
- package/dist/cli/parsers/codex.d.ts +3 -0
- package/dist/cli/parsers/codex.d.ts.map +1 -0
- package/dist/cli/parsers/codex.js +42 -0
- package/dist/cli/parsers/codex.js.map +1 -0
- package/dist/cli/parsers/conductor.d.ts +3 -0
- package/dist/cli/parsers/conductor.d.ts.map +1 -0
- package/dist/cli/parsers/conductor.js +43 -0
- package/dist/cli/parsers/conductor.js.map +1 -0
- package/dist/cli/parsers/cursor.d.ts +3 -0
- package/dist/cli/parsers/cursor.d.ts.map +1 -0
- package/dist/cli/parsers/cursor.js +50 -0
- package/dist/cli/parsers/cursor.js.map +1 -0
- package/dist/cli/parsers/index.d.ts +12 -0
- package/dist/cli/parsers/index.d.ts.map +1 -0
- package/dist/cli/parsers/index.js +27 -0
- package/dist/cli/parsers/index.js.map +1 -0
- package/dist/cli/parsers/opencode.d.ts +3 -0
- package/dist/cli/parsers/opencode.d.ts.map +1 -0
- package/dist/cli/parsers/opencode.js +72 -0
- package/dist/cli/parsers/opencode.js.map +1 -0
- package/dist/cli/parsers/parsers.test.d.ts +2 -0
- package/dist/cli/parsers/parsers.test.d.ts.map +1 -0
- package/dist/cli/parsers/parsers.test.js +151 -0
- package/dist/cli/parsers/parsers.test.js.map +1 -0
- package/dist/cli/parsers/pi.d.ts +3 -0
- package/dist/cli/parsers/pi.d.ts.map +1 -0
- package/dist/cli/parsers/pi.js +43 -0
- package/dist/cli/parsers/pi.js.map +1 -0
- package/dist/cli/parsers/types.d.ts +25 -0
- package/dist/cli/parsers/types.d.ts.map +1 -0
- package/dist/cli/parsers/types.js +2 -0
- package/dist/cli/parsers/types.js.map +1 -0
- package/dist/cli/parsers/vscode-copilot.d.ts +3 -0
- package/dist/cli/parsers/vscode-copilot.d.ts.map +1 -0
- package/dist/cli/parsers/vscode-copilot.js +69 -0
- package/dist/cli/parsers/vscode-copilot.js.map +1 -0
- package/dist/cli/parsers/zed.d.ts +3 -0
- package/dist/cli/parsers/zed.d.ts.map +1 -0
- package/dist/cli/parsers/zed.js +43 -0
- package/dist/cli/parsers/zed.js.map +1 -0
- package/dist/cli/sync.d.ts +21 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +78 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/type-extractor.d.ts +25 -0
- package/dist/cli/type-extractor.d.ts.map +1 -0
- package/dist/cli/type-extractor.js +254 -0
- package/dist/cli/type-extractor.js.map +1 -0
- package/dist/cli/type-extractor.test.d.ts +2 -0
- package/dist/cli/type-extractor.test.d.ts.map +1 -0
- package/dist/cli/type-extractor.test.js +173 -0
- package/dist/cli/type-extractor.test.js.map +1 -0
- package/dist/client/http.d.ts +44 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +311 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/index.d.ts +158 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +256 -0
- package/dist/client/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +12 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +13 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +18 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +42 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +39 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/actions.d.ts +42 -0
- package/dist/component/actions.d.ts.map +1 -0
- package/dist/component/actions.js +405 -0
- package/dist/component/actions.js.map +1 -0
- package/dist/component/apiKeyMutations.d.ts +29 -0
- package/dist/component/apiKeyMutations.d.ts.map +1 -0
- package/dist/component/apiKeyMutations.js +149 -0
- package/dist/component/apiKeyMutations.js.map +1 -0
- package/dist/component/apiKeyQueries.d.ts +37 -0
- package/dist/component/apiKeyQueries.d.ts.map +1 -0
- package/dist/component/apiKeyQueries.js +127 -0
- package/dist/component/apiKeyQueries.js.map +1 -0
- package/dist/component/checksum.d.ts +6 -0
- package/dist/component/checksum.d.ts.map +1 -0
- package/dist/component/checksum.js +14 -0
- package/dist/component/checksum.js.map +1 -0
- package/dist/component/checksum.test.d.ts +2 -0
- package/dist/component/checksum.test.d.ts.map +1 -0
- package/dist/component/checksum.test.js +27 -0
- package/dist/component/checksum.test.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +4 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/cronActions.d.ts +3 -0
- package/dist/component/cronActions.d.ts.map +1 -0
- package/dist/component/cronActions.js +38 -0
- package/dist/component/cronActions.js.map +1 -0
- package/dist/component/cronQueries.d.ts +6 -0
- package/dist/component/cronQueries.d.ts.map +1 -0
- package/dist/component/cronQueries.js +38 -0
- package/dist/component/cronQueries.js.map +1 -0
- package/dist/component/crons.d.ts +3 -0
- package/dist/component/crons.d.ts.map +1 -0
- package/dist/component/crons.js +18 -0
- package/dist/component/crons.js.map +1 -0
- package/dist/component/format.d.ts +11 -0
- package/dist/component/format.d.ts.map +1 -0
- package/dist/component/format.js +175 -0
- package/dist/component/format.js.map +1 -0
- package/dist/component/format.test.d.ts +2 -0
- package/dist/component/format.test.d.ts.map +1 -0
- package/dist/component/format.test.js +118 -0
- package/dist/component/format.test.js.map +1 -0
- package/dist/component/mutations.d.ts +158 -0
- package/dist/component/mutations.d.ts.map +1 -0
- package/dist/component/mutations.js +745 -0
- package/dist/component/mutations.js.map +1 -0
- package/dist/component/queries.d.ts +94 -0
- package/dist/component/queries.d.ts.map +1 -0
- package/dist/component/queries.js +574 -0
- package/dist/component/queries.js.map +1 -0
- package/dist/component/schema.d.ts +278 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +161 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +571 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/shared.d.ts +126 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +67 -0
- package/dist/shared.js.map +1 -0
- package/dist/test.d.ts +23 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +21 -0
- package/dist/test.js.map +1 -0
- package/eslint.config.js +15 -0
- package/example/convex/convex.config.ts +7 -0
- package/example/convex/memory.ts +129 -0
- package/llms.md +175 -0
- package/llms.txt +126 -0
- package/package.json +72 -0
- package/prds/API-REFERENCE.md +935 -0
- package/prds/README.md +988 -0
- package/prds/SETUP.md +682 -0
- package/src/cli/index.ts +254 -0
- package/src/cli/parsers/claude-code.ts +80 -0
- package/src/cli/parsers/codex.ts +45 -0
- package/src/cli/parsers/conductor.ts +47 -0
- package/src/cli/parsers/cursor.ts +55 -0
- package/src/cli/parsers/index.ts +30 -0
- package/src/cli/parsers/opencode.ts +84 -0
- package/src/cli/parsers/parsers.test.ts +201 -0
- package/src/cli/parsers/pi.ts +47 -0
- package/src/cli/parsers/types.ts +26 -0
- package/src/cli/parsers/vscode-copilot.ts +78 -0
- package/src/cli/parsers/zed.ts +47 -0
- package/src/cli/sync.ts +110 -0
- package/src/cli/type-extractor.test.ts +241 -0
- package/src/cli/type-extractor.ts +331 -0
- package/src/client/http.ts +415 -0
- package/src/client/index.ts +519 -0
- package/src/component/_generated/api.ts +14 -0
- package/src/component/_generated/dataModel.ts +20 -0
- package/src/component/_generated/server.ts +64 -0
- package/src/component/actions.ts +558 -0
- package/src/component/apiKeyMutations.ts +175 -0
- package/src/component/apiKeyQueries.ts +156 -0
- package/src/component/checksum.test.ts +31 -0
- package/src/component/checksum.ts +13 -0
- package/src/component/convex.config.ts +5 -0
- package/src/component/cronActions.ts +52 -0
- package/src/component/cronQueries.ts +42 -0
- package/src/component/crons.ts +34 -0
- package/src/component/format.test.ts +133 -0
- package/src/component/format.ts +232 -0
- package/src/component/mutations.ts +824 -0
- package/src/component/queries.ts +684 -0
- package/src/component/schema.ts +207 -0
- package/src/mcp/server.ts +695 -0
- package/src/shared.ts +251 -0
- package/src/test.ts +32 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +8 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Agent Instructions — @waynesutton/agent-memory
|
|
2
|
+
|
|
3
|
+
## Project Overview
|
|
4
|
+
|
|
5
|
+
This is a Convex Component npm package (`@waynesutton/agent-memory`) that provides persistent, cloud-synced memory for AI coding agents. It is not a standalone app — it is installed into other Convex apps via `app.use(agentMemory)`.
|
|
6
|
+
|
|
7
|
+
## Tech Stack
|
|
8
|
+
|
|
9
|
+
- **Runtime:** Convex (serverless backend)
|
|
10
|
+
- **Language:** TypeScript (strict mode)
|
|
11
|
+
- **Build:** `tsc` (no bundler)
|
|
12
|
+
- **Test:** Vitest + convex-test
|
|
13
|
+
- **Package manager:** npm
|
|
14
|
+
|
|
15
|
+
## Project Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/
|
|
19
|
+
├── component/ # Convex backend (defineComponent)
|
|
20
|
+
│ ├── schema.ts # 9 tables with validators and indexes
|
|
21
|
+
│ ├── mutations.ts # CRUD + batch + feedback + relations + history
|
|
22
|
+
│ ├── queries.ts # list, search, context bundle, history, feedback
|
|
23
|
+
│ ├── actions.ts # embeddings, semantic search, intelligent ingest
|
|
24
|
+
│ ├── apiKeyMutations.ts # API key create/revoke, rate limit
|
|
25
|
+
│ ├── apiKeyQueries.ts # API key validation
|
|
26
|
+
│ ├── crons.ts # Scheduled jobs (decay, cleanup)
|
|
27
|
+
│ ├── cronActions.ts # Internal actions for crons
|
|
28
|
+
│ ├── cronQueries.ts # Internal queries for crons
|
|
29
|
+
│ ├── format.ts # Memory -> tool-native file conversion
|
|
30
|
+
│ └── checksum.ts # FNV-1a hashing
|
|
31
|
+
├── client/
|
|
32
|
+
│ ├── index.ts # AgentMemory class (public API)
|
|
33
|
+
│ └── http.ts # MemoryHttpApi class (HTTP endpoints)
|
|
34
|
+
├── mcp/
|
|
35
|
+
│ └── server.ts # MCP server (14 tools)
|
|
36
|
+
├── cli/
|
|
37
|
+
│ ├── index.ts # CLI entry point
|
|
38
|
+
│ ├── sync.ts # Push/pull logic
|
|
39
|
+
│ └── parsers/ # 8 tool format parsers
|
|
40
|
+
├── shared.ts # Shared types and validators
|
|
41
|
+
└── test.ts # Test helper
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Development Commands
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm run build # tsc compile
|
|
48
|
+
npm run dev # tsc --watch
|
|
49
|
+
npm test # vitest run
|
|
50
|
+
npm run test:watch # vitest watch
|
|
51
|
+
npm run codegen # convex codegen for component
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Coding Conventions
|
|
55
|
+
|
|
56
|
+
### Convex Component Rules
|
|
57
|
+
|
|
58
|
+
1. **All public functions must have `args` and `returns` validators** — Convex components require explicit validators on every exported query, mutation, and action.
|
|
59
|
+
2. **No `ctx.auth`** — components cannot access the consuming app's auth. Identity is passed explicitly via `userId`, `agentId`, etc.
|
|
60
|
+
3. **No `process.env`** — components cannot read environment variables. Config values like API keys are passed as function arguments.
|
|
61
|
+
4. **IDs become strings at the boundary** — when the consuming app calls component functions, Convex `Id<"table">` values cross as strings. Cast with `as any` at boundaries.
|
|
62
|
+
5. **Use `(q: any)` for index queries** — TypeScript struggles with component-internal index types. Use `any` for `.withIndex()` callback parameters.
|
|
63
|
+
6. **Component tables are isolated** — the 9 tables live under the `agentMemory:` namespace, separate from the consuming app's tables.
|
|
64
|
+
|
|
65
|
+
### TypeScript
|
|
66
|
+
|
|
67
|
+
- Strict mode enabled
|
|
68
|
+
- Use `import type` for type-only imports
|
|
69
|
+
- Use `.js` extensions in import paths (ESM)
|
|
70
|
+
- Prefer `as const` for literal arrays used as validators
|
|
71
|
+
|
|
72
|
+
### Style
|
|
73
|
+
|
|
74
|
+
- Functions use explicit return types where validators require it
|
|
75
|
+
- Mutations that modify state always record history entries
|
|
76
|
+
- Checksums use FNV-1a (see `src/component/checksum.ts`)
|
|
77
|
+
- All timestamps are `Date.now()` (milliseconds)
|
|
78
|
+
|
|
79
|
+
## Key Patterns
|
|
80
|
+
|
|
81
|
+
### Adding a new query/mutation to the component
|
|
82
|
+
|
|
83
|
+
1. Add the function to `src/component/queries.ts` or `src/component/mutations.ts`
|
|
84
|
+
2. Include full `args` and `returns` validators
|
|
85
|
+
3. Add a wrapper method to `src/client/index.ts` (AgentMemory class)
|
|
86
|
+
4. If MCP-accessible, add a tool definition to `src/mcp/server.ts`
|
|
87
|
+
5. Update `src/shared.ts` if new types are needed
|
|
88
|
+
|
|
89
|
+
### The context bundle pattern
|
|
90
|
+
|
|
91
|
+
`getContextBundle` returns memories in 3 tiers:
|
|
92
|
+
- **pinned** — effective priority >= 0.8 (boosted by positive feedback)
|
|
93
|
+
- **relevant** — path-matched against `activePaths`
|
|
94
|
+
- **available** — everything else as summaries
|
|
95
|
+
|
|
96
|
+
Priority is computed by `getEffectivePriority()` which factors in `positiveCount` and `negativeCount`.
|
|
97
|
+
|
|
98
|
+
### The intelligent ingest pipeline
|
|
99
|
+
|
|
100
|
+
`actions.ingest` does: extract facts (LLM) -> search existing (full-text) -> decide per-fact (LLM) -> execute ADD/UPDATE/DELETE/SKIP.
|
|
101
|
+
|
|
102
|
+
## Testing
|
|
103
|
+
|
|
104
|
+
Tests use `convex-test` with Vitest. The component exports a test helper at `@waynesutton/agent-memory/test`.
|
|
105
|
+
|
|
106
|
+
## Documentation
|
|
107
|
+
|
|
108
|
+
- `prds/README.md` — user-facing README
|
|
109
|
+
- `prds/API-REFERENCE.md` — complete API reference
|
|
110
|
+
- `prds/SETUP.md` — step-by-step setup guide
|
|
111
|
+
- `llms.txt` — concise reference for LLMs
|
|
112
|
+
- `llms.md` — detailed agent reference
|
|
113
|
+
- `CLAUDE.md` — Claude Code specific instructions
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# CLAUDE.md — @waynesutton/agent-memory
|
|
2
|
+
|
|
3
|
+
## What This Project Is
|
|
4
|
+
|
|
5
|
+
A Convex Component npm package that provides persistent, cloud-synced memory for AI coding agents. Installed into Convex apps via `app.use(agentMemory)`. Not a standalone app.
|
|
6
|
+
|
|
7
|
+
## Build & Test
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run build # tsc
|
|
11
|
+
npm test # vitest run
|
|
12
|
+
npm run codegen # convex codegen --component-dir ./src/component
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Key Files
|
|
16
|
+
|
|
17
|
+
- `src/component/schema.ts` — 9 tables (memories, embeddings, projects, syncLog, memoryHistory, memoryFeedback, memoryRelations, apiKeys, rateLimitTokens)
|
|
18
|
+
- `src/component/mutations.ts` — all write operations with history tracking
|
|
19
|
+
- `src/component/queries.ts` — all read operations
|
|
20
|
+
- `src/component/actions.ts` — embeddings, semantic search, intelligent ingest
|
|
21
|
+
- `src/component/apiKeyMutations.ts` — API key CRUD and rate limiting
|
|
22
|
+
- `src/component/apiKeyQueries.ts` — API key validation
|
|
23
|
+
- `src/client/index.ts` — `AgentMemory` class (the public API consumers use)
|
|
24
|
+
- `src/client/http.ts` — `MemoryHttpApi` class (read-only HTTP endpoints)
|
|
25
|
+
- `src/mcp/server.ts` — MCP server with 14 tools
|
|
26
|
+
- `src/shared.ts` — shared types and validators (used by both component and client)
|
|
27
|
+
- `src/component/crons.ts` — scheduled jobs (relevance decay, cleanup)
|
|
28
|
+
|
|
29
|
+
## Convex Component Rules (IMPORTANT)
|
|
30
|
+
|
|
31
|
+
These rules are non-negotiable when modifying this codebase:
|
|
32
|
+
|
|
33
|
+
1. **Every exported query/mutation/action must have `args` and `returns` validators.** This is a Convex component requirement. Missing validators will cause deployment failures.
|
|
34
|
+
|
|
35
|
+
2. **No `ctx.auth` inside `src/component/`.** Components don't have access to the consuming app's auth system. User identity is passed explicitly as string args (`userId`, `agentId`).
|
|
36
|
+
|
|
37
|
+
3. **No `process.env` inside `src/component/`.** Components run in an isolated environment. API keys and config must be passed as function arguments.
|
|
38
|
+
|
|
39
|
+
4. **IDs are strings at the component boundary.** When the consuming app calls component functions, `Id<"memories">` becomes `string`. Use `as any` or `as unknown as string` at boundaries.
|
|
40
|
+
|
|
41
|
+
5. **Use `(q: any)` in `.withIndex()` callbacks.** The generated types for component indexes don't resolve cleanly — use `any` for the query builder parameter.
|
|
42
|
+
|
|
43
|
+
6. **Import paths use `.js` extensions.** This is ESM. Write `import { foo } from "./bar.js"` not `"./bar"`.
|
|
44
|
+
|
|
45
|
+
7. **Mutations that change content must record history.** Every create/update/archive/restore writes to the `memoryHistory` table for audit trail.
|
|
46
|
+
|
|
47
|
+
## Code Style
|
|
48
|
+
|
|
49
|
+
- TypeScript strict mode
|
|
50
|
+
- No bundler — plain `tsc` output
|
|
51
|
+
- Prefer `as const` arrays for validator source-of-truth
|
|
52
|
+
- Timestamps are always `Date.now()` (milliseconds)
|
|
53
|
+
- Checksums use FNV-1a (`src/component/checksum.ts`)
|
|
54
|
+
- No unnecessary abstractions — three similar lines > premature helper
|
|
55
|
+
|
|
56
|
+
## Architecture Notes
|
|
57
|
+
|
|
58
|
+
- The `AgentMemory` class in `src/client/index.ts` wraps all component function calls. Consumers never call component functions directly in practice.
|
|
59
|
+
- The `MemoryHttpApi` class in `src/client/http.ts` generates `httpAction` handlers. It cannot create HTTP routes directly (Convex component limitation) — the consuming app mounts them.
|
|
60
|
+
- The MCP server (`src/mcp/server.ts`) runs as a local process using stdio, not as a Convex function. It uses `ConvexHttpClient` to talk to the backend.
|
|
61
|
+
- Cron jobs are defined in `src/component/crons.ts` and call internal actions/mutations. They run inside the component's isolated environment.
|
|
62
|
+
- The intelligent ingest pipeline (`actions.ingest`) calls an external LLM API from within a Convex action. It extracts facts, searches for overlap, and decides ADD/UPDATE/DELETE/SKIP per fact.
|
|
63
|
+
|
|
64
|
+
## When Adding Features
|
|
65
|
+
|
|
66
|
+
1. Start with the schema if new tables/fields are needed (`src/component/schema.ts`)
|
|
67
|
+
2. Add component functions (queries/mutations/actions in `src/component/`)
|
|
68
|
+
3. Add client wrapper methods (`src/client/index.ts`)
|
|
69
|
+
4. Add MCP tool if agent-accessible (`src/mcp/server.ts`)
|
|
70
|
+
5. Add types to `src/shared.ts` if needed
|
|
71
|
+
6. Update docs: `prds/API-REFERENCE.md`, `prds/README.md`, `prds/SETUP.md`
|
|
72
|
+
7. Run `npm run build` to verify — zero TypeScript errors required
|
|
73
|
+
|
|
74
|
+
## Docs Location
|
|
75
|
+
|
|
76
|
+
User-facing docs are in `prds/` (not the project root):
|
|
77
|
+
- `prds/README.md` — full README
|
|
78
|
+
- `prds/API-REFERENCE.md` — complete API reference
|
|
79
|
+
- `prds/SETUP.md` — setup guide with all integration paths (A through H)
|
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# agent-memory
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { push, pull, detectTools } from "./sync.js";
|
|
4
|
+
import { extractTypeMemories } from "./type-extractor.js";
|
|
5
|
+
import { ConvexHttpClient } from "convex/browser";
|
|
6
|
+
const program = new Command();
|
|
7
|
+
program
|
|
8
|
+
.name("agent-memory")
|
|
9
|
+
.description("CLI for syncing agent memories between local files and Convex")
|
|
10
|
+
.version("0.0.1");
|
|
11
|
+
// ── init ────────────────────────────────────────────────────────────
|
|
12
|
+
program
|
|
13
|
+
.command("init")
|
|
14
|
+
.description("Detect tools and register project")
|
|
15
|
+
.option("--project <id>", "Project ID", "default")
|
|
16
|
+
.option("--name <name>", "Project display name")
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const convexUrl = requireConvexUrl();
|
|
19
|
+
const dir = process.cwd();
|
|
20
|
+
console.log("Detecting tools...");
|
|
21
|
+
const tools = await detectTools(dir);
|
|
22
|
+
if (tools.length === 0) {
|
|
23
|
+
console.log("No tool configurations detected. Supported: Claude Code, Cursor, OpenCode, Codex, Conductor, Zed, VS Code Copilot, Pi");
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(`Found: ${tools.join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
const client = new ConvexHttpClient(convexUrl);
|
|
29
|
+
await client.mutation("agentMemory/mutations:upsertProject", {
|
|
30
|
+
projectId: opts.project,
|
|
31
|
+
name: opts.name ?? opts.project,
|
|
32
|
+
settings: {
|
|
33
|
+
autoSync: false,
|
|
34
|
+
syncFormats: tools,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
console.log(`Project "${opts.project}" registered.`);
|
|
38
|
+
});
|
|
39
|
+
// ── push ────────────────────────────────────────────────────────────
|
|
40
|
+
program
|
|
41
|
+
.command("push")
|
|
42
|
+
.description("Push local memory files to Convex")
|
|
43
|
+
.option("--project <id>", "Project ID", "default")
|
|
44
|
+
.option("--format <format>", "Tool format to parse")
|
|
45
|
+
.option("--user <id>", "User ID for user-scoped memories")
|
|
46
|
+
.action(async (opts) => {
|
|
47
|
+
const convexUrl = requireConvexUrl();
|
|
48
|
+
console.log("Pushing local memories to Convex...");
|
|
49
|
+
await push({
|
|
50
|
+
convexUrl,
|
|
51
|
+
projectId: opts.project,
|
|
52
|
+
format: opts.format,
|
|
53
|
+
userId: opts.user,
|
|
54
|
+
dir: process.cwd(),
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
// ── pull ────────────────────────────────────────────────────────────
|
|
58
|
+
program
|
|
59
|
+
.command("pull")
|
|
60
|
+
.description("Pull memories from Convex to local files")
|
|
61
|
+
.option("--project <id>", "Project ID", "default")
|
|
62
|
+
.option("--format <format>", "Output format", "raw")
|
|
63
|
+
.option("--user <id>", "User ID for user-scoped memories")
|
|
64
|
+
.action(async (opts) => {
|
|
65
|
+
const convexUrl = requireConvexUrl();
|
|
66
|
+
console.log("Pulling memories from Convex...");
|
|
67
|
+
await pull({
|
|
68
|
+
convexUrl,
|
|
69
|
+
projectId: opts.project,
|
|
70
|
+
format: opts.format,
|
|
71
|
+
userId: opts.user,
|
|
72
|
+
dir: process.cwd(),
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// ── list ────────────────────────────────────────────────────────────
|
|
76
|
+
program
|
|
77
|
+
.command("list")
|
|
78
|
+
.description("List memories in the terminal")
|
|
79
|
+
.option("--project <id>", "Project ID", "default")
|
|
80
|
+
.option("--type <type>", "Filter by memory type")
|
|
81
|
+
.action(async (opts) => {
|
|
82
|
+
const convexUrl = requireConvexUrl();
|
|
83
|
+
const client = new ConvexHttpClient(convexUrl);
|
|
84
|
+
const memories = await client.query("agentMemory/queries:list", {
|
|
85
|
+
projectId: opts.project,
|
|
86
|
+
memoryType: opts.type,
|
|
87
|
+
archived: false,
|
|
88
|
+
});
|
|
89
|
+
if (memories.length === 0) {
|
|
90
|
+
console.log("No memories found.");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
console.log(`\n${memories.length} memories:\n`);
|
|
94
|
+
for (const m of memories) {
|
|
95
|
+
const priority = m.priority !== undefined ? ` [p=${m.priority}]` : "";
|
|
96
|
+
console.log(` ${m._id} ${m.memoryType.padEnd(12)} ${m.title}${priority}`);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// ── search ──────────────────────────────────────────────────────────
|
|
100
|
+
program
|
|
101
|
+
.command("search <query>")
|
|
102
|
+
.description("Search memories")
|
|
103
|
+
.option("--project <id>", "Project ID", "default")
|
|
104
|
+
.option("--limit <n>", "Max results", "10")
|
|
105
|
+
.action(async (query, opts) => {
|
|
106
|
+
const convexUrl = requireConvexUrl();
|
|
107
|
+
const client = new ConvexHttpClient(convexUrl);
|
|
108
|
+
const results = await client.query("agentMemory/queries:search", {
|
|
109
|
+
projectId: opts.project,
|
|
110
|
+
query,
|
|
111
|
+
limit: parseInt(opts.limit),
|
|
112
|
+
});
|
|
113
|
+
if (results.length === 0) {
|
|
114
|
+
console.log("No results found.");
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
console.log(`\n${results.length} results:\n`);
|
|
118
|
+
for (const m of results) {
|
|
119
|
+
console.log(` ${m._id} ${m.title}`);
|
|
120
|
+
// Show first 100 chars of content
|
|
121
|
+
const preview = m.content.slice(0, 100).replace(/\n/g, " ");
|
|
122
|
+
console.log(` ${preview}${m.content.length > 100 ? "..." : ""}`);
|
|
123
|
+
console.log();
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// ── ingest-types ────────────────────────────────────────────────────
|
|
127
|
+
program
|
|
128
|
+
.command("ingest-types <glob>")
|
|
129
|
+
.description("Generate type documentation from TypeScript files and store as reference memories")
|
|
130
|
+
.option("--project <id>", "Project ID", "default")
|
|
131
|
+
.option("--user <id>", "User ID for user-scoped memories")
|
|
132
|
+
.option("--tags <tags>", "Comma-separated additional tags")
|
|
133
|
+
.option("--priority <n>", "Priority (0-1)", "0.6")
|
|
134
|
+
.option("--exclude <patterns>", "Comma-separated glob patterns to exclude")
|
|
135
|
+
.action(async (glob, opts) => {
|
|
136
|
+
const convexUrl = requireConvexUrl();
|
|
137
|
+
console.log(`Extracting types from: ${glob}`);
|
|
138
|
+
const result = await extractTypeMemories({
|
|
139
|
+
globPattern: glob,
|
|
140
|
+
cwd: process.cwd(),
|
|
141
|
+
tags: opts.tags ? opts.tags.split(",") : [],
|
|
142
|
+
priority: parseFloat(opts.priority),
|
|
143
|
+
exclude: opts.exclude ? opts.exclude.split(",") : undefined,
|
|
144
|
+
});
|
|
145
|
+
if (result.memories.length === 0) {
|
|
146
|
+
console.log(`No exported types found in ${result.filesProcessed} files.`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
console.log(`Found ${result.memories.length} type definitions across ${result.filesProcessed} files.`);
|
|
150
|
+
console.log("Pushing to Convex...");
|
|
151
|
+
const client = new ConvexHttpClient(convexUrl);
|
|
152
|
+
const importResult = await client.mutation("agentMemory/mutations:importFromLocal", {
|
|
153
|
+
projectId: opts.project,
|
|
154
|
+
userId: opts.user,
|
|
155
|
+
memories: result.memories,
|
|
156
|
+
});
|
|
157
|
+
console.log(`Done: ${importResult.created} created, ${importResult.updated} updated, ${importResult.unchanged} unchanged`);
|
|
158
|
+
});
|
|
159
|
+
// ── mcp ─────────────────────────────────────────────────────────────
|
|
160
|
+
program
|
|
161
|
+
.command("mcp")
|
|
162
|
+
.description("Start the MCP server")
|
|
163
|
+
.option("--project <id>", "Project ID", "default")
|
|
164
|
+
.option("--read-only", "Disable write operations")
|
|
165
|
+
.option("--disable-tools <tools>", "Comma-separated list of tools to disable")
|
|
166
|
+
.option("--embedding-api-key <key>", "API key for vector search")
|
|
167
|
+
.action(async (opts) => {
|
|
168
|
+
const convexUrl = requireConvexUrl();
|
|
169
|
+
// Dynamic import to avoid loading MCP deps when not needed
|
|
170
|
+
const { startMcpServer } = await import("../mcp/server.js");
|
|
171
|
+
await startMcpServer({
|
|
172
|
+
convexUrl,
|
|
173
|
+
projectId: opts.project,
|
|
174
|
+
readOnly: opts.readOnly ?? false,
|
|
175
|
+
disabledTools: opts.disableTools
|
|
176
|
+
? opts.disableTools.split(",")
|
|
177
|
+
: [],
|
|
178
|
+
embeddingApiKey: opts.embeddingApiKey,
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
// ── Helpers ─────────────────────────────────────────────────────────
|
|
182
|
+
function requireConvexUrl() {
|
|
183
|
+
const url = process.env.CONVEX_URL;
|
|
184
|
+
if (!url) {
|
|
185
|
+
console.error("Error: CONVEX_URL environment variable is required.");
|
|
186
|
+
console.error("Set it to your Convex deployment URL.");
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
return url;
|
|
190
|
+
}
|
|
191
|
+
program.parse();
|
|
192
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/claude-code.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,gBAAgB,EAAE,MAiE9B,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readdir, readFile, access } from "node:fs/promises";
|
|
2
|
+
import { join, basename } from "node:path";
|
|
3
|
+
import matter from "gray-matter";
|
|
4
|
+
import { computeChecksum } from "../../component/checksum.js";
|
|
5
|
+
export const claudeCodeParser = {
|
|
6
|
+
name: "Claude Code",
|
|
7
|
+
async detect(dir) {
|
|
8
|
+
try {
|
|
9
|
+
await access(join(dir, ".claude"));
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
async parse(dir) {
|
|
17
|
+
const memories = [];
|
|
18
|
+
// Parse .claude/rules/*.md
|
|
19
|
+
const rulesDir = join(dir, ".claude", "rules");
|
|
20
|
+
const ruleFiles = await safeReaddir(rulesDir);
|
|
21
|
+
for (const file of ruleFiles) {
|
|
22
|
+
if (!file.endsWith(".md"))
|
|
23
|
+
continue;
|
|
24
|
+
const fullPath = join(rulesDir, file);
|
|
25
|
+
const raw = await readFile(fullPath, "utf-8");
|
|
26
|
+
const { data, content } = matter(raw);
|
|
27
|
+
memories.push({
|
|
28
|
+
title: basename(file, ".md"),
|
|
29
|
+
content: content.trim(),
|
|
30
|
+
memoryType: "instruction",
|
|
31
|
+
scope: "project",
|
|
32
|
+
tags: [],
|
|
33
|
+
paths: data.paths,
|
|
34
|
+
priority: 0.9, // rules are high priority
|
|
35
|
+
source: "claude-code",
|
|
36
|
+
checksum: computeChecksum(content.trim()),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Parse memory files from ~/.claude/projects/*/memory/*.md
|
|
40
|
+
const homeDir = process.env.HOME ?? "";
|
|
41
|
+
const projectsDir = join(homeDir, ".claude", "projects");
|
|
42
|
+
const projectDirs = await safeReaddir(projectsDir);
|
|
43
|
+
for (const projDir of projectDirs) {
|
|
44
|
+
const memDir = join(projectsDir, projDir, "memory");
|
|
45
|
+
const memFiles = await safeReaddir(memDir);
|
|
46
|
+
for (const file of memFiles) {
|
|
47
|
+
if (!file.endsWith(".md"))
|
|
48
|
+
continue;
|
|
49
|
+
const fullPath = join(memDir, file);
|
|
50
|
+
const raw = await readFile(fullPath, "utf-8");
|
|
51
|
+
const { data, content } = matter(raw);
|
|
52
|
+
memories.push({
|
|
53
|
+
title: basename(file, ".md"),
|
|
54
|
+
content: content.trim(),
|
|
55
|
+
memoryType: data.type === "feedback" ? "feedback" : "learning",
|
|
56
|
+
scope: "user",
|
|
57
|
+
tags: [],
|
|
58
|
+
priority: 0.5,
|
|
59
|
+
source: "claude-code",
|
|
60
|
+
checksum: computeChecksum(content.trim()),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return memories;
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
async function safeReaddir(dir) {
|
|
68
|
+
try {
|
|
69
|
+
return await readdir(dir);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cli/parsers/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,WAAW,EAAE,MAuCzB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFile, access } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { computeChecksum } from "../../component/checksum.js";
|
|
4
|
+
export const codexParser = {
|
|
5
|
+
name: "Codex",
|
|
6
|
+
async detect(dir) {
|
|
7
|
+
try {
|
|
8
|
+
await access(join(dir, "AGENTS.md"));
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
async parse(dir) {
|
|
16
|
+
const memories = [];
|
|
17
|
+
// Check AGENTS.override.md first (takes priority)
|
|
18
|
+
for (const filename of ["AGENTS.override.md", "AGENTS.md"]) {
|
|
19
|
+
try {
|
|
20
|
+
const raw = await readFile(join(dir, filename), "utf-8");
|
|
21
|
+
const content = raw.trim();
|
|
22
|
+
if (content.length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
memories.push({
|
|
25
|
+
title: filename.replace(".md", "").toLowerCase(),
|
|
26
|
+
content,
|
|
27
|
+
memoryType: "instruction",
|
|
28
|
+
scope: "project",
|
|
29
|
+
tags: [],
|
|
30
|
+
priority: filename.includes("override") ? 1.0 : 0.8,
|
|
31
|
+
source: "codex",
|
|
32
|
+
checksum: computeChecksum(content),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// File doesn't exist
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return memories;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/parsers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAW;IACjC,IAAI,EAAE,OAAO;IAEb,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAmB,EAAE,CAAC;QAEpC,kDAAkD;QAClD,KAAK,MAAM,QAAQ,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAEnC,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;oBAChD,OAAO;oBACP,UAAU,EAAE,aAAa;oBACzB,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;oBACnD,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;iBACnC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conductor.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/conductor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,eAAe,EAAE,MAyC7B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readdir, readFile, access } from "node:fs/promises";
|
|
2
|
+
import { join, basename } from "node:path";
|
|
3
|
+
import { computeChecksum } from "../../component/checksum.js";
|
|
4
|
+
export const conductorParser = {
|
|
5
|
+
name: "Conductor",
|
|
6
|
+
async detect(dir) {
|
|
7
|
+
try {
|
|
8
|
+
await access(join(dir, ".conductor"));
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
async parse(dir) {
|
|
16
|
+
const memories = [];
|
|
17
|
+
const rulesDir = join(dir, ".conductor", "rules");
|
|
18
|
+
let files = [];
|
|
19
|
+
try {
|
|
20
|
+
files = await readdir(rulesDir);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return memories;
|
|
24
|
+
}
|
|
25
|
+
for (const file of files) {
|
|
26
|
+
if (!file.endsWith(".md"))
|
|
27
|
+
continue;
|
|
28
|
+
const content = (await readFile(join(rulesDir, file), "utf-8")).trim();
|
|
29
|
+
memories.push({
|
|
30
|
+
title: basename(file, ".md"),
|
|
31
|
+
content,
|
|
32
|
+
memoryType: "instruction",
|
|
33
|
+
scope: "project",
|
|
34
|
+
tags: [],
|
|
35
|
+
priority: 0.8,
|
|
36
|
+
source: "conductor",
|
|
37
|
+
checksum: computeChecksum(content),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return memories;
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=conductor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conductor.js","sourceRoot":"","sources":["../../../src/cli/parsers/conductor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,IAAI,EAAE,WAAW;IAEjB,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAElD,IAAI,KAAK,GAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEvE,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;gBAC5B,OAAO;gBACP,UAAU,EAAE,aAAa;gBACzB,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE,GAAG;gBACb,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/cli/parsers/cursor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,YAAY,EAAE,MAwC1B,CAAC"}
|