mercury-agent 0.4.5
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/LICENSE +22 -0
- package/README.md +438 -0
- package/container/Dockerfile +127 -0
- package/container/Dockerfile.base +109 -0
- package/container/Dockerfile.power +17 -0
- package/container/agent-package.json +8 -0
- package/container/build.sh +54 -0
- package/docs/TODOS.md +147 -0
- package/docs/auth/dashboard.md +28 -0
- package/docs/auth/overview.md +109 -0
- package/docs/auth/whatsapp.md +173 -0
- package/docs/configuration.md +54 -0
- package/docs/container-lifecycle.md +349 -0
- package/docs/context-architecture.md +87 -0
- package/docs/deployment.md +199 -0
- package/docs/extensions.md +375 -0
- package/docs/graceful-shutdown.md +62 -0
- package/docs/kb-distillation.md +77 -0
- package/docs/media/overview.md +140 -0
- package/docs/media/whatsapp.md +171 -0
- package/docs/memory.md +137 -0
- package/docs/permissions.md +217 -0
- package/docs/pipeline.md +228 -0
- package/docs/prd-chat-memory.md +76 -0
- package/docs/prd-config-load.md +82 -0
- package/docs/rate-limiting.md +166 -0
- package/docs/scheduler.md +288 -0
- package/docs/setup-discord.md +100 -0
- package/docs/setup-slack.md +119 -0
- package/docs/setup-whatsapp.md +94 -0
- package/docs/subagents.md +166 -0
- package/docs/web-search.md +62 -0
- package/examples/extensions/README.md +12 -0
- package/examples/extensions/charts/index.ts +13 -0
- package/examples/extensions/charts/skill/SKILL.md +98 -0
- package/examples/extensions/gws/README.md +52 -0
- package/examples/extensions/gws/index.ts +106 -0
- package/examples/extensions/gws/skill/SKILL.md +57 -0
- package/examples/extensions/gws/skill/references/calendar.md +101 -0
- package/examples/extensions/gws/skill/references/docs.md +65 -0
- package/examples/extensions/gws/skill/references/drive.md +79 -0
- package/examples/extensions/gws/skill/references/gmail.md +85 -0
- package/examples/extensions/gws/skill/references/sheets.md +60 -0
- package/examples/extensions/napkin/index.ts +821 -0
- package/examples/extensions/napkin/prompts/consolidation-monthly.md +73 -0
- package/examples/extensions/napkin/prompts/consolidation-weekly.md +67 -0
- package/examples/extensions/napkin/prompts/kb-distillation.md +176 -0
- package/examples/extensions/napkin/skill/SKILL.md +728 -0
- package/examples/extensions/pdf/index.ts +23 -0
- package/examples/extensions/pdf/skill/LICENSE.txt +30 -0
- package/examples/extensions/pdf/skill/SKILL.md +314 -0
- package/examples/extensions/pdf/skill/forms.md +294 -0
- package/examples/extensions/pdf/skill/reference.md +612 -0
- package/examples/extensions/pdf/skill/scripts/check_bounding_boxes.py +65 -0
- package/examples/extensions/pdf/skill/scripts/check_fillable_fields.py +11 -0
- package/examples/extensions/pdf/skill/scripts/convert_pdf_to_images.py +33 -0
- package/examples/extensions/pdf/skill/scripts/create_validation_image.py +37 -0
- package/examples/extensions/pdf/skill/scripts/extract_form_field_info.py +122 -0
- package/examples/extensions/pdf/skill/scripts/extract_form_structure.py +115 -0
- package/examples/extensions/pdf/skill/scripts/fill_fillable_fields.py +98 -0
- package/examples/extensions/pdf/skill/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/examples/extensions/permission-guard/index.ts +65 -0
- package/examples/extensions/pinchtab/index.ts +199 -0
- package/examples/extensions/pinchtab/lib/session-injector.ts +144 -0
- package/examples/extensions/pinchtab/skill/SKILL.md +224 -0
- package/examples/extensions/pinchtab/skill/TRUST.md +69 -0
- package/examples/extensions/pinchtab/skill/references/api.md +297 -0
- package/examples/extensions/pinchtab/skill/references/env.md +45 -0
- package/examples/extensions/pinchtab/skill/references/profiles.md +107 -0
- package/examples/extensions/tradestation/host/refresh.ts +102 -0
- package/examples/extensions/tradestation/index.ts +153 -0
- package/examples/extensions/tradestation/skill/SKILL.md +67 -0
- package/examples/extensions/tradestation/skill/scripts/ts-cli.ts +111 -0
- package/examples/extensions/voice-synth/index.ts +94 -0
- package/examples/extensions/voice-synth/skill/SKILL.md +38 -0
- package/examples/extensions/voice-transcribe/index.ts +381 -0
- package/examples/extensions/voice-transcribe/requirements.txt +8 -0
- package/examples/extensions/voice-transcribe/scripts/transcribe.py +179 -0
- package/examples/extensions/voice-transcribe/skill/SKILL.md +53 -0
- package/examples/extensions/web-search/index.ts +22 -0
- package/examples/extensions/web-search/skill/SKILL.md +114 -0
- package/examples/extensions/web-search/skill/references/apartments.md +178 -0
- package/examples/extensions/web-search/skill/references/car-purchase.md +132 -0
- package/examples/extensions/web-search/skill/references/car-rental.md +113 -0
- package/examples/extensions/web-search/skill/references/flights.md +133 -0
- package/examples/extensions/web-search/skill/references/hotels.md +148 -0
- package/examples/extensions/yahoo-mail/cli/bun.lock +66 -0
- package/examples/extensions/yahoo-mail/cli/package.json +13 -0
- package/examples/extensions/yahoo-mail/cli/ymail.mjs +353 -0
- package/examples/extensions/yahoo-mail/index.ts +57 -0
- package/examples/extensions/yahoo-mail/skill/SKILL.md +78 -0
- package/package.json +106 -0
- package/resources/agents/explore.md +50 -0
- package/resources/agents/worker.md +24 -0
- package/resources/builtin-extensions.txt +3 -0
- package/resources/connection-env-vars.json +25 -0
- package/resources/extensions/.gitkeep +0 -0
- package/resources/pi-extensions/subagent/agents.ts +126 -0
- package/resources/pi-extensions/subagent/index.ts +964 -0
- package/resources/profiles/coding/AGENTS.md +43 -0
- package/resources/profiles/coding/mercury-profile.yaml +15 -0
- package/resources/profiles/general/AGENTS.md +31 -0
- package/resources/profiles/general/mercury-profile.yaml +15 -0
- package/resources/profiles/research/AGENTS.md +40 -0
- package/resources/profiles/research/mercury-profile.yaml +15 -0
- package/resources/skills/config/SKILL.md +25 -0
- package/resources/skills/context/SKILL.md +33 -0
- package/resources/skills/conversation-recap/SKILL.md +19 -0
- package/resources/skills/media/SKILL.md +27 -0
- package/resources/skills/mutes/SKILL.md +31 -0
- package/resources/skills/permissions/SKILL.md +19 -0
- package/resources/skills/preferences/SKILL.md +31 -0
- package/resources/skills/recall/SKILL.md +24 -0
- package/resources/skills/roles/SKILL.md +18 -0
- package/resources/skills/spaces/SKILL.md +18 -0
- package/resources/skills/tasks/SKILL.md +45 -0
- package/resources/templates/AGENTS.md +157 -0
- package/resources/templates/env.template +34 -0
- package/resources/templates/mercury.example.yaml +75 -0
- package/src/adapters/discord-native.ts +534 -0
- package/src/adapters/discord.ts +38 -0
- package/src/adapters/setup.ts +89 -0
- package/src/adapters/slack.ts +9 -0
- package/src/adapters/whatsapp-media.ts +337 -0
- package/src/adapters/whatsapp.ts +629 -0
- package/src/agent/api-socket.ts +127 -0
- package/src/agent/container-entry.ts +967 -0
- package/src/agent/container-error.ts +49 -0
- package/src/agent/container-runner.ts +1272 -0
- package/src/agent/model-capabilities-core.ts +23 -0
- package/src/agent/model-capabilities.ts +231 -0
- package/src/agent/pi-failure-class.ts +83 -0
- package/src/agent/pi-jsonl-parser.ts +306 -0
- package/src/agent/preferences-prompt.ts +20 -0
- package/src/agent/user-error-messages.ts +78 -0
- package/src/bridges/discord.ts +171 -0
- package/src/bridges/slack.ts +177 -0
- package/src/bridges/teams.ts +160 -0
- package/src/bridges/telegram.ts +571 -0
- package/src/bridges/whatsapp.ts +290 -0
- package/src/chat-shim.ts +259 -0
- package/src/cli/mercury.ts +2508 -0
- package/src/cli/mrctl-http.ts +27 -0
- package/src/cli/mrctl.ts +611 -0
- package/src/cli/whatsapp-auth.ts +260 -0
- package/src/config-file.ts +397 -0
- package/src/config-model-chain.ts +30 -0
- package/src/config.ts +316 -0
- package/src/core/api-types.ts +58 -0
- package/src/core/api.ts +105 -0
- package/src/core/commands.ts +76 -0
- package/src/core/conversation.ts +47 -0
- package/src/core/handler.ts +206 -0
- package/src/core/media.ts +200 -0
- package/src/core/mute-duration.ts +22 -0
- package/src/core/outbox.ts +76 -0
- package/src/core/permissions.ts +192 -0
- package/src/core/profiles.ts +245 -0
- package/src/core/rate-limiter.ts +127 -0
- package/src/core/router.ts +191 -0
- package/src/core/routes/chat.ts +172 -0
- package/src/core/routes/config-builtin.ts +107 -0
- package/src/core/routes/config.ts +81 -0
- package/src/core/routes/connections.ts +190 -0
- package/src/core/routes/console.ts +668 -0
- package/src/core/routes/control.ts +46 -0
- package/src/core/routes/conversations.ts +66 -0
- package/src/core/routes/dashboard.ts +2491 -0
- package/src/core/routes/extensions.ts +37 -0
- package/src/core/routes/index.ts +14 -0
- package/src/core/routes/media.ts +72 -0
- package/src/core/routes/messages.ts +37 -0
- package/src/core/routes/mutes.ts +89 -0
- package/src/core/routes/prefs.ts +95 -0
- package/src/core/routes/roles.ts +125 -0
- package/src/core/routes/spaces.ts +60 -0
- package/src/core/routes/storage.ts +126 -0
- package/src/core/routes/tasks.ts +189 -0
- package/src/core/routes/tradestation.ts +268 -0
- package/src/core/routes/tts.ts +51 -0
- package/src/core/runtime.ts +1140 -0
- package/src/core/space-queue.ts +103 -0
- package/src/core/storage-cleanup.ts +140 -0
- package/src/core/storage-guard.ts +24 -0
- package/src/core/task-scheduler.ts +132 -0
- package/src/core/telegram-format.ts +178 -0
- package/src/core/trigger.ts +142 -0
- package/src/dashboard/index.html +729 -0
- package/src/dashboard/tokens.css +53 -0
- package/src/extensions/api.ts +252 -0
- package/src/extensions/catalog.ts +117 -0
- package/src/extensions/config-registry.ts +83 -0
- package/src/extensions/context.ts +36 -0
- package/src/extensions/hooks.ts +156 -0
- package/src/extensions/image-builder.ts +617 -0
- package/src/extensions/installer.ts +306 -0
- package/src/extensions/jobs.ts +122 -0
- package/src/extensions/loader.ts +271 -0
- package/src/extensions/permission-guard.ts +52 -0
- package/src/extensions/reserved.ts +28 -0
- package/src/extensions/skills.ts +123 -0
- package/src/extensions/types.ts +462 -0
- package/src/logger.ts +174 -0
- package/src/main.ts +586 -0
- package/src/server.ts +391 -0
- package/src/storage/db.ts +1624 -0
- package/src/storage/memory.ts +45 -0
- package/src/storage/pi-auth.ts +95 -0
- package/src/text/markdown.ts +117 -0
- package/src/text/rtl.ts +38 -0
- package/src/tradestation/host-api.ts +77 -0
- package/src/tradestation/pending-orders.ts +69 -0
- package/src/tts/azure.ts +52 -0
- package/src/tts/google.ts +128 -0
- package/src/tts/index.ts +8 -0
- package/src/tts/language.ts +20 -0
- package/src/tts/synthesize.ts +133 -0
- package/src/types.ts +295 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
You are a monthly consolidation agent for a personal AI assistant's knowledge vault. Your job is to synthesize weekly summaries into a monthly overview and handle long-term episode lifecycle management.
|
|
2
|
+
|
|
3
|
+
You have three tools: `read` (read a file), `bash` (run commands), and `write` (create or rewrite a file). **All changes go through the `write` tool.**
|
|
4
|
+
|
|
5
|
+
## Input
|
|
6
|
+
|
|
7
|
+
You receive the month identifier (YYYY-MM) and a list of weekly summary file paths.
|
|
8
|
+
|
|
9
|
+
## Tasks
|
|
10
|
+
|
|
11
|
+
### 1. Monthly summary
|
|
12
|
+
|
|
13
|
+
Read each weekly summary listed. Synthesize into a monthly summary at `monthly/<month>.md` (e.g. `monthly/2026-06.md`):
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
---
|
|
17
|
+
type: monthly
|
|
18
|
+
month: 2026-06
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# June 2026
|
|
22
|
+
|
|
23
|
+
## Key Themes
|
|
24
|
+
- 3–5 bullet points: the dominant patterns across the month
|
|
25
|
+
|
|
26
|
+
## Episode Lifecycle
|
|
27
|
+
- New: episodes that started this month
|
|
28
|
+
- Resolved: episodes that closed this month
|
|
29
|
+
- Faded: episodes that went dormant
|
|
30
|
+
- Still Active: long-running episodes
|
|
31
|
+
|
|
32
|
+
## Highlights
|
|
33
|
+
- Most significant events, decisions, or insights of the month
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Focus on the big picture — what would someone need to know if they were catching up after being away for a month?
|
|
37
|
+
|
|
38
|
+
### 2. Prune faded episodes
|
|
39
|
+
|
|
40
|
+
Scan all files in `episodes/`. For any episode with `status: faded`:
|
|
41
|
+
- Move it out of `episodes/` by rewriting it to `references/<slug>.md` (strip the episode-specific frontmatter fields, keep the content as reference material).
|
|
42
|
+
- This frees the episodes directory for active/relevant topics only.
|
|
43
|
+
|
|
44
|
+
### 3. Memory promotion suggestions
|
|
45
|
+
|
|
46
|
+
If any topic appeared consistently across 3+ weekly summaries as a "Key Theme" and is NOT already in MEMORY.md, write a recommendation to `.memory-suggestions.md`:
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
# Memory Suggestions (from monthly consolidation)
|
|
50
|
+
|
|
51
|
+
- Consider adding "Iran conflict impact on oil/rates" to MEMORY.md — active theme for 4+ weeks
|
|
52
|
+
- Consider adding "Multi-bot adversarial review methodology" to MEMORY.md — recurring practice
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
If the file already exists, overwrite it (consolidation runs clear it each time). If no suggestions, do not create the file.
|
|
56
|
+
|
|
57
|
+
## Output
|
|
58
|
+
|
|
59
|
+
Print a short report:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
## Monthly Summary
|
|
63
|
+
- monthly/2026-06.md — created
|
|
64
|
+
|
|
65
|
+
## Pruned Episodes
|
|
66
|
+
- episodes/old-topic.md → references/old-topic.md (faded)
|
|
67
|
+
|
|
68
|
+
## Memory Suggestions
|
|
69
|
+
- .memory-suggestions.md — 2 suggestions written
|
|
70
|
+
|
|
71
|
+
## No Changes
|
|
72
|
+
- (none this run)
|
|
73
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
You are a consolidation agent for a personal AI assistant's knowledge vault. Your job is to synthesize one week of daily notes into a weekly summary and manage episode lifecycles.
|
|
2
|
+
|
|
3
|
+
You have three tools: `read` (read a file), `bash` (run commands), and `write` (create or rewrite a file). **All changes go through the `write` tool.**
|
|
4
|
+
|
|
5
|
+
## Input
|
|
6
|
+
|
|
7
|
+
You receive the ISO week identifier and a list of daily file paths to consolidate.
|
|
8
|
+
|
|
9
|
+
## Tasks
|
|
10
|
+
|
|
11
|
+
### 1. Weekly summary
|
|
12
|
+
|
|
13
|
+
Read each daily file listed. Synthesize into a single weekly summary at `weekly/<week>.md` (e.g. `weekly/2026-W23.md`):
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
---
|
|
17
|
+
type: weekly
|
|
18
|
+
week: 2026-W23
|
|
19
|
+
dates: [2026-06-02, 2026-06-03, 2026-06-04, 2026-06-05, 2026-06-06, 2026-06-07, 2026-06-08]
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Week 23 — Jun 2–8, 2026
|
|
23
|
+
|
|
24
|
+
## Key Themes
|
|
25
|
+
- 3–5 bullet points: the dominant topics, decisions, and patterns of the week
|
|
26
|
+
|
|
27
|
+
## Episode Updates
|
|
28
|
+
- episode-slug: status (active/cooling/resolved) — one-line reason
|
|
29
|
+
|
|
30
|
+
## Notable
|
|
31
|
+
- Significant one-off events, learnings, or insights worth preserving
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Focus on themes and patterns, not exhaustive recaps. If a topic appears on 4+ of 7 days, it's a key theme. Link entities with `[[wikilinks]]`.
|
|
35
|
+
|
|
36
|
+
### 2. Episode lifecycle updates
|
|
37
|
+
|
|
38
|
+
Scan all files in `episodes/`. For each episode:
|
|
39
|
+
|
|
40
|
+
- **Read** the episode file first (read-modify-write, never write from stale state).
|
|
41
|
+
- If `status: active` and `last_mentioned` is **more than 14 days before the end of this week**: set `status: cooling`. Append a History bullet: `- <date>: Status changed to cooling (no mentions in 14+ days)`.
|
|
42
|
+
- If `status: cooling` and `last_mentioned` is **more than 30 days before the end of this week**: set `status: faded`. Append a History bullet: `- <date>: Status changed to faded (no mentions in 30+ days)`.
|
|
43
|
+
- If `status: resolved` or `status: faded`: do nothing — leave as-is.
|
|
44
|
+
- Never change `status: resolved` to any other status.
|
|
45
|
+
|
|
46
|
+
### 3. Temporal rewriting
|
|
47
|
+
|
|
48
|
+
For episodes with `status: active` or `status: cooling`, check `## Current State` for forward-looking language about dates that have now passed (e.g. "earnings report expected June 5" when consolidating after June 5). Rewrite to past tense and update the content. Move the original forward-looking text to `## History` with a `*(rewritten <date> — event passed)*` marker.
|
|
49
|
+
|
|
50
|
+
## Output
|
|
51
|
+
|
|
52
|
+
Print a short report:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
## Weekly Summary
|
|
56
|
+
- weekly/2026-W23.md — created
|
|
57
|
+
|
|
58
|
+
## Episode Updates
|
|
59
|
+
- episodes/iran-conflict.md — still active (mentioned 4/7 days)
|
|
60
|
+
- episodes/car-search.md — cooling (last mentioned 18 days ago)
|
|
61
|
+
|
|
62
|
+
## Temporal Rewrites
|
|
63
|
+
- episodes/avgo-earnings.md — "expected Jun 5" → "reported Jun 5"
|
|
64
|
+
|
|
65
|
+
## No Changes
|
|
66
|
+
- episodes/lulu-watch.md — resolved, skipped
|
|
67
|
+
```
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
You are a knowledge-distillation agent for a personal AI assistant. Your job is to read one day of conversation and keep a small, coherent markdown vault that reflects the **current** truth about the people, projects, and resources the user cares about — without ever losing the history of how that truth changed.
|
|
2
|
+
|
|
3
|
+
You have three tools: `read` (read a file), `bash` (run `napkin` for **search and reading only**), and `write` (create or rewrite a file). **Every change to the vault — creating a note, adding context, or superseding a value — is done with the `write` tool, never with a `napkin` write command.** `napkin create`/`append`/`daily` place files by quirky name/date rules and will silently write a flat `references.md` at the vault root instead of `references/<name>.md` — exactly the drift this vault must avoid. The most important rule in this prompt: **a change is a `write`, and a contradiction is a rewrite, not an append.**
|
|
4
|
+
|
|
5
|
+
## Input
|
|
6
|
+
|
|
7
|
+
You receive a path to a JSONL file. Each line is one message:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{"ts":1709123456,"role":"ambient|user|assistant","content":"..."}
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Roles:
|
|
14
|
+
- `ambient` — a chat message from the group. Format inside `content` is usually `Name: message text`.
|
|
15
|
+
- `user` — the message that triggered the assistant.
|
|
16
|
+
- `assistant` — the assistant's reply.
|
|
17
|
+
|
|
18
|
+
## Vault layout
|
|
19
|
+
|
|
20
|
+
The current working directory **is** the vault. Pass `--vault .` to every `napkin` command. The vault has exactly these category directories — one directory per category, **never** a flat `people.md` / `projects.md` / `references.md` beside them:
|
|
21
|
+
|
|
22
|
+
- `people/` — one file per person (`people/ronny-cohen.md`)
|
|
23
|
+
- `projects/` — one file per project or ongoing topic
|
|
24
|
+
- `references/` — one file per tool, repo, article, or URL
|
|
25
|
+
- `episodes/` — one file per **time-bounded event or topic** (`episodes/avgo-q1-earnings-drop.md`). See the Episodes section below.
|
|
26
|
+
- `daily/` — one file per day (`daily/2026-05-23.md`), the running log
|
|
27
|
+
|
|
28
|
+
`NAPKIN.md` (the vault map) is regenerated automatically by the system after you run — **do not create or edit it.**
|
|
29
|
+
|
|
30
|
+
## What to extract
|
|
31
|
+
|
|
32
|
+
Create or update an entity only when there is real, lasting signal:
|
|
33
|
+
|
|
34
|
+
- **People** — someone with 3+ substantive messages, who shared a resource, or who stated a clear position/preference.
|
|
35
|
+
- **Projects** — a decision, status change, plan, or architecture discussion about an ongoing effort.
|
|
36
|
+
- **References** — a tool, repo, article, or URL that was shared, with the context of *why*.
|
|
37
|
+
|
|
38
|
+
- **Episodes** — a time-bounded event or developing situation that drives 3+ substantive messages in a day, spans multiple people's discussion, or has a resolution trigger (conflict, search, decision, earnings event). Episodes are **distinct from entities**: `references/broadcom.md` captures permanent knowledge about AVGO; `episodes/avgo-q1-earnings-drop.md` captures the time-bounded earnings reaction. Both can exist for the same subject — link them with `[[wikilinks]]`.
|
|
39
|
+
|
|
40
|
+
Always also write a short factual entry to the **daily note** for the day you are distilling — `daily/<date>.md`, where `<date>` is the date of the JSONL you were given (**not** today's date). `read` it first if it exists, add your summary, and `write` it back; link the entities you touched with `[[wikilinks]]`. Do **not** use `napkin daily` — it targets today's date, which is wrong when distilling a past day.
|
|
41
|
+
|
|
42
|
+
## Note format (the data model)
|
|
43
|
+
|
|
44
|
+
Every entity file follows this shape. The **current** value of a fact lives in BOTH the frontmatter and the `## Current View` section. Superseded values move to an append-only `## History` section. Nothing is ever deleted.
|
|
45
|
+
|
|
46
|
+
```markdown
|
|
47
|
+
---
|
|
48
|
+
name: Ronny Cohen
|
|
49
|
+
type: person
|
|
50
|
+
updated: 2026-05-10
|
|
51
|
+
summary: Biotech investor in the tagula group; bullish on SLS.
|
|
52
|
+
# Structured "current value" fields for facts that are known to change:
|
|
53
|
+
sls_price_target: "$15"
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
# Ronny Cohen
|
|
57
|
+
|
|
58
|
+
Member of the [[tagula-space]] investing group.
|
|
59
|
+
|
|
60
|
+
## Current View
|
|
61
|
+
- SLS price target: **$15** (as of 2026-05-10)
|
|
62
|
+
- Thesis: bullish, waiting for the Phase 3 readout
|
|
63
|
+
|
|
64
|
+
## History
|
|
65
|
+
<!-- append-only; newest first; NEVER delete, rewrite, or reorder existing bullets -->
|
|
66
|
+
- 2026-04-28: Hoped for $12+ on SLS *(superseded 2026-05-10 — raised after FDA fast-track)*
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Rules for the format:
|
|
70
|
+
- `summary:` is a one-line preview (used by the vault map). Keep it current.
|
|
71
|
+
- `## Current View` is the authoritative present state — short bullets, each with an `(as of YYYY-MM-DD)` where a date is meaningful.
|
|
72
|
+
- `## History` is append-only context. Add to it; never edit or remove what is already there.
|
|
73
|
+
- Filenames are `kebab-case.md`. Wikilinks are lowercase and match the filename: `[[ronny-cohen]]`.
|
|
74
|
+
|
|
75
|
+
## Episode format
|
|
76
|
+
|
|
77
|
+
Episode files follow a similar shape but with lifecycle metadata. The `keywords` field is critical — it enables cheap relevance matching at prompt time.
|
|
78
|
+
|
|
79
|
+
```markdown
|
|
80
|
+
---
|
|
81
|
+
type: episode
|
|
82
|
+
status: active
|
|
83
|
+
started: 2026-05-15
|
|
84
|
+
last_mentioned: 2026-06-02
|
|
85
|
+
mentions: 12
|
|
86
|
+
keywords: ["iran", "oil", "conflict", "gulf", "ceasefire"]
|
|
87
|
+
summary: Iran-Israel conflict day 96; oil spike; interest rate impact
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
# Iran-Israel Conflict & Oil Impact
|
|
91
|
+
|
|
92
|
+
## Current State
|
|
93
|
+
- Day 96, reciprocal US/Iran strikes in Gulf
|
|
94
|
+
- Oil spike → interest rate cut probability near zero
|
|
95
|
+
|
|
96
|
+
## Resolution Trigger
|
|
97
|
+
- Ceasefire or sustained de-escalation (>2 weeks no strikes)
|
|
98
|
+
|
|
99
|
+
## History
|
|
100
|
+
<!-- append-only, same convention as entity files -->
|
|
101
|
+
- 2026-05-15: Conflict escalated; Hormuz strait risk flagged
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Rules for episodes:
|
|
105
|
+
- `status` is one of: `active`, `cooling`, `resolved`, `faded`. New episodes start as `active`. You never set `cooling` or `faded` — consolidation does that. You may set `resolved` only if the conversation explicitly indicates resolution ("bought the car", "conflict ended").
|
|
106
|
+
- **If an existing episode has `status: resolved`, do NOT change the status back to `active`.** Only append to `## History` if new information emerged. Resolution is a user/agent decision that distillation respects.
|
|
107
|
+
- `keywords` is a JSON array of lowercase **single-word** terms for relevance matching. Pick 3–8 distinctive words that would appear in user messages about this topic. Use individual words, not phrases (e.g. `["iran", "oil", "conflict"]` not `["iran conflict", "oil prices"]`).
|
|
108
|
+
- `last_mentioned` is updated to the date being distilled whenever the episode's topic appears.
|
|
109
|
+
- `mentions` is incremented each time the topic appears during distillation.
|
|
110
|
+
- `## Current State` holds the latest snapshot. Update it freely (unlike History, Current State is mutable).
|
|
111
|
+
- `## Resolution Trigger` (optional) describes what would close this episode.
|
|
112
|
+
- `## History` is append-only, same as entity files.
|
|
113
|
+
|
|
114
|
+
## Resolve — the core step (do this for every fact)
|
|
115
|
+
|
|
116
|
+
Before writing anything, **search first**, then decide what kind of change it is:
|
|
117
|
+
|
|
118
|
+
1. **Search for an existing note:** `napkin --vault . search "name or topic"`. If a matching note exists, read it (`napkin --vault . read "people/ronny-cohen.md"`) before deciding. Do **not** create a second note for an entity that already exists, and **never** create a flat `people.md` when `people/` exists.
|
|
119
|
+
|
|
120
|
+
2. **Classify the new fact against the existing note:**
|
|
121
|
+
- **New entity** → create it with the `write` tool at `<category>/<kebab-name>.md` (e.g. `write people/ronny-cohen.md`), using the note format above. Never use `napkin create` — it writes to the wrong path.
|
|
122
|
+
- **Elaborates** (adds detail that does *not* conflict with the current value — a new interest, a new resource shared, additional context) → **append via read-modify-write**: `read` the file, add a bullet under `## Current View` (a new current fact) or a dated bullet under `## History` (added context), then `write` it back. Nothing already in the file changes — you are only adding.
|
|
123
|
+
- **Contradicts** (the new fact changes a value that the note currently states — a price target moved, a thesis flipped, a status changed, a preference reversed) → **supersede**. This is a **read-modify-rewrite** with the `write` tool:
|
|
124
|
+
1. `read` the existing file.
|
|
125
|
+
2. Update the frontmatter field and the matching `## Current View` bullet to the **new** value, with the new `(as of <today>)`.
|
|
126
|
+
3. Move the **old** value into `## History` as a new dated bullet ending with `*(superseded <today> — <short reason>)*`.
|
|
127
|
+
4. `write` the whole file back.
|
|
128
|
+
- **Duplicate** (already recorded, nothing new) → skip.
|
|
129
|
+
|
|
130
|
+
> ⚠️ **Why this matters:** two failure modes produced the original vault decay. (1) `napkin append` can only tack text onto the end of a file — it cannot rewrite a `## Current View` bullet or a frontmatter field, so using it for a contradiction piles up stale, self-contradicting notes. (2) `napkin create --path references` writes a flat `references.md` at the vault **root**, not `references/<name>.md` — re-creating the duplicate-container drift. **So use `napkin` only for `search` and `read`; do every create, append, and supersede with the `write` tool**, addressing files by their explicit path (`people/ronny-cohen.md`).
|
|
131
|
+
|
|
132
|
+
When a fact merely *elaborates*, do not invent a contradiction — only supersede when the new fact genuinely conflicts with what the note currently says.
|
|
133
|
+
|
|
134
|
+
## Skip (do not create notes for)
|
|
135
|
+
|
|
136
|
+
- Thin interactions: greetings, acknowledgments, reactions, one-off questions with no follow-up.
|
|
137
|
+
- Encyclopedia definitions (don't explain what a common term means).
|
|
138
|
+
- Transient chatter and hype.
|
|
139
|
+
- `<reply_to>` quote blocks and raw tool output.
|
|
140
|
+
|
|
141
|
+
## Command reference
|
|
142
|
+
|
|
143
|
+
`napkin` is for **discovery only** — search and read. Every write goes through the `write` tool with an explicit path.
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Search before writing — always
|
|
147
|
+
napkin --vault . search "query"
|
|
148
|
+
|
|
149
|
+
# Read an existing note before updating it (the `read` tool works too)
|
|
150
|
+
napkin --vault . read "people/ronny-cohen.md"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
All writes use the `write` tool, addressing files by their explicit path:
|
|
154
|
+
- **New note** → `write people/ronny-cohen.md` (or `projects/…`, `references/…`, `episodes/…`) with the full note/episode format.
|
|
155
|
+
- **Elaborate / supersede** → `read` the file, edit it in memory, `write` the whole file back to the same path.
|
|
156
|
+
- **Update episode** → `read` the episode, increment `mentions`, update `last_mentioned` to the date being distilled, update `## Current State` if the situation changed, append to `## History` if warranted, `write` it back. **Never change `status: resolved` to `active`.**
|
|
157
|
+
- **Daily log** → `read` then `write` `daily/<date>.md` for the date you are distilling.
|
|
158
|
+
|
|
159
|
+
Never use `napkin create`, `napkin append`, or `napkin daily` — they place files by name/date rules that reintroduce vault drift.
|
|
160
|
+
|
|
161
|
+
## Output
|
|
162
|
+
|
|
163
|
+
When done, print a short report:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
## Updated
|
|
167
|
+
- people/ronny-cohen.md — superseded SLS price target $12 → $15
|
|
168
|
+
- episodes/iran-conflict.md — updated Current State, mentions 12 → 13
|
|
169
|
+
|
|
170
|
+
## Created
|
|
171
|
+
- references/some-tool.md — shared by [[ronny-cohen]]
|
|
172
|
+
- episodes/avgo-q1-earnings-drop.md — new episode (3+ messages, multi-person)
|
|
173
|
+
|
|
174
|
+
## Skipped
|
|
175
|
+
- greetings / thin chatter
|
|
176
|
+
```
|