@aitne-sh/aitne 0.1.7 → 0.1.9
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 +256 -833
- package/agent-assets/agent-profiles/_safety.md +52 -20
- package/agent-assets/agent-profiles/browser-task.md +108 -0
- package/agent-assets/agent-profiles/conversational.md +3 -3
- package/agent-assets/agent-profiles/profile-importer.md +3 -3
- package/agent-assets/agent-profiles/routine-fetch-window.md +30 -19
- package/agent-assets/agent-profiles/routine.md +4 -3
- package/agent-assets/agents/context-index-reconcile/agent.md +52 -0
- package/agent-assets/agents/evening-review/agent.md +53 -0
- package/agent-assets/agents/hourly-check/agent.md +62 -0
- package/agent-assets/agents/monthly-review/agent.md +55 -0
- package/agent-assets/agents/morning-routine/agent.md +78 -0
- package/agent-assets/agents/roadmap-maintenance/agent.md +52 -0
- package/agent-assets/agents/skill-curation/agent.md +52 -0
- package/agent-assets/agents/user-profile-sweep-evening/agent.md +48 -0
- package/agent-assets/agents/user-profile-sweep-morning/agent.md +53 -0
- package/agent-assets/agents/weekly-review/agent.md +51 -0
- package/agent-assets/docs/concepts/agent-day.md +18 -11
- package/agent-assets/docs/concepts/auth-health.md +56 -10
- package/agent-assets/docs/concepts/backends-and-tiers.md +110 -41
- package/agent-assets/docs/concepts/costs-and-quotas.md +74 -19
- package/agent-assets/docs/concepts/delegated-mode.md +193 -75
- package/agent-assets/docs/concepts/memory-model.md +79 -34
- package/agent-assets/docs/concepts/observations.md +61 -11
- package/agent-assets/docs/concepts/process-keys.md +66 -17
- package/agent-assets/docs/concepts/routines.md +77 -32
- package/agent-assets/docs/concepts/safety-and-execution.md +50 -21
- package/agent-assets/docs/concepts/safety-model.md +62 -37
- package/agent-assets/docs/concepts/skills.md +38 -17
- package/agent-assets/docs/features/integrations/browser-history.md +195 -0
- package/agent-assets/docs/features/integrations/calendar.md +40 -30
- package/agent-assets/docs/features/integrations/git.md +20 -9
- package/agent-assets/docs/features/integrations/github.md +93 -35
- package/agent-assets/docs/features/integrations/mail.md +60 -17
- package/agent-assets/docs/features/integrations/notion.md +51 -11
- package/agent-assets/docs/features/integrations/obsidian.md +35 -7
- package/agent-assets/docs/features/lifestyle/git.md +45 -44
- package/agent-assets/docs/features/lifestyle/reading.md +50 -22
- package/agent-assets/docs/features/lifestyle/receipts.md +66 -21
- package/agent-assets/docs/features/lifestyle/travel-bookings.md +91 -14
- package/agent-assets/docs/features/memory-files/agent-journal.md +111 -50
- package/agent-assets/docs/features/memory-files/projects.md +75 -15
- package/agent-assets/docs/features/memory-files/roadmap.md +55 -10
- package/agent-assets/docs/features/memory-files/schedule.md +113 -70
- package/agent-assets/docs/features/memory-files/today.md +47 -21
- package/agent-assets/docs/features/memory-files/user-profile.md +67 -31
- package/agent-assets/docs/features/messaging/bang-commands.md +115 -28
- package/agent-assets/docs/features/messaging/dashboard-chat.md +43 -21
- package/agent-assets/docs/features/messaging/discord.md +46 -4
- package/agent-assets/docs/features/messaging/overview.md +40 -19
- package/agent-assets/docs/features/messaging/pairing-and-magic-phrase.md +94 -27
- package/agent-assets/docs/features/messaging/slack.md +79 -14
- package/agent-assets/docs/features/messaging/telegram.md +25 -6
- package/agent-assets/docs/features/messaging/whatsapp.md +79 -14
- package/agent-assets/docs/features/operations/activity-and-conversations.md +45 -16
- package/agent-assets/docs/features/operations/approvals.md +53 -15
- package/agent-assets/docs/features/operations/backend-routing.md +75 -16
- package/agent-assets/docs/features/operations/cost-tracking.md +90 -17
- package/agent-assets/docs/features/operations/managed-chromium.md +221 -0
- package/agent-assets/docs/features/operations/notifications.md +58 -11
- package/agent-assets/docs/features/operations/quiet-hours.md +63 -40
- package/agent-assets/docs/features/operations/schedule-approaching.md +59 -16
- package/agent-assets/docs/features/routines/custom-routines.md +97 -23
- package/agent-assets/docs/features/routines/evening-review.md +75 -22
- package/agent-assets/docs/features/routines/hourly-check.md +150 -30
- package/agent-assets/docs/features/routines/morning-routine.md +60 -33
- package/agent-assets/docs/features/routines/weekly-review.md +65 -20
- package/agent-assets/docs/features/wiki/commands.md +37 -16
- package/agent-assets/docs/features/wiki/cost-and-approval.md +240 -0
- package/agent-assets/docs/features/wiki/dashboard.md +255 -0
- package/agent-assets/docs/features/wiki/overview.md +80 -12
- package/agent-assets/docs/features/wiki/search.md +248 -0
- package/agent-assets/docs/features/wiki/workspaces.md +254 -0
- package/agent-assets/docs/getting-started/01-what-is-this.md +64 -32
- package/agent-assets/docs/getting-started/02-first-steps.md +28 -10
- package/agent-assets/docs/getting-started/03-what-can-this-do.md +42 -21
- package/agent-assets/docs/getting-started/04-first-day.md +52 -20
- package/agent-assets/docs/glossary.md +285 -21
- package/agent-assets/docs/guides/add-a-custom-routine.md +74 -22
- package/agent-assets/docs/guides/backup-and-restore.md +92 -14
- package/agent-assets/docs/guides/budget-and-cost-for-wiki.md +62 -25
- package/agent-assets/docs/guides/build-your-wiki.md +33 -6
- package/agent-assets/docs/guides/change-which-model-handles-x.md +70 -9
- package/agent-assets/docs/guides/connect-a-new-mail-account.md +80 -15
- package/agent-assets/docs/guides/explore-with-trace-and-connect.md +32 -9
- package/agent-assets/docs/guides/import-knowledge-file.md +60 -39
- package/agent-assets/docs/guides/install-and-run.md +64 -19
- package/agent-assets/docs/guides/maintain-wiki-health.md +41 -10
- package/agent-assets/docs/guides/migrate-machines.md +86 -18
- package/agent-assets/docs/guides/multiple-wikis-for-multiple-domains.md +119 -59
- package/agent-assets/docs/guides/pause-the-agent.md +71 -22
- package/agent-assets/docs/guides/reinstall-cleanly.md +102 -17
- package/agent-assets/docs/guides/setup-wizard.md +126 -56
- package/agent-assets/docs/guides/switch-default-backend.md +72 -17
- package/agent-assets/docs/guides/use-an-existing-obsidian-vault.md +31 -10
- package/agent-assets/docs/reference/api.md +162 -23
- package/agent-assets/docs/reference/cli-commands.md +55 -15
- package/agent-assets/docs/reference/config.md +246 -39
- package/agent-assets/docs/reference/disallowed-tools.md +42 -10
- package/agent-assets/docs/reference/keyboard-shortcuts.md +47 -10
- package/agent-assets/docs/reference/knowledge-layout.md +620 -0
- package/agent-assets/docs/reference/process-keys.md +126 -20
- package/agent-assets/docs/reference/skills.md +62 -18
- package/agent-assets/docs/troubleshooting/auth-failed.md +53 -19
- package/agent-assets/docs/troubleshooting/dashboard-shows-degraded.md +96 -22
- package/agent-assets/docs/troubleshooting/fallback-keeps-firing.md +94 -20
- package/agent-assets/docs/troubleshooting/messaging-not-pairing.md +77 -22
- package/agent-assets/docs/troubleshooting/morning-routine-didnt-run.md +87 -22
- package/agent-assets/docs/troubleshooting/observation-not-detected.md +85 -21
- package/agent-assets/docs/troubleshooting/quota-exhausted.md +36 -6
- package/agent-assets/docs/troubleshooting/wiki-ingest-full-blocked.md +128 -51
- package/agent-assets/docs/troubleshooting/wiki-write-failed.md +33 -11
- package/agent-assets/optimizer-skills/drift-analysis/SKILL.md +1 -1
- package/agent-assets/optimizer-skills/knowledge-map/SKILL.md +1 -1
- package/agent-assets/optimizer-skills/skill-curation/SKILL.md +2 -2
- package/agent-assets/sandbox/linux/aitne-chromium.apparmor +91 -0
- package/agent-assets/sandbox/macos/aitne-chromium.sb +156 -0
- package/agent-assets/skills/agent-actions/SKILL.md +122 -0
- package/agent-assets/skills/agent-create/SKILL.md +149 -0
- package/agent-assets/skills/attach/SKILL.md +3 -4
- package/agent-assets/skills/browser-history/SKILL.md +198 -0
- package/agent-assets/skills/browser-history-respond/SKILL.md +106 -0
- package/agent-assets/skills/browser-task/SKILL.md +169 -0
- package/agent-assets/skills/context/SKILL.md +45 -463
- package/agent-assets/skills/context/curation.json +2 -2
- package/agent-assets/skills/context/references/api.md +232 -0
- package/agent-assets/skills/context/references/required-frontmatter.md +73 -0
- package/agent-assets/skills/context/references/snapshot-files.md +103 -0
- package/agent-assets/skills/context/seeds/file-responsibilities.seed.json +4 -4
- package/agent-assets/skills/docs-search/SKILL.md +17 -16
- package/agent-assets/skills/external-services/SKILL.delegated.claude.md +14 -26
- package/agent-assets/skills/external-services/SKILL.delegated.codex.md +14 -26
- package/agent-assets/skills/external-services/SKILL.delegated.gemini.md +14 -26
- package/agent-assets/skills/external-services/SKILL.md +9 -262
- package/agent-assets/skills/external-services/SKILL.native.claude.md +6 -7
- package/agent-assets/skills/external-services/SKILL.native.codex.md +8 -9
- package/agent-assets/skills/external-services/SKILL.native.gemini.md +5 -6
- package/agent-assets/skills/external-services/references/calendar-apple.md +97 -0
- package/agent-assets/skills/external-services/references/calendar-google.md +72 -0
- package/agent-assets/skills/external-services/references/calendar-outlook.md +36 -0
- package/agent-assets/skills/external-services/references/github.md +17 -0
- package/agent-assets/skills/external-services/references/obsidian.md +49 -0
- package/agent-assets/skills/external-services/references/skills-crud.md +27 -0
- package/agent-assets/skills/gmail-lifestyle/SKILL.md +151 -0
- package/agent-assets/skills/gmail-lifestyle/references/receipts-api.md +93 -0
- package/agent-assets/skills/gmail-lifestyle/references/travel-bookings-api.md +75 -0
- package/agent-assets/skills/mail/SKILL.delegated.claude.md +15 -6
- package/agent-assets/skills/mail/SKILL.delegated.codex.md +9 -5
- package/agent-assets/skills/mail/SKILL.delegated.gemini.md +9 -5
- package/agent-assets/skills/mail/SKILL.md +9 -114
- package/agent-assets/skills/mail/SKILL.native.claude.md +1 -1
- package/agent-assets/skills/mail/SKILL.native.codex.md +1 -1
- package/agent-assets/skills/mail/SKILL.native.gemini.md +1 -1
- package/agent-assets/skills/mail/references/api.md +110 -0
- package/agent-assets/skills/mail/references/examples.md +70 -0
- package/agent-assets/skills/mail/references/providers.md +8 -8
- package/agent-assets/skills/managed-tasks/SKILL.md +472 -0
- package/agent-assets/skills/managed-tasks/references/errors.md +73 -0
- package/agent-assets/skills/managed-tasks/references/output-path.md +75 -0
- package/agent-assets/skills/managed-tasks/references/recurrence-rule.md +86 -0
- package/agent-assets/skills/management-policy/SKILL.md +54 -125
- package/agent-assets/skills/management-policy/curation.json +1 -1
- package/agent-assets/skills/management-policy/references/policy-workflow.md +101 -0
- package/agent-assets/skills/management-policy/seeds/policy-file-shape.seed.json +1 -1
- package/agent-assets/skills/notify/SKILL.md +10 -82
- package/agent-assets/skills/notify/references/priority.md +65 -0
- package/agent-assets/skills/notion/SKILL.delegated.claude.md +2 -2
- package/agent-assets/skills/notion/SKILL.delegated.codex.md +2 -2
- package/agent-assets/skills/notion/SKILL.delegated.gemini.md +2 -2
- package/agent-assets/skills/notion/SKILL.md +6 -10
- package/agent-assets/skills/notion/SKILL.native.claude.md +11 -8
- package/agent-assets/skills/notion/SKILL.native.codex.md +10 -6
- package/agent-assets/skills/notion/SKILL.native.gemini.md +10 -6
- package/agent-assets/skills/observations/SKILL.md +25 -14
- package/agent-assets/skills/project-doc/SKILL.md +2 -6
- package/agent-assets/skills/project-doc/curation.json +3 -3
- package/agent-assets/skills/project-doc/seeds/project-shape.seed.json +7 -4
- package/agent-assets/skills/project-doc/seeds/slug-grammar.seed.json +3 -3
- package/agent-assets/skills/reading/SKILL.md +12 -2
- package/agent-assets/skills/reading/references/reading-taste.md +2 -2
- package/agent-assets/skills/roadmap/SKILL.md +43 -141
- package/agent-assets/skills/roadmap/curation.json +1 -1
- package/agent-assets/skills/roadmap/references/api.md +100 -0
- package/agent-assets/skills/roadmap/references/cross-check.md +80 -0
- package/agent-assets/skills/roadmap/references/migration.md +56 -0
- package/agent-assets/skills/roadmap/references/preparation-timeline.md +2 -2
- package/agent-assets/skills/roadmap/seeds/entry-types.seed.json +1 -1
- package/agent-assets/skills/schedule/SKILL.md +76 -104
- package/agent-assets/skills/schedule/references/batch.md +93 -0
- package/agent-assets/skills/schedule/references/errors.md +217 -0
- package/agent-assets/skills/schedule/references/model-selection.md +96 -0
- package/agent-assets/skills/schedule/references/recurrence-rule.md +86 -0
- package/agent-assets/skills/scheduled-managed-task/SKILL.md +59 -51
- package/agent-assets/skills/today/SKILL.md +32 -62
- package/agent-assets/skills/today/curation.json +3 -3
- package/agent-assets/skills/today/references/agent-plan-lifecycle.md +114 -0
- package/agent-assets/skills/today/seeds/section-shape.seed.json +1 -1
- package/agent-assets/skills/user-interview/SKILL.md +23 -67
- package/agent-assets/skills/user-interview/references/op-briefing.md +51 -0
- package/agent-assets/skills/user-interview/references/op-morning.md +59 -0
- package/agent-assets/skills/user-interview/references/sweep-and-fallback.md +9 -1
- package/agent-assets/skills/user-profile/SKILL.md +54 -74
- package/agent-assets/skills/user-profile/curation.json +2 -2
- package/agent-assets/skills/user-profile/references/character-preferences.md +83 -0
- package/agent-assets/skills/user-profile/seeds/routing-table.seed.json +8 -8
- package/agent-assets/skills/user-profile/seeds/topic-files.seed.json +30 -2
- package/agent-assets/skills/wiki/wiki-ask/SKILL.md +0 -1
- package/agent-assets/skills/wiki/wiki-compile/SKILL.md +4 -5
- package/agent-assets/skills/wiki/wiki-connect/SKILL.md +0 -1
- package/agent-assets/skills/wiki/wiki-graduate/SKILL.md +0 -1
- package/agent-assets/skills/wiki/wiki-ingest/SKILL.md +0 -1
- package/agent-assets/skills/wiki/wiki-lint/SKILL.md +0 -1
- package/agent-assets/skills/wiki/wiki-trace/SKILL.md +0 -1
- package/agent-assets/skills/wiki/wiki-vault-rules/SKILL.md +0 -1
- package/agent-assets/system-prompts/routine-fetch-window.md +78 -0
- package/agent-assets/system-prompts/skill-index-instruction.md +26 -0
- package/agent-assets/task-flows/_partials/calendar-acquire.google_calendar.md +20 -11
- package/agent-assets/task-flows/_partials/calendar-acquire.outlook_calendar.md +18 -9
- package/agent-assets/task-flows/_partials/capture-user-info.md +24 -0
- package/agent-assets/task-flows/_partials/confirm-subflow.md +68 -0
- package/agent-assets/task-flows/_partials/dm-intent.long-horizon.md +35 -0
- package/agent-assets/task-flows/_partials/dm-intent.project.md +391 -0
- package/agent-assets/task-flows/_partials/mail-acquire.gmail.md +20 -11
- package/agent-assets/task-flows/_partials/mail-acquire.outlook_mail.md +18 -9
- package/agent-assets/task-flows/_partials/notion-acquire.notion.md +26 -15
- package/agent-assets/task-flows/browser_task.md +84 -0
- package/agent-assets/task-flows/github.assigned.md +1 -1
- package/agent-assets/task-flows/github.pull_request.review_requested.md +2 -2
- package/agent-assets/task-flows/github.workflow_run.failed.md +2 -2
- package/agent-assets/task-flows/knowledge.import.md +15 -15
- package/agent-assets/task-flows/message.received.dm.md +20 -17
- package/agent-assets/task-flows/message.received.dm_first.md +11 -15
- package/agent-assets/task-flows/routine.custom.md +6 -4
- package/agent-assets/task-flows/routine.evening_review.md +46 -170
- package/agent-assets/task-flows/routine.fetch_window.md +19 -14
- package/agent-assets/task-flows/routine.hourly_check.md +27 -15
- package/agent-assets/task-flows/routine.hourly_check.triage.md +1 -1
- package/agent-assets/task-flows/routine.monthly_review.md +67 -25
- package/agent-assets/task-flows/routine.morning_routine_journal.md +135 -0
- package/agent-assets/task-flows/routine.morning_routine_today.md +673 -0
- package/agent-assets/task-flows/routine.research_cluster_update.md +35 -0
- package/agent-assets/task-flows/routine.research_dispatch.md +38 -0
- package/agent-assets/task-flows/routine.research_offer_dm.md +125 -0
- package/agent-assets/task-flows/routine.research_wiki_summary.md +53 -0
- package/agent-assets/task-flows/routine.roadmap_refresh.md +68 -23
- package/agent-assets/task-flows/routine.today_refresh.md +4 -4
- package/agent-assets/task-flows/routine.user_profile_sweep.md +19 -20
- package/agent-assets/task-flows/routine.weekly_review.md +370 -86
- package/agent-assets/task-flows/schedule.approaching.md +0 -1
- package/agent-assets/task-flows/scheduled.dm.md +13 -13
- package/agent-assets/task-flows/scheduled.task.md +9 -9
- package/agent-assets/task-flows/setup.initial.md +171 -251
- package/agent-assets/task-flows/setup.update.md +2 -2
- package/agent-assets/task-flows/wiki.ingest_url.md +1 -1
- package/agent-assets/templates/README.md +27 -20
- package/agent-assets/templates/_index.md +42 -26
- package/agent-assets/templates/_manifest.json +34 -99
- package/agent-assets/templates/{user → identity}/_index.md +1 -1
- package/agent-assets/templates/identity/expertise.md +9 -0
- package/agent-assets/templates/identity/goals.md +9 -0
- package/agent-assets/templates/identity/people.md +13 -0
- package/agent-assets/templates/identity/personal.md +9 -0
- package/agent-assets/templates/{user → identity}/profile.md +2 -2
- package/agent-assets/templates/identity/work.md +9 -0
- package/agent-assets/templates/{dossiers → knowledge/dossiers}/_index.md +2 -2
- package/agent-assets/templates/{projects → plans/projects}/_active.base +1 -1
- package/agent-assets/templates/policies/_index.md +21 -0
- package/agent-assets/templates/{rules → policies}/journal-export.md +1 -1
- package/agent-assets/templates/policies/journal-format.md +168 -0
- package/agent-assets/templates/{rules/policies → policies/management-captures}/_index.md +2 -2
- package/agent-assets/templates/{rules → policies}/management.md +3 -3
- package/agent-assets/templates/{rules → policies}/mcp.md +1 -1
- package/agent-assets/templates/{rules → policies}/redaction.md +1 -1
- package/agent-assets/templates/{routines → policies/routines}/_index.md +1 -1
- package/agent-assets/templates/{routines → policies/routines}/evening.md +2 -2
- package/agent-assets/templates/{routines → policies/routines}/hourly.md +1 -1
- package/agent-assets/templates/{routines → policies/routines}/monthly.md +2 -2
- package/bin/aitne.mjs +21 -5
- package/package.json +5 -4
- package/scripts/commands/doctor.mjs +63 -5
- package/scripts/commands/run-now.mjs +187 -0
- package/scripts/commands/verify.mjs +264 -0
- package/scripts/lib/ports.d.mts +27 -0
- package/scripts/lib/ports.mjs +36 -0
- package/scripts/lib/read-api-token.mjs +176 -0
- package/scripts/start.mjs +2 -1
- package/agent-assets/docs/features/lifestyle/travel-time.md +0 -52
- package/agent-assets/docs/features/routines/monthly-review.md +0 -65
- package/agent-assets/skills/management-task-modify/SKILL.md +0 -203
- package/agent-assets/skills/management-task-register/SKILL.md +0 -330
- package/agent-assets/skills/management-task-stop/SKILL.md +0 -166
- package/agent-assets/skills/receipts/SKILL.md +0 -134
- package/agent-assets/skills/travel/SKILL.md +0 -132
- package/agent-assets/skills/travel-time/SKILL.md +0 -158
- package/agent-assets/task-flows/routine.morning_routine.md +0 -322
- package/agent-assets/task-flows/routine.morning_routine_initial.md +0 -204
- package/agent-assets/templates/context-index.md +0 -42
- package/agent-assets/templates/rules/_index.md +0 -19
- package/agent-assets/templates/rules/journal-format.md +0 -61
- package/agent-assets/templates/user/expertise.md +0 -7
- package/agent-assets/templates/user/goals.md +0 -7
- package/agent-assets/templates/user/people.md +0 -7
- package/agent-assets/templates/user/personal.md +0 -7
- package/agent-assets/templates/user/work.md +0 -7
- /package/agent-assets/templates/{agent/journal.md → journal/agent.md} +0 -0
- /package/agent-assets/templates/{dossiers → knowledge/dossiers}/evening.md +0 -0
- /package/agent-assets/templates/{dossiers → knowledge/dossiers}/hourly.md +0 -0
- /package/agent-assets/templates/{dossiers → knowledge/dossiers}/monthly.md +0 -0
- /package/agent-assets/templates/{dossiers → knowledge/dossiers}/morning.md +0 -0
- /package/agent-assets/templates/{dossiers → knowledge/dossiers}/roadmap.md +0 -0
- /package/agent-assets/templates/{dossiers → knowledge/dossiers}/weekly.md +0 -0
- /package/agent-assets/templates/{projects → plans/projects}/_index.md +0 -0
- /package/agent-assets/templates/{roadmap.md → plans/roadmap.md} +0 -0
- /package/agent-assets/templates/{routines → policies/routines}/morning.md +0 -0
- /package/agent-assets/templates/{routines → policies/routines}/weekly.md +0 -0
- /package/agent-assets/templates/{agent → state}/profile-questions.md +0 -0
- /package/agent-assets/templates/{today.md → state/today.md} +0 -0
package/README.md
CHANGED
|
@@ -2,108 +2,166 @@
|
|
|
2
2
|
|
|
3
3
|
# Aitne
|
|
4
4
|
|
|
5
|
-
### Always on. Always yours.
|
|
6
|
-
|
|
7
|
-
**A local-first, proactive personal AI agent that runs continuously on your own machine — and learns *you* every day.**
|
|
8
|
-
|
|
9
5
|
[](https://www.npmjs.com/package/@aitne-sh/aitne)
|
|
10
6
|
[](./LICENSE)
|
|
11
7
|
[](https://nodejs.org)
|
|
12
8
|
[](#platform-support)
|
|
13
|
-
|
|
9
|
+
|
|
10
|
+
**Wake up to a brief that was written for you, by you.**
|
|
11
|
+
|
|
12
|
+
At 04:00, Aitne reads your calendar, mail, GitHub, and notes — then drafts a one-page plan for the day ahead: today's meetings, the email thread you missed, the PR your teammate is waiting on. Before you've finished coffee, the summary is in your DMs. By evening it journals what actually happened.
|
|
13
|
+
|
|
14
|
+
All on your laptop. All Markdown you own. Bring your own AI (Claude Code / Codex / Gemini CLI) — Aitne is the part that watches, schedules, and remembers.
|
|
14
15
|
|
|
15
16
|
```bash
|
|
16
17
|
npm install -g @aitne-sh/aitne@latest
|
|
17
18
|
aitne start
|
|
18
19
|
```
|
|
19
20
|
|
|
21
|
+

|
|
22
|
+
|
|
20
23
|
</div>
|
|
21
24
|
|
|
22
25
|
---
|
|
23
26
|
|
|
24
|
-
##
|
|
27
|
+
## A day with Aitne
|
|
28
|
+
|
|
29
|
+
Aitne is a daemon on your laptop, connected to your calendar, mail (Gmail / Outlook / iCloud / Yahoo), GitHub, Obsidian, and Notion. You talk to it through DMs in Slack / Telegram / Discord / WhatsApp — or through a local dashboard at `:8322`.
|
|
30
|
+
|
|
31
|
+
- **04:00 — Morning routine.** Aitne reads everything that landed overnight (mail, GitHub activity, calendar changes, vault updates) and writes `today.md` — sample below.
|
|
32
|
+
- **Morning — Brief.** The plan lands in your DMs as a short summary.
|
|
33
|
+
- **Through the day — Nudges.** Meeting reminders with travel time, hourly background checks for the things you care about (eval results, PR review requests, new mail). DMs only when there's something worth your attention.
|
|
34
|
+
- **Evening — Review.** Aitne writes a daily journal: what got done, what slipped, one observation about the week.
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
You steer it through natural-language DMs ("skip morning routine on Sundays", "ping me when the overnight job finishes") and bang commands (`!cost`, `!ask`, `!ingest`).
|
|
27
37
|
|
|
28
|
-
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Aitne's plan for today
|
|
41
|
+
|
|
42
|
+
`today.md` — written each morning into `~/.personal-agent/context/state/`. Plain Markdown you can `cat`, `vim`, or sync to Obsidian. Sample:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
2026-05-20 (Wednesday)
|
|
46
|
+
Day type: Weekday | Work focus: on | Study focus: on | Personal focus: on
|
|
47
|
+
|
|
48
|
+
User Schedule
|
|
49
|
+
10:00 — Team standup (#ml-platform)
|
|
50
|
+
13:30 — RAG eval review with research team
|
|
51
|
+
16:00 — 1:1 with manager (quarterly check-in)
|
|
52
|
+
21:00 — Overnight training window opens (8xH100 reserved)
|
|
53
|
+
|
|
54
|
+
User Tasks
|
|
55
|
+
Land the embedding-index refactor PR — address review feedback [URGENT] [work]
|
|
56
|
+
Cancel unused GPU reservation before 18:00 — billing cutoff [work]
|
|
57
|
+
Skim 3 papers from yesterday's arxiv digest — pick one for Friday's reading group [study]
|
|
58
|
+
Renew gym membership before Friday [personal]
|
|
59
|
+
Reply to dentist about reschedule [personal]
|
|
60
|
+
|
|
61
|
+
Agent Plan
|
|
62
|
+
09:45 Notify: standup in 15 min [work] →notify
|
|
63
|
+
17:30 Notify: cancel GPU reservation by 18:00 to avoid overnight charges [work] →notify
|
|
64
|
+
20:45 Notify: training window opens in 15 min — confirm dataset hash [work] →notify
|
|
65
|
+
|
|
66
|
+
Agent Notes
|
|
67
|
+
(HIGH) 2026-05-22 (Fri): Reading group at 16:00 — pick paper by Thu evening
|
|
68
|
+
(HIGH) 2026-05-23 (Sat): Friend's birthday dinner — gift not bought yet
|
|
69
|
+
(MED) 2026-05-25 (Mon): Quarterly OKR review — draft self-assessment by EOD Sun
|
|
70
|
+
Two coworkers pushed to feat/embedding-index since you last pulled [work]
|
|
71
|
+
Overnight eval run finished — accuracy +1.2pp, p95 latency +18ms [work]
|
|
72
|
+
Bank statement available — review when convenient [personal]
|
|
73
|
+
Weather: rain 06:00–10:00 — leave 10 min earlier [personal]
|
|
74
|
+
|
|
75
|
+
Agent Log
|
|
76
|
+
04:12 Morning Routine completed — today.md drafted from 23 raw signals
|
|
77
|
+
07:02 Sent morning brief to Slack DM (4 priorities, 2 timing alerts)
|
|
78
|
+
12:38 Hourly check: 1 new GitHub review request, 0 calendar changes
|
|
79
|
+
18:00 Evening Review completed — 3 of 5 tasks closed; 2 carried to tomorrow
|
|
80
|
+
|
|
81
|
+
Handoff
|
|
82
|
+
Tomorrow
|
|
83
|
+
Reply to dentist about reschedule [personal]
|
|
84
|
+
Pick reading-group paper [study]
|
|
85
|
+
Triage overnight training-run metrics [work]
|
|
86
|
+
Later
|
|
87
|
+
2026-05-22 (Fri): Reading group at 16:00
|
|
88
|
+
2026-05-23 (Sat): Friend's birthday dinner
|
|
89
|
+
2026-05-25 (Mon): Quarterly OKR review
|
|
90
|
+
```
|
|
29
91
|
|
|
30
92
|
---
|
|
31
93
|
|
|
32
|
-
##
|
|
94
|
+
## Why Aitne
|
|
33
95
|
|
|
34
|
-
**
|
|
96
|
+
**You don't open it. It opens to you.**
|
|
97
|
+
Most AI tools wait for you to type. Aitne goes first — it watches all day and reaches out only when there's something worth acting on.
|
|
35
98
|
|
|
36
|
-
**
|
|
99
|
+
**Nothing leaves your laptop.**
|
|
100
|
+
The daemon binds to `127.0.0.1` only. Secrets sit in your OS keychain. Memory is plain Markdown under `~/.personal-agent/`. No vendor account, no remote sync, no telemetry — your AI provider's API is the only thing that talks to the network, on your own key.
|
|
37
101
|
|
|
38
|
-
**
|
|
102
|
+
**Bring your own model.**
|
|
103
|
+
Per-task routing assigns the right tier to the right backend, and the router fails over automatically on quota or auth issues. Run one backend or all of them — your choice.
|
|
39
104
|
|
|
40
|
-
**
|
|
105
|
+
**Memory compounds, the model doesn't have to.**
|
|
106
|
+
Every DM, every correction, every observation goes into your Markdown context. The model stays stateless — your story grows.
|
|
41
107
|
|
|
42
|
-
|
|
108
|
+
Already running Claude Code in a terminal? Aitne is the part that wakes itself up before you do, watches your mail and calendar between your sessions, remembers what you told it last week, and reaches you in your DMs without a terminal open.
|
|
43
109
|
|
|
44
110
|
---
|
|
45
111
|
|
|
46
|
-
##
|
|
112
|
+
## Is this for you?
|
|
47
113
|
|
|
48
|
-
|
|
114
|
+
**Aitne fits if you...**
|
|
115
|
+
- already use Claude Code, Codex CLI, or Gemini CLI daily
|
|
116
|
+
- want context that survives sessions, without uploading your life to someone's server
|
|
117
|
+
- are comfortable running a daemon on your laptop and pasting an API key
|
|
49
118
|
|
|
50
|
-
|
|
119
|
+
**You'll bounce off if you...**
|
|
120
|
+
- want a polished hosted chat UI — this isn't that
|
|
121
|
+
- don't have an API key for at least one provider (Aitne spawns sessions on your behalf; the cost lands on your account)
|
|
122
|
+
- expect zero setup — there's a 9-step wizard for integrations and channels
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Install
|
|
51
127
|
|
|
52
128
|
```bash
|
|
53
129
|
npm install -g @aitne-sh/aitne@latest
|
|
54
130
|
aitne start
|
|
55
131
|
```
|
|
56
132
|
|
|
57
|
-
|
|
133
|
+
The daemon listens on `:8321`, the dashboard on `:8322`. After `aitne start`, your browser opens to the setup wizard.
|
|
58
134
|
|
|
59
|
-
|
|
60
|
-
# Claude Code — full feature support including server-side advisor
|
|
61
|
-
npm install -g @anthropic-ai/claude-code
|
|
62
|
-
claude auth login
|
|
135
|
+
You also need at least one AI backend installed and one API key. The documented operating mode is **provider API keys** — paste them into the wizard (they land in the OS keychain, never `.env`):
|
|
63
136
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
137
|
+
| Backend | Install | Auth |
|
|
138
|
+
|---|---|---|
|
|
139
|
+
| **Claude Code** | `npm install -g @anthropic-ai/claude-code` | `ANTHROPIC_API_KEY` in the wizard (Anthropic's headless-agent policy disallows Pro/Max subscriptions for SDK sessions) |
|
|
140
|
+
| **OpenAI Codex CLI** | `npm install -g @openai/codex` | `OPENAI_API_KEY` in the wizard, or `codex login --device-auth` |
|
|
141
|
+
| **Google Gemini CLI** | `npm install -g @google/gemini-cli` | `GEMINI_API_KEY` / `GOOGLE_API_KEY`, or OAuth on first use |
|
|
142
|
+
| **OpenCode** (sst/opencode) | `npm install -g opencode-ai` | provider via `opencode auth login`, set in the wizard |
|
|
67
143
|
|
|
68
|
-
|
|
69
|
-
npm install -g @google/gemini-cli
|
|
70
|
-
# OAuth handled on first use
|
|
71
|
-
```
|
|
144
|
+
### Verify
|
|
72
145
|
|
|
73
|
-
|
|
146
|
+
```bash
|
|
147
|
+
aitne status # PIDs, uptime, connected platforms, today's spend
|
|
148
|
+
aitne doctor # install-health diagnostic (Node, ports, keychain, CLIs, native bindings)
|
|
149
|
+
aitne logs -f # tail the daemon log
|
|
150
|
+
```
|
|
74
151
|
|
|
75
|
-
### From source
|
|
152
|
+
### From source
|
|
76
153
|
|
|
77
|
-
|
|
154
|
+
Contributors and anyone hacking on the daemon directly. Requires Node ≥ 22 and pnpm 10.x.
|
|
78
155
|
|
|
79
156
|
```bash
|
|
80
157
|
git clone https://github.com/Aitne-sh/Aitne.git aitne
|
|
81
158
|
cd aitne
|
|
82
159
|
corepack enable
|
|
83
160
|
pnpm install
|
|
84
|
-
pnpm
|
|
85
|
-
# or
|
|
86
|
-
pnpm dev # foreground with full stdio for debugging
|
|
161
|
+
pnpm dev # foreground mode with full stdio
|
|
87
162
|
```
|
|
88
163
|
|
|
89
|
-
|
|
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.
|
|
164
|
+
Full walkthrough: [docs/setup-guide.md](docs/setup-guide.md).
|
|
107
165
|
|
|
108
166
|
---
|
|
109
167
|
|
|
@@ -124,8 +182,8 @@ flowchart LR
|
|
|
124
182
|
|
|
125
183
|
subgraph LOCAL["Your laptop"]
|
|
126
184
|
direction TB
|
|
127
|
-
DAEMON["Aitne daemon<br/>(always on)"]
|
|
128
|
-
BRAIN["AI session<br/>Claude / Codex / Gemini"]
|
|
185
|
+
DAEMON["Aitne daemon<br/>(always on, 127.0.0.1)"]
|
|
186
|
+
BRAIN["AI session<br/>Claude / Codex / Gemini / OpenCode"]
|
|
129
187
|
MEMORY["Markdown memory<br/>plain files you own"]
|
|
130
188
|
DAEMON --- BRAIN
|
|
131
189
|
BRAIN --- MEMORY
|
|
@@ -138,62 +196,85 @@ flowchart LR
|
|
|
138
196
|
DAEMON --- YOU
|
|
139
197
|
```
|
|
140
198
|
|
|
141
|
-
|
|
199
|
+
Two execution paths run in parallel:
|
|
142
200
|
|
|
143
|
-
- **Reactive path** — owner DMs
|
|
144
|
-
- **Polling path** — observers for Git, GitHub, Obsidian, Notion, Calendar,
|
|
201
|
+
- **Reactive path** — owner DMs/mentions, cron routines (morning / evening / weekly), calendar approach events. Event → priority heap → dispatcher → backend session.
|
|
202
|
+
- **Polling path** — observers for Git, GitHub, Obsidian, Notion, Calendar, Mail write to an `observations` table without spawning sessions. An hourly cron triages those observations through a lite-tier session, then escalates to a full Sonnet-class session only if something is worth surfacing.
|
|
145
203
|
|
|
146
204
|
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
205
|
|
|
148
|
-
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Backends
|
|
149
209
|
|
|
150
|
-
|
|
210
|
+
Aitne abstracts four AI runtimes behind one `IAgentCore` interface. Every kind of work has a `ProcessKey` mapped to a tier (`lite` / `medium` / `high`) and a backend; for Claude those tiers map to **Haiku 4.5 / Sonnet 4.6 / Opus 4.8**. The high tier is opt-in — no install-time surface defaults to it; pin it per row from `:8322/settings/models`.
|
|
151
211
|
|
|
152
|
-
|
|
212
|
+
| Backend | Implementation | Resume | Strengths |
|
|
213
|
+
|---|---|---|---|
|
|
214
|
+
| **Claude Code** | `@anthropic-ai/claude-agent-sdk` | ✓ | Routines, deep context, server-side advisor |
|
|
215
|
+
| **Codex CLI** | OpenAI Codex CLI subprocess + JSONL stream | ✓ | Code-heavy tasks, fast iteration |
|
|
216
|
+
| **Gemini CLI** | Google Gemini CLI subprocess + JSONL stream | ✓ | Free-tier headroom, large-context summarization |
|
|
217
|
+
| **OpenCode** | `opencode-ai` HTTP server + SDK client | ✓ | Multi-provider — routes to any `opencode auth login` provider |
|
|
218
|
+
|
|
219
|
+
The router fails over to a configured fallback automatically on `BackendQuotaError` or decisive failure, re-materializing the fallback's instruction file and skill directories into the session workdir. Per-process tier defaults and routing are editable at `:8322/settings/models`.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Integrations
|
|
224
|
+
|
|
225
|
+
| Category | Providers |
|
|
226
|
+
|---|---|
|
|
227
|
+
| **Messaging** | Slack (Socket Mode), Telegram, Discord, WhatsApp (Baileys), Web dashboard |
|
|
228
|
+
| **Mail** | Gmail, Outlook, Yahoo, iCloud — unified API, classifier, local FTS5 search, IMAP IDLE |
|
|
229
|
+
| **Calendar** | Google Calendar, Outlook Calendar, iCloud (CalDAV), Google Maps for travel time |
|
|
230
|
+
| **Knowledge** | Obsidian (CLI + vault watch), Notion (REST), custom MCP servers |
|
|
231
|
+
| **Code** | Local Git, GitHub (Octokit + webhooks) |
|
|
232
|
+
| **Lifestyle** | Auto-extracted receipts · travel bookings · Kindle highlights · voice transcription (Whisper, opt-in) |
|
|
233
|
+
|
|
234
|
+
Each integration runs in one of four modes:
|
|
235
|
+
|
|
236
|
+
| Mode | Auth held by | Polling? | Capabilities |
|
|
237
|
+
|---|---|---|---|
|
|
238
|
+
| **`direct`** | Daemon (OAuth in OS Keychain) | Daemon poller | Full feature set |
|
|
239
|
+
| **`delegated`** | Main backend's connector | Cron worker (per-cadence opt-in) | Whatever the connector exposes |
|
|
240
|
+
| **`native`** | Main backend's connector | None — reached in-turn via MCP | On-demand only |
|
|
241
|
+
| **`disabled`** | — | — | Off |
|
|
242
|
+
|
|
243
|
+
Every mode change goes through a live capability probe and a per-key flip lock.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## What you can do
|
|
248
|
+
|
|
249
|
+
<details open>
|
|
153
250
|
<summary><b>Time, calendar, travel</b></summary>
|
|
154
251
|
|
|
155
252
|
- Auto-generate `today.md` every morning with your real schedule
|
|
156
|
-
- 15-min approach reminders for every
|
|
253
|
+
- 15-min approach reminders for every event, with travel time pre-computed via Google Maps
|
|
157
254
|
- Find a 30-min slot across multiple calendars — Aitne checks freebusy and replies with options
|
|
158
|
-
- Auto-extract flight, hotel,
|
|
159
|
-
- Surface tomorrow's itinerary in the morning briefing
|
|
160
|
-
- "What time should I leave for my next meeting?" — answers with live traffic
|
|
255
|
+
- Auto-extract flight, hotel, train confirmations from email into a structured travel timeline
|
|
161
256
|
</details>
|
|
162
257
|
|
|
163
|
-
<details>
|
|
258
|
+
<details open>
|
|
164
259
|
<summary><b>Mail across every account</b></summary>
|
|
165
260
|
|
|
166
261
|
- Unified inbox across Gmail, Outlook, Yahoo, and iCloud (OAuth or app-password / IMAP)
|
|
167
|
-
- Local FTS5 full-text search across every account
|
|
168
|
-
- Auto-classify, label,
|
|
169
|
-
-
|
|
170
|
-
-
|
|
171
|
-
- Daily digest of unread mail in the morning briefing
|
|
172
|
-
- IMAP IDLE for near-real-time delivery; PDF and image attachments are extracted and indexed
|
|
262
|
+
- Local FTS5 full-text search across every account
|
|
263
|
+
- Auto-classify, label, archive, and draft replies in your style
|
|
264
|
+
- Forwarded receipts auto-extract into a structured receipts table
|
|
265
|
+
- IMAP IDLE for near-real-time delivery; PDF/image attachments are extracted and indexed
|
|
173
266
|
</details>
|
|
174
267
|
|
|
175
268
|
<details>
|
|
176
|
-
<summary><b>Knowledge: Obsidian, Notion, your own
|
|
269
|
+
<summary><b>Knowledge: Obsidian, Notion, your own wiki</b></summary>
|
|
177
270
|
|
|
178
271
|
- Use your existing Obsidian vault as Aitne's primary memory store — wiki-links keep working
|
|
179
|
-
- Append to your daily note via the official Obsidian CLI
|
|
180
|
-
- Full Notion page and database CRUD
|
|
181
|
-
-
|
|
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
|
|
272
|
+
- Append to your daily note via the official Obsidian CLI
|
|
273
|
+
- Full Notion page and database CRUD
|
|
274
|
+
- DM `!ingest <url>` to capture a source, `!compile` to synthesize raw notes into linked wiki articles
|
|
192
275
|
- `!ask <question>` answers from your own wiki and writes the cited reply to `30_outputs/`
|
|
193
|
-
- `!lint`
|
|
194
|
-
-
|
|
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
|
|
276
|
+
- `!lint`, `!trace`, `!connect` for vault health, idea evolution, cross-domain bridges
|
|
277
|
+
- Multiple workspaces (`!ingest @research ...`) — internal or any number of external Obsidian vaults
|
|
197
278
|
</details>
|
|
198
279
|
|
|
199
280
|
<details>
|
|
@@ -201,817 +282,159 @@ A non-exhaustive catalogue — every entry below is backed by an implemented ski
|
|
|
201
282
|
|
|
202
283
|
- Local Git: `git log`, `git diff`, `git show` exposed via daemon proxy
|
|
203
284
|
- GitHub: PR lists, comments, issues, webhook receivers (HMAC-SHA256 verified)
|
|
204
|
-
- Per-repo cron triggers — "every Monday at 09:00, summarize merged PRs into
|
|
205
|
-
- "Why did this build break?" — agent reads CI status, diff, and traces
|
|
285
|
+
- Per-repo cron triggers — "every Monday at 09:00, summarize merged PRs into the repo's daily journal"
|
|
206
286
|
- Auto-detect when a coworker modified a file you're about to ship
|
|
207
287
|
- Unified Repositories: one row pairs a local clone with a GitHub remote; the doctor flags drift
|
|
208
288
|
</details>
|
|
209
289
|
|
|
210
290
|
<details>
|
|
211
|
-
<summary><b>
|
|
212
|
-
|
|
213
|
-
-
|
|
214
|
-
-
|
|
215
|
-
-
|
|
216
|
-
- "
|
|
217
|
-
-
|
|
291
|
+
<summary><b>Self-management via natural language</b></summary>
|
|
292
|
+
|
|
293
|
+
- "Don't run hourly checks on weekends" — patches the cron window
|
|
294
|
+
- "Remember my partner's birthday is March 14" — appends to `identity/profile.md`
|
|
295
|
+
- "I prefer concise replies — no preamble" — updates the agent's `character` field
|
|
296
|
+
- "Email me a summary every Friday at 5pm" — creates a recurring schedule
|
|
297
|
+
- "Switch to Codex for code reviews" — flips the per-process backend mapping
|
|
298
|
+
- Every change is journaled to `agent_actions` — audit anything via `aitne audit`
|
|
218
299
|
</details>
|
|
219
300
|
|
|
220
301
|
<details>
|
|
221
|
-
<summary><b>
|
|
302
|
+
<summary><b>Bring your own toolkit</b></summary>
|
|
222
303
|
|
|
223
|
-
-
|
|
224
|
-
-
|
|
225
|
-
-
|
|
226
|
-
-
|
|
227
|
-
- Voice attachments — send a voice memo, get a Whisper-transcribed message (opt-in, runs locally via `ffmpeg-static` + `@huggingface/transformers`)
|
|
228
|
-
</details>
|
|
229
|
-
|
|
230
|
-
<details>
|
|
231
|
-
<summary><b>Self-management and automation</b></summary>
|
|
232
|
-
|
|
233
|
-
- Tell it to remember things in plain language ("I'm allergic to nuts")
|
|
234
|
-
- Tell it to forget things ("delete that note about my old job")
|
|
235
|
-
- Tell it to change schedules ("don't run hourly checks on weekends")
|
|
236
|
-
- Tell it to change tone ("be more concise, no preamble")
|
|
237
|
-
- Custom routines on any cron schedule with free-form prompts
|
|
238
|
-
- Self-scheduled wakeups — agent decides when to check on something
|
|
239
|
-
</details>
|
|
240
|
-
|
|
241
|
-
<details>
|
|
242
|
-
<summary><b>Run your own tools</b></summary>
|
|
243
|
-
|
|
244
|
-
- Bring your own MCP servers — they materialize into every session workdir
|
|
245
|
-
- Bring your own Claude Code skills — they show up wherever the agent runs
|
|
246
|
-
- Bring your own Codex / Gemini config — Aitne reads it on session init
|
|
247
|
-
- Custom skills via the `/api/skills` endpoint — drop a `SKILL.md` and it's live
|
|
304
|
+
- Your `~/.claude/skills`, `~/.codex/config.toml`, and `~/.gemini/` settings are loaded on session init
|
|
305
|
+
- Custom MCP servers materialize into every per-session workdir
|
|
306
|
+
- Aitne layers its persona on top of your existing config — nothing gets overwritten
|
|
307
|
+
- Voice attachments — opt-in local Whisper transcription via `ffmpeg-static` + `@huggingface/transformers`
|
|
248
308
|
</details>
|
|
249
309
|
|
|
250
310
|
---
|
|
251
311
|
|
|
252
|
-
##
|
|
253
|
-
|
|
254
|
-
A walkthrough of one user's Tuesday.
|
|
255
|
-
|
|
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.
|
|
257
|
-
|
|
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.
|
|
265
|
-
|
|
266
|
-
**09:15 — You DM Aitne:** *"Tell Sarah I'll review by 11. And book lunch with Mark on Thursday — somewhere near his office."*
|
|
267
|
-
|
|
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.
|
|
269
|
-
|
|
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.
|
|
312
|
+
## Memory
|
|
277
313
|
|
|
278
|
-
|
|
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?
|
|
314
|
+
Everything Aitne writes lives in `~/.personal-agent/context/`:
|
|
280
315
|
|
|
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"]
|
|
299
|
-
|
|
300
|
-
SOURCES --> OB
|
|
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
|
|
311
316
|
```
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
|
317
|
+
context/
|
|
318
|
+
├── state/
|
|
319
|
+
│ ├── today.md # Working view, always injected
|
|
320
|
+
│ ├── yesterday.md # Daemon-rotated archive
|
|
321
|
+
│ ├── inbox/ # Captured snippets
|
|
322
|
+
│ └── scratch/ # Short-lived agent notes (48h TTL)
|
|
323
|
+
├── plans/
|
|
324
|
+
│ ├── roadmap.md # Long-term goals
|
|
325
|
+
│ └── projects/ # One file per active project
|
|
326
|
+
├── identity/ # profile.md, people.md, work.md, …
|
|
327
|
+
├── policies/ # Management rules, MCP config, redaction, routines
|
|
328
|
+
├── journal/
|
|
329
|
+
│ ├── daily/YYYY-MM-DD.md # Synthesized daily journal
|
|
330
|
+
│ ├── weekly/ # Weekly retrospectives
|
|
331
|
+
│ └── agent.md # Private agent self-reflection
|
|
332
|
+
└── knowledge/ # wiki, per-repo overviews, entities, dossiers
|
|
333
333
|
```
|
|
334
334
|
|
|
335
|
-
|
|
335
|
+
Context writes flow through `curl http://localhost:8321/api/context/<class>/<path>` — where `<class>` is one of `identity`, `state`, `plans`, `journal`, `knowledge`, `policies` — not the SDK's `Edit`/`Write` tools. This gives the daemon a single chokepoint for write locks, frontmatter validation, and 30-day snapshots. SQLite (`better-sqlite3` with FTS5) backs sessions, observations, agent actions, and history.
|
|
336
336
|
|
|
337
|
-
|
|
338
|
-
|
|
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:
|
|
340
|
-
|
|
341
|
-
- **Tone** → updates the `character` runtime-config field, applied to every backend's system prompt.
|
|
342
|
-
- **Attribute** → updates `user/profile.md` Learned Context.
|
|
343
|
-
|
|
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).
|
|
337
|
+
Schema upgrades are forward-only and idempotent — the migration runner preserves your SQLite history and Markdown context across releases. (`aitne update` prints the `npm install -g @aitne-sh/aitne@latest` command; there is no self-updater.)
|
|
345
338
|
|
|
346
339
|
---
|
|
347
340
|
|
|
348
|
-
##
|
|
341
|
+
## Safety
|
|
349
342
|
|
|
350
|
-
|
|
343
|
+
Four independent layers, designed so the bottom layer holds even when upper layers are widened:
|
|
351
344
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
| *"Always check Sarah's calendar before scheduling with her"* | Adds a rule to `rules/management.md` |
|
|
357
|
-
| *"Remember my partner's birthday is March 14"* | Appends to `user/profile.md` Learned Context |
|
|
358
|
-
| *"I prefer concise replies — no preamble"* | Updates `character` field |
|
|
359
|
-
| *"Move all my React work into one project file"* | Refactors `projects/*.md` and re-indexes |
|
|
360
|
-
| *"Cancel tomorrow's morning briefing"* | Removes the `agent_schedule` row |
|
|
361
|
-
| *"Forget what I said about my old job"* | Surgically edits `user/work.md` |
|
|
362
|
-
| *"Email me a summary every Friday at 5pm"* | Creates a recurring schedule with a free-form prompt |
|
|
363
|
-
| *"Switch to Codex for code reviews from now on"* | Updates `process_backend_config` mapping |
|
|
364
|
-
|
|
365
|
-
Behind the scenes, the agent maps natural language to one of:
|
|
366
|
-
|
|
367
|
-
- `PATCH /api/config` — runtime config (~100 keys)
|
|
368
|
-
- `PUT /api/context/*` — Markdown memory (locked, validated, snapshotted)
|
|
369
|
-
- `DELETE /api/schedule/:id` / `POST /api/recurring-schedules` — scheduling
|
|
370
|
-
- `PATCH /api/config/character` — tone
|
|
371
|
-
- `POST /api/triggers` — cron-driven custom routines
|
|
372
|
-
|
|
373
|
-
Every change is journaled to `agent_actions` with `source_kind=user_directive`. Audit anything you don't recognize via `aitne audit`.
|
|
345
|
+
1. **SDK permission model** — strict `allowedTools` whitelist in Safe mode; `bypassPermissions` in Allow mode
|
|
346
|
+
2. **PreToolUse hooks** (Claude, Safe mode) — `curl` parsed for hostname + port; daemon-API is the only legal write path
|
|
347
|
+
3. **Daemon API risk tiers** — `Autonomous` / `ReadSensitive` (X-Read-Token) / `Approve` (Bearer token)
|
|
348
|
+
4. **Absolute-block layer** — recursive deletes, `sudo`, pipe-to-shell, secret-file reads/writes, Anthropic-cloud managed-agent tools — hard-denied in **both** modes regardless of overrides
|
|
374
349
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
## Bring your own harness
|
|
378
|
-
|
|
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.
|
|
380
|
-
|
|
381
|
-
```mermaid
|
|
382
|
-
flowchart LR
|
|
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
|
|
400
|
-
SESS --> RUN
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
| You already have… | In Aitne it just works |
|
|
404
|
-
|---|---|
|
|
405
|
-
| A Claude Code MCP server connected to your company's internal API | Every Aitne session can use it. No code changes. |
|
|
406
|
-
| Custom slash commands you built for `/review` or `/test` | Available in every Aitne-spawned Claude Code session. |
|
|
407
|
-
| A polished `AGENTS.md` for your Codex setup | Aitne layers its persona on top, keeping your config intact. |
|
|
408
|
-
| Your Gemini auth and project preferences | Inherited automatically. |
|
|
409
|
-
| Skills you wrote for `~/.claude/skills/` | Imported on demand. |
|
|
410
|
-
|
|
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.
|
|
350
|
+
Plus: localhost-only API, webhook HMAC verification, no automated financial transactions, no automated social posting, single-owner adapter filtering, hourly auth-health monitoring with auto-recovery.
|
|
412
351
|
|
|
413
352
|
---
|
|
414
353
|
|
|
415
|
-
##
|
|
354
|
+
## Cost
|
|
416
355
|
|
|
417
|
-
|
|
356
|
+
| Control | Default | Effect when set |
|
|
357
|
+
|---|---|---|
|
|
358
|
+
| `maxConcurrentSessions` (autonomous) | 3 | Hard semaphore |
|
|
359
|
+
| `maxReactiveSessions` (DMs) | 2 | Hard semaphore |
|
|
360
|
+
| `executeTimeoutMinutes` | 60 | Per-execute watchdog |
|
|
361
|
+
| `autonomousDailyCostCapUsd` | `null` | Priority-based skipping: `hourly_check` at 100%, `evening_review` at 150%, `morning_routine` at 200%. Reactive DMs are not gated. |
|
|
362
|
+
| `autonomousMonthlyCostCapUsd` | `null` | Alert + warn surface |
|
|
363
|
+
| Per-ProcessKey `maxBudgetUsd` | per-row | Hard cap per execute |
|
|
418
364
|
|
|
419
|
-
|
|
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"]
|
|
425
|
-
|
|
426
|
-
IN --> AITNE
|
|
427
|
-
AITNE --- SVC
|
|
428
|
-
AITNE --> OUT
|
|
429
|
-
```
|
|
365
|
+
Typical day for an active user: **~$0.50** (morning routine + briefing + 2× hourly check + 1 DM + evening review, all on Sonnet 4.6). Quota exhaustion is detected, dedupe-notified once per 2-hour window, and retried on the next tick.
|
|
430
366
|
|
|
431
367
|
---
|
|
432
368
|
|
|
433
|
-
##
|
|
369
|
+
## Operating Aitne
|
|
434
370
|
|
|
435
371
|
### Lifecycle
|
|
436
372
|
|
|
437
373
|
| Command | What it does |
|
|
438
374
|
|---|---|
|
|
439
|
-
| `aitne start [--no-open]` | Build if stale, launch daemon + dashboard in background
|
|
440
|
-
| `aitne stop` | Graceful shutdown (SIGTERM → SIGKILL after 10 s)
|
|
441
|
-
| `aitne restart [--
|
|
442
|
-
| `aitne status` | PIDs, uptime,
|
|
443
|
-
| `aitne logs [-f] [-n N] [-d]` | Tail
|
|
444
|
-
| `aitne dev` | Foreground mode (full stdio
|
|
445
|
-
| `aitne build` | Force a build (skip the mtime gate). |
|
|
375
|
+
| `aitne start [--no-open]` | Build if stale, launch daemon + dashboard in background |
|
|
376
|
+
| `aitne stop` | Graceful shutdown (SIGTERM → SIGKILL after 10 s) |
|
|
377
|
+
| `aitne restart [--clean-context]` | Stop then start. `--clean-context` wipes `context/` after a tarball backup |
|
|
378
|
+
| `aitne status` | PIDs, uptime, platforms, backends, today's spend |
|
|
379
|
+
| `aitne logs [-f] [-n N] [-d]` | Tail daemon log (`-d` = dashboard, `-f` = follow) |
|
|
380
|
+
| `aitne dev` | Foreground mode (full stdio) |
|
|
446
381
|
|
|
447
382
|
### Operations
|
|
448
383
|
|
|
449
384
|
| Command | What it does |
|
|
450
385
|
|---|---|
|
|
451
|
-
| `aitne
|
|
452
|
-
| `aitne
|
|
453
|
-
| `aitne
|
|
454
|
-
| `aitne
|
|
455
|
-
| `aitne
|
|
456
|
-
| `aitne
|
|
457
|
-
| `aitne
|
|
458
|
-
| `aitne help [cmd]` | Help (or per-command help). |
|
|
459
|
-
|
|
460
|
-
### `aitne audit` flags
|
|
461
|
-
|
|
462
|
-
| Flag | Default | Description |
|
|
463
|
-
|---|---|---|
|
|
464
|
-
| `--since <duration>` | `24h` | Time window (`1h`, `7d`, `2026-04-20`). |
|
|
465
|
-
| `--type <pattern>` | — | `action_type` filter (`%` for LIKE matching). |
|
|
466
|
-
| `--result <value>` | — | `success` / `failed` / `partial` / `skipped`. |
|
|
467
|
-
| `--backend <name>` | — | `claude` / `codex` / `gemini`. |
|
|
468
|
-
| `--limit <N>` | 50 | Row cap. |
|
|
469
|
-
| `--detail` | off | Expand the `detail` JSON column. |
|
|
470
|
-
| `--json` | off | Machine-readable output. |
|
|
471
|
-
|
|
472
|
-
### `aitne doctor` checks
|
|
473
|
-
|
|
474
|
-
1. Node version ≥ 22.0.0
|
|
475
|
-
2. Daemon port (`PA_API_PORT`, default 8321) is bindable
|
|
476
|
-
3. Dashboard port (`PA_DASHBOARD_PORT`, default 3000) is bindable
|
|
477
|
-
4. OS secret store usable (`security` / `secret-tool` / `PA_MASTER_PASSWORD`)
|
|
478
|
-
5. At least one backend CLI (`claude`, `codex`, or `gemini`) responds
|
|
479
|
-
6. `~/.personal-agent` exists and is writable
|
|
480
|
-
7. `better-sqlite3` native binding loads
|
|
481
|
-
8. `agent-assets/skills/` is reachable
|
|
482
|
-
9. Repository drift — one row per paired-local + GitHub repo whose `origin` no longer matches the registered `<owner>/<repo>`
|
|
386
|
+
| `aitne doctor [--json]` | Eight install-health checks + per-repo GitHub-link drift expansion |
|
|
387
|
+
| `aitne audit [flags]` | Read the agent action log — `--since`, `--type`, `--result`, `--backend`, `--detail`, `--json` |
|
|
388
|
+
| `aitne setup` | Re-open the `/setup` wizard |
|
|
389
|
+
| `aitne open` | Open the dashboard in your browser |
|
|
390
|
+
| `aitne run-now <job>` | Fire a maintenance job on demand (currently `roadmap_maintenance`) |
|
|
391
|
+
| `aitne verify <target>` | Read-only post-launch verification of a shipped design surface |
|
|
392
|
+
| `aitne version` / `update` / `uninstall` | Self-explanatory |
|
|
483
393
|
|
|
484
|
-
|
|
394
|
+
`aitne help [cmd]` for per-command details.
|
|
485
395
|
|
|
486
|
-
|
|
396
|
+
### Configuration
|
|
487
397
|
|
|
488
|
-
|
|
489
|
-
flowchart TB
|
|
490
|
-
PLAT["Input platforms:<br/>Slack, Telegram, Discord,<br/>WhatsApp, Web dashboard"]
|
|
491
|
-
|
|
492
|
-
subgraph DAEMON["Aitne daemon (Hono on :8321)"]
|
|
493
|
-
direction TB
|
|
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)"]
|
|
500
|
-
end
|
|
501
|
-
|
|
502
|
-
BACKENDS["AI runtimes:<br/>Claude Code SDK,<br/>Codex CLI subprocess,<br/>Gemini CLI subprocess"]
|
|
503
|
-
|
|
504
|
-
DATA["Local data:<br/>SQLite (WAL + FTS5),<br/>Markdown memory,<br/>OS Keychain"]
|
|
505
|
-
|
|
506
|
-
PLAT --> EB
|
|
507
|
-
SC --> EB
|
|
508
|
-
OB --> DATA
|
|
509
|
-
DATA --> EB
|
|
510
|
-
EB --> DI
|
|
511
|
-
DI --> BR
|
|
512
|
-
BR --> AC
|
|
513
|
-
AC --> BACKENDS
|
|
514
|
-
AC --> DATA
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
### Two execution paths
|
|
518
|
-
|
|
519
|
-
**Reactive path** — owner DMs / mentions, cron routines, calendar approach events, scheduled tasks
|
|
520
|
-
→ Event source → EventBus → Dispatcher → BackendRouter → Agent → output to user.
|
|
521
|
-
|
|
522
|
-
**Polling path** — Obsidian, Git, GitHub, Notion, Calendar, Mail change detection
|
|
523
|
-
→ Observer → `observations` table (UPSERT, with `actor='user'|'agent'`)
|
|
524
|
-
… time passes …
|
|
525
|
-
→ Hourly cron → Stage 2 lite-tier triage → Stage 3 full `routine.hourly_check` (if escalated) → agent reads pending → updates `today.md` / `roadmap.md` → notifies if needed.
|
|
526
|
-
|
|
527
|
-
`AgentWriteTracker` prevents agent → observer → agent loops by tagging the agent's own writes so the hourly check filters them out. A pre-pass `routine.fetch_window` session fans out per-account fetches into the `observations` table before each routine runs.
|
|
528
|
-
|
|
529
|
-
### Repo layout
|
|
530
|
-
|
|
531
|
-
```
|
|
532
|
-
packages/
|
|
533
|
-
├── daemon/ # Hono server, EventBus, Dispatcher, BackendRouter, observers, SQLite layer, integration SDK wrappers
|
|
534
|
-
├── dashboard/ # Next.js 16 + React 19 + Tailwind 4 + shadcn/ui
|
|
535
|
-
└── shared/ # Types, Zod schemas, ProcessKey enum, branding constants
|
|
536
|
-
|
|
537
|
-
agent-assets/ # Read by the daemon at session-init time
|
|
538
|
-
├── agent-profiles/ # Persona MD per backend (CLAUDE.md / AGENTS.md / GEMINI.md)
|
|
539
|
-
├── skills/ # 24 built-in skills (context, calendar, mail, notion, …)
|
|
540
|
-
├── task-flows/ # Per-event prompt templates
|
|
541
|
-
└── templates/ # Scaffold MD copied to context/ on first run
|
|
542
|
-
|
|
543
|
-
bin/aitne.mjs # CLI entry — lifecycle + ops
|
|
544
|
-
scripts/ # Build/run helpers and per-command modules
|
|
545
|
-
docs/design/ # Architecture and design docs — source of truth
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## Memory layout
|
|
551
|
-
|
|
552
|
-
Everything the agent writes lives under `PA_DATA_DIR` (default `~/.personal-agent`):
|
|
553
|
-
|
|
554
|
-
```
|
|
555
|
-
~/.personal-agent/
|
|
556
|
-
├── context/ # Markdown memory — edit any file by hand at any time
|
|
557
|
-
│ ├── _index.md # Navigation hub
|
|
558
|
-
│ ├── today.md # Today's working view (always injected)
|
|
559
|
-
│ ├── yesterday.md # Daemon-rotated archive
|
|
560
|
-
│ ├── roadmap.md # Long-term goals (Morning + Evening injection)
|
|
561
|
-
│ ├── context-index.md # Auto-maintained index
|
|
562
|
-
│ ├── user/
|
|
563
|
-
│ │ ├── profile.md # ~600 tokens, always injected
|
|
564
|
-
│ │ ├── people.md # Relationship dictionary
|
|
565
|
-
│ │ ├── work.md, expertise.md, personal.md, goals.md
|
|
566
|
-
│ ├── rules/ # Policy files (management, redaction, journal)
|
|
567
|
-
│ ├── routines/ # Per-cadence checklist rulebooks
|
|
568
|
-
│ ├── dossiers/ # Carry-forward state per routine
|
|
569
|
-
│ ├── projects/ # One file per active project + Obsidian Bases view
|
|
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)
|
|
573
|
-
│ ├── inbox/ # Optional paste bucket
|
|
574
|
-
│ └── agent/
|
|
575
|
-
│ ├── journal.md # Private agent self-reflection
|
|
576
|
-
│ └── scratch/ # 48-h TTL temp files
|
|
577
|
-
├── data/personal_agent.db # SQLite (WAL + FTS5)
|
|
578
|
-
├── logs/{daemon,dashboard}.log
|
|
579
|
-
├── prompts/ # Editable prompt templates
|
|
580
|
-
├── attachments/ # Chat attachments
|
|
581
|
-
├── agent-sessions/[id]/ # Per-session backend workdir
|
|
582
|
-
├── secrets/ # File-fallback secret store (empty when OS keychain is used)
|
|
583
|
-
└── run/ # PID files for daemon + dashboard
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
### Write chokepoint
|
|
587
|
-
|
|
588
|
-
Context-MD writes go through `curl http://localhost:8321/api/context/<path>` rather than the SDK's `Edit`/`Write` tools on those paths. This is enforced by **skill instructions** (the bundled skills only ever invoke the daemon API) plus the **absolute-block path globs** that hard-deny SDK writes to secret paths (`.env`, `~/.ssh`, `~/.aws`, `~/.gnupg`, `~/.personal-agent/secrets/**`, …). Routing context writes through the daemon API gives one chokepoint for locks (`today.md` write lock), frontmatter validation, and snapshots (30-day `md_file_snapshots` retention).
|
|
589
|
-
|
|
590
|
-
---
|
|
591
|
-
|
|
592
|
-
## Multi-backend
|
|
593
|
-
|
|
594
|
-
Aitne abstracts three AI runtimes behind a single `IAgentCore` interface:
|
|
595
|
-
|
|
596
|
-
| Backend | Implementation | Session resume | Strengths |
|
|
597
|
-
|---|---|---|---|
|
|
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 |
|
|
601
|
-
|
|
602
|
-
### Per-process tier routing
|
|
603
|
-
|
|
604
|
-
Every kind of work has a `ProcessKey` mapped to a tier (`lite` / `medium` / `high`) and a backend. For Claude, those tiers map to Haiku 4.5 / Sonnet 4.6 / Opus 4.7.
|
|
605
|
-
|
|
606
|
-
| ProcessKey | Default tier | What runs there |
|
|
607
|
-
|---|---|---|
|
|
608
|
-
| `routine.morning_routine_initial` | **high** | First-day plan generation (one-shot, sets up profile) |
|
|
609
|
-
| `routine.morning_routine` | medium | Daily plan generation — the highest-value recurring process |
|
|
610
|
-
| `routine.evening_review` | medium | Today wrap-up |
|
|
611
|
-
| `routine.weekly_review`, `routine.monthly_review` | medium | Cadence summaries |
|
|
612
|
-
| `routine.hourly_check` | medium | Stage 3 observation aggregation |
|
|
613
|
-
| `routine.hourly_check.triage` | lite | Stage 2 escalate-vs-log-only gate |
|
|
614
|
-
| `routine.fetch_window` | lite | Pre-pass fan-out fetcher for routines |
|
|
615
|
-
| `message.dm`, `message.mention` | medium | DM and channel response |
|
|
616
|
-
| `dashboard.chat` | medium | Web chat |
|
|
617
|
-
| `dashboard.docs_qa` | medium (tier-locked) | Docs panel — never burns Opus quota |
|
|
618
|
-
| `agent.task`, `agent.dm_task` | medium | Scheduled wakeups |
|
|
619
|
-
| `knowledge.import` | high | One-shot knowledge ingestion |
|
|
620
|
-
| `calendar.change`, `gmail_classify` | lite | Polling-derived events |
|
|
621
|
-
| `git.*`, `github.*` (event triage) | lite | Git/GitHub event triage |
|
|
622
|
-
| `delegated_task` | lite | Delegated subprocess task mode |
|
|
623
|
-
| `delegated_task_heavy` | high | Opt-in destructive-write task mode |
|
|
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 |
|
|
626
|
-
|
|
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.
|
|
628
|
-
|
|
629
|
-
---
|
|
630
|
-
|
|
631
|
-
## Integrations
|
|
632
|
-
|
|
633
|
-
### Messaging
|
|
634
|
-
|
|
635
|
-
| Platform | Library | Mode | Setup |
|
|
636
|
-
|---|---|---|---|
|
|
637
|
-
| Slack | `@slack/bolt` | Socket Mode (WebSocket) | Bot + App tokens |
|
|
638
|
-
| Telegram | `telegraf` | Long polling | Bot token |
|
|
639
|
-
| Discord | `discord.js` | Gateway | Bot token |
|
|
640
|
-
| WhatsApp | `@whiskeysockets/baileys` | QR pairing | Scan QR from dashboard |
|
|
641
|
-
| Web Dashboard | Hono SSE | Always on | None |
|
|
642
|
-
|
|
643
|
-
### Mail (multi-provider, unified API)
|
|
644
|
-
|
|
645
|
-
| Provider | Auth | Features |
|
|
646
|
-
|---|---|---|
|
|
647
|
-
| **Gmail** | `googleapis` OAuth2 | Read · send · drafts · labels · IMAP IDLE · classifier · attachment extraction |
|
|
648
|
-
| **Outlook** | `@azure/msal-node` Graph API | Read · send · drafts · folders |
|
|
649
|
-
| **Yahoo** | IMAP + app password | Read · send · IMAP IDLE |
|
|
650
|
-
| **iCloud** | IMAP + app password | Read · send · IMAP IDLE |
|
|
651
|
-
|
|
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.
|
|
653
|
-
|
|
654
|
-
### Knowledge and docs
|
|
655
|
-
|
|
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
|
|
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.
|
|
659
|
-
- **Custom MCP servers** — register via `/api/mcp/servers`; materialized into the per-session workdir so backends use them transparently
|
|
660
|
-
|
|
661
|
-
### Code
|
|
662
|
-
|
|
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`
|
|
664
|
-
- **GitHub** — `@octokit/rest` + webhooks; PR list and comment, issue ops, HMAC-SHA256 signature verification at `POST /webhook/github`
|
|
665
|
-
|
|
666
|
-
### Calendar and travel
|
|
667
|
-
|
|
668
|
-
- **Google Calendar** — `googleapis` OAuth2; full event CRUD, freebusy, calendar list, 15-min approaching reminders
|
|
669
|
-
- **Outlook Calendar** — Microsoft Graph via `@azure/msal-node` in direct mode, or user-managed MCP in delegated / native modes
|
|
670
|
-
- **iCloud Calendar** — CalDAV via `tsdav`
|
|
671
|
-
- **Google Maps** — Directions API for travel-time estimation tied to calendar events
|
|
672
|
-
|
|
673
|
-
### Lifestyle
|
|
674
|
-
|
|
675
|
-
- **Receipts** — auto-extracts PDF / image attachments from mail with category detection
|
|
676
|
-
- **Travel bookings** — auto-extracts flight, hotel, restaurant, train confirmations
|
|
677
|
-
- **Reading** — Kindle My Clippings importer; reading-taste profile; weekly book recommendations
|
|
678
|
-
- **Voice** — opt-in Whisper transcription (`ffmpeg-static` + `@huggingface/transformers`) runs locally on voice attachments. Install via `POST /api/voice/install`.
|
|
679
|
-
|
|
680
|
-
### Integration delegation modes
|
|
681
|
-
|
|
682
|
-
Each integration runs in one of **four** modes:
|
|
683
|
-
|
|
684
|
-
| Mode | Auth held by | Polling? | Setup cost | Capabilities |
|
|
685
|
-
|---|---|---|---|---|
|
|
686
|
-
| **`direct`** | Daemon (OAuth in OS Keychain) | Daemon poller | 5–6 vendor-console steps | Full feature set |
|
|
687
|
-
| **`delegated`** | Main backend's connector | Cron `delegated-sync-worker` (per-cadence opt-in) | None — backend already authed | Reduced (whatever the connector exposes) |
|
|
688
|
-
| **`native`** | Main backend's connector | None — agent reaches the integration in-turn via MCP | None | On-demand only; observations posted via `/api/observations` |
|
|
689
|
-
| **`disabled`** | — | No | — | Off |
|
|
690
|
-
|
|
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.
|
|
692
|
-
|
|
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`.
|
|
694
|
-
|
|
695
|
-
---
|
|
696
|
-
|
|
697
|
-
## Safety model
|
|
698
|
-
|
|
699
|
-
Aitne stacks **four** independent safety layers. The bottom layer holds even when the upper layers are widened by the user.
|
|
700
|
-
|
|
701
|
-
### Layer 1 — SDK permission model
|
|
702
|
-
|
|
703
|
-
```typescript
|
|
704
|
-
// Safe (strict) mode — claude-tool-collection.ts:CLAUDE_DEFAULT_ALLOWED_TOOLS
|
|
705
|
-
permissionMode: "dontAsk"
|
|
706
|
-
allowedTools: ["Read", "Glob", "Grep", "Write", "Edit", "Skill",
|
|
707
|
-
"Bash(curl *)", "Bash(git *)", "Bash(jq *)"]
|
|
708
|
-
disallowedTools: ALWAYS_DISALLOWED_TOOLS + dashboard overrides
|
|
709
|
-
```
|
|
710
|
-
|
|
711
|
-
Allow mode swaps to `permissionMode: "bypassPermissions"` but the absolute-block layer below still applies.
|
|
712
|
-
|
|
713
|
-
### Layer 2 — PreToolUse hooks (Claude, Safe mode)
|
|
714
|
-
|
|
715
|
-
In Safe mode, every `Bash(curl ...)` invocation is parsed: the hostname must be `localhost` or `127.0.0.1` and the port must match the daemon's `apiPort`. Connection-override flags (`--connect-to`, `--resolve`, `--proxy`, `-x`, `--socks`, `-K`) are also rejected. A parallel `jq` hook blocks `--rawfile` / env-leak filters. In Allow mode the curl/jq pair is skipped, but the absolute-block hook (below) and the context-write attribution hook still run. Vault writes are attributed to the agent via `AgentWriteTracker` so they don't loop back as observations.
|
|
716
|
-
|
|
717
|
-
### Layer 3 — Daemon API risk tiers
|
|
718
|
-
|
|
719
|
-
| Tier | Examples | Auth required |
|
|
720
|
-
|---|---|---|
|
|
721
|
-
| **Autonomous** | `GET /api/context/*`, `POST /api/notify`, `POST /api/schedule`, `POST /api/observations` | None (localhost only) |
|
|
722
|
-
| **ReadSensitive** | `GET /api/observations`, `GET /api/calendar/events`, `GET /api/mail/search` | `X-Read-Token` or Bearer |
|
|
723
|
-
| **Approve** | `PATCH /api/config`, `POST /api/setup/*`, `POST /api/system/factory-reset`, `POST /api/triggers`, `/api/repositories`, `/api/mcp/servers`, `/api/integrations` | Bearer |
|
|
724
|
-
|
|
725
|
-
### Layer 4 — Absolute-block layer (`ALWAYS_DISALLOWED_TOOLS`)
|
|
726
|
-
|
|
727
|
-
Hard-blocked in **both Safe and Allow** modes. `bypassPermissions` and `allowedToolsOverride` cannot widen past this:
|
|
728
|
-
|
|
729
|
-
- Recursive delete: `rm -rf *`, `rm -r *`, `rm --recursive*`, plus every common short-flag bundle (`-rfv`, `-fr`, `-vr`, `-R`, `-fR`, …)
|
|
730
|
-
- Privilege escalation: `sudo *`, `doas *`, `su *`
|
|
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)
|
|
737
|
-
|
|
738
|
-
Every blocked attempt lands in `agent_actions` with `action_type='blocked_absolute'`.
|
|
739
|
-
|
|
740
|
-
### Other guarantees
|
|
741
|
-
|
|
742
|
-
- **Localhost-only API** — daemon binds to `127.0.0.1` only
|
|
743
|
-
- **Bearer token** — required for all Approve-tier endpoints
|
|
744
|
-
- **Webhook HMAC** — GitHub webhooks verified with `X-Hub-Signature-256`
|
|
745
|
-
- **No automated financial transactions** — never trade, transfer, or pay
|
|
746
|
-
- **No automated social posting** — never post publicly on your behalf
|
|
747
|
-
- **Single-owner only** — group chats and multi-user channels are filtered at the adapter layer
|
|
748
|
-
- **Auth Health Monitor** — hourly probe of every backend's auth state, with grace periods, escalating DMs, and auto-recovery flows for Claude / Codex / Gemini
|
|
749
|
-
|
|
750
|
-
---
|
|
751
|
-
|
|
752
|
-
## Cost and quotas
|
|
753
|
-
|
|
754
|
-
### Built-in controls
|
|
755
|
-
|
|
756
|
-
| Control | Default | Configurable |
|
|
757
|
-
|---|---|---|
|
|
758
|
-
| `maxConcurrentSessions` (autonomous) | 3 | yes |
|
|
759
|
-
| `maxReactiveSessions` (DMs) | 2 | yes |
|
|
760
|
-
| `executeTimeoutMinutes` (per-execute watchdog) | 60 | yes |
|
|
761
|
-
| `autonomousDailyCostCapUsd` | null (alert-only) | yes |
|
|
762
|
-
| `autonomousMonthlyCostCapUsd` | null (alert-only) | yes |
|
|
763
|
-
| Per-ProcessKey `maxBudgetUsd` (in `process_backend_config`) | per-row, set from `/settings/models` | yes |
|
|
764
|
-
| `delegated_task` hard caps | `maxToolCalls=15` · `maxBudgetUsd=$0.50` · `timeoutMs=300_000` | no (compile-time) |
|
|
765
|
-
|
|
766
|
-
### Typical day's spend
|
|
767
|
-
|
|
768
|
-
```
|
|
769
|
-
04:00 Morning Routine (Sonnet) ~$0.15
|
|
770
|
-
07:00 Morning Briefing (Sonnet) ~$0.03
|
|
771
|
-
09:00 Hourly Check (Sonnet) ~$0.05
|
|
772
|
-
12:00 Hourly Check (Sonnet) ~$0.03
|
|
773
|
-
12:55 DM response (Sonnet) ~$0.08
|
|
774
|
-
18:00 Evening Review (Sonnet) ~$0.15
|
|
775
|
-
─────────────────────────────────────────────────
|
|
776
|
-
Total ~$0.49
|
|
777
|
-
```
|
|
778
|
-
|
|
779
|
-
If you're on a Claude / Codex / Gemini subscription, none of this hits a metered API key — it consumes your subscription quota directly. Quota exhaustion is detected, dedupe-notified once per 2-hour window, and the next hourly tick retries automatically.
|
|
780
|
-
|
|
781
|
-
---
|
|
782
|
-
|
|
783
|
-
## Configuration
|
|
784
|
-
|
|
785
|
-
`.env` is **bootstrap-only**. Everything else is editable from the dashboard at runtime — or via natural-language DMs.
|
|
786
|
-
|
|
787
|
-
### `.env` (bootstrap)
|
|
788
|
-
|
|
789
|
-
```bash
|
|
790
|
-
PA_DATA_DIR=~/.personal-agent
|
|
791
|
-
PA_API_PORT=8321
|
|
792
|
-
PA_DASHBOARD_PORT=3000
|
|
793
|
-
PA_LOG_LEVEL=info # trace | debug | info | warn | error
|
|
794
|
-
```
|
|
795
|
-
|
|
796
|
-
### Pre-seeding identifiers via env (optional)
|
|
797
|
-
|
|
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:
|
|
799
|
-
|
|
800
|
-
```bash
|
|
801
|
-
PA_SLACK_OWNER_USER_ID=U...
|
|
802
|
-
PA_TELEGRAM_OWNER_CHAT_ID=...
|
|
803
|
-
PA_DISCORD_OWNER_USER_ID=...
|
|
804
|
-
PA_WHATSAPP_ENABLED=true
|
|
805
|
-
PA_WHATSAPP_OWNER_PHONE=...
|
|
806
|
-
|
|
807
|
-
PA_PRIMARY_VAULT_PATH=~/Documents/MyVault
|
|
808
|
-
PA_EXTERNAL_OBSIDIAN_VAULT_PATH=~/Documents/SecondaryVault
|
|
809
|
-
|
|
810
|
-
PA_NOTION_DATABASE_IDS='{"tasks":"abc...","notes":"def..."}'
|
|
811
|
-
```
|
|
812
|
-
|
|
813
|
-
Everything else — bot tokens, OAuth refresh tokens, Notion API key, GitHub token, Google Maps key, Apple Calendar credentials — is set from the dashboard `/connections` page (or via the setup wizard) and lives in the keychain.
|
|
814
|
-
|
|
815
|
-
### Runtime settings
|
|
816
|
-
|
|
817
|
-
The dashboard `/settings` tree exposes ~100 runtime keys. Headline groups:
|
|
818
|
-
|
|
819
|
-
- **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window and interval, cron schedules
|
|
820
|
-
- **Notifications** — `quietHoursStart/End`, `maxNotificationsPerHour`, `maxNotificationsPerDay`, `batchIntervalMinutes`
|
|
821
|
-
- **Sessions** — `sessionTimeoutDmMinutes`, `historyInjectionMaxMessages`, `historyInjectionMaxTokens`
|
|
822
|
-
- **Safety** — execution mode per backend, `disallowedTools` overrides
|
|
823
|
-
- **Models** — per-ProcessKey backend + tier, advisor on/off, advisor model
|
|
824
|
-
- **Cost** — daily / monthly soft caps with 80% and 100% alerts
|
|
825
|
-
- **Mail** — provider list, poll interval, IMAP IDLE on/off
|
|
826
|
-
- **Character** — 1,000-char free-form tone description
|
|
827
|
-
- **Language** — `primaryLanguage` nudges output language for DMs, knowledge, and vault writes
|
|
828
|
-
- **Voice** — `voiceTranscriptionEnabled`, `voiceTranscriptionPrimaryLanguage` (the model itself is set via `PA_VOICE_TRANSCRIPTION_MODEL` env-only)
|
|
829
|
-
- **Delegated task mode** — kill switch, per-day quota, heavy-tier opt-in, cache / pool / structured-output toggles
|
|
830
|
-
|
|
831
|
-
…or just DM the agent: *"Don't run hourly checks on weekends."*
|
|
398
|
+
`.env` is **bootstrap-only** (`PA_DATA_DIR`, `PA_API_PORT`, `PA_DASHBOARD_PORT`, `PA_LOG_LEVEL`). Everything else — ~100 runtime keys covering schedule, notifications, models, character, mail, voice, delegated mode — is editable from the dashboard at `:8322`, or via natural-language DMs to the agent.
|
|
832
399
|
|
|
833
400
|
---
|
|
834
401
|
|
|
835
402
|
## Platform support
|
|
836
403
|
|
|
837
|
-
|
|
|
404
|
+
| | macOS | Linux | Windows |
|
|
838
405
|
|---|---|---|---|
|
|
839
|
-
| **Secret storage** | Keychain
|
|
840
|
-
| **Folder picker** | `osascript` | `zenity` / `kdialog` / `yad` | `
|
|
406
|
+
| **Secret storage** | Keychain | `secret-tool` (libsecret) → AES file fallback | DPAPI → AES file fallback |
|
|
407
|
+
| **Folder picker** | `osascript` | `zenity` / `kdialog` / `yad` | `FolderBrowserDialog` |
|
|
841
408
|
| **Process tree kill** | POSIX process group | POSIX process group | `taskkill /T /F` |
|
|
842
|
-
| **Log tailing (`-f`)** | Built-in Node tailer | Built-in Node tailer | Built-in Node tailer (no `tail` binary needed) |
|
|
843
|
-
| **Console windows** | n/a | n/a | Background spawns hide the console window |
|
|
844
|
-
|
|
845
|
-
### WSL
|
|
846
|
-
|
|
847
|
-
GNOME Keyring / D-Bus are typically unavailable. Aitne falls back to the encrypted file store. Set:
|
|
848
|
-
|
|
849
|
-
```bash
|
|
850
|
-
export PA_MASTER_PASSWORD='use-a-long-random-string'
|
|
851
|
-
```
|
|
852
|
-
|
|
853
|
-
### Linux secret-tool
|
|
854
|
-
|
|
855
|
-
```bash
|
|
856
|
-
sudo apt-get install libsecret-tools # Debian / Ubuntu
|
|
857
|
-
sudo dnf install libsecret # Fedora
|
|
858
|
-
sudo pacman -S libsecret # Arch
|
|
859
|
-
```
|
|
860
409
|
|
|
861
|
-
|
|
410
|
+
WSL falls back to the encrypted file store — set `PA_MASTER_PASSWORD` to a long random string. Windows users hitting `ENAMETOOLONG` on install should enable long paths via the `LongPathsEnabled=1` registry key.
|
|
862
411
|
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
```powershell
|
|
866
|
-
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
|
|
867
|
-
-Name "LongPathsEnabled" -Value 1
|
|
868
|
-
```
|
|
412
|
+
Common gotchas: [docs/troubleshooting.md](docs/troubleshooting.md).
|
|
869
413
|
|
|
870
414
|
---
|
|
871
415
|
|
|
872
|
-
##
|
|
873
|
-
|
|
874
|
-
### `aitne start` says "dist not found"
|
|
875
|
-
|
|
876
|
-
The build did not complete. Run `aitne build` and check for TypeScript errors.
|
|
877
|
-
|
|
878
|
-
### Port already in use
|
|
879
|
-
|
|
880
|
-
Change `PA_API_PORT` (or `PA_DASHBOARD_PORT`) in `.env`. To find the conflicting process:
|
|
881
|
-
|
|
882
|
-
```bash
|
|
883
|
-
# macOS / Linux
|
|
884
|
-
lsof -i :8321
|
|
885
|
-
|
|
886
|
-
# Windows
|
|
887
|
-
netstat -ano | findstr :8321
|
|
888
|
-
```
|
|
889
|
-
|
|
890
|
-
### `aitne` not found after `npm install -g`
|
|
891
|
-
|
|
892
|
-
```bash
|
|
893
|
-
npm config get prefix
|
|
894
|
-
# add the printed prefix's `bin/` (or its root on Windows) to your PATH
|
|
895
|
-
```
|
|
896
|
-
|
|
897
|
-
### SQLite errors on startup
|
|
898
|
-
|
|
899
|
-
The DB can be reset safely — your Markdown memory in `context/` is untouched. The `*` clears the WAL + SHM companion files:
|
|
900
|
-
|
|
901
|
-
```bash
|
|
902
|
-
aitne stop
|
|
903
|
-
rm ~/.personal-agent/data/personal_agent.db*
|
|
904
|
-
# Remove-Item "$env:USERPROFILE\.personal-agent\data\personal_agent.db*" # Windows
|
|
905
|
-
aitne start
|
|
906
|
-
```
|
|
907
|
-
|
|
908
|
-
### Backend auth expired
|
|
416
|
+
## Documentation
|
|
909
417
|
|
|
910
|
-
|
|
911
|
-
aitne doctor # confirms which backend failed
|
|
912
|
-
claude auth login # re-auth Claude
|
|
913
|
-
codex login --device-auth # re-auth Codex
|
|
914
|
-
# Gemini re-auth happens automatically via the dashboard banner
|
|
915
|
-
```
|
|
916
|
-
|
|
917
|
-
### Diagnostic dump
|
|
918
|
-
|
|
919
|
-
```bash
|
|
920
|
-
aitne audit --since 24h --result failed --detail
|
|
921
|
-
```
|
|
922
|
-
|
|
923
|
-
---
|
|
924
|
-
|
|
925
|
-
## Development
|
|
926
|
-
|
|
927
|
-
### Tech stack
|
|
928
|
-
|
|
929
|
-
| Layer | Stack |
|
|
930
|
-
|---|---|
|
|
931
|
-
| **Daemon** | Node.js 22 · Hono · `@anthropic-ai/claude-agent-sdk` · `@slack/bolt` · `telegraf` · `discord.js` · `@whiskeysockets/baileys` · `googleapis` · `@azure/msal-node` · `@notionhq/client` · `@octokit/rest` · `tsdav` · `chokidar` · `node-cron` · `heap-js` · `pino` · `zod` |
|
|
932
|
-
| **Storage** | `better-sqlite3` (WAL + FTS5 trigram) · OS Keychain · plain Markdown |
|
|
933
|
-
| **Dashboard** | Next.js 16 (App Router) · React 19 · Tailwind CSS 4 · shadcn/ui · TanStack Query · Recharts · Monaco Editor |
|
|
934
|
-
| **Voice** | `ffmpeg-static` · `@huggingface/transformers` (Whisper, opt-in) |
|
|
935
|
-
| **Monorepo** | pnpm 10.x workspaces · Turborepo · TypeScript 5.8 · Vitest 3 |
|
|
936
|
-
|
|
937
|
-
### Conventions
|
|
938
|
-
|
|
939
|
-
- All code, comments, tests, and user-facing text are in **English**
|
|
940
|
-
- TypeScript throughout, camelCase, ESM with `.js` import extensions
|
|
941
|
-
- Tests colocated with source as `foo.ts` + `foo.test.ts`
|
|
942
|
-
- Vitest enforces **100% coverage** on a curated subset of pure-logic modules
|
|
943
|
-
- The `docs/design/` tree is the authoritative spec; `packages/daemon/src/` is the source of truth when they diverge
|
|
944
|
-
|
|
945
|
-
### Source-of-truth pointers
|
|
946
|
-
|
|
947
|
-
| If you need to… | Start in |
|
|
418
|
+
| Topic | Doc |
|
|
948
419
|
|---|---|
|
|
949
|
-
|
|
|
950
|
-
|
|
|
951
|
-
|
|
|
952
|
-
|
|
|
953
|
-
|
|
|
954
|
-
| Edit a built-in skill | `agent-assets/skills/<slug>/SKILL.md` |
|
|
955
|
-
| Edit an event task flow | `agent-assets/task-flows/<eventType>.md` |
|
|
956
|
-
| Change risk classification | `src/safety/risk-classifier.ts` |
|
|
957
|
-
| Change the absolute-block layer | `src/safety/always-disallowed.ts` |
|
|
958
|
-
| Change auth health / recovery | `src/core/backends/auth-health-monitor.ts` + `auth-recovery.ts` |
|
|
420
|
+
| Documentation index | [docs/index.md](docs/index.md) |
|
|
421
|
+
| Setup walkthrough | [docs/setup-guide.md](docs/setup-guide.md) |
|
|
422
|
+
| Troubleshooting | [docs/troubleshooting.md](docs/troubleshooting.md) |
|
|
423
|
+
| Maintenance playbook | [docs/maintenance.md](docs/maintenance.md) |
|
|
424
|
+
| Advisor model | [docs/advisor.md](docs/advisor.md) |
|
|
959
425
|
|
|
960
426
|
---
|
|
961
427
|
|
|
962
|
-
##
|
|
963
|
-
|
|
964
|
-
**Is Aitne a chatbot?**
|
|
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.
|
|
428
|
+
## Tech stack
|
|
966
429
|
|
|
967
|
-
|
|
968
|
-
No. The daemon binds to `127.0.0.1` only. There is no telemetry. Verify with `lsof` and `nettop`.
|
|
430
|
+
Daemon: Node.js 22 · Hono · `@anthropic-ai/claude-agent-sdk` · `@slack/bolt` · `telegraf` · `discord.js` · `@whiskeysockets/baileys` · `googleapis` · `@azure/msal-node` · `@notionhq/client` · `@octokit/rest` · `tsdav` · `chokidar` · `node-cron` · `better-sqlite3` (FTS5) · `pino` · `zod`
|
|
969
431
|
|
|
970
|
-
|
|
971
|
-
In your OS-native credential store (macOS Keychain / libsecret / DPAPI). Never in `.env`. On systems without a credential store, in an AES-encrypted file under `~/.personal-agent/secrets/`.
|
|
432
|
+
Dashboard: Next.js 16 · React 19 · Tailwind 4 · shadcn/ui · TanStack Query · Recharts · Monaco
|
|
972
433
|
|
|
973
|
-
|
|
974
|
-
Yes — Claude Code, OpenAI Codex, and Google Gemini CLI are all supported. Pick one or all three. Per-process tier routing lets you mix-and-match.
|
|
975
|
-
|
|
976
|
-
**Do I need an API key?**
|
|
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.
|
|
978
|
-
|
|
979
|
-
**Can I edit the agent's memory directly?**
|
|
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.
|
|
981
|
-
|
|
982
|
-
**What about Obsidian?**
|
|
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.
|
|
984
|
-
|
|
985
|
-
**Can I run my own MCP servers?**
|
|
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.
|
|
987
|
-
|
|
988
|
-
**Do my existing Claude Code / Codex / Gemini settings work?**
|
|
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).
|
|
990
|
-
|
|
991
|
-
**Does it work without internet?**
|
|
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.
|
|
993
|
-
|
|
994
|
-
**Does it support languages other than English?**
|
|
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.
|
|
996
|
-
|
|
997
|
-
**Is this for my whole team?**
|
|
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.
|
|
999
|
-
|
|
1000
|
-
**How do I uninstall?**
|
|
1001
|
-
`aitne uninstall`. It will offer to wipe `~/.personal-agent` or keep it for re-installation.
|
|
434
|
+
Monorepo: pnpm 10 workspaces · Turborepo · TypeScript 5.8 · Vitest 3 (100% coverage gate on a curated pure-logic subset)
|
|
1002
435
|
|
|
1003
436
|
---
|
|
1004
437
|
|
|
1005
438
|
## License
|
|
1006
439
|
|
|
1007
|
-
MIT —
|
|
1008
|
-
|
|
1009
|
-
---
|
|
1010
|
-
|
|
1011
|
-
<div align="center">
|
|
1012
|
-
|
|
1013
|
-
**Aitne — Always on. Always yours.**
|
|
1014
|
-
|
|
1015
|
-
[Issues](https://github.com/Aitne-sh/Aitne/issues) · [Discussions](https://github.com/Aitne-sh/Aitne/discussions) · [npm](https://www.npmjs.com/package/@aitne-sh/aitne)
|
|
1016
|
-
|
|
1017
|
-
</div>
|
|
440
|
+
MIT — see [LICENSE](./LICENSE).
|