@aitne-sh/aitne 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +4 -0
  2. package/agent-assets/agent-profiles/background-task.md +8 -1
  3. package/agent-assets/agent-profiles/routine-fetch-window.md +11 -0
  4. package/agent-assets/agents/evening-review/agent.md +6 -2
  5. package/agent-assets/agents/lesson-maintenance/agent.md +56 -0
  6. package/agent-assets/agents/morning-routine/agent.md +10 -6
  7. package/agent-assets/agents/source-librarian/agent.md +51 -0
  8. package/agent-assets/docs/concepts/agent-day.md +15 -15
  9. package/agent-assets/docs/concepts/auth-health.md +10 -7
  10. package/agent-assets/docs/concepts/backends-and-tiers.md +34 -23
  11. package/agent-assets/docs/concepts/costs-and-quotas.md +10 -10
  12. package/agent-assets/docs/concepts/delegated-mode.md +18 -18
  13. package/agent-assets/docs/concepts/memory-model.md +25 -24
  14. package/agent-assets/docs/concepts/observations.md +27 -19
  15. package/agent-assets/docs/concepts/process-keys.md +25 -26
  16. package/agent-assets/docs/concepts/routines.md +18 -17
  17. package/agent-assets/docs/concepts/safety-and-execution.md +20 -17
  18. package/agent-assets/docs/concepts/safety-model.md +16 -15
  19. package/agent-assets/docs/concepts/skills.md +7 -4
  20. package/agent-assets/docs/features/integrations/browser-history.md +52 -47
  21. package/agent-assets/docs/features/integrations/calendar.md +7 -7
  22. package/agent-assets/docs/features/integrations/git.md +15 -13
  23. package/agent-assets/docs/features/integrations/github.md +12 -10
  24. package/agent-assets/docs/features/integrations/mail.md +47 -45
  25. package/agent-assets/docs/features/integrations/notion.md +15 -11
  26. package/agent-assets/docs/features/integrations/obsidian.md +27 -23
  27. package/agent-assets/docs/features/lifestyle/git.md +7 -8
  28. package/agent-assets/docs/features/lifestyle/reading.md +11 -8
  29. package/agent-assets/docs/features/lifestyle/receipts.md +21 -22
  30. package/agent-assets/docs/features/lifestyle/travel-bookings.md +9 -9
  31. package/agent-assets/docs/features/memory-files/agent-journal.md +12 -10
  32. package/agent-assets/docs/features/memory-files/agent-lessons.md +46 -21
  33. package/agent-assets/docs/features/memory-files/projects.md +13 -14
  34. package/agent-assets/docs/features/memory-files/roadmap.md +16 -15
  35. package/agent-assets/docs/features/memory-files/schedule.md +10 -10
  36. package/agent-assets/docs/features/memory-files/today.md +18 -18
  37. package/agent-assets/docs/features/memory-files/user-profile.md +17 -17
  38. package/agent-assets/docs/features/messaging/bang-commands.md +15 -15
  39. package/agent-assets/docs/features/messaging/dashboard-chat.md +8 -7
  40. package/agent-assets/docs/features/messaging/discord.md +7 -5
  41. package/agent-assets/docs/features/messaging/overview.md +14 -14
  42. package/agent-assets/docs/features/messaging/pairing-and-magic-phrase.md +12 -12
  43. package/agent-assets/docs/features/messaging/slack.md +9 -8
  44. package/agent-assets/docs/features/messaging/telegram.md +7 -7
  45. package/agent-assets/docs/features/messaging/whatsapp.md +6 -6
  46. package/agent-assets/docs/features/operations/activity-and-conversations.md +9 -9
  47. package/agent-assets/docs/features/operations/approvals.md +13 -12
  48. package/agent-assets/docs/features/operations/backend-routing.md +38 -37
  49. package/agent-assets/docs/features/operations/browser-tasks.md +63 -57
  50. package/agent-assets/docs/features/operations/cost-tracking.md +5 -5
  51. package/agent-assets/docs/features/operations/managed-chromium.md +23 -22
  52. package/agent-assets/docs/features/operations/notifications.md +15 -15
  53. package/agent-assets/docs/features/operations/quiet-hours.md +14 -15
  54. package/agent-assets/docs/features/operations/schedule-approaching.md +16 -14
  55. package/agent-assets/docs/features/routines/activity-scan.md +14 -11
  56. package/agent-assets/docs/features/routines/custom-routines.md +9 -7
  57. package/agent-assets/docs/features/routines/evening-review.md +6 -7
  58. package/agent-assets/docs/features/routines/morning-routine.md +23 -22
  59. package/agent-assets/docs/features/routines/weekly-review.md +57 -51
  60. package/agent-assets/docs/features/wiki/commands.md +28 -22
  61. package/agent-assets/docs/features/wiki/cost-and-approval.md +28 -23
  62. package/agent-assets/docs/features/wiki/dashboard.md +22 -24
  63. package/agent-assets/docs/features/wiki/overview.md +17 -25
  64. package/agent-assets/docs/features/wiki/search.md +15 -17
  65. package/agent-assets/docs/features/wiki/workspaces.md +55 -56
  66. package/agent-assets/docs/getting-started/01-what-is-this.md +4 -5
  67. package/agent-assets/docs/getting-started/02-first-steps.md +12 -13
  68. package/agent-assets/docs/getting-started/03-what-can-this-do.md +7 -7
  69. package/agent-assets/docs/getting-started/04-first-day.md +4 -5
  70. package/agent-assets/docs/glossary.md +21 -19
  71. package/agent-assets/docs/guides/add-a-custom-routine.md +17 -12
  72. package/agent-assets/docs/guides/backup-and-restore.md +19 -16
  73. package/agent-assets/docs/guides/budget-and-cost-for-wiki.md +57 -62
  74. package/agent-assets/docs/guides/build-your-wiki.md +11 -12
  75. package/agent-assets/docs/guides/change-which-model-handles-x.md +30 -28
  76. package/agent-assets/docs/guides/connect-a-new-mail-account.md +30 -29
  77. package/agent-assets/docs/guides/explore-with-trace-and-connect.md +30 -32
  78. package/agent-assets/docs/guides/import-knowledge-file.md +9 -10
  79. package/agent-assets/docs/guides/install-and-run.md +9 -10
  80. package/agent-assets/docs/guides/maintain-wiki-health.md +10 -10
  81. package/agent-assets/docs/guides/migrate-machines.md +16 -14
  82. package/agent-assets/docs/guides/multiple-wikis-for-multiple-domains.md +12 -13
  83. package/agent-assets/docs/guides/pause-the-agent.md +25 -25
  84. package/agent-assets/docs/guides/reinstall-cleanly.md +13 -12
  85. package/agent-assets/docs/guides/setup-wizard.md +10 -12
  86. package/agent-assets/docs/guides/switch-default-backend.md +9 -9
  87. package/agent-assets/docs/guides/use-an-existing-obsidian-vault.md +9 -11
  88. package/agent-assets/docs/pages/activity.md +76 -0
  89. package/agent-assets/docs/pages/agents.md +78 -0
  90. package/agent-assets/docs/pages/analytics.md +70 -0
  91. package/agent-assets/docs/pages/browser.md +73 -0
  92. package/agent-assets/docs/pages/chat.md +67 -0
  93. package/agent-assets/docs/pages/connections.md +78 -0
  94. package/agent-assets/docs/pages/git.md +73 -0
  95. package/agent-assets/docs/pages/knowledge.md +75 -0
  96. package/agent-assets/docs/pages/overview.md +90 -0
  97. package/agent-assets/docs/pages/reading.md +65 -0
  98. package/agent-assets/docs/pages/settings.md +77 -0
  99. package/agent-assets/docs/pages/tasks.md +74 -0
  100. package/agent-assets/docs/pages/wiki.md +73 -0
  101. package/agent-assets/docs/reference/api.md +18 -17
  102. package/agent-assets/docs/reference/cli-commands.md +13 -10
  103. package/agent-assets/docs/reference/config.md +40 -35
  104. package/agent-assets/docs/reference/disallowed-tools.md +18 -17
  105. package/agent-assets/docs/reference/keyboard-shortcuts.md +6 -8
  106. package/agent-assets/docs/reference/knowledge-layout.md +10 -10
  107. package/agent-assets/docs/reference/process-keys.md +20 -22
  108. package/agent-assets/docs/reference/skills.md +18 -16
  109. package/agent-assets/docs/troubleshooting/auth-failed.md +13 -11
  110. package/agent-assets/docs/troubleshooting/dashboard-shows-degraded.md +10 -10
  111. package/agent-assets/docs/troubleshooting/fallback-keeps-firing.md +26 -24
  112. package/agent-assets/docs/troubleshooting/messaging-not-pairing.md +8 -9
  113. package/agent-assets/docs/troubleshooting/morning-routine-didnt-run.md +19 -18
  114. package/agent-assets/docs/troubleshooting/observation-not-detected.md +14 -15
  115. package/agent-assets/docs/troubleshooting/quota-exhausted.md +28 -26
  116. package/agent-assets/docs/troubleshooting/wiki-ingest-full-blocked.md +35 -34
  117. package/agent-assets/docs/troubleshooting/wiki-write-failed.md +21 -24
  118. package/agent-assets/playbooks/markdown-note.md +43 -0
  119. package/agent-assets/playbooks/monitoring.md +29 -0
  120. package/agent-assets/playbooks/research.md +47 -0
  121. package/agent-assets/skills/agent-create/SKILL.md +71 -32
  122. package/agent-assets/skills/agent-create/references/prompt-frame-extended.md +132 -0
  123. package/agent-assets/skills/agent-create/references/prompt-frame.md +125 -0
  124. package/agent-assets/skills/background-task/SKILL.md +13 -8
  125. package/agent-assets/skills/background-task-reply/SKILL.md +2 -2
  126. package/agent-assets/skills/board/SKILL.md +92 -0
  127. package/agent-assets/skills/browser-history/SKILL.md +3 -3
  128. package/agent-assets/skills/browser-history-respond/SKILL.md +3 -3
  129. package/agent-assets/skills/browser-task/SKILL.md +4 -2
  130. package/agent-assets/skills/context/seeds/file-responsibilities.seed.json +2 -1
  131. package/agent-assets/skills/schedule/SKILL.md +21 -18
  132. package/agent-assets/skills/schedule/references/batch.md +1 -1
  133. package/agent-assets/skills/schedule/references/model-selection.md +1 -1
  134. package/agent-assets/skills/schedule/references/prompt-frame.md +125 -0
  135. package/agent-assets/skills/sources/SKILL.md +68 -0
  136. package/agent-assets/skills/sources/curation.json +21 -0
  137. package/agent-assets/skills/sources/seeds/filing-rules.seed.json +25 -0
  138. package/agent-assets/skills/sources/seeds/source-collections.seed.json +20 -0
  139. package/agent-assets/skills/task/SKILL.md +82 -0
  140. package/agent-assets/task-flows/background_task.md +29 -3
  141. package/agent-assets/task-flows/message.received.dm.md +1 -1
  142. package/agent-assets/task-flows/routine.activity_scan.md +17 -2
  143. package/agent-assets/task-flows/routine.evening_review.md +72 -11
  144. package/agent-assets/task-flows/routine.fetch_window.md +21 -0
  145. package/agent-assets/task-flows/routine.monthly_review.md +3 -1
  146. package/agent-assets/task-flows/routine.morning_routine_today.md +26 -7
  147. package/agent-assets/task-flows/routine.source_maintenance.md +50 -0
  148. package/agent-assets/task-flows/scheduled.dm.md +29 -16
  149. package/agent-assets/templates/_manifest.json +1 -0
  150. package/agent-assets/templates/knowledge/sources/_index.md +19 -0
  151. package/package.json +4 -4
@@ -20,7 +20,6 @@ section: integrations
20
20
  tags:
21
21
  - integrations
22
22
  - observations
23
- - browser-history
24
23
  - polling
25
24
  - autonomous
26
25
  status: stable
@@ -32,7 +31,7 @@ ask_examples:
32
31
  - How do I opt out of browser history?
33
32
  locale: en-US
34
33
  created: 2026-05-22
35
- updated: 2026-06-07
34
+ updated: 2026-07-01
36
35
  keywords:
37
36
  - browser history
38
37
  - browser history poller
@@ -75,38 +74,41 @@ api_endpoints:
75
74
 
76
75
  # Browser History
77
76
 
78
- Aitne can read the SQLite history databases that Chrome, Chromium,
79
- Edge, Brave, Comet, and Atlas already maintain on disk, classify visits
80
- into categories, and use the result to notice what you've been
81
- researching, what you've been refreshing, and what comparison-shopping
82
- windows you're in. Everything stays local — no URLs, titles, or
83
- clicks leave the daemon.
77
+ Every browser keeps a local history file (a small SQLite database) of
78
+ the pages you visit. Aitne can read that file for Chrome, Chromium,
79
+ Edge, Brave, Comet, and Atlas, sort each visit into a category, and use
80
+ the result to notice what you've been researching, what pages you keep
81
+ refreshing, and when you're comparison-shopping. Everything stays on
82
+ your machine — no URLs, titles, or clicks leave the daemon.
84
83
 
85
84
  ## What It Does
86
85
 
87
- - **Reads visits** from the browser's own history DB on a 30-min
88
- cadence (per browser, per profile) and inserts them into the
86
+ - **Reads visits** from the browser's own history file every 30
87
+ minutes (per browser, per profile) and inserts them into the
89
88
  daemon's `browser_visits` table.
90
89
  - **Counts reloads** per `<domain>/<first-path>` into
91
- `browser_reload_signals`. Surfaced via [`!checks`](../messaging/bang-commands.md)
92
- for the agent-day and via the weekly review's "this week you
93
- checked" block.
94
- - **Derives research clusters** when a topic crosses meaningful-visits
95
- / foreground-time / distinct-domain thresholds. Clusters live in
96
- `browser_research_clusters` with a slug, display name, journal at
97
- `context/research/<slug>.md`, and a status (`active | dormant |
98
- muted | concluded`).
99
- - **Offers engagement DMs** via the Two-Option Offer pattern when a
100
- cluster qualifies: pick "research dive" (parallel web research +
101
- summary) or "wiki summary" (Obsidian / Notion / local context).
102
- Accept paths run through `routine.research_dispatch` /
103
- `routine.research_wiki_summary`; decline silences offers for 14
90
+ `browser_reload_signals` that is, how often you reopen the same
91
+ page. These show up via [`!checks`](../messaging/bang-commands.md)
92
+ for the current agent-day (Aitne's version of "today", which rolls
93
+ over in the early morning rather than at midnight) and in the weekly
94
+ review's "this week you checked" block.
95
+ - **Derives research clusters** when a topic passes the thresholds for
96
+ meaningful visits, foreground reading time, and distinct domains. A
97
+ cluster is a group of related pages Aitne thinks you're actively
98
+ researching. Clusters live in `browser_research_clusters` with a
99
+ slug, display name, journal at `context/research/<slug>.md`, and a
100
+ status (`active | dormant | muted | concluded`).
101
+ - **Offers a direct message** when a cluster qualifies, using the
102
+ Two-Option Offer pattern: pick "research dive" (parallel web research
103
+ plus a summary) or "wiki summary" (into Obsidian / Notion / local
104
+ context). Accepting runs `routine.research_dispatch` or
105
+ `routine.research_wiki_summary`; declining silences offers for 14
104
106
  days; mute / unmute / rename / conclude via [`!research`](../messaging/bang-commands.md).
105
- - **Detects shopping comparison windows** — 90-min sliding windows
106
- containing ≥3 distinct ASINs surface as comparison sessions the
107
- agent can summarise.
107
+ - **Detects comparison-shopping sessions** — a 90-min sliding window
108
+ holding ≥3 distinct ASINs (Amazon product IDs) surfaces as a session
109
+ the agent can summarize for you.
108
110
  - **Powers the pre-morning digest** — yesterday's reading and reload
109
- patterns feed the digest the morning routine reads.
111
+ patterns feed the digest that the morning routine reads.
110
112
 
111
113
  ## Privacy and Consent
112
114
 
@@ -116,9 +118,9 @@ clicks leave the daemon.
116
118
  (`/settings/integrations/browser-history`) page. The integration only
117
119
  supports `direct` (the daemon poller) or `disabled` — there is no
118
120
  delegated or native mode.
119
- - **Local-only.** No request leaves the daemon. The browser's
120
- history file is opened read-only; the daemon never reaches into
121
- cookies, login sessions, or profile dirs other than the history DB.
121
+ - **Local-only.** No request leaves the daemon. The history file is
122
+ opened read-only, and the daemon never touches cookies, login
123
+ sessions, or any profile file other than that history database.
122
124
  - **Per-browser opt-in.** `browserHistoryBrowserOverrides` lets you
123
125
  force each detected browser on or off independently
124
126
  (`auto` / `forced-on` / `forced-off`).
@@ -134,17 +136,20 @@ clicks leave the daemon.
134
136
 
135
137
  ## How Clusters Qualify
136
138
 
137
- A research cluster qualifies when the combination of meaningful visits,
138
- foreground time, and distinct domains crosses the thresholds in
139
- `DEFAULT_OFFER_THRESHOLDS` (fixed defaults — `browserHistoryLifecycle`
140
- tunes the poller's check cadence, not these thresholds).
141
- On each tick the poller evaluates the offer triggers per active cluster
142
- (`evaluateOfferTriggers`) — this is where the 14-day, per-slug offer
143
- re-fire window lives and the **offer rate-limit gate**
144
- (`gateOfferRateLimit`: daily offer cap, minimum gap between offers,
145
- quiet hours, and a 30-day decline backoff) must also approve before a
146
- Two-Option Offer DM is composed by the `routine.research_offer_dm`
147
- process key.
139
+ A cluster qualifies once its meaningful visits, foreground time, and
140
+ distinct-domain counts all cross the thresholds in
141
+ `DEFAULT_OFFER_THRESHOLDS`. Those thresholds are fixed defaults;
142
+ `browserHistoryLifecycle` tunes how often the poller checks, not the
143
+ thresholds themselves.
144
+
145
+ Qualifying does not guarantee a message. On each tick the poller runs
146
+ the offer triggers for every active cluster (`evaluateOfferTriggers`),
147
+ which hold the 14-day, per-slug window before the same cluster can be
148
+ offered again. The **offer rate-limit gate** (`gateOfferRateLimit`) must
149
+ then approve too — it enforces a daily offer cap, a minimum gap between
150
+ offers, quiet hours, and a 30-day backoff after a decline. Only then
151
+ does the `routine.research_offer_dm` process key compose the Two-Option
152
+ Offer DM.
148
153
 
149
154
  Accepting either path clears every pending-offer row for that slug, so a
150
155
  later tick cannot re-offer the same cluster.
@@ -179,15 +184,15 @@ later tick cannot re-offer the same cluster.
179
184
 
180
185
  - **The settings page shows no browsers.** Open
181
186
  `/settings/integrations/browser-history` and run `aitne doctor` — the
182
- platform detector might be failing to resolve the user's profile dir.
183
- The daemon log line will name the candidate paths it tried.
187
+ detector may be unable to locate your browser's profile folder. The
188
+ daemon log line lists the candidate paths it tried.
184
189
  - **A cluster keeps re-offering.** Check the `lastResearchOfferAt` /
185
- `lastWikiOfferAt` columns; the trigger evaluator uses those for the
186
- 14-day re-fire window (the rate-limit gate also reads them for its
190
+ `lastWikiOfferAt` columns; the trigger evaluator uses them for the
191
+ 14-day re-fire window (and the rate-limit gate reads them for its
187
192
  30-day decline backoff). `!research decline <slug>` stamps both
188
193
  fields.
189
- - **`!checks` is empty.** That's the common case for a quiet day —
190
- the reload signals are gated to the agent-day, not UTC.
194
+ - **`!checks` is empty.** That's normal for a quiet day — the reload
195
+ signals are counted per agent-day, not per UTC day.
191
196
 
192
197
  ## Related
193
198
 
@@ -19,7 +19,6 @@ section: integrations
19
19
  tags:
20
20
  - integrations
21
21
  - calendar
22
- - core
23
22
  - observations
24
23
  - polling
25
24
  status: stable
@@ -33,7 +32,7 @@ ask_examples:
33
32
  - Which model handles detected calendar changes?
34
33
  locale: en-US
35
34
  created: 2026-04-25
36
- updated: 2026-06-07
35
+ updated: 2026-07-01
37
36
  keywords:
38
37
  - calendar
39
38
  - google calendar
@@ -77,10 +76,11 @@ around them and DM you ahead of meetings that matter.
77
76
  - **Polls** Google Calendar on `calendarPollIntervalSeconds`; Outlook
78
77
  and Apple calendars are read on demand rather than polled.
79
78
  - **Records observations** when events change (add / move / remove),
80
- consumed by the activity scan.
79
+ which the activity scan then reads.
81
80
  - **Surfaces today's events** to the morning routine so they land in
82
81
  `state/today.md` and the day's schedule file.
83
- - **Reads** events on demand for reactive turns ("am I free at 3?").
82
+ - **Reads** events on demand when you ask a live question, such as
83
+ "am I free at 3?".
84
84
 
85
85
  The agent can create, move, or delete events when the operator asks
86
86
  (`POST`/`PATCH`/`DELETE /api/calendar/events`, all Autonomous-tier — no
@@ -108,9 +108,9 @@ an explicit request.
108
108
  ## Calendar Event Model
109
109
 
110
110
  The Calendar Event Model picker chooses the backend and model that
111
- runs when the **daemon-side poller detects a calendar change**. It binds
112
- the `calendar.change` ProcessKey. The poller's change detection reacts
113
- in two situations:
111
+ runs when the **daemon-side poller detects a calendar change**. It is
112
+ bound to the `calendar.change` ProcessKey (the internal name for this
113
+ change-handling job). The poller reacts to a change in two situations:
114
114
 
115
115
  - An event was added, moved, or deleted between polls (recorded as a
116
116
  change observation; the activity scan picks it up).
@@ -26,7 +26,7 @@ ask_examples:
26
26
  - How often does the daemon poll my repos?
27
27
  locale: en-US
28
28
  created: 2026-04-25
29
- updated: 2026-06-07
29
+ updated: 2026-07-01
30
30
  keywords:
31
31
  - git
32
32
  - commit
@@ -53,31 +53,33 @@ api_endpoints:
53
53
 
54
54
  # Git
55
55
 
56
- Add local git repositories to a watched set; the daemon polls them
57
- and the activity scan decides whether the recent activity is worth
58
- flagging.
56
+ Add local git repositories to a watched set. The daemon checks them
57
+ on a schedule (it polls them), and the activity scan decides whether
58
+ the recent activity is worth flagging.
59
59
 
60
60
  ## What It Does
61
61
 
62
- - **Polls** each watched repo every `gitPollIntervalSeconds`.
63
- - **Records observations** when new commits land between polls. The
64
- commit author is included so agent-originated commits do not
65
- re-surface to the agent (defended via `AgentWriteTracker`).
62
+ - **Checks (polls)** each watched repo every `gitPollIntervalSeconds`
63
+ seconds.
64
+ - **Records an observation** when new commits land between two checks.
65
+ It notes who authored each commit, so commits the agent made itself
66
+ are not shown back to it (enforced by `AgentWriteTracker`).
66
67
  - **Surfaces patterns**, not individual commits — three small commits
67
- in an hour will not page you.
68
+ in an hour will not each trigger a notification.
68
69
 
69
70
  The agent never pushes, never amends, never force-resets. Read-only
70
71
  by design.
71
72
 
72
73
  ## When It Runs / How It Is Triggered
73
74
 
74
- - The poller is continuous.
75
- - The activity scan consumes the accumulated observations.
75
+ - The poller runs continuously in the background.
76
+ - The activity scan reads the observations it has collected.
76
77
 
77
78
  ## What It Outputs
78
79
 
79
- - An `observation` row per detected change set.
80
- - A summary in the activity scan's output when observations qualified.
80
+ - One `observation` row for each detected set of changes.
81
+ - A summary in the activity scan's output when those observations are
82
+ worth reporting.
81
83
 
82
84
  ## Where in the Dashboard
83
85
 
@@ -29,7 +29,7 @@ ask_examples:
29
29
  - Where do I add a GitHub repo to watch?
30
30
  locale: en-US
31
31
  created: 2026-04-25
32
- updated: 2026-06-07
32
+ updated: 2026-07-01
33
33
  keywords:
34
34
  - github
35
35
  - issue
@@ -61,14 +61,16 @@ context_files:
61
61
 
62
62
  # GitHub
63
63
 
64
- The daemon polls GitHub via the local `gh` CLI: review requests, CI
65
- failures on the default branch, security alerts, and assignments
66
- become DMs; everything else is recorded for the activity scan.
64
+ The daemon polls GitHub through the local `gh` CLI. Four kinds of
65
+ signal turn into a direct message (DM): review requests, CI failures
66
+ on the default branch, security alerts, and assignments. Everything
67
+ else is recorded for the activity scan instead of pinging you.
67
68
 
68
69
  ## What It Does
69
70
 
70
71
  - **Polls Notifications** every `githubPollIntervalSeconds` (default
71
- 1800s / 30 min) using ETag caching 304 responses cost no
72
+ 1800s / 30 min) using ETag caching, so when nothing has changed
73
+ GitHub returns a 304 ("not modified") and that poll costs no
72
74
  rate-limit quota.
73
75
  - **Polls workflow_runs** per watched GitHub repository, filtered by
74
76
  `status=failure`. Each repo's GitHub side comes from a unified
@@ -84,8 +86,8 @@ The agent never auto-comments, auto-merges, or pushes.
84
86
  ## High-priority events
85
87
 
86
88
  The agent will DM the user (priority `high`; during quiet hours the DM
87
- is deferred until they end rather than dropped — only `critical`
88
- safety messages break through) on:
89
+ waits until quiet hours end rather than being dropped — only
90
+ `critical` safety messages break through) on:
89
91
 
90
92
  - A teammate or bot **requested your review** on a PR — only when it
91
93
  looks time-sensitive (release-blocker keywords in the title, or the
@@ -149,9 +151,9 @@ Watched repos are no longer config keys. The old `gitRepos` /
149
151
  cutover — repos now live in the `repositories` table and are managed on
150
152
  **Connections → Repositories**. Per-repo polling cadence is set on
151
153
  **My Life → Git** and overrides the global interval for that repo's
152
- workflow-runs poll. The global interval is the floor a per-repo
153
- cadence longer than it slows that repo down, while a shorter one
154
- still polls at the global tick.
154
+ workflow-runs poll. The global interval is the floor: a per-repo
155
+ cadence longer than the global one slows that repo down, but a shorter
156
+ one still only polls at the global tick.
155
157
 
156
158
  ## When Something Goes Wrong
157
159
 
@@ -19,7 +19,6 @@ section: integrations
19
19
  tags:
20
20
  - integrations
21
21
  - mail
22
- - core
23
22
  status: stable
24
23
  ask_examples:
25
24
  - How do I connect my Gmail to the agent?
@@ -27,7 +26,7 @@ ask_examples:
27
26
  - How do I add a second mail account?
28
27
  locale: en-US
29
28
  created: 2026-04-25
30
- updated: 2026-06-07
29
+ updated: 2026-07-01
31
30
  keywords:
32
31
  - mail
33
32
  - gmail
@@ -60,46 +59,46 @@ context_files:
60
59
 
61
60
  # Mail
62
61
 
63
- Connect one or more mailboxes (Gmail, Outlook, Yahoo, or iCloud) and
64
- Aitne polls them, classifies incoming threads, and
65
- lets the agent search / label / read via the `mail` skill. Search is
66
- local — backed by SQLite FTS5 so the agent doesn't need to round-trip
67
- the provider for every query.
62
+ Connect one or more mailboxes (Gmail, Outlook, Yahoo, or iCloud). Aitne
63
+ then polls them, sorts incoming threads, and lets the agent search,
64
+ label, and read your mail through the `mail` skill. Search runs locally,
65
+ backed by a SQLite full-text index (FTS5), so the agent doesn't have to
66
+ call the provider every time you ask about your inbox.
68
67
 
69
68
  ## What It Does
70
69
 
71
- - **Read & search** existing threads (FTS5-backed local index).
72
- - **Classify** incoming messages — is it a travel booking, a receipt
73
- attachment, a Kindle notebook export.
74
- - **Label** threads so the operator and the agent agree on triage state.
75
- - **Surface** the small set of mail items in the morning routine that
76
- actually need owner action.
70
+ - **Read & search** existing threads (from the local FTS5 index).
71
+ - **Classify** incoming messages — for example, a travel booking, a
72
+ receipt attachment, or a Kindle notebook export.
73
+ - **Label** threads so you and the agent agree on where each one stands.
74
+ - **Surface** the few mail items in the morning routine that actually
75
+ need your attention.
77
76
 
78
- The agent **prefers drafts** over sending. By convention it creates a
79
- draft (`POST /mail/:account/drafts`) and lets you review and hit send
77
+ The agent **prefers drafts** over sending. By default it writes a draft
78
+ (`POST /mail/:account/drafts`) and leaves it for you to review and send
80
79
  yourself. Direct send (`POST /mail/:account/messages/send`) is *not*
81
- blocked — it is classified as an autonomous action, so the daemon does
82
- not DM you for approval first. The agent only sends directly when it
83
- judges you'd clearly want it to, and it tells you afterward; during the
84
- activity scan the `mail` skill is hard read-only (no sending, drafting,
85
- labeling, or filing).
80
+ blocked — it counts as an autonomous action, so the daemon does not DM
81
+ you for approval first. The agent only sends on its own when it's clear
82
+ you'd want it to, and it tells you afterward. During the activity scan
83
+ the `mail` skill is strictly read-only: no sending, drafting, labeling,
84
+ or filing.
86
85
 
87
86
  ## When It Runs / How It Is Triggered
88
87
 
89
- - In `direct` mode a poller pulls new messages on a cadence. Gmail uses
90
- `gmailPollIntervalSeconds` (default 600); all other accounts (Outlook,
91
- Yahoo, iCloud) use `mailPollIntervalSeconds` (default 180).
92
- The Gmail cadence is adjustable under **Settings → Infrastructure**.
93
- - The morning routine reads the labeled queue and decides which need
94
- surfacing.
95
- - Reactive turns (you DM "what's in my mail?") use the `mail` skill on
96
- demand.
88
+ - In `direct` mode a poller checks for new messages on a set interval.
89
+ Gmail uses `gmailPollIntervalSeconds` (default 600); all other accounts
90
+ (Outlook, Yahoo, iCloud) use `mailPollIntervalSeconds` (default 180).
91
+ You can adjust the Gmail interval under **Settings → Infrastructure**.
92
+ - The morning routine reads the labeled queue and picks which threads to
93
+ bring to your attention.
94
+ - When you ask directly (you DM "what's in my mail?"), the agent uses the
95
+ `mail` skill on demand.
97
96
 
98
97
  ## Integration Modes
99
98
 
100
99
  Gmail and Outlook support all four integration modes
101
- (`direct | delegated | native | disabled`); each may sit in a
102
- different mode. Yahoo and iCloud have no integration-registry entry
100
+ (`direct | delegated | native | disabled`), and each account can sit in
101
+ a different mode. Yahoo and iCloud have no integration-registry entry, so
103
102
  they are direct-only by design.
104
103
 
105
104
  | Provider | Direct | Delegated | Native | Notes |
@@ -109,9 +108,10 @@ they are direct-only by design.
109
108
  | Yahoo | ✓ | — | — | IMAP transport. Direct-only; never enters the delegated surface. |
110
109
  | iCloud | ✓ | — | — | IMAP transport. Direct-only; never enters the delegated surface. |
111
110
 
112
- Mode flips run through the §14.7 live probe + the per-key
113
- `runtime_state.integration_flip_lock:<key>`. Changing the main
114
- backend cascades unmatched `native` rows to `disabled`.
111
+ Switching a provider between modes goes through the §14.7 live probe and
112
+ a per-key lock (`runtime_state.integration_flip_lock:<key>`). If you
113
+ change the main backend, any `native` rows it no longer matches fall back
114
+ to `disabled`.
115
115
 
116
116
  See [Delegated Mode](../../concepts/delegated-mode.md) for the full
117
117
  mode lifecycle.
@@ -119,10 +119,10 @@ mode lifecycle.
119
119
  ## What It Outputs
120
120
 
121
121
  - New threads land in the local `mail_messages_index` table
122
- (FTS-indexed via `fts_mail_messages`).
123
- - Labels/tags are written via the provider API when the agent applies
124
- them (`POST /mail/:account/messages/:id/tags`).
125
- - A short "mail" section in `state/today.md` when items qualified.
122
+ (full-text indexed via `fts_mail_messages`).
123
+ - Labels and tags are written back through the provider API when the
124
+ agent applies them (`POST /mail/:account/messages/:id/tags`).
125
+ - A short "mail" section in `state/today.md` when items qualify.
126
126
 
127
127
  ## Where in the Dashboard
128
128
 
@@ -132,18 +132,20 @@ mode lifecycle.
132
132
 
133
133
  ## Configuration
134
134
 
135
- Per account you choose a provider kind (`gmail` / `outlook` / `yahoo` /
136
- `icloud`) plus credentials and an optional display label. You
135
+ For each account you choose a provider kind (`gmail` / `outlook` /
136
+ `yahoo` / `icloud`), plus credentials and an optional display label. You
137
137
  pick the kind, not the transport — Yahoo and iCloud connect over IMAP
138
- under the hood, but that is an implementation detail. The set of enabled
139
- providers is `enabledMailProviders` (default `["gmail"]`).
138
+ behind the scenes, but that's an implementation detail you don't manage.
139
+ The list of enabled providers is `enabledMailProviders` (default
140
+ `["gmail"]`).
140
141
 
141
142
  ## When Something Goes Wrong
142
143
 
143
- - An **auth failure** points at expired credentials. The dashboard's
144
- auth-health card flips to a warning. See [Auth Failed](../../troubleshooting/auth-failed.md).
145
- - A **classifier that misses** consistently — switch the model behind
146
- it via the Gmail Classification Model card on `/connections/mail`.
144
+ - An **auth failure** usually means the credentials have expired. The
145
+ dashboard's auth-health card turns to a warning. See
146
+ [Auth Failed](../../troubleshooting/auth-failed.md).
147
+ - A **classifier that keeps guessing wrong** switch the model behind it
148
+ from the Gmail Classification Model card on `/connections/mail`.
147
149
 
148
150
  ## Related
149
151
 
@@ -13,7 +13,6 @@ summary: |
13
13
  section: integrations
14
14
  tags:
15
15
  - integrations
16
- - notion
17
16
  - knowledge
18
17
  - observations
19
18
  status: stable
@@ -24,7 +23,7 @@ ask_examples:
24
23
  - Why are my Notion routine fetches skipped?
25
24
  locale: en-US
26
25
  created: 2026-04-25
27
- updated: 2026-06-11
26
+ updated: 2026-07-01
28
27
  keywords:
29
28
  - notion
30
29
  - page
@@ -48,21 +47,25 @@ api_endpoints:
48
47
 
49
48
  # Notion
50
49
 
51
- Aitne polls the configured Notion databases, records an
52
- observation on change, and the activity scan decides whether anything
53
- warrants surfacing. The agent can also read pages on demand through
50
+ Aitne watches the Notion databases you configure. When a page changes,
51
+ it records an *observation* (a short note that something happened), and
52
+ the [activity scan](../routines/activity-scan.md) the routine that
53
+ periodically reviews recent activity — decides whether anything is worth
54
+ surfacing to you. The agent can also read Notion pages on demand through
54
55
  the `notion` skill.
55
56
 
56
57
  ## What It Does
57
58
 
58
- - Polls Notion via the official API at `notionPollIntervalSeconds`.
59
- - Records an observation per detected change.
59
+ - Checks Notion through the official API on the interval set by
60
+ `notionPollIntervalSeconds`.
61
+ - Records one observation for each change it detects.
60
62
  - Lets the agent read pages on demand.
61
63
 
62
64
  ## When It Runs / How It Is Triggered
63
65
 
64
- Continuous polling in `direct` mode. In `delegated` / `native` / `disabled`
65
- modes the poller does not run — see Integration Modes below.
66
+ The poller runs continuously, but only in `direct` mode. In the
67
+ `delegated`, `native`, and `disabled` modes it does not run — see
68
+ [Integration Modes](#integration-modes) below.
66
69
 
67
70
  ## Integration Modes
68
71
 
@@ -84,8 +87,9 @@ Notion supports all four integration modes (`direct` / `delegated` /
84
87
  `disabled`.
85
88
  - **`disabled`** — silence; no observations, no daemon access.
86
89
 
87
- Switching modes requires the integration flip-lock probe to pass
88
- (connector reachable, capabilities reported). See `POST /api/integrations/notion/probe`.
90
+ Switching modes requires the integration flip-lock probe to pass — a
91
+ quick check that the connector is reachable and reports its
92
+ capabilities. See `POST /api/integrations/notion/probe`.
89
93
 
90
94
  ## Routine Fetch Targets
91
95
 
@@ -8,15 +8,14 @@ aliases:
8
8
  - knowledge vault
9
9
  category: features
10
10
  summary: |
11
- Watch an Obsidian vault for new and changed notes. Changes record
12
- observations the activity scan consumes; the agent can also read
13
- notes on demand.
11
+ Watch an Obsidian vault for new and changed notes. Each change
12
+ records an observation that the activity scan later reviews; the
13
+ agent can also read notes on demand.
14
14
  section: integrations
15
15
  tags:
16
16
  - integrations
17
17
  - knowledge
18
18
  - observations
19
- - obsidian
20
19
  status: stable
21
20
  ask_examples:
22
21
  - How do I connect my Obsidian vault?
@@ -24,7 +23,7 @@ ask_examples:
24
23
  - Why didn't the agent see my new note?
25
24
  locale: en-US
26
25
  created: 2026-04-25
27
- updated: 2026-06-11
26
+ updated: 2026-07-01
28
27
  keywords:
29
28
  - obsidian
30
29
  - vault
@@ -45,18 +44,22 @@ config_keys:
45
44
 
46
45
  # Obsidian
47
46
 
48
- Point Aitne at your Obsidian vault directory; new and changed notes
49
- record observations the activity scan consumes. The agent can read and
50
- write vault notes through the `external-services` skill.
47
+ Point Aitne at your Obsidian vault folder (the directory where your
48
+ notes live). When you add or change a note, Aitne records an
49
+ observation a short note-to-self that the
50
+ [activity scan](../routines/activity-scan.md) reviews on its next run.
51
+ The agent can also read and write vault notes through the
52
+ `external-services` skill.
51
53
 
52
- Reads and writes go through the Obsidian app's CLI the Obsidian app
53
- must be running, or vault read/write calls fail.
54
+ Reads and writes go through the Obsidian app's own command-line tool
55
+ (CLI), so the Obsidian app must be running otherwise vault read and
56
+ write calls fail.
54
57
 
55
58
  ## What It Does
56
59
 
57
- - Watches the vault for filesystem changes.
58
- - Filters out agent-originated writes via `AgentWriteTracker`.
59
- - Records observations for genuine operator edits.
60
+ - Watches the vault folder for file changes.
61
+ - Ignores writes the agent made itself, using `AgentWriteTracker`.
62
+ - Records an observation for each edit you make by hand.
60
63
 
61
64
  ### Will it edit my notes?
62
65
 
@@ -70,10 +73,11 @@ its own output.
70
73
  ## When It Runs / How It Is Triggered
71
74
 
72
75
  Continuously — the watcher runs as long as the daemon is up and a vault
73
- path is configured (`externalObsidianWatch=true`). Saves are debounced
74
- by `obsidianDebounceSeconds` before an observation is recorded; the
75
- [activity scan](../routines/activity-scan.md) later consumes those
76
- observations.
76
+ path is configured (`externalObsidianWatch=true`). After you save,
77
+ Aitne waits `obsidianDebounceSeconds` before recording the change (a
78
+ short pause called debouncing), so a burst of quick saves is folded
79
+ into one observation. The [activity scan](../routines/activity-scan.md)
80
+ picks up those observations on its next run.
77
81
 
78
82
  ## Where in the Dashboard
79
83
 
@@ -84,15 +88,15 @@ observations.
84
88
  | Setting | Default | Notes |
85
89
  |---|---|---|
86
90
  | `externalObsidianVaultPath` | unset | Vault directory; set in Connections → Notes. |
87
- | `externalObsidianWatch` | true | Set false to keep the path but stop recording changes (large-vault churn control). |
88
- | `obsidianDebounceSeconds` | 5 | How long to wait after a save before recording. |
91
+ | `externalObsidianWatch` | true | Set false to keep the path but stop recording changes — handy for a large, busy vault. |
92
+ | `obsidianDebounceSeconds` | 5 | How many seconds to wait after a save before recording. |
89
93
 
90
94
  ## When Something Goes Wrong
91
95
 
92
- - A vault read or write that failed: the Obsidian app must be running,
93
- since reads and writes proxy through its CLI. Open Obsidian and retry.
94
- - A change that did not record: the debounce may have folded multiple
95
- saves; the next one will fire.
96
+ - A read or write failed: the Obsidian app must be running, because
97
+ reads and writes go through its CLI. Open Obsidian and try again.
98
+ - A change didn't show up: the debounce pause may have folded several
99
+ saves together; the next save will record it.
96
100
 
97
101
  ## Related
98
102