@aitne-sh/aitne 0.1.6 → 0.1.7

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.
Files changed (2) hide show
  1. package/README.md +286 -486
  2. package/package.json +4 -4
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### Always on. Always yours.
6
6
 
7
- **A local-first, proactive personal AI agent that runs continuously on your own machine — and gets smarter about *you* every day.**
7
+ **A local-first, proactive personal AI agent that runs continuously on your own machine — and learns *you* every day.**
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/@aitne-sh/aitne.svg)](https://www.npmjs.com/package/@aitne-sh/aitne)
10
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](./LICENSE)
@@ -21,143 +21,194 @@ aitne start
21
21
 
22
22
  ---
23
23
 
24
- ## The concept
24
+ ## Overview
25
25
 
26
- ChatGPT and Claude are *reactive* — they wait for you to type. **Aitne is proactive.** It's a tiny daemon that lives on your laptop, watches your calendar, mail, repos and notes, and acts on its own — drafting your morning plan at 04:00, surfacing the email you forgot, nudging you about the PR your teammate is waiting on, and weaving everything into a Markdown journal you actually own.
26
+ ChatGPT and Claude wait for you to type. **Aitne does not.** It's a tiny TypeScript daemon that lives on your laptop, watches your calendar, mail, repositories, and notes, and acts on its own — drafting your morning plan at 04:00, surfacing the email you forgot, nudging you about the PR your teammate is waiting on, and weaving everything into Markdown files *you* own.
27
27
 
28
- ```mermaid
29
- flowchart LR
30
- subgraph WORLD["Your digital life"]
31
- direction TB
32
- W1["💬 Messages"]
33
- W2["📅 Calendar"]
34
- W3["📧 Mail"]
35
- W4["📦 Git"]
36
- W5["📓 Notes"]
37
- end
28
+ You bring the brain — Claude Code, OpenAI Codex CLI, or Google Gemini CLI. Aitne is the nervous system that schedules, routes, observes, and remembers.
38
29
 
39
- subgraph LOCAL["💻 Your laptop — Aitne"]
40
- direction TB
41
- DAEMON["⚙️ Daemon<br/>(always-on)"]
42
- BRAIN["🧠 Your AI<br/>(Claude · Codex · Gemini)"]
43
- MEMORY["📝 Markdown memory<br/>(plain files you own)"]
44
- DAEMON <--> BRAIN
45
- BRAIN <--> MEMORY
46
- DAEMON <--> MEMORY
47
- end
30
+ ---
48
31
 
49
- YOU["📱 You<br/>Slack · Telegram · Discord<br/>WhatsApp · Web chat"]
32
+ ## What makes Aitne different
50
33
 
51
- WORLD <--> DAEMON
52
- DAEMON <--> YOU
53
- ```
34
+ **It compounds.** Every DM, every reaction, every implicit signal shapes how Aitne thinks about you. After a month it sounds like you. After a year it remembers what you forgot last quarter. The model never changes — *the context does*.
54
35
 
55
- Three things make Aitne different:
36
+ **You manage it in plain language.** "Don't ping me before 9am." "Remember my partner's birthday." "Stop running hourly checks on weekends." A dedicated set of management skills (`management-task-register`, `management-policy`, `user-profile`, …) maps your words to settings, schedules, and profile updates. No 80-panel settings UI.
56
37
 
57
- | | |
58
- |---|---|
59
- | 🌱 **It compounds.** | Every day, every DM, every reaction emoji shapes the agent's understanding of *you*. After a month it sounds like you. After a year it knows what you forgot last quarter. |
60
- | 🗣️ **You manage it in plain language.** | "Don't ping me before 9am." "Remember my partner's birthday." "Stop running hourly checks on weekends." Aitne maps your words to settings, schedules, and profile updates — automatically. |
61
- | 🔌 **It rides on what you already have.** | Your Claude Code skills, your Codex config, your Gemini settings, your custom MCP servers Aitne loads them into every session. No re-configuring. No re-buying. |
38
+ **It rides on what you already have.** Your `~/.claude/skills`, your `~/.codex/config.toml`, your `~/.gemini/` settings, your custom MCP servers — Aitne reads them on session init and layers its persona on top. Your existing toolkit shows up in every Aitne-spawned session. No re-configuring. No vendor lock.
39
+
40
+ **Your memory is plain Markdown.** Everything Aitne writes lands in `~/.personal-agent/context/*.md`. You can `cat`, `vim`, `obsidian`, or `cp` any of it. Uninstall and the memory is still yours. No proprietary format. No migration headache.
41
+
42
+ **It runs entirely on your machine.** The daemon binds to `127.0.0.1` only. Secrets live in the OS keychain (macOS Keychain / libsecret / DPAPI). No telemetry. No cloud state. Verify with `lsof` and `nettop`.
62
43
 
63
44
  ---
64
45
 
65
- ## A day with Aitne
46
+ ## Installation
66
47
 
67
- > A real walkthrough of one user's Tuesday.
48
+ ### From npm
68
49
 
69
- **04:00 While you sleep.** Aitne reads yesterday's handoff, your calendar for today, the last 24 hours of mail across your accounts, new commits in your repos, and the pending observations from Notion. It generates `today.md` and queues a Morning Briefing DM for after quiet hours end.
50
+ The recommended path. Installs the `aitne` CLI globally with the daemon, dashboard, and built-in agent assets.
70
51
 
71
- **07:30 — Slack DM lands as you grab coffee:**
72
- > Good morning. 3 things to flag:
73
- > • **Sarah's PR (#487)** needs your review — she's been blocked since Friday
74
- > • **Sales call with Acme @ 14:00** — leaving home by 13:25 (12-min commute)
75
- > • **IRS reminder from Friday** — deadline is *tomorrow*
76
- >
77
- > Today: 2 meetings, 4 tasks. Light day. Reply `end` to close, or just talk to me.
52
+ ```bash
53
+ npm install -g @aitne-sh/aitne@latest
54
+ aitne start
55
+ ```
78
56
 
79
- **09:15 You DM Aitne:** *"Tell Sarah I'll review by 11. And book lunch with Mark on Thursday — somewhere near his office."*
80
- Aitne drafts the Slack reply to Sarah, finds 3 lunch slots Thursday, checks Mark's last 5 lunch venues from your `people.md`, suggests Tartine. You confirm. Done.
57
+ Then bring **at least one** AI backend:
81
58
 
82
- **11:30 — Hourly check fires.** A new commit in your repo modified the API contract you're about to ship. Aitne adds a note to `Agent Notes` on `today.md` and DMs once: *"⚠️ Heads up — `auth.ts:84` was just changed by @Yuki. Want me to summarize the diff?"*
59
+ ```bash
60
+ # Claude Code — full feature support including server-side advisor
61
+ npm install -g @anthropic-ai/claude-code
62
+ claude auth login
83
63
 
84
- **13:45 Calendar approach.** *"Sales call in 15 min. Acme is the warm lead from last Tuesday — they mentioned wanting webhook integration. Brief is in `projects/acme.md`."*
64
+ # OpenAI Codex CLI
65
+ npm install -g @openai/codex
66
+ codex login --device-auth
85
67
 
86
- **15:45 You forward a hotel confirmation email to Aitne.** It extracts dates, address, confirmation number into `travel_bookings`, saves the PDF to `~/.personal-agent/context/receipts/2026/05/`, and adds the trip to next week's morning briefing.
68
+ # Google Gemini CLI
69
+ npm install -g @google/gemini-cli
70
+ # OAuth handled on first use
71
+ ```
87
72
 
88
- **18:00 Evening review.** Aitne notices you didn't reply to two emails from this morning. They get carried to tomorrow's `today.md`. It also sees you wrote *"shorter please"* twice today, classifies that as a tone-class signal, and silently shortens its replies going forward.
73
+ Login once with each CLI you intend to use Aitne auto-detects them on the next session.
89
74
 
90
- **Friday 18:30 Weekly review.**
91
- > Week of 2026-05-04: shipped 3 PRs, 2 deferred. Open loops: hotel cancellation, Acme follow-up. Focus next week: launch prep. Heads up: you've worked past 22:00 every day this week — should I clear Friday afternoon?
75
+ ### From source (git)
76
+
77
+ For contributors, or if you want to hack on the daemon directly. Requires Node ≥ 22 and pnpm 10.x.
78
+
79
+ ```bash
80
+ git clone https://github.com/Aitne-sh/Aitne.git aitne
81
+ cd aitne
82
+ corepack enable
83
+ pnpm install
84
+ pnpm start # build (if stale) + launch daemon and dashboard in background
85
+ # or
86
+ pnpm dev # foreground with full stdio for debugging
87
+ ```
92
88
 
93
- That's a normal Tuesday. The point isn't any single trick — it's that **all of this happens without you opening an app.**
89
+ Common workflows:
90
+
91
+ ```bash
92
+ pnpm test # vitest unit tests across packages/*
93
+ pnpm test:watch
94
+ pnpm lint # turbo run lint
95
+ pnpm clean # turbo clean + remove node_modules and .buildstamp
96
+ ```
97
+
98
+ ### Verifying the install
99
+
100
+ ```bash
101
+ aitne status # PIDs, uptime, connected platforms, backends, today's spend
102
+ aitne doctor # 9-check install diagnostic
103
+ aitne logs -f # tail the daemon log
104
+ ```
105
+
106
+ The daemon listens on `:8321`, the dashboard on `:3000`. Open `http://localhost:3000` and finish the 9-step setup wizard.
94
107
 
95
108
  ---
96
109
 
97
- ## What you can do with it
110
+ ## How it works
111
+
112
+ A long-running daemon receives signals from every channel you've connected, parks short-term state in SQLite, and spawns an AI session whenever it needs to think. The session reads your Markdown memory, calls a curated set of skills, and writes results back through the daemon API.
113
+
114
+ ```mermaid
115
+ flowchart LR
116
+ subgraph WORLD["Your digital life"]
117
+ direction TB
118
+ W1["Messages"]
119
+ W2["Calendar"]
120
+ W3["Mail"]
121
+ W4["Git / GitHub"]
122
+ W5["Notes"]
123
+ end
124
+
125
+ subgraph LOCAL["Your laptop"]
126
+ direction TB
127
+ DAEMON["Aitne daemon<br/>(always on)"]
128
+ BRAIN["AI session<br/>Claude / Codex / Gemini"]
129
+ MEMORY["Markdown memory<br/>plain files you own"]
130
+ DAEMON --- BRAIN
131
+ BRAIN --- MEMORY
132
+ DAEMON --- MEMORY
133
+ end
134
+
135
+ YOU["You<br/>Slack · Telegram · Discord<br/>WhatsApp · Web dashboard"]
98
136
 
99
- A non-exhaustive list. Click any group to expand.
137
+ WORLD --- DAEMON
138
+ DAEMON --- YOU
139
+ ```
140
+
141
+ The daemon runs two execution paths in parallel:
142
+
143
+ - **Reactive path** — owner DMs, mentions, cron-driven routines (morning, evening, weekly, monthly), and calendar-approach events flow through the EventBus into the Dispatcher, which spawns a backend session sized for the work.
144
+ - **Polling path** — observers for Git, GitHub, Obsidian, Notion, Calendar, and mail write to an `observations` table without spawning sessions. A cron-driven hourly check triages those observations through a lite-tier session, then escalates to a full Sonnet-class session only if something worth surfacing was found.
145
+
146
+ A pre-pass `routine.fetch_window` session runs before each routine, fanning out per-account fetches (mail, calendar, Notion) into the `observations` table so the main session reads from a single source.
147
+
148
+ ### What you can do with it
149
+
150
+ A non-exhaustive catalogue — every entry below is backed by an implemented skill, route, or observer. Click to expand.
100
151
 
101
152
  <details>
102
- <summary><b>📅 Time, calendar, travel</b></summary>
153
+ <summary><b>Time, calendar, travel</b></summary>
103
154
 
104
155
  - Auto-generate `today.md` every morning with your real schedule
105
156
  - 15-min approach reminders for every calendar event, with travel time pre-computed via Google Maps
106
- - "Find me a 30-min slot with Sarah and Mark next week" — Aitne checks freebusy across calendars
157
+ - Find a 30-min slot across multiple calendars — Aitne checks freebusy and replies with options
107
158
  - Auto-extract flight, hotel, restaurant, train confirmations from email into a structured travel timeline
108
159
  - Surface tomorrow's itinerary in the morning briefing
109
160
  - "What time should I leave for my next meeting?" — answers with live traffic
110
161
  </details>
111
162
 
112
163
  <details>
113
- <summary><b>📧 Mail across all your accounts</b></summary>
164
+ <summary><b>Mail across every account</b></summary>
114
165
 
115
166
  - Unified inbox across Gmail, Outlook, Yahoo, and iCloud (OAuth or app-password / IMAP)
116
- - Local FTS5 full-text search across **every** account ("find emails about acme last quarter")
117
- - Auto-classify, label, and archive (Gmail) — full filter rules across all providers
167
+ - Local FTS5 full-text search across every account ("find emails about acme last quarter")
168
+ - Auto-classify, label, and archive (Gmail) — filter rules across all providers
118
169
  - Draft replies in your style ("draft a polite no to this conference invite")
119
- - Forwarded receipts auto-extracted to a structured `receipts` table tagged with category, vendor, amount
170
+ - Forwarded receipts extract to a structured `receipts` table with category, vendor, amount
120
171
  - Daily digest of unread mail in the morning briefing
121
- - IMAP IDLE for near-real-time delivery; PDF/image attachments are extracted and indexed
172
+ - IMAP IDLE for near-real-time delivery; PDF and image attachments are extracted and indexed
122
173
  </details>
123
174
 
124
175
  <details>
125
- <summary><b>📓 Knowledge: Obsidian, Notion, your own notes</b></summary>
176
+ <summary><b>Knowledge: Obsidian, Notion, your own notes</b></summary>
126
177
 
127
178
  - Use your existing Obsidian vault as Aitne's primary memory store — wiki-links keep working
128
179
  - Append to your daily note via the official Obsidian CLI (`obsidian create` / `daily:append`)
129
- - Full Notion page & database CRUD — query, create, update, archive
180
+ - Full Notion page and database CRUD — query, create, update, archive
130
181
  - "Summarize what I wrote about this project last month" — across vault layers
131
- - Auto-link new notes to existing concepts ("this is related to your `agent-architecture.md` from March")
182
+ - Auto-link new notes to existing concepts
132
183
  </details>
133
184
 
134
185
  <details>
135
- <summary><b>🧠 Build a personal wiki from anything you DM</b></summary>
186
+ <summary><b>Build a personal wiki from anything you DM</b></summary>
136
187
 
137
- - Send a URL with `!ingest https://...` — the agent fetches, summarises, and saves a raw note in `10_raw/`
188
+ - DM `!ingest <url>` — the agent fetches, summarises, and saves a raw note in `10_raw/`
138
189
  - Run `!compile` to synthesise raw notes into linked wiki articles in `20_wiki/` with an auto-maintained `_index.md`
139
- - `!compile --preview` shows added / modified / unchanged pages plus cost and ETA *before* you spend tokens
190
+ - `!compile --preview` shows added / modified / unchanged pages plus cost and ETA before you spend tokens
140
191
  - `!compile full` rebuilds everything — cost-gated, with a dashboard approval queue and an optional git pre-compile snapshot for external vaults
141
192
  - `!ask <question>` answers from your own wiki and writes the cited reply to `30_outputs/`
142
193
  - `!lint` audits for orphans, broken links, schema drift, and taxonomy candidates → dated health report
143
194
  - `!trace <topic>` and `!connect A B` reconstruct how an idea evolved and find shared structure across domains
144
- - Run multiple workspaces (`!ingest @research ...`, `!compile @ops full`) — the default workspace falls through when the `@` token is omitted
145
- - Workspaces can be internal (`~/.personal-agent/wiki/`) or an external Obsidian vault you already keep
195
+ - Multiple workspaces (`!ingest @research ...`, `!compile @ops full`) — default workspace falls through when `@` is omitted
196
+ - Workspaces can be internal (`~/.personal-agent/wiki/`) or any number of external Obsidian vaults
146
197
  </details>
147
198
 
148
199
  <details>
149
- <summary><b>📦 Code, Git, GitHub</b></summary>
200
+ <summary><b>Code, Git, GitHub</b></summary>
150
201
 
151
202
  - Local Git: `git log`, `git diff`, `git show` exposed via daemon proxy
152
- - GitHub: PR lists, comments, issues, webhook receivers (HMAC-verified)
203
+ - GitHub: PR lists, comments, issues, webhook receivers (HMAC-SHA256 verified)
153
204
  - Per-repo cron triggers — "every Monday at 09:00, summarize merged PRs into `projects/<repo>.md`"
154
- - "Why did this build break?" — agent reads CI status + diff + traces
205
+ - "Why did this build break?" — agent reads CI status, diff, and traces
155
206
  - Auto-detect when a coworker modified a file you're about to ship
156
207
  - Unified Repositories: one row pairs a local clone with a GitHub remote; the doctor flags drift
157
208
  </details>
158
209
 
159
210
  <details>
160
- <summary><b>✅ Tasks, projects, life admin</b></summary>
211
+ <summary><b>Tasks, projects, life admin</b></summary>
161
212
 
162
213
  - Unified task view across GitHub Issues, mail-derived TODOs, and your own `today.md`
163
214
  - Per-project Markdown files with auto-maintained status, deadlines, and people
@@ -167,17 +218,17 @@ A non-exhaustive list. Click any group to expand.
167
218
  </details>
168
219
 
169
220
  <details>
170
- <summary><b>📚 Reading, lifestyle, voice</b></summary>
221
+ <summary><b>Reading, lifestyle, voice</b></summary>
171
222
 
172
223
  - Import Kindle highlights, build a reading-taste profile
173
224
  - Friday book recommendation DM based on your taste
174
225
  - Receipts auto-organized by month into your vault
175
226
  - Travel itinerary roll-up surfaced before each trip
176
- - **Voice attachments** — send a voice memo, get a Whisper-transcribed message (opt-in, runs locally)
227
+ - Voice attachments — send a voice memo, get a Whisper-transcribed message (opt-in, runs locally via `ffmpeg-static` + `@huggingface/transformers`)
177
228
  </details>
178
229
 
179
230
  <details>
180
- <summary><b>🤖 Self-management & automation</b></summary>
231
+ <summary><b>Self-management and automation</b></summary>
181
232
 
182
233
  - Tell it to remember things in plain language ("I'm allergic to nuts")
183
234
  - Tell it to forget things ("delete that note about my old job")
@@ -188,9 +239,9 @@ A non-exhaustive list. Click any group to expand.
188
239
  </details>
189
240
 
190
241
  <details>
191
- <summary><b>🔧 Run your own tools</b></summary>
242
+ <summary><b>Run your own tools</b></summary>
192
243
 
193
- - Bring your own MCP servers — they materialize into every session
244
+ - Bring your own MCP servers — they materialize into every session workdir
194
245
  - Bring your own Claude Code skills — they show up wherever the agent runs
195
246
  - Bring your own Codex / Gemini config — Aitne reads it on session init
196
247
  - Custom skills via the `/api/skills` endpoint — drop a `SKILL.md` and it's live
@@ -198,97 +249,99 @@ A non-exhaustive list. Click any group to expand.
198
249
 
199
250
  ---
200
251
 
201
- ## How Aitne accumulates knowledge about you
252
+ ## A day with Aitne
253
+
254
+ A walkthrough of one user's Tuesday.
202
255
 
203
- Every signal Aitne sees flows through the same pipeline: capture short-term long-term injected back into every future conversation.
256
+ **04:00 While you sleep.** Aitne reads yesterday's handoff, your calendar for today, the last 24 hours of mail across your accounts, new commits in your repos, and the pending observations from Notion. It generates `today.md` and queues a Morning Briefing DM for after quiet hours end.
204
257
 
205
- ```mermaid
206
- flowchart TB
207
- subgraph SOURCES["📥 Sources"]
208
- direction LR
209
- S1["💬 messages"]
210
- S2["📅 calendar"]
211
- S3["📧 mail"]
212
- S4["📦 git/github"]
213
- S5["📓 obsidian/notion"]
214
- S6["✋ you editing<br/>files by hand"]
215
- end
258
+ **07:30 — Slack DM lands as you grab coffee:**
259
+ > Good morning. 3 things to flag:
260
+ > - **Sarah's PR (#487)** needs your review — she's been blocked since Friday
261
+ > - **Sales call with Acme @ 14:00** — leaving home by 13:25 (12-min commute)
262
+ > - **IRS reminder from Friday** — deadline is *tomorrow*
263
+ >
264
+ > Today: 2 meetings, 4 tasks. Light day. Reply `end` to close, or just talk to me.
216
265
 
217
- OB["⚙️ Observers & adapters<br/>(WebSocket · IDLE · polling)"]
266
+ **09:15 — You DM Aitne:** *"Tell Sarah I'll review by 11. And book lunch with Mark on Thursday — somewhere near his office."*
218
267
 
219
- subgraph SHORT["🟡 Short-term memory"]
220
- direction LR
221
- ST1[("SQLite<br/>observations<br/>messages<br/>actions")]
222
- ST2["today.md<br/>(working view,<br/>always injected)"]
223
- end
268
+ Aitne drafts the Slack reply to Sarah, finds 3 lunch slots Thursday, checks Mark's last 5 lunch venues from your `people.md`, suggests Tartine. You confirm.
224
269
 
225
- subgraph LONG["🟢 Long-term memory (Markdown)"]
226
- direction TB
227
- LT1["user/profile.md<br/>work · expertise<br/>people · goals"]
228
- LT2["projects/*.md<br/>roadmap.md"]
229
- LT3["daily/YYYY-MM-DD.md<br/>↓<br/>weekly/YYYY-Www.md<br/>↓<br/>monthly/YYYY-MM.md"]
230
- end
270
+ **11:30 — Hourly check fires.** A new commit in your repo modified the API contract you're about to ship. Aitne adds a note to `today.md` and DMs once: *"Heads up `auth.ts:84` was just changed by @Yuki. Want me to summarize the diff?"*
271
+
272
+ **13:45 — Calendar approach.** *"Sales call in 15 min. Acme is the warm lead from last Tuesday — they mentioned wanting webhook integration. Brief is in `projects/acme.md`."*
273
+
274
+ **15:45 — You forward a hotel confirmation email.** Aitne extracts dates, address, and confirmation number into `travel_bookings`, saves the PDF to `~/.personal-agent/context/receipts/2026/05/`, and adds the trip to next week's morning briefing.
275
+
276
+ **18:00 — Evening review.** Aitne notices you didn't reply to two emails from this morning. They get carried to tomorrow's `today.md`. It also sees you wrote *"shorter please"* twice today, classifies that as a tone-class signal, and silently shortens its replies going forward.
277
+
278
+ **Friday 18:30 — Weekly review.**
279
+ > Week of 2026-05-04: shipped 3 PRs, 2 deferred. Open loops: hotel cancellation, Acme follow-up. Focus next week: launch prep. Heads up: you've worked past 22:00 every day this week — should I clear Friday afternoon?
231
280
 
232
- AI(("🧠 Next session<br/>(any backend,<br/>any platform)"))
281
+ The point isn't any single trick — it's that **all of this happens without you opening an app.**
282
+
283
+ ---
284
+
285
+ ## How Aitne accumulates knowledge
286
+
287
+ Every signal flows through the same pipeline: capture → short-term → long-term → injected back into every future conversation.
288
+
289
+ ```mermaid
290
+ flowchart TB
291
+ SOURCES["Sources: messages, calendar, mail,<br/>git, GitHub, Obsidian, Notion,<br/>your own manual edits"]
292
+ OB["Observers and adapters<br/>(WebSocket, IDLE, polling)"]
293
+ SQL["SQLite: observations,<br/>messages, agent_actions"]
294
+ TODAY["today.md<br/>(working view, always injected)"]
295
+ PROFILE["user/profile.md<br/>work, expertise,<br/>people, goals"]
296
+ PROJECTS["projects/*.md<br/>roadmap.md"]
297
+ JOURNAL["daily/YYYY-MM-DD.md<br/>weekly/YYYY-Www.md<br/>monthly/YYYY-MM.md"]
298
+ AI["Next session<br/>any backend, any platform"]
233
299
 
234
300
  SOURCES --> OB
235
- OB --> ST1
236
- ST1 -- "hourly check<br/>aggregates" --> ST2
237
- ST2 -- "evening review<br/>condenses" --> LT3
238
- ST2 -- "patterns identified" --> LT1
239
- ST2 -- "project-tagged<br/>updates" --> LT2
240
- LT3 -- "Friday roll-up" --> LT3
241
- LT3 -- "month-end roll-up" --> LT3
242
-
243
- LT1 -. "always injected" .-> AI
244
- ST2 -. "always injected" .-> AI
245
- LT2 -. "morning + evening" .-> AI
246
- LT3 -. "recalled when relevant" .-> AI
301
+ OB --> SQL
302
+ SQL --> TODAY
303
+ TODAY --> JOURNAL
304
+ TODAY --> PROFILE
305
+ TODAY --> PROJECTS
306
+
307
+ PROFILE -.-> AI
308
+ TODAY -.-> AI
309
+ PROJECTS -.-> AI
310
+ JOURNAL -.-> AI
247
311
  ```
248
312
 
249
313
  **Key properties:**
250
314
 
251
- - **Plain Markdown.** You can `cat`, `vim`, `obsidian`, or `cp` any of these files. There is no proprietary format. Uninstall and the memory is still yours.
252
- - **Layered retention.** `today.md` rotates to `yesterday.md` once per agent-day. `daily/` files are persistent by design (synthesized journal). `weekly/` is pruned after 1 year. `agent/journal.md` keeps the most recent ~12 weekly + 24 monthly sections. SQLite-backed history (messages, agent_actions) is pruned after 90 days.
253
- - **Always-injected context.** Every session starts with `user/profile.md` + `rules/management.md` + `today.md` already loaded — the agent never has to "search for context."
315
+ - **Plain Markdown.** `cat`, `vim`, `obsidian`, `cp` there is no proprietary format. Uninstall and the memory stays yours.
316
+ - **Layered retention.** `today.md` rotates to `yesterday.md` once per agent-day. `daily/` files are persistent by design (synthesized journal). `weekly/` is pruned after one year. `agent/journal.md` keeps the most recent ~12 weekly + 24 monthly sections. SQLite-backed history (messages, agent_actions) is pruned after 90 days.
317
+ - **Always-injected context.** Every session starts with `user/profile.md` + `rules/management.md` + `today.md` already loaded — the agent never has to "search for context".
254
318
  - **You can always intervene.** Edit any file by hand. The agent picks up your changes on the next routine.
255
319
 
256
- ---
257
-
258
- ## Compounding intelligence
320
+ ### Compounding intelligence
259
321
 
260
- The longer you use it, the better it gets. Not because the model improves — because *the context does*.
322
+ The longer you use it, the better it gets. Not because the model improves — because the context does.
261
323
 
262
324
  ```mermaid
263
- graph LR
264
- D1["📆 <b>Day 1</b><br/>Empty profile<br/>Generic answers<br/>Asks who's Sarah"]
265
- W1["📅 <b>Week 1</b><br/>Calendar synced<br/>People dictionary<br/>Mail patterns ID'd"]
266
- M1["🌙 <b>Month 1</b><br/>Profile auto-filled<br/>Tone matches you<br/>Recurring tasks tracked"]
267
- M3["📈 <b>Month 3</b><br/>Full project map<br/>Knows your peers<br/>Proactive nudges"]
268
- Y1["🎯 <b>Year 1</b><br/>Anticipates needs<br/>Recalls Q1 context<br/>You can't go back"]
269
-
270
- D1 -->|implicit feedback| W1
271
- W1 -->|evening review| M1
272
- M1 -->|project tracking| M3
273
- M3 -->|long-term memory| Y1
274
-
275
- style D1 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
276
- style W1 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
277
- style M1 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
278
- style M3 fill:#dcfce7,stroke:#22c55e,stroke-width:2px
279
- style Y1 fill:#dcfce7,stroke:#22c55e,stroke-width:3px
325
+ flowchart LR
326
+ D1["Day 1<br/>Empty profile<br/>Generic answers"]
327
+ W1["Week 1<br/>Calendar synced<br/>People dictionary"]
328
+ M1["Month 1<br/>Profile auto-filled<br/>Tone matches you"]
329
+ M3["Month 3<br/>Full project map<br/>Proactive nudges"]
330
+ Y1["Year 1<br/>Anticipates needs<br/>Recalls Q1 context"]
331
+
332
+ D1 --> W1 --> M1 --> M3 --> Y1
280
333
  ```
281
334
 
282
335
  ### The implicit feedback loop
283
336
 
284
- Every interaction shapes Aitne's understanding of you, *implicitly*. No buttons. No surveys. Just talk to it.
337
+ Every interaction shapes Aitne's understanding of you implicitly. No buttons. No surveys.
285
338
 
286
- The Signal Detector tags each turn for **tone-class signals** (corrections like "be shorter", "no preamble") and **attribute-class signals** (durable facts like "I'm allergic to nuts"). The Evening Review interprets the raw signals on the next pass:
339
+ The Signal Detector tags each turn for **tone-class signals** (corrections like "be shorter", "no preamble") and **attribute-class signals** (durable facts like "I'm allergic to nuts"). The Evening Review interprets them:
287
340
 
288
341
  - **Tone** → updates the `character` runtime-config field, applied to every backend's system prompt.
289
342
  - **Attribute** → updates `user/profile.md` Learned Context.
290
343
 
291
- The line between the two is enforced server-side: a signal like "I prefer concise replies" is *tone* (goes to character). A signal like "my flight is on Friday" is *attribute* (goes to profile).
344
+ The line is enforced server-side: "I prefer concise replies" is tone (goes to character). "My flight is on Friday" is attribute (goes to profile).
292
345
 
293
346
  ---
294
347
 
@@ -304,7 +357,7 @@ Aitne has a dedicated set of management skills — `management-task-register`, `
304
357
  | *"Remember my partner's birthday is March 14"* | Appends to `user/profile.md` Learned Context |
305
358
  | *"I prefer concise replies — no preamble"* | Updates `character` field |
306
359
  | *"Move all my React work into one project file"* | Refactors `projects/*.md` and re-indexes |
307
- | *"Cancel tomorrow's morning briefing"* | Removes the agent_schedule row |
360
+ | *"Cancel tomorrow's morning briefing"* | Removes the `agent_schedule` row |
308
361
  | *"Forget what I said about my old job"* | Surgically edits `user/work.md` |
309
362
  | *"Email me a summary every Friday at 5pm"* | Creates a recurring schedule with a free-form prompt |
310
363
  | *"Switch to Codex for code reviews from now on"* | Updates `process_backend_config` mapping |
@@ -321,275 +374,60 @@ Every change is journaled to `agent_actions` with `source_kind=user_directive`.
321
374
 
322
375
  ---
323
376
 
324
- ## Bring your own harness (BYOH)
377
+ ## Bring your own harness
325
378
 
326
- Already invested in Claude Code skills? Custom MCP servers? A polished `~/.codex/config.toml`? **Aitne loads them all.** No re-configuring. No re-buying. No vendor lock.
379
+ Already invested in Claude Code skills? Custom MCP servers? A polished `~/.codex/config.toml`? **Aitne loads them all.** No re-configuring. No vendor lock.
327
380
 
328
381
  ```mermaid
329
382
  flowchart LR
330
- subgraph YOUR["🔵 Your existing setup"]
331
- direction TB
332
- Y1["~/.claude/<br/>· skills<br/>· slash commands<br/>· MCP servers"]
333
- Y2["~/.codex/<br/>· config<br/>· plugins"]
334
- Y3["~/.gemini/<br/>· config<br/>· tools"]
335
- Y4["Custom MCP servers<br/>(your data sources,<br/>internal tools)"]
336
- end
337
-
338
- subgraph AITNE_SKILLS["🟡 Aitne's built-ins"]
339
- direction TB
340
- A1["23 skills<br/>(Calendar, Mail, Notion,<br/>Roadmap, Schedule, ...)"]
341
- A2["Per-event task flows<br/>(morning, hourly,<br/>DM, mention, ...)"]
342
- A3["Persona MD<br/>(per-backend)"]
343
- end
344
-
345
- SESS["📦 Per-session workdir<br/>~/.personal-agent/agent-sessions/&lt;id&gt;/<br/>CLAUDE.md · AGENTS.md · GEMINI.md<br/>+ .claude/skills/ · .codex/skills/<br/>+ MCP config materialized"]
346
-
347
- RUN["🚀 Backend runs with<br/><b>your full toolkit + Aitne's</b>"]
348
-
349
- YOUR --> SESS
350
- AITNE_SKILLS --> SESS
383
+ Y1["~/.claude/<br/>skills, slash commands,<br/>MCP servers"]
384
+ Y2["~/.codex/<br/>config, plugins"]
385
+ Y3["~/.gemini/<br/>config, tools"]
386
+ Y4["Your custom<br/>MCP servers"]
387
+ A1["Aitne built-in skills<br/>(24 of them)"]
388
+ A2["Per-event task flows"]
389
+ A3["Persona MD per backend"]
390
+ SESS["Per-session workdir<br/>~/.personal-agent/agent-sessions/[id]/<br/>CLAUDE.md, AGENTS.md, GEMINI.md<br/>plus .claude/skills, .codex/skills<br/>plus materialized MCP config"]
391
+ RUN["Backend runs with<br/>your full toolkit plus Aitne's"]
392
+
393
+ Y1 --> SESS
394
+ Y2 --> SESS
395
+ Y3 --> SESS
396
+ Y4 --> SESS
397
+ A1 --> SESS
398
+ A2 --> SESS
399
+ A3 --> SESS
351
400
  SESS --> RUN
352
-
353
- style YOUR fill:#dbeafe,stroke:#3b82f6
354
- style AITNE_SKILLS fill:#fef3c7,stroke:#f59e0b
355
- style SESS fill:#dcfce7,stroke:#22c55e
356
- style RUN fill:#fae8ff,stroke:#a855f7
357
401
  ```
358
402
 
359
403
  | You already have… | In Aitne it just works |
360
404
  |---|---|
361
405
  | A Claude Code MCP server connected to your company's internal API | Every Aitne session can use it. No code changes. |
362
- | Custom slash commands you built for `/review` or `/test` | They're available in every Aitne-spawned Claude Code session. |
406
+ | Custom slash commands you built for `/review` or `/test` | Available in every Aitne-spawned Claude Code session. |
363
407
  | A polished `AGENTS.md` for your Codex setup | Aitne layers its persona on top, keeping your config intact. |
364
- | Your Gemini auth + project preferences | Inherited automatically. |
408
+ | Your Gemini auth and project preferences | Inherited automatically. |
365
409
  | Skills you wrote for `~/.claude/skills/` | Imported on demand. |
366
410
 
367
- **The growth flywheel:** Claude Code / Codex / Gemini ship a new connector → Aitne picks it up on next session → you get it for free.
411
+ **The growth flywheel:** Claude Code, Codex, or Gemini ships a new connector → Aitne picks it up on next session → you get it for free.
368
412
 
369
413
  ---
370
414
 
371
415
  ## Multi-platform, multi-app
372
416
 
373
- One agent, every surface.
417
+ One agent, every surface. A morning brief delivered to Slack, a follow-up via WhatsApp, an email draft from the dashboard — Aitne carries the same context across all of them.
374
418
 
375
419
  ```mermaid
376
- flowchart TB
377
- subgraph IN["📥 Input surfaces"]
378
- direction LR
379
- I1["💬 Slack DM/mention"]
380
- I2["📲 Telegram"]
381
- I3["🎮 Discord"]
382
- I4["💚 WhatsApp"]
383
- I5["🌐 Web dashboard chat"]
384
- I6["✋ Manual file edits"]
385
- end
386
-
387
- subgraph SVC["🔌 Connected apps"]
388
- direction TB
389
- SV1["📅 Google Calendar · Outlook Calendar"]
390
- SV2["📧 Gmail · Outlook · Yahoo · iCloud"]
391
- SV3["📓 Notion · Obsidian"]
392
- SV4["📦 GitHub · local Git"]
393
- SV5["🗺️ Google Maps"]
394
- SV6["🔧 Custom MCP servers"]
395
- end
396
-
397
- AITNE(("🧠 Aitne"))
420
+ flowchart LR
421
+ IN["Input surfaces:<br/>Slack DM, Telegram, Discord,<br/>WhatsApp, Web dashboard,<br/>manual file edits"]
422
+ AITNE["Aitne daemon"]
423
+ SVC["Connected apps:<br/>Google Calendar, Outlook Calendar,<br/>Gmail, Outlook, Yahoo, iCloud,<br/>Notion, Obsidian, GitHub,<br/>local Git, Google Maps,<br/>custom MCP servers"]
424
+ OUT["Output surfaces:<br/>same DM channel,<br/>today.md updates,<br/>calendar actions,<br/>drafted emails,<br/>proactive notifications"]
398
425
 
399
426
  IN --> AITNE
400
- AITNE <--> SVC
401
-
402
- subgraph OUT["📤 Output surfaces"]
403
- direction LR
404
- O1["💬 Same DM channel"]
405
- O2["📋 today.md<br/>updates"]
406
- O3["📅 Calendar<br/>actions"]
407
- O4["📧 Drafted emails"]
408
- O5["🔔 Proactive<br/>notifications"]
409
- end
410
-
427
+ AITNE --- SVC
411
428
  AITNE --> OUT
412
429
  ```
413
430
 
414
- **One conversation, every channel.** A morning brief delivered to Slack, a follow-up via WhatsApp, an email draft from the dashboard — Aitne carries the same context across all of them.
415
-
416
- ---
417
-
418
- ## Highlights
419
-
420
- | | |
421
- |---|---|
422
- | 🌅 **Proactive routines** | Morning · evening · weekly · monthly · hourly observation sweep |
423
- | 💬 **Reactive on every chat platform** | Slack · Telegram · Discord · WhatsApp · Web dashboard |
424
- | 🧠 **Multi-backend brain** | Claude (Opus 4.7 / Sonnet 4.6 / Haiku 4.5) · Codex CLI · Gemini CLI |
425
- | 📝 **MD-centric memory** | Plain Markdown you own — `today.md` · `roadmap.md` · `projects/*` · `daily/` · `weekly/` · `monthly/` |
426
- | 🔌 **23 built-in skills** | Calendar, mail, Notion, Obsidian, schedule, roadmap, receipts, travel, reading, voice, … |
427
- | 🧠 **Personal wiki builder** | DM `!ingest <url>` to capture, `!compile` to synthesise, `!ask` / `!lint` / `!trace` / `!connect` to operate — across one or many workspaces |
428
- | 🔁 **4-mode integration framework** | `direct` (daemon polls) · `delegated` (backend's connector) · `native` (main backend MCP on demand) · `disabled` |
429
- | 🛡️ **Four-layer safety** | SDK allowlist · PreToolUse hooks · daemon API risk tiers · absolute-block layer that holds even in Allow mode |
430
- | 🪪 **Local-first & private** | Binds to `127.0.0.1`. No telemetry. Secrets in OS Keychain. Zero cloud state. |
431
- | 🧰 **Production tooling** | Background daemon · `aitne doctor` · cost analytics · auth health monitor with auto-recovery |
432
- | 🌍 **Speak any language** | The LLM handles it — talk to Aitne in Japanese, English, German, anything. `primaryLanguage` config nudges its outputs too. |
433
-
434
- ---
435
-
436
- ## Table of contents
437
-
438
- 1. [Quick start](#quick-start)
439
- 2. [Setup guide](#setup-guide)
440
- 3. [CLI reference](#cli-reference)
441
- 4. [Architecture](#architecture)
442
- 5. [Memory layout](#memory-layout)
443
- 6. [Multi-backend](#multi-backend)
444
- 7. [Integrations](#integrations)
445
- 8. [Safety model](#safety-model)
446
- 9. [Cost & quotas](#cost--quotas)
447
- 10. [Configuration](#configuration)
448
- 11. [Platform support](#platform-support)
449
- 12. [Troubleshooting](#troubleshooting)
450
- 13. [Development](#development)
451
- 14. [FAQ](#faq)
452
- 15. [License](#license)
453
-
454
- ---
455
-
456
- ## Quick start
457
-
458
- ### 1. Install
459
-
460
- ```bash
461
- npm install -g @aitne-sh/aitne@latest
462
- ```
463
-
464
- Installs the `aitne` CLI globally with the daemon, dashboard, and built-in agent assets.
465
-
466
- ### 2. Bring at least one AI backend
467
-
468
- Aitne is the nervous system; you bring the brain. Install **at least one** of:
469
-
470
- ```bash
471
- # Claude Code (recommended — full features, server-side advisor support)
472
- npm install -g @anthropic-ai/claude-code
473
-
474
- # OpenAI Codex CLI
475
- npm install -g @openai/codex
476
-
477
- # Google Gemini CLI
478
- npm install -g @google/gemini-cli
479
- ```
480
-
481
- Login once with each CLI you intend to use — Aitne auto-detects them.
482
-
483
- ### 3. Start
484
-
485
- ```bash
486
- aitne start
487
- ```
488
-
489
- The daemon (`:8321`) and dashboard (`:3000`) launch in the background and your browser opens to the setup wizard.
490
-
491
- ### 4. Confirm
492
-
493
- ```bash
494
- aitne status
495
- ```
496
-
497
- ```
498
- Aitne status:
499
-
500
- Daemon: running (PID 12345)
501
- Uptime: 1m 23s
502
- API: http://127.0.0.1:8321
503
- Platforms: slack, dashboard
504
- Backends: claude
505
- Dashboard: running (PID 12346)
506
- URL: http://localhost:3000
507
-
508
- Last action: 2026-05-11T07:30:14Z (routine.morning_routine)
509
- Today: 6 action(s) · $0.043 spent
510
- Next: 2026-05-11T18:00:00Z routine.evening_review
511
- ```
512
-
513
- That's it. Open `http://localhost:3000` and finish the wizard.
514
-
515
- ---
516
-
517
- ## Setup guide
518
-
519
- ### Prerequisites
520
-
521
- | Requirement | Version | Why |
522
- |---|---|---|
523
- | **Node.js** | ≥ 22.0.0 | Daemon runtime (LTS) |
524
- | **At least one AI backend** | — | Claude Code, Codex CLI, or Gemini CLI |
525
- | **OS Keychain** | macOS / libsecret on Linux / DPAPI on Windows | Secret storage (file-based fallback available) |
526
-
527
- ### Step 1 — Install Aitne
528
-
529
- ```bash
530
- npm install -g @aitne-sh/aitne@latest
531
- ```
532
-
533
- > Want to hack on the source? See [Development](#development).
534
-
535
- ### Step 2 — Install at least one backend CLI
536
-
537
- #### Claude Code (recommended)
538
-
539
- ```bash
540
- npm install -g @anthropic-ai/claude-code
541
- claude --version
542
- claude auth login # uses your Claude subscription
543
- ```
544
-
545
- #### OpenAI Codex CLI
546
-
547
- ```bash
548
- npm install -g @openai/codex
549
- codex --version
550
- codex login --device-auth # device-flow OAuth
551
- ```
552
-
553
- #### Google Gemini CLI
554
-
555
- ```bash
556
- npm install -g @google/gemini-cli
557
- gemini --version
558
- # OAuth handled automatically on first use
559
- ```
560
-
561
- You can install all three. Per-process tier routing lets you mix-and-match: Sonnet for routines and DMs, Haiku for delegated/polling, Codex for code-heavy work, Gemini for free-tier headroom — and Opus only on the keys that genuinely need it (first-day morning routine, knowledge import, opt-in heavy task mode).
562
-
563
- ### Step 3 — Launch and run the wizard
564
-
565
- ```bash
566
- aitne start
567
- ```
568
-
569
- Aitne builds (if needed), launches both processes, and opens `http://localhost:3000/setup`. The wizard walks 9 screens:
570
-
571
- | # | Step | What it asks |
572
- |---|---|---|
573
- | 1 | **Basics** | Agent display name + primary language |
574
- | 2 | **Vault** | Plain (`~/.personal-agent/context/`) or your existing Obsidian vault path |
575
- | 3 | **AI Backend** | Pick the main backend (Claude / Codex / Gemini), authenticate (API key or CLI login), choose execution mode (Safe vs. Allow) |
576
- | 4 | **Mail** | Gmail (OAuth) · Outlook (OAuth) · Yahoo / iCloud (IMAP + app password) — each card sets `direct` / `delegated` / `native` mode where supported |
577
- | 5 | **Calendar** | Google Calendar (OAuth) · Outlook Calendar (OAuth or user-managed MCP) — same mode picker per card |
578
- | 6 | **Note** | Notion (OAuth) and an optional secondary Obsidian vault path to watch |
579
- | 7 | **Messaging** | Slack · Telegram · Discord · WhatsApp pairing |
580
- | 8 | **Rules** | A short conversation with the agent — it interviews you and stages a `character` block + a `management-rules` block, which you confirm before saving |
581
- | 9 | **Done** | Summary; agent runs its first `setup` session |
582
-
583
- Required steps: Basics, Vault, AI Backend, Rules. Everything else exposes a **Skip** button — you can come back later from `/connections/*` or `/settings/*`.
584
-
585
- ### Step 4 — Verify
586
-
587
- ```bash
588
- aitne status # PIDs, uptime, connected platforms, backends, today's spend
589
- aitne doctor # install diagnostic
590
- aitne logs -f # tail the daemon log
591
- ```
592
-
593
431
  ---
594
432
 
595
433
  ## CLI reference
@@ -612,7 +450,7 @@ aitne logs -f # tail the daemon log
612
450
  |---|---|
613
451
  | `aitne setup` | Re-open the dashboard `/setup` wizard. Auto-starts the daemon if needed. |
614
452
  | `aitne open` | Open the dashboard in your browser. |
615
- | `aitne doctor [--json]` | 9 install checks; the repository-drift check expands into one extra row per repo whose `origin` no longer matches its registered slug. |
453
+ | `aitne doctor [--json]` | 8 base install checks; the repository-drift check expands into one extra row per drifted repo. |
616
454
  | `aitne audit [flags]` | Read the agent action log directly from SQLite. |
617
455
  | `aitne version [--json]` | Version, Node, install path, last build time. |
618
456
  | `aitne update [--check]` | Print the npm command to upgrade. `--check` makes one network call. |
@@ -623,13 +461,13 @@ aitne logs -f # tail the daemon log
623
461
 
624
462
  | Flag | Default | Description |
625
463
  |---|---|---|
626
- | `--since <duration>` | `24h` | Time window (e.g. `1h`, `7d`, `2026-04-20`). |
464
+ | `--since <duration>` | `24h` | Time window (`1h`, `7d`, `2026-04-20`). |
627
465
  | `--type <pattern>` | — | `action_type` filter (`%` for LIKE matching). |
628
466
  | `--result <value>` | — | `success` / `failed` / `partial` / `skipped`. |
629
467
  | `--backend <name>` | — | `claude` / `codex` / `gemini`. |
630
468
  | `--limit <N>` | 50 | Row cap. |
631
- | `--detail` | off | Expand the `detail` JSON column under each row. |
632
- | `--json` | off | Machine-readable JSON output. |
469
+ | `--detail` | off | Expand the `detail` JSON column. |
470
+ | `--json` | off | Machine-readable output. |
633
471
 
634
472
  ### `aitne doctor` checks
635
473
 
@@ -649,58 +487,36 @@ aitne logs -f # tail the daemon log
649
487
 
650
488
  ```mermaid
651
489
  flowchart TB
652
- subgraph PLAT["📱 Input platforms"]
653
- direction LR
654
- P1[Slack]
655
- P2[Telegram]
656
- P3[Discord]
657
- P4[WhatsApp]
658
- P5[Dashboard]
659
- end
490
+ PLAT["Input platforms:<br/>Slack, Telegram, Discord,<br/>WhatsApp, Web dashboard"]
660
491
 
661
- subgraph DAEMON["⚙️ Aitne daemon (Hono :8321)"]
492
+ subgraph DAEMON["Aitne daemon (Hono on :8321)"]
662
493
  direction TB
663
- EB[EventBus<br/>priority heap]
664
- DI[Dispatcher<br/>semaphores: 2 reactive +<br/>3 autonomous]
665
- BR[BackendRouter<br/>ProcessKey tier backend<br/>+ fallback]
666
- AC[Agent Core<br/>IAgentCore interface]
667
- OB[Observers<br/>Git · GitHub · Obsidian ·<br/>Notion · Calendar · Mail]
668
- SC[Scheduler<br/>node-cron + agent_schedule]
494
+ EB["EventBus<br/>(priority heap)"]
495
+ DI["Dispatcher<br/>(2 reactive + 3 autonomous semaphores)"]
496
+ BR["BackendRouter<br/>ProcessKey to tier and backend<br/>plus fallback"]
497
+ AC["Agent Core<br/>(IAgentCore interface)"]
498
+ OB["Observers:<br/>Git, GitHub, Obsidian,<br/>Notion, Calendar, Mail"]
499
+ SC["Scheduler<br/>(node-cron + agent_schedule)"]
669
500
  end
670
501
 
671
- subgraph BACKENDS["🧠 AI runtimes"]
672
- direction LR
673
- BC[Claude Code SDK]
674
- BX[Codex CLI subprocess]
675
- BG[Gemini CLI subprocess]
676
- end
502
+ BACKENDS["AI runtimes:<br/>Claude Code SDK,<br/>Codex CLI subprocess,<br/>Gemini CLI subprocess"]
677
503
 
678
- subgraph DATA["💾 Local data"]
679
- direction LR
680
- SQL[(SQLite<br/>WAL + FTS5)]
681
- MD["📝 Markdown memory<br/>~/.personal-agent/context/"]
682
- KC[OS Keychain]
683
- end
504
+ DATA["Local data:<br/>SQLite (WAL + FTS5),<br/>Markdown memory,<br/>OS Keychain"]
684
505
 
685
506
  PLAT --> EB
686
507
  SC --> EB
687
- OB --> SQL
688
- SQL -- "hourly check pulls" --> EB
508
+ OB --> DATA
509
+ DATA --> EB
689
510
  EB --> DI
690
511
  DI --> BR
691
512
  BR --> AC
692
- AC --> BC
693
- AC --> BX
694
- AC --> BG
695
- AC <-->|curl localhost API| DAEMON
696
- DAEMON <--> SQL
697
- DAEMON <--> MD
698
- DAEMON <--> KC
513
+ AC --> BACKENDS
514
+ AC --> DATA
699
515
  ```
700
516
 
701
517
  ### Two execution paths
702
518
 
703
- **Reactive path** — owner DMs/mentions, cron routines, calendar approach events, scheduled tasks
519
+ **Reactive path** — owner DMs / mentions, cron routines, calendar approach events, scheduled tasks
704
520
  → Event source → EventBus → Dispatcher → BackendRouter → Agent → output to user.
705
521
 
706
522
  **Polling path** — Obsidian, Git, GitHub, Notion, Calendar, Mail change detection
@@ -720,13 +536,13 @@ packages/
720
536
 
721
537
  agent-assets/ # Read by the daemon at session-init time
722
538
  ├── agent-profiles/ # Persona MD per backend (CLAUDE.md / AGENTS.md / GEMINI.md)
723
- ├── skills/ # 23 built-in skills (context, calendar, mail, notion, …)
724
- ├── task-flows/ # Per-event prompt templates (one per event type)
539
+ ├── skills/ # 24 built-in skills (context, calendar, mail, notion, …)
540
+ ├── task-flows/ # Per-event prompt templates
725
541
  └── templates/ # Scaffold MD copied to context/ on first run
726
542
 
727
543
  bin/aitne.mjs # CLI entry — lifecycle + ops
728
544
  scripts/ # Build/run helpers and per-command modules
729
- docs/design/ # Architecture & design docs (v4.16) — source of truth
545
+ docs/design/ # Architecture and design docs — source of truth
730
546
  ```
731
547
 
732
548
  ---
@@ -751,9 +567,9 @@ Everything the agent writes lives under `PA_DATA_DIR` (default `~/.personal-agen
751
567
  │ ├── routines/ # Per-cadence checklist rulebooks
752
568
  │ ├── dossiers/ # Carry-forward state per routine
753
569
  │ ├── projects/ # One file per active project + Obsidian Bases view
754
- │ ├── daily/<YYYY-MM-DD>.md # Synthesized daily journal (persistent by design)
755
- │ ├── weekly/<YYYY-Www>.md # Weekly review (1 yr file retention)
756
- │ ├── monthly/<YYYY-MM>.md # Monthly review (persistent by design)
570
+ │ ├── daily/YYYY-MM-DD.md # Synthesized daily journal (persistent by design)
571
+ │ ├── weekly/YYYY-Www.md # Weekly review (1 yr file retention)
572
+ │ ├── monthly/YYYY-MM.md # Monthly review (persistent by design)
757
573
  │ ├── inbox/ # Optional paste bucket
758
574
  │ └── agent/
759
575
  │ ├── journal.md # Private agent self-reflection
@@ -762,8 +578,8 @@ Everything the agent writes lives under `PA_DATA_DIR` (default `~/.personal-agen
762
578
  ├── logs/{daemon,dashboard}.log
763
579
  ├── prompts/ # Editable prompt templates
764
580
  ├── attachments/ # Chat attachments
765
- ├── agent-sessions/<id>/ # Per-session backend workdir
766
- ├── secrets/ # File-fallback secret store (`<name>.enc`); empty when OS keychain is used
581
+ ├── agent-sessions/[id]/ # Per-session backend workdir
582
+ ├── secrets/ # File-fallback secret store (empty when OS keychain is used)
767
583
  └── run/ # PID files for daemon + dashboard
768
584
  ```
769
585
 
@@ -779,9 +595,9 @@ Aitne abstracts three AI runtimes behind a single `IAgentCore` interface:
779
595
 
780
596
  | Backend | Implementation | Session resume | Strengths |
781
597
  |---|---|---|---|
782
- | **Claude Code** | `@anthropic-ai/claude-agent-sdk` | Full session resume | Best for routines, deep context, server-side advisor |
783
- | **Codex CLI** | OpenAI Codex CLI subprocess + JSONL stream | New session each time | Best for code-heavy tasks, fast iteration |
784
- | **Gemini CLI** | Google Gemini CLI subprocess + JSONL stream | New session each time | Best for free-tier, large-context summarization |
598
+ | **Claude Code** | `@anthropic-ai/claude-agent-sdk` | Yes (SDK `resume` option) | Best for routines, deep context, server-side advisor |
599
+ | **Codex CLI** | OpenAI Codex CLI subprocess + JSONL stream | Yes (`--resume <session-id>`) | Best for code-heavy tasks, fast iteration |
600
+ | **Gemini CLI** | Google Gemini CLI subprocess + JSONL stream | Yes (`--resume <session-id>`) | Best for free-tier headroom, large-context summarization |
785
601
 
786
602
  ### Per-process tier routing
787
603
 
@@ -806,8 +622,9 @@ Every kind of work has a `ProcessKey` mapped to a tier (`lite` / `medium` / `hig
806
622
  | `delegated_task` | lite | Delegated subprocess task mode |
807
623
  | `delegated_task_heavy` | high | Opt-in destructive-write task mode |
808
624
  | `observation.summarize` | lite | Per-observation classification |
625
+ | `wiki.ingest_url`, `wiki.compile`, `wiki.ask`, `wiki.lint`, `wiki.trace`, `wiki.connect` | medium | Personal wiki surfaces |
809
626
 
810
- Configure each ProcessKey's backend & tier from the dashboard `/settings/models` page. The router fails over to a fallback backend automatically on `BackendQuotaError` or `BackendDecisiveFailure`, re-materializing the fallback's instruction file + skill directories into the session workdir.
627
+ Configure each ProcessKey's backend and tier from the dashboard `/settings/models` page. The router fails over to a fallback backend automatically on `BackendQuotaError` or `BackendDecisiveFailure`, re-materializing the fallback's instruction file + skill directories into the session workdir.
811
628
 
812
629
  ---
813
630
 
@@ -820,7 +637,7 @@ Configure each ProcessKey's backend & tier from the dashboard `/settings/models`
820
637
  | Slack | `@slack/bolt` | Socket Mode (WebSocket) | Bot + App tokens |
821
638
  | Telegram | `telegraf` | Long polling | Bot token |
822
639
  | Discord | `discord.js` | Gateway | Bot token |
823
- | WhatsApp | `baileys` | QR pairing | Scan QR from dashboard |
640
+ | WhatsApp | `@whiskeysockets/baileys` | QR pairing | Scan QR from dashboard |
824
641
  | Web Dashboard | Hono SSE | Always on | None |
825
642
 
826
643
  ### Mail (multi-provider, unified API)
@@ -832,30 +649,30 @@ Configure each ProcessKey's backend & tier from the dashboard `/settings/models`
832
649
  | **Yahoo** | IMAP + app password | Read · send · IMAP IDLE |
833
650
  | **iCloud** | IMAP + app password | Read · send · IMAP IDLE |
834
651
 
835
- Local FTS5 full-text search runs across **every** account via `GET /api/mail/search?q=...`. The classifier (`mail-classifier`) tags messages across all providers; the Gmail-specific classifier auto-applies labels.
652
+ Local FTS5 full-text search runs across every account via `GET /api/mail/search?q=...`. The classifier (`mail-classifier`) tags messages across all providers; the Gmail-specific classifier auto-applies labels.
836
653
 
837
- ### Knowledge & docs
654
+ ### Knowledge and docs
838
655
 
839
656
  - **Obsidian** — read directly via `Read`; write via the official Obsidian CLI (`obsidian create`, `obsidian append`, `obsidian daily:append`, …); `chokidar` watches the vault for user edits
840
657
  - **Notion** — `@notionhq/client` REST API; full page + database CRUD
841
- - **Wiki builder** — per-workspace ingest / compile / ask / lint / trace / connect surface backed by `packages/daemon/src/core/wiki/` (cost-gated full rebuilds, approval queue, compile preview, optional git pre-compile snapshot, dispatch-mode fan-out). One internal workspace or any number of external Obsidian vaults; addressed with `@<workspace>` on every bang command. See `agent-assets/docs/features/wiki/overview.md`.
658
+ - **Wiki builder** — per-workspace ingest / compile / ask / lint / trace / connect surface backed by `packages/daemon/src/core/wiki/` (cost-gated full rebuilds, approval queue, compile preview, optional git pre-compile snapshot, dispatch-mode fan-out). One internal workspace or any number of external Obsidian vaults; addressed with `@<workspace>` on every bang command.
842
659
  - **Custom MCP servers** — register via `/api/mcp/servers`; materialized into the per-session workdir so backends use them transparently
843
660
 
844
661
  ### Code
845
662
 
846
663
  - **Git** (local) — daemon proxies `git log`, `git diff`, `git show`; cron-driven repository observer; `automation_triggers` table fires LLM prompts on `cron.daily` / `cron.weekly`
847
- - **GitHub** — `@octokit/rest` + webhooks; PR list & comment, issue ops, HMAC-SHA256 signature verification at `POST /webhook/github`
664
+ - **GitHub** — `@octokit/rest` + webhooks; PR list and comment, issue ops, HMAC-SHA256 signature verification at `POST /webhook/github`
848
665
 
849
- ### Calendar & travel
666
+ ### Calendar and travel
850
667
 
851
668
  - **Google Calendar** — `googleapis` OAuth2; full event CRUD, freebusy, calendar list, 15-min approaching reminders
852
669
  - **Outlook Calendar** — Microsoft Graph via `@azure/msal-node` in direct mode, or user-managed MCP in delegated / native modes
853
- - **iCloud Calendar** — CalDAV via `tsdav` (Apple Calendar service; reachable from any platform)
670
+ - **iCloud Calendar** — CalDAV via `tsdav`
854
671
  - **Google Maps** — Directions API for travel-time estimation tied to calendar events
855
672
 
856
673
  ### Lifestyle
857
674
 
858
- - **Receipts** — auto-extracts PDF/image attachments from mail with category detection
675
+ - **Receipts** — auto-extracts PDF / image attachments from mail with category detection
859
676
  - **Travel bookings** — auto-extracts flight, hotel, restaurant, train confirmations
860
677
  - **Reading** — Kindle My Clippings importer; reading-taste profile; weekly book recommendations
861
678
  - **Voice** — opt-in Whisper transcription (`ffmpeg-static` + `@huggingface/transformers`) runs locally on voice attachments. Install via `POST /api/voice/install`.
@@ -868,10 +685,10 @@ Each integration runs in one of **four** modes:
868
685
  |---|---|---|---|---|
869
686
  | **`direct`** | Daemon (OAuth in OS Keychain) | Daemon poller | 5–6 vendor-console steps | Full feature set |
870
687
  | **`delegated`** | Main backend's connector | Cron `delegated-sync-worker` (per-cadence opt-in) | None — backend already authed | Reduced (whatever the connector exposes) |
871
- | **`native`** | Main backend's connector | No daemon polling — agent reaches the integration in-turn via MCP | None | On-demand only; observations posted via `/api/observations` |
688
+ | **`native`** | Main backend's connector | None — agent reaches the integration in-turn via MCP | None | On-demand only; observations posted via `/api/observations` |
872
689
  | **`disabled`** | — | No | — | Off |
873
690
 
874
- `delegated` runs the backend's connector on a cron cadence (default-off, opt-in per cadence). `native` skips polling entirely and routes calls in-band during DMs / hourly checks. Outlook Mail and Outlook Calendar are *user-managed-connector* native: install the MCP yourself, Aitne synthesises a probe pass.
691
+ `delegated` runs the backend's connector on a cron cadence (default-off, opt-in per cadence). `native` skips polling entirely and routes calls in-band during DMs / hourly checks. Outlook Mail and Outlook Calendar are user-managed-connector native: install the MCP yourself, Aitne synthesises a probe pass.
875
692
 
876
693
  Every mode change goes through `POST /api/integrations/:key/probe` and the per-key flip lock — a live capability check is mandatory before flipping to `delegated` or `native`.
877
694
 
@@ -909,12 +726,14 @@ In Safe mode, every `Bash(curl ...)` invocation is parsed: the hostname must be
909
726
 
910
727
  Hard-blocked in **both Safe and Allow** modes. `bypassPermissions` and `allowedToolsOverride` cannot widen past this:
911
728
 
912
- - Recursive delete: `rm -rf *`, `rm -r *`, `rm --recursive*` (every flag-bundle variant)
729
+ - Recursive delete: `rm -rf *`, `rm -r *`, `rm --recursive*`, plus every common short-flag bundle (`-rfv`, `-fr`, `-vr`, `-R`, `-fR`, …)
913
730
  - Privilege escalation: `sudo *`, `doas *`, `su *`
914
- - Pipe-to-shell RCE: `curl * | sh`, `wget * | bash`, `bash <(...)`
915
- - Platform secret CLI: `security *`, `secret-tool *`, `cmdkey *`
916
- - Secret file reads/writes: `.env`, `~/.ssh/**`, `~/.gnupg/**`, `~/.aws/**`, `~/.config/gcloud/**`
917
- - Daemon-managed secrets: `~/.personal-agent/secrets/**`, `~/.personal-agent/whatsapp/auth/**`
731
+ - Pipe-to-shell RCE: `curl * | sh`, `wget * | bash`, `bash <(...)`, `sh <(...)`, no-space `bash<...` / `sh<...`
732
+ - Indirect-eval RCE: `eval *`, `source *` (no Aitne skill or task flow uses these)
733
+ - Platform secret CLI: `security *` (macOS), `secret-tool *` (Linux), `cmdkey *` (Windows)
734
+ - Secret file reads and writes: `.env`, `**/.env`, `id_rsa*`, `id_ed25519*`, `~/.ssh/**`, `~/.gnupg/**`, `~/.aws/**`, `~/.config/gcloud/**`, `~/.config/gh/hosts.yml`, `~/.netrc`, `~/Library/Keychains/**`, `~/.local/share/keyrings/**`
735
+ - Daemon-managed secret surfaces: `~/.personal-agent/secrets/**`, `~/.personal-agent/whatsapp/auth/**`, `~/.personal-agent/backups/**`
736
+ - Anthropic-cloud managed-agent tools: `CronCreate`, `CronList`, `CronDelete`, `RemoteTrigger`, `PushNotification` (would bypass the local audit log, MD memory, and cost telemetry)
918
737
 
919
738
  Every blocked attempt lands in `agent_actions` with `action_type='blocked_absolute'`.
920
739
 
@@ -930,7 +749,7 @@ Every blocked attempt lands in `agent_actions` with `action_type='blocked_absolu
930
749
 
931
750
  ---
932
751
 
933
- ## Cost & quotas
752
+ ## Cost and quotas
934
753
 
935
754
  ### Built-in controls
936
755
 
@@ -963,13 +782,12 @@ If you're on a Claude / Codex / Gemini subscription, none of this hits a metered
963
782
 
964
783
  ## Configuration
965
784
 
966
- `.env` is **bootstrap-only**. Everything else is editable from the dashboard at runtime — or via natural-language DMs to the agent.
785
+ `.env` is **bootstrap-only**. Everything else is editable from the dashboard at runtime — or via natural-language DMs.
967
786
 
968
787
  ### `.env` (bootstrap)
969
788
 
970
789
  ```bash
971
- PA_DATA_DIR=~/.personal-agent # macOS / Linux
972
- # PA_DATA_DIR=C:\Users\You\.personal-agent # Windows
790
+ PA_DATA_DIR=~/.personal-agent
973
791
  PA_API_PORT=8321
974
792
  PA_DASHBOARD_PORT=3000
975
793
  PA_LOG_LEVEL=info # trace | debug | info | warn | error
@@ -977,21 +795,18 @@ PA_LOG_LEVEL=info # trace | debug | info | warn | error
977
795
 
978
796
  ### Pre-seeding identifiers via env (optional)
979
797
 
980
- Bot **tokens and OAuth credentials** always live in the OS keychain — they're never read from environment variables. The wizard's Messaging step (or `/connections/*`) is the single entry point. The few non-secret identifiers you *can* pre-seed for fully scripted installs:
798
+ Bot tokens and OAuth credentials always live in the OS keychain — they are never read from environment variables. The wizard's Messaging step (or `/connections/*`) is the single entry point. The few non-secret identifiers you can pre-seed for fully scripted installs:
981
799
 
982
800
  ```bash
983
- # Owner identifiers (non-secret — let messaging adapters know who you are)
984
801
  PA_SLACK_OWNER_USER_ID=U...
985
802
  PA_TELEGRAM_OWNER_CHAT_ID=...
986
803
  PA_DISCORD_OWNER_USER_ID=...
987
804
  PA_WHATSAPP_ENABLED=true
988
805
  PA_WHATSAPP_OWNER_PHONE=...
989
806
 
990
- # Obsidian vault paths
991
807
  PA_PRIMARY_VAULT_PATH=~/Documents/MyVault
992
808
  PA_EXTERNAL_OBSIDIAN_VAULT_PATH=~/Documents/SecondaryVault
993
809
 
994
- # Notion default database routing
995
810
  PA_NOTION_DATABASE_IDS='{"tasks":"abc...","notes":"def..."}'
996
811
  ```
997
812
 
@@ -999,9 +814,9 @@ Everything else — bot tokens, OAuth refresh tokens, Notion API key, GitHub tok
999
814
 
1000
815
  ### Runtime settings
1001
816
 
1002
- The dashboard `/settings` tree exposes ~100 runtime keys. The headline ones:
817
+ The dashboard `/settings` tree exposes ~100 runtime keys. Headline groups:
1003
818
 
1004
- - **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window & interval, cron schedules
819
+ - **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window and interval, cron schedules
1005
820
  - **Notifications** — `quietHoursStart/End`, `maxNotificationsPerHour`, `maxNotificationsPerDay`, `batchIntervalMinutes`
1006
821
  - **Sessions** — `sessionTimeoutDmMinutes`, `historyInjectionMaxMessages`, `historyInjectionMaxTokens`
1007
822
  - **Safety** — execution mode per backend, `disallowedTools` overrides
@@ -1010,7 +825,7 @@ The dashboard `/settings` tree exposes ~100 runtime keys. The headline ones:
1010
825
  - **Mail** — provider list, poll interval, IMAP IDLE on/off
1011
826
  - **Character** — 1,000-char free-form tone description
1012
827
  - **Language** — `primaryLanguage` nudges output language for DMs, knowledge, and vault writes
1013
- - **Voice** — `voiceTranscriptionEnabled`, `voiceTranscriptionModel`, `voiceTranscriptionPrimaryLanguage`
828
+ - **Voice** — `voiceTranscriptionEnabled`, `voiceTranscriptionPrimaryLanguage` (the model itself is set via `PA_VOICE_TRANSCRIPTION_MODEL` env-only)
1014
829
  - **Delegated task mode** — kill switch, per-day quota, heavy-tier opt-in, cache / pool / structured-output toggles
1015
830
 
1016
831
  …or just DM the agent: *"Don't run hourly checks on weekends."*
@@ -1109,21 +924,6 @@ aitne audit --since 24h --result failed --detail
1109
924
 
1110
925
  ## Development
1111
926
 
1112
- For contributors:
1113
-
1114
- ```bash
1115
- git clone https://github.com/Aitne-sh/Aitne.git aitne
1116
- cd aitne
1117
- corepack enable
1118
- pnpm install
1119
- pnpm start # build (if stale) + launch in background
1120
- pnpm dev # foreground mode with full stdio
1121
- pnpm test # vitest — unit tests across packages/*
1122
- pnpm test:watch
1123
- pnpm lint # turbo run lint
1124
- pnpm clean # remove all build artifacts and node_modules
1125
- ```
1126
-
1127
927
  ### Tech stack
1128
928
 
1129
929
  | Layer | Stack |
@@ -1140,7 +940,7 @@ pnpm clean # remove all build artifacts and node_modules
1140
940
  - TypeScript throughout, camelCase, ESM with `.js` import extensions
1141
941
  - Tests colocated with source as `foo.ts` + `foo.test.ts`
1142
942
  - Vitest enforces **100% coverage** on a curated subset of pure-logic modules
1143
- - The `docs/design/` tree (v4.16) is the authoritative spec; `packages/daemon/src/` is the source of truth when they diverge
943
+ - The `docs/design/` tree is the authoritative spec; `packages/daemon/src/` is the source of truth when they diverge
1144
944
 
1145
945
  ### Source-of-truth pointers
1146
946
 
@@ -1162,7 +962,7 @@ pnpm clean # remove all build artifacts and node_modules
1162
962
  ## FAQ
1163
963
 
1164
964
  **Is Aitne a chatbot?**
1165
- No. It's a daemon. It also responds to chat, but the more interesting half is what it does *while you're not looking at it*.
965
+ No. It's a daemon. It also responds to chat, but the more interesting half is what it does while you're not looking at it.
1166
966
 
1167
967
  **Does it phone home?**
1168
968
  No. The daemon binds to `127.0.0.1` only. There is no telemetry. Verify with `lsof` and `nettop`.
@@ -1177,7 +977,7 @@ Yes — Claude Code, OpenAI Codex, and Google Gemini CLI are all supported. Pick
1177
977
  No metered API key required — Aitne uses your subscription quota via the official CLIs (`claude auth login`, `codex login`, `gemini`). If you'd rather pay-as-you-go, supply `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` in the wizard.
1178
978
 
1179
979
  **Can I edit the agent's memory directly?**
1180
- Yes — that's the entire point. Open `~/.personal-agent/context/today.md` in your editor, change anything, save. The agent picks up your edits on the next routine. Any edit is *just text in a file* — no proprietary format, no migration headaches if you uninstall.
980
+ Yes — that's the entire point. Open `~/.personal-agent/context/today.md` in your editor, change anything, save. The agent picks up your edits on the next routine. Any edit is just text in a file — no proprietary format, no migration headaches if you uninstall.
1181
981
 
1182
982
  **What about Obsidian?**
1183
983
  Aitne can use your existing Obsidian vault as the primary memory store. The agent reads vault files directly and writes via the official Obsidian CLI. Your wiki links keep working. Your daily notes get appended to.
@@ -1186,13 +986,13 @@ Aitne can use your existing Obsidian vault as the primary memory store. The agen
1186
986
  Yes. Register them in the dashboard `/connections` page; the daemon writes the per-session MCP config into each backend's session workdir before launching, so all your MCP tools are available transparently.
1187
987
 
1188
988
  **Do my existing Claude Code / Codex / Gemini settings work?**
1189
- Yes. Aitne reads your `~/.claude/`, `~/.codex/`, `~/.gemini/` configs on session init and layers its persona on top. Custom skills, slash commands, MCP servers, and plugins all carry over. See [Bring your own harness](#bring-your-own-harness-byoh).
989
+ Yes. Aitne reads your `~/.claude/`, `~/.codex/`, `~/.gemini/` configs on session init and layers its persona on top. Custom skills, slash commands, MCP servers, and plugins all carry over. See [Bring your own harness](#bring-your-own-harness).
1190
990
 
1191
991
  **Does it work without internet?**
1192
992
  The AI backends and reactive messaging need internet (to hit those services). The daemon, dashboard, observers (Git, Obsidian local), and Markdown memory are entirely offline.
1193
993
 
1194
994
  **Does it support languages other than English?**
1195
- Yes. Talk to it in your native language — Japanese, German, Spanish, anything. The LLM handles it; the `primaryLanguage` setting nudges DM / knowledge / vault outputs into that language too. Implementation code remains English-only.
995
+ Yes. Talk to it in your native language — Japanese, German, Spanish, anything. The LLM handles it; the `primaryLanguage` setting nudges DM, knowledge, and vault outputs into that language too. Implementation code remains English-only.
1196
996
 
1197
997
  **Is this for my whole team?**
1198
998
  No — Aitne is **single-owner by design**. Group chats and multi-user channels are filtered at the adapter layer. If you want a team agent, run one Aitne per teammate.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aitne-sh/aitne",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Aitne — a local-first, proactive personal AI agent. A long-running TypeScript daemon is the nervous system; Claude Code (or Codex / Gemini CLI) is the brain. All persistent memory lives in local Markdown files.",
5
5
  "keywords": [
6
6
  "ai",
@@ -43,9 +43,9 @@
43
43
  "README.md"
44
44
  ],
45
45
  "dependencies": {
46
- "@aitne/daemon": "0.1.6",
47
- "@aitne/dashboard": "0.1.6",
48
- "@aitne/shared": "0.1.6"
46
+ "@aitne/daemon": "0.1.7",
47
+ "@aitne/dashboard": "0.1.7",
48
+ "@aitne/shared": "0.1.7"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@typescript-eslint/eslint-plugin": "^8.58.1",