@aitne-sh/aitne 0.1.5 → 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 +295 -479
- package/agent-assets/agent-profiles/_safety.md +17 -2
- package/agent-assets/agent-profiles/routine-fetch-window.md +75 -40
- package/agent-assets/agent-profiles/wiki-agent.md +19 -0
- package/agent-assets/docs/features/messaging/bang-commands.md +161 -0
- package/agent-assets/docs/features/messaging/overview.md +3 -0
- package/agent-assets/docs/features/wiki/commands.md +222 -0
- package/agent-assets/docs/features/wiki/overview.md +145 -0
- package/agent-assets/docs/getting-started/03-what-can-this-do.md +18 -0
- package/agent-assets/docs/glossary.md +34 -0
- package/agent-assets/docs/guides/budget-and-cost-for-wiki.md +123 -0
- package/agent-assets/docs/guides/build-your-wiki.md +99 -0
- package/agent-assets/docs/guides/explore-with-trace-and-connect.md +169 -0
- package/agent-assets/docs/guides/maintain-wiki-health.md +168 -0
- package/agent-assets/docs/guides/multiple-wikis-for-multiple-domains.md +192 -0
- package/agent-assets/docs/guides/pause-the-agent.md +10 -3
- package/agent-assets/docs/guides/use-an-existing-obsidian-vault.md +156 -0
- package/agent-assets/docs/reference/cli-commands.md +24 -1
- package/agent-assets/docs/troubleshooting/wiki-ingest-full-blocked.md +96 -0
- package/agent-assets/docs/troubleshooting/wiki-write-failed.md +82 -0
- package/agent-assets/skills/context/SKILL.md +288 -17
- package/agent-assets/skills/external-services/SKILL.delegated.claude.md +2 -2
- package/agent-assets/skills/external-services/SKILL.delegated.codex.md +3 -3
- package/agent-assets/skills/external-services/SKILL.delegated.gemini.md +6 -6
- package/agent-assets/skills/external-services/SKILL.md +5 -3
- package/agent-assets/skills/external-services/SKILL.native.claude.md +49 -58
- package/agent-assets/skills/external-services/SKILL.native.codex.md +50 -58
- package/agent-assets/skills/external-services/SKILL.native.gemini.md +53 -56
- package/agent-assets/skills/mail/SKILL.md +5 -5
- package/agent-assets/skills/mail/SKILL.native.claude.md +57 -65
- package/agent-assets/skills/mail/SKILL.native.codex.md +73 -75
- package/agent-assets/skills/mail/SKILL.native.gemini.md +80 -75
- package/agent-assets/skills/management-task-register/SKILL.md +3 -3
- package/agent-assets/skills/notion/SKILL.native.claude.md +78 -82
- package/agent-assets/skills/notion/SKILL.native.codex.md +78 -80
- package/agent-assets/skills/notion/SKILL.native.gemini.md +91 -90
- package/agent-assets/skills/observations/SKILL.md +104 -14
- package/agent-assets/skills/roadmap/SKILL.md +19 -0
- package/agent-assets/skills/schedule/SKILL.md +44 -3
- package/agent-assets/skills/today/SKILL.md +25 -5
- package/agent-assets/skills/travel-time/SKILL.md +9 -0
- package/agent-assets/skills/wiki/wiki-ask/SKILL.md +32 -0
- package/agent-assets/skills/wiki/wiki-compile/SKILL.md +126 -0
- package/agent-assets/skills/wiki/wiki-connect/SKILL.md +75 -0
- package/agent-assets/skills/wiki/wiki-graduate/SKILL.md +45 -0
- package/agent-assets/skills/wiki/wiki-ingest/SKILL.md +182 -0
- package/agent-assets/skills/wiki/wiki-lint/SKILL.md +90 -0
- package/agent-assets/skills/wiki/wiki-trace/SKILL.md +72 -0
- package/agent-assets/skills/wiki/wiki-vault-rules/SKILL.md +145 -0
- package/agent-assets/task-flows/_partials/calendar-acquire.google_calendar.md +28 -9
- package/agent-assets/task-flows/_partials/calendar-acquire.outlook_calendar.md +26 -9
- package/agent-assets/task-flows/_partials/mail-acquire.gmail.md +51 -24
- package/agent-assets/task-flows/_partials/mail-acquire.outlook_mail.md +46 -16
- package/agent-assets/task-flows/_partials/notion-acquire.notion.md +29 -9
- package/agent-assets/task-flows/message.received.dm.md +35 -2
- package/agent-assets/task-flows/message.received.dm.native.claude.md +25 -26
- package/agent-assets/task-flows/message.received.dm.native.codex.md +30 -24
- package/agent-assets/task-flows/message.received.dm.native.gemini.md +36 -36
- package/agent-assets/task-flows/message.received.dm_first.md +43 -4
- package/agent-assets/task-flows/message.received.dm_first.native.claude.md +20 -20
- package/agent-assets/task-flows/message.received.dm_first.native.codex.md +22 -19
- package/agent-assets/task-flows/message.received.dm_first.native.gemini.md +28 -24
- package/agent-assets/task-flows/routine.fetch_window.md +51 -36
- package/agent-assets/task-flows/routine.morning_routine.md +12 -3
- package/agent-assets/task-flows/routine.morning_routine_initial.md +22 -1
- package/agent-assets/task-flows/scheduled.dm.md +477 -0
- package/agent-assets/task-flows/wiki.ask.md +11 -0
- package/agent-assets/task-flows/wiki.compile.md +28 -0
- package/agent-assets/task-flows/wiki.connect.md +12 -0
- package/agent-assets/task-flows/wiki.ingest_url.md +35 -0
- package/agent-assets/task-flows/wiki.lint.md +13 -0
- package/agent-assets/task-flows/wiki.trace.md +13 -0
- package/agent-assets/wiki-seeds/schemas/output.md +12 -0
- package/agent-assets/wiki-seeds/schemas/raw.md +13 -0
- package/agent-assets/wiki-seeds/schemas/wiki.md +12 -0
- package/agent-assets/wiki-seeds/taxonomy.md +13 -0
- package/package.json +21 -41
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,129 +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
|
+
```
|
|
88
|
+
|
|
89
|
+
Common workflows:
|
|
92
90
|
|
|
93
|
-
|
|
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
|
|
98
111
|
|
|
99
|
-
A
|
|
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"]
|
|
136
|
+
|
|
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
|
|
183
|
+
</details>
|
|
184
|
+
|
|
185
|
+
<details>
|
|
186
|
+
<summary><b>Build a personal wiki from anything you DM</b></summary>
|
|
187
|
+
|
|
188
|
+
- DM `!ingest <url>` — the agent fetches, summarises, and saves a raw note in `10_raw/`
|
|
189
|
+
- Run `!compile` to synthesise raw notes into linked wiki articles in `20_wiki/` with an auto-maintained `_index.md`
|
|
190
|
+
- `!compile --preview` shows added / modified / unchanged pages plus cost and ETA before you spend tokens
|
|
191
|
+
- `!compile full` rebuilds everything — cost-gated, with a dashboard approval queue and an optional git pre-compile snapshot for external vaults
|
|
192
|
+
- `!ask <question>` answers from your own wiki and writes the cited reply to `30_outputs/`
|
|
193
|
+
- `!lint` audits for orphans, broken links, schema drift, and taxonomy candidates → dated health report
|
|
194
|
+
- `!trace <topic>` and `!connect A B` reconstruct how an idea evolved and find shared structure across domains
|
|
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
|
|
132
197
|
</details>
|
|
133
198
|
|
|
134
199
|
<details>
|
|
135
|
-
<summary><b
|
|
200
|
+
<summary><b>Code, Git, GitHub</b></summary>
|
|
136
201
|
|
|
137
202
|
- Local Git: `git log`, `git diff`, `git show` exposed via daemon proxy
|
|
138
|
-
- GitHub: PR lists, comments, issues, webhook receivers (HMAC-verified)
|
|
203
|
+
- GitHub: PR lists, comments, issues, webhook receivers (HMAC-SHA256 verified)
|
|
139
204
|
- Per-repo cron triggers — "every Monday at 09:00, summarize merged PRs into `projects/<repo>.md`"
|
|
140
|
-
- "Why did this build break?" — agent reads CI status
|
|
205
|
+
- "Why did this build break?" — agent reads CI status, diff, and traces
|
|
141
206
|
- Auto-detect when a coworker modified a file you're about to ship
|
|
142
207
|
- Unified Repositories: one row pairs a local clone with a GitHub remote; the doctor flags drift
|
|
143
208
|
</details>
|
|
144
209
|
|
|
145
210
|
<details>
|
|
146
|
-
<summary><b
|
|
211
|
+
<summary><b>Tasks, projects, life admin</b></summary>
|
|
147
212
|
|
|
148
213
|
- Unified task view across GitHub Issues, mail-derived TODOs, and your own `today.md`
|
|
149
214
|
- Per-project Markdown files with auto-maintained status, deadlines, and people
|
|
@@ -153,17 +218,17 @@ A non-exhaustive list. Click any group to expand.
|
|
|
153
218
|
</details>
|
|
154
219
|
|
|
155
220
|
<details>
|
|
156
|
-
<summary><b
|
|
221
|
+
<summary><b>Reading, lifestyle, voice</b></summary>
|
|
157
222
|
|
|
158
223
|
- Import Kindle highlights, build a reading-taste profile
|
|
159
224
|
- Friday book recommendation DM based on your taste
|
|
160
225
|
- Receipts auto-organized by month into your vault
|
|
161
226
|
- Travel itinerary roll-up surfaced before each trip
|
|
162
|
-
-
|
|
227
|
+
- Voice attachments — send a voice memo, get a Whisper-transcribed message (opt-in, runs locally via `ffmpeg-static` + `@huggingface/transformers`)
|
|
163
228
|
</details>
|
|
164
229
|
|
|
165
230
|
<details>
|
|
166
|
-
<summary><b
|
|
231
|
+
<summary><b>Self-management and automation</b></summary>
|
|
167
232
|
|
|
168
233
|
- Tell it to remember things in plain language ("I'm allergic to nuts")
|
|
169
234
|
- Tell it to forget things ("delete that note about my old job")
|
|
@@ -174,9 +239,9 @@ A non-exhaustive list. Click any group to expand.
|
|
|
174
239
|
</details>
|
|
175
240
|
|
|
176
241
|
<details>
|
|
177
|
-
<summary><b
|
|
242
|
+
<summary><b>Run your own tools</b></summary>
|
|
178
243
|
|
|
179
|
-
- Bring your own MCP servers — they materialize into every session
|
|
244
|
+
- Bring your own MCP servers — they materialize into every session workdir
|
|
180
245
|
- Bring your own Claude Code skills — they show up wherever the agent runs
|
|
181
246
|
- Bring your own Codex / Gemini config — Aitne reads it on session init
|
|
182
247
|
- Custom skills via the `/api/skills` endpoint — drop a `SKILL.md` and it's live
|
|
@@ -184,97 +249,99 @@ A non-exhaustive list. Click any group to expand.
|
|
|
184
249
|
|
|
185
250
|
---
|
|
186
251
|
|
|
187
|
-
##
|
|
252
|
+
## A day with Aitne
|
|
188
253
|
|
|
189
|
-
|
|
254
|
+
A walkthrough of one user's Tuesday.
|
|
190
255
|
|
|
191
|
-
|
|
192
|
-
flowchart TB
|
|
193
|
-
subgraph SOURCES["📥 Sources"]
|
|
194
|
-
direction LR
|
|
195
|
-
S1["💬 messages"]
|
|
196
|
-
S2["📅 calendar"]
|
|
197
|
-
S3["📧 mail"]
|
|
198
|
-
S4["📦 git/github"]
|
|
199
|
-
S5["📓 obsidian/notion"]
|
|
200
|
-
S6["✋ you editing<br/>files by hand"]
|
|
201
|
-
end
|
|
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.
|
|
202
257
|
|
|
203
|
-
|
|
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.
|
|
204
265
|
|
|
205
|
-
|
|
206
|
-
direction LR
|
|
207
|
-
ST1[("SQLite<br/>observations<br/>messages<br/>actions")]
|
|
208
|
-
ST2["today.md<br/>(working view,<br/>always injected)"]
|
|
209
|
-
end
|
|
266
|
+
**09:15 — You DM Aitne:** *"Tell Sarah I'll review by 11. And book lunch with Mark on Thursday — somewhere near his office."*
|
|
210
267
|
|
|
211
|
-
|
|
212
|
-
direction TB
|
|
213
|
-
LT1["user/profile.md<br/>work · expertise<br/>people · goals"]
|
|
214
|
-
LT2["projects/*.md<br/>roadmap.md"]
|
|
215
|
-
LT3["daily/YYYY-MM-DD.md<br/>↓<br/>weekly/YYYY-Www.md<br/>↓<br/>monthly/YYYY-MM.md"]
|
|
216
|
-
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.
|
|
217
269
|
|
|
218
|
-
|
|
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?
|
|
280
|
+
|
|
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"]
|
|
219
299
|
|
|
220
300
|
SOURCES --> OB
|
|
221
|
-
OB -->
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
LT2 -. "morning + evening" .-> AI
|
|
232
|
-
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
|
|
233
311
|
```
|
|
234
312
|
|
|
235
313
|
**Key properties:**
|
|
236
314
|
|
|
237
|
-
- **Plain Markdown.**
|
|
238
|
-
- **Layered retention.** `today.md` rotates to `yesterday.md` once per agent-day. `daily/` files are persistent by design (synthesized journal). `weekly/` is pruned after
|
|
239
|
-
- **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".
|
|
240
318
|
- **You can always intervene.** Edit any file by hand. The agent picks up your changes on the next routine.
|
|
241
319
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
## Compounding intelligence
|
|
320
|
+
### Compounding intelligence
|
|
245
321
|
|
|
246
|
-
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.
|
|
247
323
|
|
|
248
324
|
```mermaid
|
|
249
|
-
|
|
250
|
-
D1["
|
|
251
|
-
W1["
|
|
252
|
-
M1["
|
|
253
|
-
M3["
|
|
254
|
-
Y1["
|
|
255
|
-
|
|
256
|
-
D1
|
|
257
|
-
W1 -->|evening review| M1
|
|
258
|
-
M1 -->|project tracking| M3
|
|
259
|
-
M3 -->|long-term memory| Y1
|
|
260
|
-
|
|
261
|
-
style D1 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
|
|
262
|
-
style W1 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
|
|
263
|
-
style M1 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
|
|
264
|
-
style M3 fill:#dcfce7,stroke:#22c55e,stroke-width:2px
|
|
265
|
-
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
|
|
266
333
|
```
|
|
267
334
|
|
|
268
335
|
### The implicit feedback loop
|
|
269
336
|
|
|
270
|
-
Every interaction shapes Aitne's understanding of you
|
|
337
|
+
Every interaction shapes Aitne's understanding of you implicitly. No buttons. No surveys.
|
|
271
338
|
|
|
272
|
-
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:
|
|
273
340
|
|
|
274
341
|
- **Tone** → updates the `character` runtime-config field, applied to every backend's system prompt.
|
|
275
342
|
- **Attribute** → updates `user/profile.md` Learned Context.
|
|
276
343
|
|
|
277
|
-
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).
|
|
278
345
|
|
|
279
346
|
---
|
|
280
347
|
|
|
@@ -290,7 +357,7 @@ Aitne has a dedicated set of management skills — `management-task-register`, `
|
|
|
290
357
|
| *"Remember my partner's birthday is March 14"* | Appends to `user/profile.md` Learned Context |
|
|
291
358
|
| *"I prefer concise replies — no preamble"* | Updates `character` field |
|
|
292
359
|
| *"Move all my React work into one project file"* | Refactors `projects/*.md` and re-indexes |
|
|
293
|
-
| *"Cancel tomorrow's morning briefing"* | Removes the agent_schedule row |
|
|
360
|
+
| *"Cancel tomorrow's morning briefing"* | Removes the `agent_schedule` row |
|
|
294
361
|
| *"Forget what I said about my old job"* | Surgically edits `user/work.md` |
|
|
295
362
|
| *"Email me a summary every Friday at 5pm"* | Creates a recurring schedule with a free-form prompt |
|
|
296
363
|
| *"Switch to Codex for code reviews from now on"* | Updates `process_backend_config` mapping |
|
|
@@ -307,274 +374,60 @@ Every change is journaled to `agent_actions` with `source_kind=user_directive`.
|
|
|
307
374
|
|
|
308
375
|
---
|
|
309
376
|
|
|
310
|
-
## Bring your own harness
|
|
377
|
+
## Bring your own harness
|
|
311
378
|
|
|
312
|
-
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.
|
|
313
380
|
|
|
314
381
|
```mermaid
|
|
315
382
|
flowchart LR
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
RUN["🚀 Backend runs with<br/><b>your full toolkit + Aitne's</b>"]
|
|
334
|
-
|
|
335
|
-
YOUR --> SESS
|
|
336
|
-
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
|
|
337
400
|
SESS --> RUN
|
|
338
|
-
|
|
339
|
-
style YOUR fill:#dbeafe,stroke:#3b82f6
|
|
340
|
-
style AITNE_SKILLS fill:#fef3c7,stroke:#f59e0b
|
|
341
|
-
style SESS fill:#dcfce7,stroke:#22c55e
|
|
342
|
-
style RUN fill:#fae8ff,stroke:#a855f7
|
|
343
401
|
```
|
|
344
402
|
|
|
345
403
|
| You already have… | In Aitne it just works |
|
|
346
404
|
|---|---|
|
|
347
405
|
| A Claude Code MCP server connected to your company's internal API | Every Aitne session can use it. No code changes. |
|
|
348
|
-
| 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. |
|
|
349
407
|
| A polished `AGENTS.md` for your Codex setup | Aitne layers its persona on top, keeping your config intact. |
|
|
350
|
-
| Your Gemini auth
|
|
408
|
+
| Your Gemini auth and project preferences | Inherited automatically. |
|
|
351
409
|
| Skills you wrote for `~/.claude/skills/` | Imported on demand. |
|
|
352
410
|
|
|
353
|
-
**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.
|
|
354
412
|
|
|
355
413
|
---
|
|
356
414
|
|
|
357
415
|
## Multi-platform, multi-app
|
|
358
416
|
|
|
359
|
-
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.
|
|
360
418
|
|
|
361
419
|
```mermaid
|
|
362
|
-
flowchart
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
I3["🎮 Discord"]
|
|
368
|
-
I4["💚 WhatsApp"]
|
|
369
|
-
I5["🌐 Web dashboard chat"]
|
|
370
|
-
I6["✋ Manual file edits"]
|
|
371
|
-
end
|
|
372
|
-
|
|
373
|
-
subgraph SVC["🔌 Connected apps"]
|
|
374
|
-
direction TB
|
|
375
|
-
SV1["📅 Google Calendar · Outlook Calendar"]
|
|
376
|
-
SV2["📧 Gmail · Outlook · Yahoo · iCloud"]
|
|
377
|
-
SV3["📓 Notion · Obsidian"]
|
|
378
|
-
SV4["📦 GitHub · local Git"]
|
|
379
|
-
SV5["🗺️ Google Maps"]
|
|
380
|
-
SV6["🔧 Custom MCP servers"]
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
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"]
|
|
384
425
|
|
|
385
426
|
IN --> AITNE
|
|
386
|
-
AITNE
|
|
387
|
-
|
|
388
|
-
subgraph OUT["📤 Output surfaces"]
|
|
389
|
-
direction LR
|
|
390
|
-
O1["💬 Same DM channel"]
|
|
391
|
-
O2["📋 today.md<br/>updates"]
|
|
392
|
-
O3["📅 Calendar<br/>actions"]
|
|
393
|
-
O4["📧 Drafted emails"]
|
|
394
|
-
O5["🔔 Proactive<br/>notifications"]
|
|
395
|
-
end
|
|
396
|
-
|
|
427
|
+
AITNE --- SVC
|
|
397
428
|
AITNE --> OUT
|
|
398
429
|
```
|
|
399
430
|
|
|
400
|
-
**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.
|
|
401
|
-
|
|
402
|
-
---
|
|
403
|
-
|
|
404
|
-
## Highlights
|
|
405
|
-
|
|
406
|
-
| | |
|
|
407
|
-
|---|---|
|
|
408
|
-
| 🌅 **Proactive routines** | Morning · evening · weekly · monthly · hourly observation sweep |
|
|
409
|
-
| 💬 **Reactive on every chat platform** | Slack · Telegram · Discord · WhatsApp · Web dashboard |
|
|
410
|
-
| 🧠 **Multi-backend brain** | Claude (Opus 4.7 / Sonnet 4.6 / Haiku 4.5) · Codex CLI · Gemini CLI |
|
|
411
|
-
| 📝 **MD-centric memory** | Plain Markdown you own — `today.md` · `roadmap.md` · `projects/*` · `daily/` · `weekly/` · `monthly/` |
|
|
412
|
-
| 🔌 **23 built-in skills** | Calendar, mail, Notion, Obsidian, schedule, roadmap, receipts, travel, reading, voice, … |
|
|
413
|
-
| 🔁 **4-mode integration framework** | `direct` (daemon polls) · `delegated` (backend's connector) · `native` (main backend MCP on demand) · `disabled` |
|
|
414
|
-
| 🛡️ **Four-layer safety** | SDK allowlist · PreToolUse hooks · daemon API risk tiers · absolute-block layer that holds even in Allow mode |
|
|
415
|
-
| 🪪 **Local-first & private** | Binds to `127.0.0.1`. No telemetry. Secrets in OS Keychain. Zero cloud state. |
|
|
416
|
-
| 🧰 **Production tooling** | Background daemon · `aitne doctor` · cost analytics · auth health monitor with auto-recovery |
|
|
417
|
-
| 🌍 **Speak any language** | The LLM handles it — talk to Aitne in Japanese, English, German, anything. `primaryLanguage` config nudges its outputs too. |
|
|
418
|
-
|
|
419
|
-
---
|
|
420
|
-
|
|
421
|
-
## Table of contents
|
|
422
|
-
|
|
423
|
-
1. [Quick start](#quick-start)
|
|
424
|
-
2. [Setup guide](#setup-guide)
|
|
425
|
-
3. [CLI reference](#cli-reference)
|
|
426
|
-
4. [Architecture](#architecture)
|
|
427
|
-
5. [Memory layout](#memory-layout)
|
|
428
|
-
6. [Multi-backend](#multi-backend)
|
|
429
|
-
7. [Integrations](#integrations)
|
|
430
|
-
8. [Safety model](#safety-model)
|
|
431
|
-
9. [Cost & quotas](#cost--quotas)
|
|
432
|
-
10. [Configuration](#configuration)
|
|
433
|
-
11. [Platform support](#platform-support)
|
|
434
|
-
12. [Troubleshooting](#troubleshooting)
|
|
435
|
-
13. [Development](#development)
|
|
436
|
-
14. [FAQ](#faq)
|
|
437
|
-
15. [License](#license)
|
|
438
|
-
|
|
439
|
-
---
|
|
440
|
-
|
|
441
|
-
## Quick start
|
|
442
|
-
|
|
443
|
-
### 1. Install
|
|
444
|
-
|
|
445
|
-
```bash
|
|
446
|
-
npm install -g @aitne-sh/aitne@latest
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
Installs the `aitne` CLI globally with the daemon, dashboard, and built-in agent assets.
|
|
450
|
-
|
|
451
|
-
### 2. Bring at least one AI backend
|
|
452
|
-
|
|
453
|
-
Aitne is the nervous system; you bring the brain. Install **at least one** of:
|
|
454
|
-
|
|
455
|
-
```bash
|
|
456
|
-
# Claude Code (recommended — full features, server-side advisor support)
|
|
457
|
-
npm install -g @anthropic-ai/claude-code
|
|
458
|
-
|
|
459
|
-
# OpenAI Codex CLI
|
|
460
|
-
npm install -g @openai/codex
|
|
461
|
-
|
|
462
|
-
# Google Gemini CLI
|
|
463
|
-
npm install -g @google/gemini-cli
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
Login once with each CLI you intend to use — Aitne auto-detects them.
|
|
467
|
-
|
|
468
|
-
### 3. Start
|
|
469
|
-
|
|
470
|
-
```bash
|
|
471
|
-
aitne start
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
The daemon (`:8321`) and dashboard (`:3000`) launch in the background and your browser opens to the setup wizard.
|
|
475
|
-
|
|
476
|
-
### 4. Confirm
|
|
477
|
-
|
|
478
|
-
```bash
|
|
479
|
-
aitne status
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
```
|
|
483
|
-
Aitne status:
|
|
484
|
-
|
|
485
|
-
Daemon: running (PID 12345)
|
|
486
|
-
Uptime: 1m 23s
|
|
487
|
-
API: http://127.0.0.1:8321
|
|
488
|
-
Platforms: slack, dashboard
|
|
489
|
-
Backends: claude
|
|
490
|
-
Dashboard: running (PID 12346)
|
|
491
|
-
URL: http://localhost:3000
|
|
492
|
-
|
|
493
|
-
Last action: 2026-05-11T07:30:14Z (routine.morning_routine)
|
|
494
|
-
Today: 6 action(s) · $0.043 spent
|
|
495
|
-
Next: 2026-05-11T18:00:00Z routine.evening_review
|
|
496
|
-
```
|
|
497
|
-
|
|
498
|
-
That's it. Open `http://localhost:3000` and finish the wizard.
|
|
499
|
-
|
|
500
|
-
---
|
|
501
|
-
|
|
502
|
-
## Setup guide
|
|
503
|
-
|
|
504
|
-
### Prerequisites
|
|
505
|
-
|
|
506
|
-
| Requirement | Version | Why |
|
|
507
|
-
|---|---|---|
|
|
508
|
-
| **Node.js** | ≥ 22.0.0 | Daemon runtime (LTS) |
|
|
509
|
-
| **At least one AI backend** | — | Claude Code, Codex CLI, or Gemini CLI |
|
|
510
|
-
| **OS Keychain** | macOS / libsecret on Linux / DPAPI on Windows | Secret storage (file-based fallback available) |
|
|
511
|
-
|
|
512
|
-
### Step 1 — Install Aitne
|
|
513
|
-
|
|
514
|
-
```bash
|
|
515
|
-
npm install -g @aitne-sh/aitne@latest
|
|
516
|
-
```
|
|
517
|
-
|
|
518
|
-
> Want to hack on the source? See [Development](#development).
|
|
519
|
-
|
|
520
|
-
### Step 2 — Install at least one backend CLI
|
|
521
|
-
|
|
522
|
-
#### Claude Code (recommended)
|
|
523
|
-
|
|
524
|
-
```bash
|
|
525
|
-
npm install -g @anthropic-ai/claude-code
|
|
526
|
-
claude --version
|
|
527
|
-
claude auth login # uses your Claude subscription
|
|
528
|
-
```
|
|
529
|
-
|
|
530
|
-
#### OpenAI Codex CLI
|
|
531
|
-
|
|
532
|
-
```bash
|
|
533
|
-
npm install -g @openai/codex
|
|
534
|
-
codex --version
|
|
535
|
-
codex login --device-auth # device-flow OAuth
|
|
536
|
-
```
|
|
537
|
-
|
|
538
|
-
#### Google Gemini CLI
|
|
539
|
-
|
|
540
|
-
```bash
|
|
541
|
-
npm install -g @google/gemini-cli
|
|
542
|
-
gemini --version
|
|
543
|
-
# OAuth handled automatically on first use
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
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).
|
|
547
|
-
|
|
548
|
-
### Step 3 — Launch and run the wizard
|
|
549
|
-
|
|
550
|
-
```bash
|
|
551
|
-
aitne start
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
Aitne builds (if needed), launches both processes, and opens `http://localhost:3000/setup`. The wizard walks 9 screens:
|
|
555
|
-
|
|
556
|
-
| # | Step | What it asks |
|
|
557
|
-
|---|---|---|
|
|
558
|
-
| 1 | **Basics** | Agent display name + primary language |
|
|
559
|
-
| 2 | **Vault** | Plain (`~/.personal-agent/context/`) or your existing Obsidian vault path |
|
|
560
|
-
| 3 | **AI Backend** | Pick the main backend (Claude / Codex / Gemini), authenticate (API key or CLI login), choose execution mode (Safe vs. Allow) |
|
|
561
|
-
| 4 | **Mail** | Gmail (OAuth) · Outlook (OAuth) · Yahoo / iCloud (IMAP + app password) — each card sets `direct` / `delegated` / `native` mode where supported |
|
|
562
|
-
| 5 | **Calendar** | Google Calendar (OAuth) · Outlook Calendar (OAuth or user-managed MCP) — same mode picker per card |
|
|
563
|
-
| 6 | **Note** | Notion (OAuth) and an optional secondary Obsidian vault path to watch |
|
|
564
|
-
| 7 | **Messaging** | Slack · Telegram · Discord · WhatsApp pairing |
|
|
565
|
-
| 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 |
|
|
566
|
-
| 9 | **Done** | Summary; agent runs its first `setup` session |
|
|
567
|
-
|
|
568
|
-
Required steps: Basics, Vault, AI Backend, Rules. Everything else exposes a **Skip** button — you can come back later from `/connections/*` or `/settings/*`.
|
|
569
|
-
|
|
570
|
-
### Step 4 — Verify
|
|
571
|
-
|
|
572
|
-
```bash
|
|
573
|
-
aitne status # PIDs, uptime, connected platforms, backends, today's spend
|
|
574
|
-
aitne doctor # install diagnostic
|
|
575
|
-
aitne logs -f # tail the daemon log
|
|
576
|
-
```
|
|
577
|
-
|
|
578
431
|
---
|
|
579
432
|
|
|
580
433
|
## CLI reference
|
|
@@ -597,7 +450,7 @@ aitne logs -f # tail the daemon log
|
|
|
597
450
|
|---|---|
|
|
598
451
|
| `aitne setup` | Re-open the dashboard `/setup` wizard. Auto-starts the daemon if needed. |
|
|
599
452
|
| `aitne open` | Open the dashboard in your browser. |
|
|
600
|
-
| `aitne doctor [--json]` |
|
|
453
|
+
| `aitne doctor [--json]` | 8 base install checks; the repository-drift check expands into one extra row per drifted repo. |
|
|
601
454
|
| `aitne audit [flags]` | Read the agent action log directly from SQLite. |
|
|
602
455
|
| `aitne version [--json]` | Version, Node, install path, last build time. |
|
|
603
456
|
| `aitne update [--check]` | Print the npm command to upgrade. `--check` makes one network call. |
|
|
@@ -608,13 +461,13 @@ aitne logs -f # tail the daemon log
|
|
|
608
461
|
|
|
609
462
|
| Flag | Default | Description |
|
|
610
463
|
|---|---|---|
|
|
611
|
-
| `--since <duration>` | `24h` | Time window (
|
|
464
|
+
| `--since <duration>` | `24h` | Time window (`1h`, `7d`, `2026-04-20`). |
|
|
612
465
|
| `--type <pattern>` | — | `action_type` filter (`%` for LIKE matching). |
|
|
613
466
|
| `--result <value>` | — | `success` / `failed` / `partial` / `skipped`. |
|
|
614
467
|
| `--backend <name>` | — | `claude` / `codex` / `gemini`. |
|
|
615
468
|
| `--limit <N>` | 50 | Row cap. |
|
|
616
|
-
| `--detail` | off | Expand the `detail` JSON column
|
|
617
|
-
| `--json` | off | Machine-readable
|
|
469
|
+
| `--detail` | off | Expand the `detail` JSON column. |
|
|
470
|
+
| `--json` | off | Machine-readable output. |
|
|
618
471
|
|
|
619
472
|
### `aitne doctor` checks
|
|
620
473
|
|
|
@@ -634,58 +487,36 @@ aitne logs -f # tail the daemon log
|
|
|
634
487
|
|
|
635
488
|
```mermaid
|
|
636
489
|
flowchart TB
|
|
637
|
-
|
|
638
|
-
direction LR
|
|
639
|
-
P1[Slack]
|
|
640
|
-
P2[Telegram]
|
|
641
|
-
P3[Discord]
|
|
642
|
-
P4[WhatsApp]
|
|
643
|
-
P5[Dashboard]
|
|
644
|
-
end
|
|
490
|
+
PLAT["Input platforms:<br/>Slack, Telegram, Discord,<br/>WhatsApp, Web dashboard"]
|
|
645
491
|
|
|
646
|
-
subgraph DAEMON["
|
|
492
|
+
subgraph DAEMON["Aitne daemon (Hono on :8321)"]
|
|
647
493
|
direction TB
|
|
648
|
-
EB[EventBus<br/>priority heap]
|
|
649
|
-
DI[Dispatcher<br/>
|
|
650
|
-
BR[BackendRouter<br/>ProcessKey
|
|
651
|
-
AC[Agent Core<br/>IAgentCore interface]
|
|
652
|
-
OB[Observers
|
|
653
|
-
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)"]
|
|
654
500
|
end
|
|
655
501
|
|
|
656
|
-
|
|
657
|
-
direction LR
|
|
658
|
-
BC[Claude Code SDK]
|
|
659
|
-
BX[Codex CLI subprocess]
|
|
660
|
-
BG[Gemini CLI subprocess]
|
|
661
|
-
end
|
|
502
|
+
BACKENDS["AI runtimes:<br/>Claude Code SDK,<br/>Codex CLI subprocess,<br/>Gemini CLI subprocess"]
|
|
662
503
|
|
|
663
|
-
|
|
664
|
-
direction LR
|
|
665
|
-
SQL[(SQLite<br/>WAL + FTS5)]
|
|
666
|
-
MD["📝 Markdown memory<br/>~/.personal-agent/context/"]
|
|
667
|
-
KC[OS Keychain]
|
|
668
|
-
end
|
|
504
|
+
DATA["Local data:<br/>SQLite (WAL + FTS5),<br/>Markdown memory,<br/>OS Keychain"]
|
|
669
505
|
|
|
670
506
|
PLAT --> EB
|
|
671
507
|
SC --> EB
|
|
672
|
-
OB -->
|
|
673
|
-
|
|
508
|
+
OB --> DATA
|
|
509
|
+
DATA --> EB
|
|
674
510
|
EB --> DI
|
|
675
511
|
DI --> BR
|
|
676
512
|
BR --> AC
|
|
677
|
-
AC -->
|
|
678
|
-
AC -->
|
|
679
|
-
AC --> BG
|
|
680
|
-
AC <-->|curl localhost API| DAEMON
|
|
681
|
-
DAEMON <--> SQL
|
|
682
|
-
DAEMON <--> MD
|
|
683
|
-
DAEMON <--> KC
|
|
513
|
+
AC --> BACKENDS
|
|
514
|
+
AC --> DATA
|
|
684
515
|
```
|
|
685
516
|
|
|
686
517
|
### Two execution paths
|
|
687
518
|
|
|
688
|
-
**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
|
|
689
520
|
→ Event source → EventBus → Dispatcher → BackendRouter → Agent → output to user.
|
|
690
521
|
|
|
691
522
|
**Polling path** — Obsidian, Git, GitHub, Notion, Calendar, Mail change detection
|
|
@@ -705,13 +536,13 @@ packages/
|
|
|
705
536
|
|
|
706
537
|
agent-assets/ # Read by the daemon at session-init time
|
|
707
538
|
├── agent-profiles/ # Persona MD per backend (CLAUDE.md / AGENTS.md / GEMINI.md)
|
|
708
|
-
├── skills/ #
|
|
709
|
-
├── task-flows/ # Per-event prompt templates
|
|
539
|
+
├── skills/ # 24 built-in skills (context, calendar, mail, notion, …)
|
|
540
|
+
├── task-flows/ # Per-event prompt templates
|
|
710
541
|
└── templates/ # Scaffold MD copied to context/ on first run
|
|
711
542
|
|
|
712
543
|
bin/aitne.mjs # CLI entry — lifecycle + ops
|
|
713
544
|
scripts/ # Build/run helpers and per-command modules
|
|
714
|
-
docs/design/ # Architecture
|
|
545
|
+
docs/design/ # Architecture and design docs — source of truth
|
|
715
546
|
```
|
|
716
547
|
|
|
717
548
|
---
|
|
@@ -736,9 +567,9 @@ Everything the agent writes lives under `PA_DATA_DIR` (default `~/.personal-agen
|
|
|
736
567
|
│ ├── routines/ # Per-cadence checklist rulebooks
|
|
737
568
|
│ ├── dossiers/ # Carry-forward state per routine
|
|
738
569
|
│ ├── projects/ # One file per active project + Obsidian Bases view
|
|
739
|
-
│ ├── daily
|
|
740
|
-
│ ├── weekly
|
|
741
|
-
│ ├── 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)
|
|
742
573
|
│ ├── inbox/ # Optional paste bucket
|
|
743
574
|
│ └── agent/
|
|
744
575
|
│ ├── journal.md # Private agent self-reflection
|
|
@@ -747,8 +578,8 @@ Everything the agent writes lives under `PA_DATA_DIR` (default `~/.personal-agen
|
|
|
747
578
|
├── logs/{daemon,dashboard}.log
|
|
748
579
|
├── prompts/ # Editable prompt templates
|
|
749
580
|
├── attachments/ # Chat attachments
|
|
750
|
-
├── agent-sessions
|
|
751
|
-
├── 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)
|
|
752
583
|
└── run/ # PID files for daemon + dashboard
|
|
753
584
|
```
|
|
754
585
|
|
|
@@ -764,9 +595,9 @@ Aitne abstracts three AI runtimes behind a single `IAgentCore` interface:
|
|
|
764
595
|
|
|
765
596
|
| Backend | Implementation | Session resume | Strengths |
|
|
766
597
|
|---|---|---|---|
|
|
767
|
-
| **Claude Code** | `@anthropic-ai/claude-agent-sdk` |
|
|
768
|
-
| **Codex CLI** | OpenAI Codex CLI subprocess + JSONL stream |
|
|
769
|
-
| **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 |
|
|
770
601
|
|
|
771
602
|
### Per-process tier routing
|
|
772
603
|
|
|
@@ -791,8 +622,9 @@ Every kind of work has a `ProcessKey` mapped to a tier (`lite` / `medium` / `hig
|
|
|
791
622
|
| `delegated_task` | lite | Delegated subprocess task mode |
|
|
792
623
|
| `delegated_task_heavy` | high | Opt-in destructive-write task mode |
|
|
793
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 |
|
|
794
626
|
|
|
795
|
-
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.
|
|
796
628
|
|
|
797
629
|
---
|
|
798
630
|
|
|
@@ -805,7 +637,7 @@ Configure each ProcessKey's backend & tier from the dashboard `/settings/models`
|
|
|
805
637
|
| Slack | `@slack/bolt` | Socket Mode (WebSocket) | Bot + App tokens |
|
|
806
638
|
| Telegram | `telegraf` | Long polling | Bot token |
|
|
807
639
|
| Discord | `discord.js` | Gateway | Bot token |
|
|
808
|
-
| WhatsApp |
|
|
640
|
+
| WhatsApp | `@whiskeysockets/baileys` | QR pairing | Scan QR from dashboard |
|
|
809
641
|
| Web Dashboard | Hono SSE | Always on | None |
|
|
810
642
|
|
|
811
643
|
### Mail (multi-provider, unified API)
|
|
@@ -817,29 +649,30 @@ Configure each ProcessKey's backend & tier from the dashboard `/settings/models`
|
|
|
817
649
|
| **Yahoo** | IMAP + app password | Read · send · IMAP IDLE |
|
|
818
650
|
| **iCloud** | IMAP + app password | Read · send · IMAP IDLE |
|
|
819
651
|
|
|
820
|
-
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.
|
|
821
653
|
|
|
822
|
-
### Knowledge
|
|
654
|
+
### Knowledge and docs
|
|
823
655
|
|
|
824
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
|
|
825
657
|
- **Notion** — `@notionhq/client` REST API; full page + database CRUD
|
|
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.
|
|
826
659
|
- **Custom MCP servers** — register via `/api/mcp/servers`; materialized into the per-session workdir so backends use them transparently
|
|
827
660
|
|
|
828
661
|
### Code
|
|
829
662
|
|
|
830
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`
|
|
831
|
-
- **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`
|
|
832
665
|
|
|
833
|
-
### Calendar
|
|
666
|
+
### Calendar and travel
|
|
834
667
|
|
|
835
668
|
- **Google Calendar** — `googleapis` OAuth2; full event CRUD, freebusy, calendar list, 15-min approaching reminders
|
|
836
669
|
- **Outlook Calendar** — Microsoft Graph via `@azure/msal-node` in direct mode, or user-managed MCP in delegated / native modes
|
|
837
|
-
- **iCloud Calendar** — CalDAV via `tsdav`
|
|
670
|
+
- **iCloud Calendar** — CalDAV via `tsdav`
|
|
838
671
|
- **Google Maps** — Directions API for travel-time estimation tied to calendar events
|
|
839
672
|
|
|
840
673
|
### Lifestyle
|
|
841
674
|
|
|
842
|
-
- **Receipts** — auto-extracts PDF/image attachments from mail with category detection
|
|
675
|
+
- **Receipts** — auto-extracts PDF / image attachments from mail with category detection
|
|
843
676
|
- **Travel bookings** — auto-extracts flight, hotel, restaurant, train confirmations
|
|
844
677
|
- **Reading** — Kindle My Clippings importer; reading-taste profile; weekly book recommendations
|
|
845
678
|
- **Voice** — opt-in Whisper transcription (`ffmpeg-static` + `@huggingface/transformers`) runs locally on voice attachments. Install via `POST /api/voice/install`.
|
|
@@ -852,10 +685,10 @@ Each integration runs in one of **four** modes:
|
|
|
852
685
|
|---|---|---|---|---|
|
|
853
686
|
| **`direct`** | Daemon (OAuth in OS Keychain) | Daemon poller | 5–6 vendor-console steps | Full feature set |
|
|
854
687
|
| **`delegated`** | Main backend's connector | Cron `delegated-sync-worker` (per-cadence opt-in) | None — backend already authed | Reduced (whatever the connector exposes) |
|
|
855
|
-
| **`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` |
|
|
856
689
|
| **`disabled`** | — | No | — | Off |
|
|
857
690
|
|
|
858
|
-
`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.
|
|
859
692
|
|
|
860
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`.
|
|
861
694
|
|
|
@@ -893,12 +726,14 @@ In Safe mode, every `Bash(curl ...)` invocation is parsed: the hostname must be
|
|
|
893
726
|
|
|
894
727
|
Hard-blocked in **both Safe and Allow** modes. `bypassPermissions` and `allowedToolsOverride` cannot widen past this:
|
|
895
728
|
|
|
896
|
-
- 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`, …)
|
|
897
730
|
- Privilege escalation: `sudo *`, `doas *`, `su *`
|
|
898
|
-
- Pipe-to-shell RCE: `curl * | sh`, `wget * | bash`, `bash <(...)`
|
|
899
|
-
-
|
|
900
|
-
-
|
|
901
|
-
-
|
|
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)
|
|
902
737
|
|
|
903
738
|
Every blocked attempt lands in `agent_actions` with `action_type='blocked_absolute'`.
|
|
904
739
|
|
|
@@ -914,7 +749,7 @@ Every blocked attempt lands in `agent_actions` with `action_type='blocked_absolu
|
|
|
914
749
|
|
|
915
750
|
---
|
|
916
751
|
|
|
917
|
-
## Cost
|
|
752
|
+
## Cost and quotas
|
|
918
753
|
|
|
919
754
|
### Built-in controls
|
|
920
755
|
|
|
@@ -947,13 +782,12 @@ If you're on a Claude / Codex / Gemini subscription, none of this hits a metered
|
|
|
947
782
|
|
|
948
783
|
## Configuration
|
|
949
784
|
|
|
950
|
-
`.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.
|
|
951
786
|
|
|
952
787
|
### `.env` (bootstrap)
|
|
953
788
|
|
|
954
789
|
```bash
|
|
955
|
-
PA_DATA_DIR=~/.personal-agent
|
|
956
|
-
# PA_DATA_DIR=C:\Users\You\.personal-agent # Windows
|
|
790
|
+
PA_DATA_DIR=~/.personal-agent
|
|
957
791
|
PA_API_PORT=8321
|
|
958
792
|
PA_DASHBOARD_PORT=3000
|
|
959
793
|
PA_LOG_LEVEL=info # trace | debug | info | warn | error
|
|
@@ -961,21 +795,18 @@ PA_LOG_LEVEL=info # trace | debug | info | warn | error
|
|
|
961
795
|
|
|
962
796
|
### Pre-seeding identifiers via env (optional)
|
|
963
797
|
|
|
964
|
-
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:
|
|
965
799
|
|
|
966
800
|
```bash
|
|
967
|
-
# Owner identifiers (non-secret — let messaging adapters know who you are)
|
|
968
801
|
PA_SLACK_OWNER_USER_ID=U...
|
|
969
802
|
PA_TELEGRAM_OWNER_CHAT_ID=...
|
|
970
803
|
PA_DISCORD_OWNER_USER_ID=...
|
|
971
804
|
PA_WHATSAPP_ENABLED=true
|
|
972
805
|
PA_WHATSAPP_OWNER_PHONE=...
|
|
973
806
|
|
|
974
|
-
# Obsidian vault paths
|
|
975
807
|
PA_PRIMARY_VAULT_PATH=~/Documents/MyVault
|
|
976
808
|
PA_EXTERNAL_OBSIDIAN_VAULT_PATH=~/Documents/SecondaryVault
|
|
977
809
|
|
|
978
|
-
# Notion default database routing
|
|
979
810
|
PA_NOTION_DATABASE_IDS='{"tasks":"abc...","notes":"def..."}'
|
|
980
811
|
```
|
|
981
812
|
|
|
@@ -983,9 +814,9 @@ Everything else — bot tokens, OAuth refresh tokens, Notion API key, GitHub tok
|
|
|
983
814
|
|
|
984
815
|
### Runtime settings
|
|
985
816
|
|
|
986
|
-
The dashboard `/settings` tree exposes ~100 runtime keys.
|
|
817
|
+
The dashboard `/settings` tree exposes ~100 runtime keys. Headline groups:
|
|
987
818
|
|
|
988
|
-
- **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window
|
|
819
|
+
- **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window and interval, cron schedules
|
|
989
820
|
- **Notifications** — `quietHoursStart/End`, `maxNotificationsPerHour`, `maxNotificationsPerDay`, `batchIntervalMinutes`
|
|
990
821
|
- **Sessions** — `sessionTimeoutDmMinutes`, `historyInjectionMaxMessages`, `historyInjectionMaxTokens`
|
|
991
822
|
- **Safety** — execution mode per backend, `disallowedTools` overrides
|
|
@@ -994,7 +825,7 @@ The dashboard `/settings` tree exposes ~100 runtime keys. The headline ones:
|
|
|
994
825
|
- **Mail** — provider list, poll interval, IMAP IDLE on/off
|
|
995
826
|
- **Character** — 1,000-char free-form tone description
|
|
996
827
|
- **Language** — `primaryLanguage` nudges output language for DMs, knowledge, and vault writes
|
|
997
|
-
- **Voice** — `voiceTranscriptionEnabled`, `
|
|
828
|
+
- **Voice** — `voiceTranscriptionEnabled`, `voiceTranscriptionPrimaryLanguage` (the model itself is set via `PA_VOICE_TRANSCRIPTION_MODEL` env-only)
|
|
998
829
|
- **Delegated task mode** — kill switch, per-day quota, heavy-tier opt-in, cache / pool / structured-output toggles
|
|
999
830
|
|
|
1000
831
|
…or just DM the agent: *"Don't run hourly checks on weekends."*
|
|
@@ -1093,21 +924,6 @@ aitne audit --since 24h --result failed --detail
|
|
|
1093
924
|
|
|
1094
925
|
## Development
|
|
1095
926
|
|
|
1096
|
-
For contributors:
|
|
1097
|
-
|
|
1098
|
-
```bash
|
|
1099
|
-
git clone https://github.com/Aitne-sh/Aitne.git aitne
|
|
1100
|
-
cd aitne
|
|
1101
|
-
corepack enable
|
|
1102
|
-
pnpm install
|
|
1103
|
-
pnpm start # build (if stale) + launch in background
|
|
1104
|
-
pnpm dev # foreground mode with full stdio
|
|
1105
|
-
pnpm test # vitest — unit tests across packages/*
|
|
1106
|
-
pnpm test:watch
|
|
1107
|
-
pnpm lint # turbo run lint
|
|
1108
|
-
pnpm clean # remove all build artifacts and node_modules
|
|
1109
|
-
```
|
|
1110
|
-
|
|
1111
927
|
### Tech stack
|
|
1112
928
|
|
|
1113
929
|
| Layer | Stack |
|
|
@@ -1124,7 +940,7 @@ pnpm clean # remove all build artifacts and node_modules
|
|
|
1124
940
|
- TypeScript throughout, camelCase, ESM with `.js` import extensions
|
|
1125
941
|
- Tests colocated with source as `foo.ts` + `foo.test.ts`
|
|
1126
942
|
- Vitest enforces **100% coverage** on a curated subset of pure-logic modules
|
|
1127
|
-
- The `docs/design/` tree
|
|
943
|
+
- The `docs/design/` tree is the authoritative spec; `packages/daemon/src/` is the source of truth when they diverge
|
|
1128
944
|
|
|
1129
945
|
### Source-of-truth pointers
|
|
1130
946
|
|
|
@@ -1146,7 +962,7 @@ pnpm clean # remove all build artifacts and node_modules
|
|
|
1146
962
|
## FAQ
|
|
1147
963
|
|
|
1148
964
|
**Is Aitne a chatbot?**
|
|
1149
|
-
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.
|
|
1150
966
|
|
|
1151
967
|
**Does it phone home?**
|
|
1152
968
|
No. The daemon binds to `127.0.0.1` only. There is no telemetry. Verify with `lsof` and `nettop`.
|
|
@@ -1161,7 +977,7 @@ Yes — Claude Code, OpenAI Codex, and Google Gemini CLI are all supported. Pick
|
|
|
1161
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.
|
|
1162
978
|
|
|
1163
979
|
**Can I edit the agent's memory directly?**
|
|
1164
|
-
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.
|
|
1165
981
|
|
|
1166
982
|
**What about Obsidian?**
|
|
1167
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.
|
|
@@ -1170,13 +986,13 @@ Aitne can use your existing Obsidian vault as the primary memory store. The agen
|
|
|
1170
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.
|
|
1171
987
|
|
|
1172
988
|
**Do my existing Claude Code / Codex / Gemini settings work?**
|
|
1173
|
-
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).
|
|
1174
990
|
|
|
1175
991
|
**Does it work without internet?**
|
|
1176
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.
|
|
1177
993
|
|
|
1178
994
|
**Does it support languages other than English?**
|
|
1179
|
-
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.
|
|
1180
996
|
|
|
1181
997
|
**Is this for my whole team?**
|
|
1182
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.
|