@goondocks/myco 0.1.0
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-plugin/marketplace.json +22 -0
- package/.claude-plugin/plugin.json +18 -0
- package/CONTRIBUTING.md +143 -0
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/commands/init.md +231 -0
- package/commands/setup-llm.md +89 -0
- package/commands/status.md +112 -0
- package/dist/src/agents/adapter.d.ts +76 -0
- package/dist/src/agents/adapter.d.ts.map +1 -0
- package/dist/src/agents/adapter.js +124 -0
- package/dist/src/agents/adapter.js.map +1 -0
- package/dist/src/agents/claude-code.d.ts +3 -0
- package/dist/src/agents/claude-code.d.ts.map +1 -0
- package/dist/src/agents/claude-code.js +22 -0
- package/dist/src/agents/claude-code.js.map +1 -0
- package/dist/src/agents/cursor.d.ts +3 -0
- package/dist/src/agents/cursor.d.ts.map +1 -0
- package/dist/src/agents/cursor.js +154 -0
- package/dist/src/agents/cursor.js.map +1 -0
- package/dist/src/agents/index.d.ts +6 -0
- package/dist/src/agents/index.d.ts.map +1 -0
- package/dist/src/agents/index.js +5 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/agents/registry.d.ts +34 -0
- package/dist/src/agents/registry.d.ts.map +1 -0
- package/dist/src/agents/registry.js +95 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/artifacts/candidates.d.ts +20 -0
- package/dist/src/artifacts/candidates.d.ts.map +1 -0
- package/dist/src/artifacts/candidates.js +84 -0
- package/dist/src/artifacts/candidates.js.map +1 -0
- package/dist/src/artifacts/slugify.d.ts +2 -0
- package/dist/src/artifacts/slugify.d.ts.map +1 -0
- package/dist/src/artifacts/slugify.js +22 -0
- package/dist/src/artifacts/slugify.js.map +1 -0
- package/dist/src/capture/artifact-watcher.d.ts +19 -0
- package/dist/src/capture/artifact-watcher.d.ts.map +1 -0
- package/dist/src/capture/artifact-watcher.js +37 -0
- package/dist/src/capture/artifact-watcher.js.map +1 -0
- package/dist/src/capture/buffer.d.ts +20 -0
- package/dist/src/capture/buffer.d.ts.map +1 -0
- package/dist/src/capture/buffer.js +55 -0
- package/dist/src/capture/buffer.js.map +1 -0
- package/dist/src/capture/plan-detector.d.ts +15 -0
- package/dist/src/capture/plan-detector.d.ts.map +1 -0
- package/dist/src/capture/plan-detector.js +34 -0
- package/dist/src/capture/plan-detector.js.map +1 -0
- package/dist/src/capture/processor.d.ts +2 -0
- package/dist/src/capture/processor.d.ts.map +1 -0
- package/dist/src/capture/processor.js +3 -0
- package/dist/src/capture/processor.js.map +1 -0
- package/dist/src/capture/prompts/classify.md +28 -0
- package/dist/src/capture/prompts/debugging.md +91 -0
- package/dist/src/capture/prompts/exploration.md +88 -0
- package/dist/src/capture/prompts/extraction.md +93 -0
- package/dist/src/capture/prompts/implementation.md +90 -0
- package/dist/src/capture/prompts/prompts/classify.md +28 -0
- package/dist/src/capture/prompts/prompts/debugging.md +91 -0
- package/dist/src/capture/prompts/prompts/exploration.md +88 -0
- package/dist/src/capture/prompts/prompts/extraction.md +93 -0
- package/dist/src/capture/prompts/prompts/implementation.md +90 -0
- package/dist/src/capture/prompts/prompts/schema.yaml +97 -0
- package/dist/src/capture/prompts/prompts/session-summary.md +65 -0
- package/dist/src/capture/prompts/prompts/session-title.md +46 -0
- package/dist/src/capture/prompts/schema.yaml +97 -0
- package/dist/src/capture/prompts/session-summary.md +65 -0
- package/dist/src/capture/prompts/session-title.md +46 -0
- package/dist/src/capture/prompts.d.ts +77 -0
- package/dist/src/capture/prompts.d.ts.map +1 -0
- package/dist/src/capture/prompts.js +255 -0
- package/dist/src/capture/prompts.js.map +1 -0
- package/dist/src/capture/transcript-miner.d.ts +31 -0
- package/dist/src/capture/transcript-miner.d.ts.map +1 -0
- package/dist/src/capture/transcript-miner.js +61 -0
- package/dist/src/capture/transcript-miner.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +584 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config/loader.d.ts +4 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +32 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +83 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +55 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/constants.d.ts +73 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +86 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/context/injector.d.ts +18 -0
- package/dist/src/context/injector.d.ts.map +1 -0
- package/dist/src/context/injector.js +71 -0
- package/dist/src/context/injector.js.map +1 -0
- package/dist/src/context/relevance.d.ts +13 -0
- package/dist/src/context/relevance.d.ts.map +1 -0
- package/dist/src/context/relevance.js +44 -0
- package/dist/src/context/relevance.js.map +1 -0
- package/dist/src/daemon/batch.d.ts +22 -0
- package/dist/src/daemon/batch.d.ts.map +1 -0
- package/dist/src/daemon/batch.js +38 -0
- package/dist/src/daemon/batch.js.map +1 -0
- package/dist/src/daemon/lifecycle.d.ts +27 -0
- package/dist/src/daemon/lifecycle.d.ts.map +1 -0
- package/dist/src/daemon/lifecycle.js +50 -0
- package/dist/src/daemon/lifecycle.js.map +1 -0
- package/dist/src/daemon/lineage.d.ts +42 -0
- package/dist/src/daemon/lineage.d.ts.map +1 -0
- package/dist/src/daemon/lineage.js +116 -0
- package/dist/src/daemon/lineage.js.map +1 -0
- package/dist/src/daemon/logger.d.ts +33 -0
- package/dist/src/daemon/logger.d.ts.map +1 -0
- package/dist/src/daemon/logger.js +88 -0
- package/dist/src/daemon/logger.js.map +1 -0
- package/dist/src/daemon/main.d.ts +2 -0
- package/dist/src/daemon/main.d.ts.map +1 -0
- package/dist/src/daemon/main.js +738 -0
- package/dist/src/daemon/main.js.map +1 -0
- package/dist/src/daemon/processor.d.ts +44 -0
- package/dist/src/daemon/processor.d.ts.map +1 -0
- package/dist/src/daemon/processor.js +142 -0
- package/dist/src/daemon/processor.js.map +1 -0
- package/dist/src/daemon/server.d.ts +24 -0
- package/dist/src/daemon/server.d.ts.map +1 -0
- package/dist/src/daemon/server.js +117 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/daemon/watcher.d.ts +29 -0
- package/dist/src/daemon/watcher.d.ts.map +1 -0
- package/dist/src/daemon/watcher.js +67 -0
- package/dist/src/daemon/watcher.js.map +1 -0
- package/dist/src/hooks/client.d.ts +20 -0
- package/dist/src/hooks/client.d.ts.map +1 -0
- package/dist/src/hooks/client.js +111 -0
- package/dist/src/hooks/client.js.map +1 -0
- package/dist/src/hooks/post-tool-use.d.ts +2 -0
- package/dist/src/hooks/post-tool-use.d.ts.map +1 -0
- package/dist/src/hooks/post-tool-use.js +40 -0
- package/dist/src/hooks/post-tool-use.js.map +1 -0
- package/dist/src/hooks/read-stdin.d.ts +2 -0
- package/dist/src/hooks/read-stdin.d.ts.map +1 -0
- package/dist/src/hooks/read-stdin.js +10 -0
- package/dist/src/hooks/read-stdin.js.map +1 -0
- package/dist/src/hooks/session-end.d.ts +2 -0
- package/dist/src/hooks/session-end.d.ts.map +1 -0
- package/dist/src/hooks/session-end.js +23 -0
- package/dist/src/hooks/session-end.js.map +1 -0
- package/dist/src/hooks/session-start.d.ts +2 -0
- package/dist/src/hooks/session-start.d.ts.map +1 -0
- package/dist/src/hooks/session-start.js +49 -0
- package/dist/src/hooks/session-start.js.map +1 -0
- package/dist/src/hooks/stop.d.ts +2 -0
- package/dist/src/hooks/stop.d.ts.map +1 -0
- package/dist/src/hooks/stop.js +34 -0
- package/dist/src/hooks/stop.js.map +1 -0
- package/dist/src/hooks/user-prompt-submit.d.ts +2 -0
- package/dist/src/hooks/user-prompt-submit.d.ts.map +1 -0
- package/dist/src/hooks/user-prompt-submit.js +46 -0
- package/dist/src/hooks/user-prompt-submit.js.map +1 -0
- package/dist/src/index/fts.d.ts +16 -0
- package/dist/src/index/fts.d.ts.map +1 -0
- package/dist/src/index/fts.js +53 -0
- package/dist/src/index/fts.js.map +1 -0
- package/dist/src/index/rebuild.d.ts +4 -0
- package/dist/src/index/rebuild.d.ts.map +1 -0
- package/dist/src/index/rebuild.js +40 -0
- package/dist/src/index/rebuild.js.map +1 -0
- package/dist/src/index/sqlite.d.ts +33 -0
- package/dist/src/index/sqlite.d.ts.map +1 -0
- package/dist/src/index/sqlite.js +99 -0
- package/dist/src/index/sqlite.js.map +1 -0
- package/dist/src/index/vectors.d.ts +24 -0
- package/dist/src/index/vectors.d.ts.map +1 -0
- package/dist/src/index/vectors.js +97 -0
- package/dist/src/index/vectors.js.map +1 -0
- package/dist/src/intelligence/anthropic.d.ts +17 -0
- package/dist/src/intelligence/anthropic.d.ts.map +1 -0
- package/dist/src/intelligence/anthropic.js +36 -0
- package/dist/src/intelligence/anthropic.js.map +1 -0
- package/dist/src/intelligence/embeddings.d.ts +3 -0
- package/dist/src/intelligence/embeddings.d.ts.map +1 -0
- package/dist/src/intelligence/embeddings.js +15 -0
- package/dist/src/intelligence/embeddings.js.map +1 -0
- package/dist/src/intelligence/haiku.d.ts +17 -0
- package/dist/src/intelligence/haiku.d.ts.map +1 -0
- package/dist/src/intelligence/haiku.js +35 -0
- package/dist/src/intelligence/haiku.js.map +1 -0
- package/dist/src/intelligence/llm.d.ts +33 -0
- package/dist/src/intelligence/llm.d.ts.map +1 -0
- package/dist/src/intelligence/llm.js +26 -0
- package/dist/src/intelligence/llm.js.map +1 -0
- package/dist/src/intelligence/lm-studio.d.ts +20 -0
- package/dist/src/intelligence/lm-studio.d.ts.map +1 -0
- package/dist/src/intelligence/lm-studio.js +59 -0
- package/dist/src/intelligence/lm-studio.js.map +1 -0
- package/dist/src/intelligence/ollama.d.ts +22 -0
- package/dist/src/intelligence/ollama.d.ts.map +1 -0
- package/dist/src/intelligence/ollama.js +64 -0
- package/dist/src/intelligence/ollama.js.map +1 -0
- package/dist/src/intelligence/response.d.ts +29 -0
- package/dist/src/intelligence/response.d.ts.map +1 -0
- package/dist/src/intelligence/response.js +71 -0
- package/dist/src/intelligence/response.js.map +1 -0
- package/dist/src/intelligence/service.d.ts +18 -0
- package/dist/src/intelligence/service.d.ts.map +1 -0
- package/dist/src/intelligence/service.js +66 -0
- package/dist/src/intelligence/service.js.map +1 -0
- package/dist/src/logs/format.d.ts +6 -0
- package/dist/src/logs/format.d.ts.map +1 -0
- package/dist/src/logs/format.js +46 -0
- package/dist/src/logs/format.js.map +1 -0
- package/dist/src/logs/reader.d.ts +28 -0
- package/dist/src/logs/reader.d.ts.map +1 -0
- package/dist/src/logs/reader.js +106 -0
- package/dist/src/logs/reader.js.map +1 -0
- package/dist/src/mcp/server.d.ts +16 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +305 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/consolidate.d.ts +15 -0
- package/dist/src/mcp/tools/consolidate.d.ts.map +1 -0
- package/dist/src/mcp/tools/consolidate.js +49 -0
- package/dist/src/mcp/tools/consolidate.js.map +1 -0
- package/dist/src/mcp/tools/graph.d.ts +30 -0
- package/dist/src/mcp/tools/graph.d.ts.map +1 -0
- package/dist/src/mcp/tools/graph.js +106 -0
- package/dist/src/mcp/tools/graph.js.map +1 -0
- package/dist/src/mcp/tools/logs.d.ts +3 -0
- package/dist/src/mcp/tools/logs.d.ts.map +1 -0
- package/dist/src/mcp/tools/logs.js +7 -0
- package/dist/src/mcp/tools/logs.js.map +1 -0
- package/dist/src/mcp/tools/plans.d.ts +23 -0
- package/dist/src/mcp/tools/plans.d.ts.map +1 -0
- package/dist/src/mcp/tools/plans.js +63 -0
- package/dist/src/mcp/tools/plans.js.map +1 -0
- package/dist/src/mcp/tools/recall.d.ts +30 -0
- package/dist/src/mcp/tools/recall.d.ts.map +1 -0
- package/dist/src/mcp/tools/recall.js +34 -0
- package/dist/src/mcp/tools/recall.js.map +1 -0
- package/dist/src/mcp/tools/remember.d.ts +15 -0
- package/dist/src/mcp/tools/remember.d.ts.map +1 -0
- package/dist/src/mcp/tools/remember.js +18 -0
- package/dist/src/mcp/tools/remember.js.map +1 -0
- package/dist/src/mcp/tools/search.d.ts +19 -0
- package/dist/src/mcp/tools/search.d.ts.map +1 -0
- package/dist/src/mcp/tools/search.js +59 -0
- package/dist/src/mcp/tools/search.js.map +1 -0
- package/dist/src/mcp/tools/sessions.d.ts +21 -0
- package/dist/src/mcp/tools/sessions.d.ts.map +1 -0
- package/dist/src/mcp/tools/sessions.js +36 -0
- package/dist/src/mcp/tools/sessions.js.map +1 -0
- package/dist/src/mcp/tools/supersede.d.ts +14 -0
- package/dist/src/mcp/tools/supersede.d.ts.map +1 -0
- package/dist/src/mcp/tools/supersede.js +30 -0
- package/dist/src/mcp/tools/supersede.js.map +1 -0
- package/dist/src/mcp/tools/team.d.ts +16 -0
- package/dist/src/mcp/tools/team.d.ts.map +1 -0
- package/dist/src/mcp/tools/team.js +32 -0
- package/dist/src/mcp/tools/team.js.map +1 -0
- package/dist/src/obsidian/formatter.d.ts +80 -0
- package/dist/src/obsidian/formatter.d.ts.map +1 -0
- package/dist/src/obsidian/formatter.js +227 -0
- package/dist/src/obsidian/formatter.js.map +1 -0
- package/dist/src/prompts/classification.md +42 -0
- package/dist/src/prompts/extraction.md +45 -0
- package/dist/src/prompts/index.d.ts +13 -0
- package/dist/src/prompts/index.d.ts.map +1 -0
- package/dist/src/prompts/index.js +75 -0
- package/dist/src/prompts/index.js.map +1 -0
- package/dist/src/prompts/session-similarity.md +24 -0
- package/dist/src/prompts/summary.md +9 -0
- package/dist/src/prompts/title.md +8 -0
- package/dist/src/vault/frontmatter.d.ts +6 -0
- package/dist/src/vault/frontmatter.d.ts.map +1 -0
- package/dist/src/vault/frontmatter.js +10 -0
- package/dist/src/vault/frontmatter.js.map +1 -0
- package/dist/src/vault/observations.d.ts +10 -0
- package/dist/src/vault/observations.d.ts.map +1 -0
- package/dist/src/vault/observations.js +33 -0
- package/dist/src/vault/observations.js.map +1 -0
- package/dist/src/vault/reader.d.ts +10 -0
- package/dist/src/vault/reader.d.ts.map +1 -0
- package/dist/src/vault/reader.js +48 -0
- package/dist/src/vault/reader.js.map +1 -0
- package/dist/src/vault/resolve.d.ts +18 -0
- package/dist/src/vault/resolve.d.ts.map +1 -0
- package/dist/src/vault/resolve.js +51 -0
- package/dist/src/vault/resolve.js.map +1 -0
- package/dist/src/vault/session-id.d.ts +16 -0
- package/dist/src/vault/session-id.d.ts.map +1 -0
- package/dist/src/vault/session-id.js +29 -0
- package/dist/src/vault/session-id.js.map +1 -0
- package/dist/src/vault/types.d.ts +88 -0
- package/dist/src/vault/types.d.ts.map +1 -0
- package/dist/src/vault/types.js +94 -0
- package/dist/src/vault/types.js.map +1 -0
- package/dist/src/vault/writer.d.ts +66 -0
- package/dist/src/vault/writer.d.ts.map +1 -0
- package/dist/src/vault/writer.js +217 -0
- package/dist/src/vault/writer.js.map +1 -0
- package/hooks/hooks.json +60 -0
- package/package.json +52 -0
- package/skills/myco/SKILL.md +206 -0
- package/skills/myco/references/wisdom.md +61 -0
- package/skills/rules/SKILL.md +185 -0
- package/skills/rules/references/rules-bad-example.md +106 -0
- package/skills/rules/references/rules-good-example.md +90 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: myco-status
|
|
3
|
+
description: Show Myco vault health, stats, and any pending issues
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Myco Status
|
|
7
|
+
|
|
8
|
+
Check and report the health of the Myco vault and daemon. Use the CLI (`node dist/src/cli.js stats`) for data, and supplement with direct checks where needed.
|
|
9
|
+
|
|
10
|
+
## Step 1: Resolve vault location
|
|
11
|
+
|
|
12
|
+
Find the vault directory:
|
|
13
|
+
- Check `MYCO_VAULT_DIR` in the environment
|
|
14
|
+
- Check `.claude/settings.json` under the `env` key for `MYCO_VAULT_DIR`
|
|
15
|
+
- Fall back to `~/.myco/vaults/<project-name>/`
|
|
16
|
+
|
|
17
|
+
If no vault is found, report: "No Myco vault configured. Run `/myco-init` to set up."
|
|
18
|
+
|
|
19
|
+
## Step 2: Config health
|
|
20
|
+
|
|
21
|
+
Read `myco.yaml` from the vault:
|
|
22
|
+
- Report config version (should be `2`)
|
|
23
|
+
- Report LLM provider and model
|
|
24
|
+
- Report embedding provider and model
|
|
25
|
+
- Flag any issues (v1 config, missing fields)
|
|
26
|
+
|
|
27
|
+
## Step 3: Daemon status
|
|
28
|
+
|
|
29
|
+
Check `daemon.json` in the vault for PID and port:
|
|
30
|
+
- Is the daemon process running? (check if PID is alive)
|
|
31
|
+
- Is it healthy? (HTTP health check on the reported port)
|
|
32
|
+
- Report PID, port, uptime, active sessions
|
|
33
|
+
- If not running: "Daemon not running. It will start automatically on next session."
|
|
34
|
+
|
|
35
|
+
## Step 4: Vault stats
|
|
36
|
+
|
|
37
|
+
Query the FTS index for counts:
|
|
38
|
+
|
|
39
|
+
| Metric | How to check |
|
|
40
|
+
|--------|-------------|
|
|
41
|
+
| Sessions | `index.query({ type: 'session' }).length` |
|
|
42
|
+
| Memories | `index.query({ type: 'memory' }).length` |
|
|
43
|
+
| Plans | `index.query({ type: 'plan' }).length` |
|
|
44
|
+
| Artifacts | `index.query({ type: 'artifact' }).length` |
|
|
45
|
+
| Embeddings | Vector index count |
|
|
46
|
+
|
|
47
|
+
Also report memory breakdown by observation type (decision, gotcha, trade_off, etc.).
|
|
48
|
+
|
|
49
|
+
## Step 5: Intelligence backend health
|
|
50
|
+
|
|
51
|
+
Test connectivity to the configured providers:
|
|
52
|
+
|
|
53
|
+
- **LLM provider**: call `isAvailable()` — report reachable or not
|
|
54
|
+
- **Embedding provider**: call `isAvailable()` — report reachable or not
|
|
55
|
+
- If either is unreachable, suggest running `/myco-setup-llm`
|
|
56
|
+
|
|
57
|
+
## Step 6: Pending issues
|
|
58
|
+
|
|
59
|
+
Check for problems:
|
|
60
|
+
|
|
61
|
+
- **Stale buffers**: any `.jsonl` files in `buffer/` older than 24h? These indicate events that were never processed (LLM was unavailable)
|
|
62
|
+
- **Missing index**: does `index.db` exist? If not, suggest `node dist/src/cli.js rebuild`
|
|
63
|
+
- **Missing vectors**: does `vectors.db` exist? If not, embeddings are disabled
|
|
64
|
+
- **Lineage**: does `lineage.json` exist? Report link count if so
|
|
65
|
+
|
|
66
|
+
## Step 7: Recent activity
|
|
67
|
+
|
|
68
|
+
Show the 3 most recent sessions with:
|
|
69
|
+
- Session ID (short form)
|
|
70
|
+
- Title
|
|
71
|
+
- Started/ended timestamps
|
|
72
|
+
- Number of memories extracted
|
|
73
|
+
- Parent session (if lineage detected)
|
|
74
|
+
|
|
75
|
+
## Output format
|
|
76
|
+
|
|
77
|
+
Present as a structured report:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
=== Myco Vault ===
|
|
81
|
+
Path: ~/.myco/vaults/myco/
|
|
82
|
+
Config: v2 (valid)
|
|
83
|
+
|
|
84
|
+
--- Intelligence ---
|
|
85
|
+
LLM: ollama / gpt-oss (reachable)
|
|
86
|
+
Embedding: ollama / bge-m3 (reachable)
|
|
87
|
+
|
|
88
|
+
--- Daemon ---
|
|
89
|
+
PID: 12345 (running)
|
|
90
|
+
Port: 60942
|
|
91
|
+
Sessions: 1 active
|
|
92
|
+
|
|
93
|
+
--- Vault ---
|
|
94
|
+
Sessions: 12
|
|
95
|
+
Memories: 183 (67 decision, 34 gotcha, 32 trade_off, 20 discovery, 19 bug_fix, 1 cross-cutting)
|
|
96
|
+
Plans: 0
|
|
97
|
+
Artifacts: 8
|
|
98
|
+
Vectors: 224
|
|
99
|
+
|
|
100
|
+
--- Lineage ---
|
|
101
|
+
Links: 5 (3 clear, 1 inferred, 1 semantic_similarity)
|
|
102
|
+
|
|
103
|
+
--- Recent Sessions ---
|
|
104
|
+
1. [abc123] "Auth redesign session" (2h 15m, 5 memories)
|
|
105
|
+
2. [def456] "Bug fix for CORS" (45m, 2 memories, parent: abc123)
|
|
106
|
+
3. [ghi789] "Config cleanup" (20m, 1 memory)
|
|
107
|
+
|
|
108
|
+
--- Issues ---
|
|
109
|
+
None found.
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Adapt the format to what's actually available. If sections have no data, show them with "None" rather than omitting them.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** An image attached to a conversation turn */
|
|
2
|
+
export interface TranscriptImage {
|
|
3
|
+
/** Base64-encoded image data */
|
|
4
|
+
data: string;
|
|
5
|
+
/** MIME type (e.g., image/png) */
|
|
6
|
+
mediaType: string;
|
|
7
|
+
}
|
|
8
|
+
/** A single conversation turn extracted from an agent's transcript */
|
|
9
|
+
export interface TranscriptTurn {
|
|
10
|
+
prompt: string;
|
|
11
|
+
toolCount: number;
|
|
12
|
+
aiResponse?: string;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
/** Images attached to this turn's user prompt */
|
|
15
|
+
images?: TranscriptImage[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Maps agent-specific hook field names to normalized names.
|
|
19
|
+
* Each agent's hook system uses different field names for the same data.
|
|
20
|
+
*/
|
|
21
|
+
export interface HookFieldNames {
|
|
22
|
+
/** Field name for the transcript file path (e.g., 'transcript_path') */
|
|
23
|
+
transcriptPath: string;
|
|
24
|
+
/** Field name for the last AI response text (e.g., 'last_assistant_message') */
|
|
25
|
+
lastResponse: string;
|
|
26
|
+
/** Field name for the session ID (e.g., 'session_id') */
|
|
27
|
+
sessionId: string;
|
|
28
|
+
}
|
|
29
|
+
export interface AgentAdapter {
|
|
30
|
+
/** Agent identifier (matches plugin directory names) */
|
|
31
|
+
readonly name: string;
|
|
32
|
+
/** Human-readable display name */
|
|
33
|
+
readonly displayName: string;
|
|
34
|
+
/** Environment variable for the plugin root directory */
|
|
35
|
+
readonly pluginRootEnvVar: string;
|
|
36
|
+
/** Maps agent-specific hook body field names to normalized names */
|
|
37
|
+
readonly hookFields: HookFieldNames;
|
|
38
|
+
/**
|
|
39
|
+
* Find the transcript file for a given session ID.
|
|
40
|
+
* Returns the absolute path if found, null otherwise.
|
|
41
|
+
*/
|
|
42
|
+
findTranscript(sessionId: string): string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Parse a transcript file's content into normalized turns.
|
|
45
|
+
* Each adapter handles its agent's specific format.
|
|
46
|
+
*/
|
|
47
|
+
parseTurns(content: string): TranscriptTurn[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Scan subdirectories of baseDir for a JSONL transcript file matching sessionId.
|
|
51
|
+
* Shared by claude-code, cursor, custom adapters, and tests.
|
|
52
|
+
*/
|
|
53
|
+
export declare function findJsonlInSubdirs(baseDir: string, sessionId: string): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* Factory for creating simple per-project adapters from a base directory.
|
|
56
|
+
* Used for user-configured transcript_paths and testing.
|
|
57
|
+
*/
|
|
58
|
+
export declare function createPerProjectAdapter(baseDir: string, parseTurns: AgentAdapter['parseTurns'], name?: string): AgentAdapter;
|
|
59
|
+
export declare function extensionForMimeType(mimeType: string): string;
|
|
60
|
+
export declare function mimeTypeForExtension(ext: string): string;
|
|
61
|
+
export interface ParseJsonlOptions {
|
|
62
|
+
/** Field name containing the message role ('type' for Claude Code, 'role' for Cursor) */
|
|
63
|
+
roleField: 'type' | 'role';
|
|
64
|
+
/** Whether entries have a timestamp field to extract */
|
|
65
|
+
extractTimestamp: boolean;
|
|
66
|
+
/** Whether to check for text-only user messages (Claude Code has tool_result user messages to skip) */
|
|
67
|
+
skipToolResultUsers: boolean;
|
|
68
|
+
/** Whether to strip [Image: source: ...] text references from prompts (Claude Code-specific) */
|
|
69
|
+
stripImageTextRefs: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Shared JSONL transcript parser — used by both Claude Code and Cursor adapters.
|
|
73
|
+
* Handles user/assistant role detection, text/image extraction, and tool counting.
|
|
74
|
+
*/
|
|
75
|
+
export declare function parseJsonlTurns(content: string, opts: ParseJsonlOptions): TranscriptTurn[];
|
|
76
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/agents/adapter.ts"],"names":[],"mappings":"AAWA,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IAEpC;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAEjD;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;CAC/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYpF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,EACtC,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CASd;AAUD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAWD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAOD,MAAM,WAAW,iBAAiB;IAChC,yFAAyF;IACzF,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,wDAAwD;IACxD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uGAAuG;IACvG,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gGAAgG;IAChG,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAiD1F"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent adapter interface — declares what each coding agent provides to Myco.
|
|
3
|
+
*
|
|
4
|
+
* Each supported agent (Claude Code, Cursor, Cline, etc.) has an adapter that
|
|
5
|
+
* tells Myco where to find transcripts, how to parse them, and what capabilities
|
|
6
|
+
* the agent supports. The daemon uses these adapters at runtime to read the
|
|
7
|
+
* authoritative conversation record.
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
/**
|
|
12
|
+
* Scan subdirectories of baseDir for a JSONL transcript file matching sessionId.
|
|
13
|
+
* Shared by claude-code, cursor, custom adapters, and tests.
|
|
14
|
+
*/
|
|
15
|
+
export function findJsonlInSubdirs(baseDir, sessionId) {
|
|
16
|
+
try {
|
|
17
|
+
for (const entry of fs.readdirSync(baseDir, { withFileTypes: true })) {
|
|
18
|
+
if (!entry.isDirectory())
|
|
19
|
+
continue;
|
|
20
|
+
const candidate = path.join(baseDir, entry.name, `${sessionId}.jsonl`);
|
|
21
|
+
try {
|
|
22
|
+
fs.accessSync(candidate);
|
|
23
|
+
return candidate;
|
|
24
|
+
}
|
|
25
|
+
catch { /* not here */ }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch { /* baseDir doesn't exist or unreadable */ }
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Factory for creating simple per-project adapters from a base directory.
|
|
33
|
+
* Used for user-configured transcript_paths and testing.
|
|
34
|
+
*/
|
|
35
|
+
export function createPerProjectAdapter(baseDir, parseTurns, name) {
|
|
36
|
+
return {
|
|
37
|
+
name: name ?? `custom:${path.basename(baseDir)}`,
|
|
38
|
+
displayName: `Custom (${baseDir})`,
|
|
39
|
+
pluginRootEnvVar: '',
|
|
40
|
+
hookFields: { transcriptPath: 'transcript_path', lastResponse: 'last_assistant_message', sessionId: 'session_id' },
|
|
41
|
+
findTranscript: (sessionId) => findJsonlInSubdirs(baseDir, sessionId),
|
|
42
|
+
parseTurns,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Map MIME type to file extension */
|
|
46
|
+
const MIME_TO_EXT = {
|
|
47
|
+
'image/jpeg': 'jpg',
|
|
48
|
+
'image/gif': 'gif',
|
|
49
|
+
'image/webp': 'webp',
|
|
50
|
+
'image/png': 'png',
|
|
51
|
+
};
|
|
52
|
+
export function extensionForMimeType(mimeType) {
|
|
53
|
+
return MIME_TO_EXT[mimeType] ?? 'png';
|
|
54
|
+
}
|
|
55
|
+
/** Map file extension to MIME type */
|
|
56
|
+
const EXT_TO_MIME = {
|
|
57
|
+
'.jpg': 'image/jpeg',
|
|
58
|
+
'.jpeg': 'image/jpeg',
|
|
59
|
+
'.gif': 'image/gif',
|
|
60
|
+
'.webp': 'image/webp',
|
|
61
|
+
'.png': 'image/png',
|
|
62
|
+
};
|
|
63
|
+
export function mimeTypeForExtension(ext) {
|
|
64
|
+
return EXT_TO_MIME[ext.toLowerCase()] ?? 'image/png';
|
|
65
|
+
}
|
|
66
|
+
import { PROMPT_PREVIEW_CHARS } from '../constants.js';
|
|
67
|
+
/** Claude Code injects [Image: source: /path] text alongside base64 image blocks. Strip these since the actual images are captured as Obsidian embeds. */
|
|
68
|
+
const IMAGE_TEXT_REF_PATTERN = /\[Image: source: [^\]]+\]\n*/g;
|
|
69
|
+
/**
|
|
70
|
+
* Shared JSONL transcript parser — used by both Claude Code and Cursor adapters.
|
|
71
|
+
* Handles user/assistant role detection, text/image extraction, and tool counting.
|
|
72
|
+
*/
|
|
73
|
+
export function parseJsonlTurns(content, opts) {
|
|
74
|
+
const lines = content.split('\n').filter(Boolean);
|
|
75
|
+
const turns = [];
|
|
76
|
+
let current = null;
|
|
77
|
+
for (const line of lines) {
|
|
78
|
+
let entry;
|
|
79
|
+
try {
|
|
80
|
+
entry = JSON.parse(line);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const role = entry[opts.roleField];
|
|
86
|
+
const timestamp = opts.extractTimestamp ? (entry.timestamp ?? '') : '';
|
|
87
|
+
if (role === 'user') {
|
|
88
|
+
const msg = entry.message;
|
|
89
|
+
const blocks = Array.isArray(msg?.content) ? msg.content : [];
|
|
90
|
+
const hasText = blocks.some((b) => b.type === 'text' && b.text?.trim());
|
|
91
|
+
if (!hasText && opts.skipToolResultUsers)
|
|
92
|
+
continue;
|
|
93
|
+
if (!hasText)
|
|
94
|
+
continue;
|
|
95
|
+
if (current)
|
|
96
|
+
turns.push(current);
|
|
97
|
+
const rawPrompt = blocks
|
|
98
|
+
.filter((b) => b.type === 'text' && b.text)
|
|
99
|
+
.map((b) => b.text)
|
|
100
|
+
.join('\n');
|
|
101
|
+
const promptText = (opts.stripImageTextRefs ? rawPrompt.replace(IMAGE_TEXT_REF_PATTERN, '') : rawPrompt)
|
|
102
|
+
.trim()
|
|
103
|
+
.slice(0, PROMPT_PREVIEW_CHARS);
|
|
104
|
+
const images = blocks
|
|
105
|
+
.filter((b) => b.type === 'image' && b.source?.type === 'base64' && b.source.data)
|
|
106
|
+
.map((b) => ({ data: b.source.data, mediaType: b.source.media_type ?? 'image/png' }));
|
|
107
|
+
current = { prompt: promptText, toolCount: 0, timestamp, ...(images.length > 0 ? { images } : {}) };
|
|
108
|
+
}
|
|
109
|
+
else if (role === 'assistant' && current) {
|
|
110
|
+
const msg = entry.message;
|
|
111
|
+
if (Array.isArray(msg?.content)) {
|
|
112
|
+
const textParts = msg.content.filter((b) => b.type === 'text' && b.text).map((b) => b.text);
|
|
113
|
+
const text = textParts.join('\n').trim();
|
|
114
|
+
if (text)
|
|
115
|
+
current.aiResponse = text;
|
|
116
|
+
current.toolCount += msg.content.filter((b) => b.type === 'tool_use').length;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (current)
|
|
121
|
+
turns.push(current);
|
|
122
|
+
return turns;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/agents/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAOjD,eAAO,MAAM,iBAAiB,EAAE,YAkB/B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { findJsonlInSubdirs, parseJsonlTurns } from './adapter.js';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
const TRANSCRIPT_BASE = path.join(os.homedir(), '.claude', 'projects');
|
|
5
|
+
export const claudeCodeAdapter = {
|
|
6
|
+
name: 'claude-code',
|
|
7
|
+
displayName: 'Claude Code',
|
|
8
|
+
pluginRootEnvVar: 'CLAUDE_PLUGIN_ROOT',
|
|
9
|
+
hookFields: {
|
|
10
|
+
transcriptPath: 'transcript_path',
|
|
11
|
+
lastResponse: 'last_assistant_message',
|
|
12
|
+
sessionId: 'session_id',
|
|
13
|
+
},
|
|
14
|
+
findTranscript: (sessionId) => findJsonlInSubdirs(TRANSCRIPT_BASE, sessionId),
|
|
15
|
+
parseTurns: (content) => parseJsonlTurns(content, {
|
|
16
|
+
roleField: 'type',
|
|
17
|
+
extractTimestamp: true,
|
|
18
|
+
skipToolResultUsers: true,
|
|
19
|
+
stripImageTextRefs: true,
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agents/claude-code.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,iBAAiB,GAAiB;IAC7C,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,gBAAgB,EAAE,oBAAoB;IACtC,UAAU,EAAE;QACV,cAAc,EAAE,iBAAiB;QACjC,YAAY,EAAE,wBAAwB;QACtC,SAAS,EAAE,YAAY;KACxB;IAED,cAAc,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,eAAe,EAAE,SAAS,CAAC;IAE7E,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE;QAChD,SAAS,EAAE,MAAM;QACjB,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,IAAI;KACzB,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/agents/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAgCjD,eAAO,MAAM,aAAa,EAAE,YAsC3B,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { mimeTypeForExtension, parseJsonlTurns } from './adapter.js';
|
|
2
|
+
import { PROMPT_PREVIEW_CHARS } from '../constants.js';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
/**
|
|
7
|
+
* Cursor stores conversation transcripts in:
|
|
8
|
+
* ~/.cursor/projects/<project-path>/agent-transcripts/<session-id>.txt
|
|
9
|
+
*
|
|
10
|
+
* Images are saved as files in:
|
|
11
|
+
* ~/.cursor/projects/<project-path>/assets/<filename>.png
|
|
12
|
+
*
|
|
13
|
+
* Transcript format is plain text with role markers on their own line:
|
|
14
|
+
* user: — human prompt (may contain <image_files> and <user_query> tags)
|
|
15
|
+
* assistant: — assistant response (may contain [Tool call] and [Thinking] blocks)
|
|
16
|
+
*/
|
|
17
|
+
const USER_MARKER = '\nuser:\n';
|
|
18
|
+
const ASSISTANT_MARKER = '\nassistant:\n';
|
|
19
|
+
const TOOL_CALL_MARKER = '[Tool call]';
|
|
20
|
+
const TOOL_RESULT_MARKER = '[Tool result]';
|
|
21
|
+
const THINKING_MARKER = '[Thinking]';
|
|
22
|
+
function getCursorProjectsBase() {
|
|
23
|
+
return path.join(os.homedir(), '.cursor', 'projects');
|
|
24
|
+
}
|
|
25
|
+
const CURSOR_PROJECTS = getCursorProjectsBase();
|
|
26
|
+
export const cursorAdapter = {
|
|
27
|
+
name: 'cursor',
|
|
28
|
+
displayName: 'Cursor',
|
|
29
|
+
pluginRootEnvVar: 'CURSOR_PLUGIN_ROOT',
|
|
30
|
+
hookFields: {
|
|
31
|
+
transcriptPath: 'transcript_path',
|
|
32
|
+
lastResponse: 'last_assistant_message',
|
|
33
|
+
sessionId: 'conversation_id',
|
|
34
|
+
},
|
|
35
|
+
findTranscript(sessionId) {
|
|
36
|
+
try {
|
|
37
|
+
for (const project of fs.readdirSync(CURSOR_PROJECTS, { withFileTypes: true })) {
|
|
38
|
+
if (!project.isDirectory())
|
|
39
|
+
continue;
|
|
40
|
+
const transcriptsDir = path.join(CURSOR_PROJECTS, project.name, 'agent-transcripts');
|
|
41
|
+
// Try .txt (older Cursor) then .jsonl inside session directory (newer Cursor)
|
|
42
|
+
for (const candidate of [
|
|
43
|
+
path.join(transcriptsDir, `${sessionId}.txt`),
|
|
44
|
+
path.join(transcriptsDir, sessionId, `${sessionId}.jsonl`),
|
|
45
|
+
]) {
|
|
46
|
+
try {
|
|
47
|
+
fs.accessSync(candidate);
|
|
48
|
+
return candidate;
|
|
49
|
+
}
|
|
50
|
+
catch { /* not here */ }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch { /* projects dir doesn't exist */ }
|
|
55
|
+
return null;
|
|
56
|
+
},
|
|
57
|
+
parseTurns(content) {
|
|
58
|
+
// Detect format: JSONL (starts with '{') or plain text (starts with 'user:')
|
|
59
|
+
const trimmed = content.trimStart();
|
|
60
|
+
if (trimmed.startsWith('{')) {
|
|
61
|
+
return parseCursorJsonl(content);
|
|
62
|
+
}
|
|
63
|
+
return parseCursorText(content);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
/** Parse Cursor's newer JSONL format — same structure as Claude's but uses 'role' field */
|
|
67
|
+
function parseCursorJsonl(content) {
|
|
68
|
+
return parseJsonlTurns(content, {
|
|
69
|
+
roleField: 'role',
|
|
70
|
+
extractTimestamp: false,
|
|
71
|
+
skipToolResultUsers: false,
|
|
72
|
+
stripImageTextRefs: false,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Parse Cursor's older plain-text transcript format. */
|
|
76
|
+
function parseCursorText(content) {
|
|
77
|
+
const turns = [];
|
|
78
|
+
// Split on user marker — each block is a new human turn.
|
|
79
|
+
const sections = ('\n' + content).split(USER_MARKER).slice(1);
|
|
80
|
+
for (const section of sections) {
|
|
81
|
+
// Extract user query from <user_query> tags or raw text before first assistant response
|
|
82
|
+
let promptText = '';
|
|
83
|
+
const queryMatch = section.match(/<user_query>\s*([\s\S]*?)\s*<\/user_query>/);
|
|
84
|
+
if (queryMatch) {
|
|
85
|
+
promptText = queryMatch[1].trim().slice(0, PROMPT_PREVIEW_CHARS);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// No tags — take text before the first assistant response.
|
|
89
|
+
const beforeAssistant = section.split(ASSISTANT_MARKER)[0];
|
|
90
|
+
promptText = beforeAssistant.replace(/<[^>]+>[\s\S]*?<\/[^>]+>/g, '').trim().slice(0, PROMPT_PREVIEW_CHARS);
|
|
91
|
+
}
|
|
92
|
+
// Extract image references from <image_files> tags
|
|
93
|
+
const images = [];
|
|
94
|
+
const imageFilesMatch = section.match(/<image_files>([\s\S]*?)<\/image_files>/);
|
|
95
|
+
if (imageFilesMatch) {
|
|
96
|
+
const imageBlock = imageFilesMatch[1];
|
|
97
|
+
const pathMatches = imageBlock.matchAll(/^\d+\.\s+(.+\.(?:png|jpg|jpeg|gif|webp))\s*$/gmi);
|
|
98
|
+
for (const match of pathMatches) {
|
|
99
|
+
const imagePath = match[1].trim();
|
|
100
|
+
try {
|
|
101
|
+
const data = fs.readFileSync(imagePath).toString('base64');
|
|
102
|
+
const mediaType = mimeTypeForExtension(path.extname(imagePath));
|
|
103
|
+
images.push({ data, mediaType });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Image file not accessible — skip
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Count tool calls in assistant sections
|
|
111
|
+
const toolCallCount = section.split(TOOL_CALL_MARKER).length - 1;
|
|
112
|
+
// Extract the last meaningful assistant text response.
|
|
113
|
+
// Scan assistant blocks (split on \nA:\n) from the end.
|
|
114
|
+
// A block is "meaningful" if it contains lines that aren't tool calls/results/thinking.
|
|
115
|
+
let aiResponse;
|
|
116
|
+
const assistantBlocks = section.split(ASSISTANT_MARKER).slice(1);
|
|
117
|
+
for (let j = assistantBlocks.length - 1; j >= 0; j--) {
|
|
118
|
+
const lines = assistantBlocks[j].split('\n');
|
|
119
|
+
const textLines = [];
|
|
120
|
+
let skip = false;
|
|
121
|
+
for (const line of lines) {
|
|
122
|
+
// Skip tool calls, tool results, and thinking blocks
|
|
123
|
+
if (line.startsWith(TOOL_CALL_MARKER) || line.startsWith(TOOL_RESULT_MARKER) || line.startsWith(THINKING_MARKER)) {
|
|
124
|
+
skip = true;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// Resume after a blank line following a skipped block
|
|
128
|
+
if (skip && line.trim() === '')
|
|
129
|
+
continue;
|
|
130
|
+
if (skip && !line.startsWith(' '))
|
|
131
|
+
skip = false; // End of indented tool args
|
|
132
|
+
if (skip)
|
|
133
|
+
continue;
|
|
134
|
+
textLines.push(line);
|
|
135
|
+
}
|
|
136
|
+
const text = textLines.join('\n').trim();
|
|
137
|
+
if (text) {
|
|
138
|
+
aiResponse = text;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (promptText || images.length > 0) {
|
|
143
|
+
turns.push({
|
|
144
|
+
prompt: promptText,
|
|
145
|
+
toolCount: toolCallCount,
|
|
146
|
+
timestamp: '',
|
|
147
|
+
...(aiResponse ? { aiResponse } : {}),
|
|
148
|
+
...(images.length > 0 ? { images } : {}),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return turns;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/agents/cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { AgentAdapter, TranscriptTurn, HookFieldNames } from './adapter.js';
|
|
2
|
+
export { findJsonlInSubdirs, createPerProjectAdapter } from './adapter.js';
|
|
3
|
+
export { AgentRegistry } from './registry.js';
|
|
4
|
+
export { claudeCodeAdapter } from './claude-code.js';
|
|
5
|
+
export { cursorAdapter } from './cursor.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AgentAdapter, TranscriptTurn } from './adapter.js';
|
|
2
|
+
export declare class AgentRegistry {
|
|
3
|
+
private adapters;
|
|
4
|
+
constructor(additionalAdapters?: AgentAdapter[]);
|
|
5
|
+
/**
|
|
6
|
+
* Find and parse transcript turns for a session.
|
|
7
|
+
* Tries each adapter in priority order. Returns the first match.
|
|
8
|
+
*/
|
|
9
|
+
getTranscriptTurns(sessionId: string): {
|
|
10
|
+
turns: TranscriptTurn[];
|
|
11
|
+
source: string;
|
|
12
|
+
} | null;
|
|
13
|
+
/** List all registered adapter names */
|
|
14
|
+
get adapterNames(): string[];
|
|
15
|
+
/** Get a specific adapter by name */
|
|
16
|
+
getAdapter(name: string): AgentAdapter | undefined;
|
|
17
|
+
/** Detect which agent is currently active based on environment variables */
|
|
18
|
+
detectActiveAgent(): AgentAdapter | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Parse turns from a known transcript file path (provided by hook).
|
|
21
|
+
* Tries each adapter's parseTurns until one produces results.
|
|
22
|
+
* Skips directory scanning entirely — the path is already known.
|
|
23
|
+
*/
|
|
24
|
+
parseTurnsFromPath(filePath: string): {
|
|
25
|
+
turns: TranscriptTurn[];
|
|
26
|
+
source: string;
|
|
27
|
+
} | null;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the plugin root directory from the active agent's environment variable.
|
|
30
|
+
* Returns undefined if no agent env var is set (e.g., running from CLI directly).
|
|
31
|
+
*/
|
|
32
|
+
resolvePluginRoot(): string | undefined;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAejE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAiB;gBAErB,kBAAkB,GAAE,YAAY,EAAO;IAInD;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAkBzF,wCAAwC;IACxC,IAAI,YAAY,IAAI,MAAM,EAAE,CAE3B;IAED,qCAAqC;IACrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIlD,4EAA4E;IAC5E,iBAAiB,IAAI,YAAY,GAAG,SAAS;IAS7C;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAqBxF;;;OAGG;IACH,iBAAiB,IAAI,MAAM,GAAG,SAAS;CAOxC"}
|