@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.
- package/README.md +286 -486
- 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
|
|
7
|
+
**A local-first, proactive personal AI agent that runs continuously on your own machine — and learns *you* every day.**
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@aitne-sh/aitne)
|
|
10
10
|
[](./LICENSE)
|
|
@@ -21,143 +21,194 @@ aitne start
|
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
-
##
|
|
24
|
+
## Overview
|
|
25
25
|
|
|
26
|
-
ChatGPT and Claude
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
+
## What makes Aitne different
|
|
50
33
|
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
##
|
|
46
|
+
## Installation
|
|
66
47
|
|
|
67
|
-
|
|
48
|
+
### From npm
|
|
68
49
|
|
|
69
|
-
|
|
50
|
+
The recommended path. Installs the `aitne` CLI globally with the daemon, dashboard, and built-in agent assets.
|
|
70
51
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
+
# OpenAI Codex CLI
|
|
65
|
+
npm install -g @openai/codex
|
|
66
|
+
codex login --device-auth
|
|
85
67
|
|
|
86
|
-
|
|
68
|
+
# Google Gemini CLI
|
|
69
|
+
npm install -g @google/gemini-cli
|
|
70
|
+
# OAuth handled on first use
|
|
71
|
+
```
|
|
87
72
|
|
|
88
|
-
|
|
73
|
+
Login once with each CLI you intend to use — Aitne auto-detects them on the next session.
|
|
89
74
|
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
|
117
|
-
- Auto-classify, label, and archive (Gmail) —
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
182
|
+
- Auto-link new notes to existing concepts
|
|
132
183
|
</details>
|
|
133
184
|
|
|
134
185
|
<details>
|
|
135
|
-
<summary><b
|
|
186
|
+
<summary><b>Build a personal wiki from anything you DM</b></summary>
|
|
136
187
|
|
|
137
|
-
-
|
|
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
|
|
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
|
-
-
|
|
145
|
-
- Workspaces can be internal (`~/.personal-agent/wiki/`) or
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
-
##
|
|
252
|
+
## A day with Aitne
|
|
253
|
+
|
|
254
|
+
A walkthrough of one user's Tuesday.
|
|
202
255
|
|
|
203
|
-
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
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 -->
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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.**
|
|
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
|
|
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
|
|
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
|
-
|
|
264
|
-
D1["
|
|
265
|
-
W1["
|
|
266
|
-
M1["
|
|
267
|
-
M3["
|
|
268
|
-
Y1["
|
|
269
|
-
|
|
270
|
-
D1
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
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` |
|
|
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
|
|
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
|
|
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
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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
|
|
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]` |
|
|
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 (
|
|
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
|
|
632
|
-
| `--json` | off | Machine-readable
|
|
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
|
-
|
|
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["
|
|
492
|
+
subgraph DAEMON["Aitne daemon (Hono on :8321)"]
|
|
662
493
|
direction TB
|
|
663
|
-
EB[EventBus<br/>priority heap]
|
|
664
|
-
DI[Dispatcher<br/>
|
|
665
|
-
BR[BackendRouter<br/>ProcessKey
|
|
666
|
-
AC[Agent Core<br/>IAgentCore interface]
|
|
667
|
-
OB[Observers
|
|
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
|
-
|
|
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
|
-
|
|
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 -->
|
|
688
|
-
|
|
508
|
+
OB --> DATA
|
|
509
|
+
DATA --> EB
|
|
689
510
|
EB --> DI
|
|
690
511
|
DI --> BR
|
|
691
512
|
BR --> AC
|
|
692
|
-
AC -->
|
|
693
|
-
AC -->
|
|
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/ #
|
|
724
|
-
├── task-flows/ # Per-event prompt templates
|
|
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
|
|
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
|
|
755
|
-
│ ├── weekly
|
|
756
|
-
│ ├── monthly
|
|
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
|
|
766
|
-
├── secrets/ # File-fallback secret store (
|
|
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` |
|
|
783
|
-
| **Codex CLI** | OpenAI Codex CLI subprocess + JSONL stream |
|
|
784
|
-
| **Gemini CLI** | Google Gemini CLI subprocess + JSONL stream |
|
|
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
|
|
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 |
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
664
|
+
- **GitHub** — `@octokit/rest` + webhooks; PR list and comment, issue ops, HMAC-SHA256 signature verification at `POST /webhook/github`
|
|
848
665
|
|
|
849
|
-
### Calendar
|
|
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`
|
|
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 |
|
|
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
|
|
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
|
|
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
|
-
-
|
|
916
|
-
-
|
|
917
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
817
|
+
The dashboard `/settings` tree exposes ~100 runtime keys. Headline groups:
|
|
1003
818
|
|
|
1004
|
-
- **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window
|
|
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`, `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
47
|
-
"@aitne/dashboard": "0.1.
|
|
48
|
-
"@aitne/shared": "0.1.
|
|
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",
|