@aitne-sh/aitne 0.1.12 → 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 (139) hide show
  1. package/agent-assets/agent-profiles/background-task.md +8 -1
  2. package/agent-assets/agent-profiles/routine-fetch-window.md +11 -0
  3. package/agent-assets/agents/evening-review/agent.md +6 -2
  4. package/agent-assets/agents/lesson-maintenance/agent.md +56 -0
  5. package/agent-assets/agents/morning-routine/agent.md +7 -2
  6. package/agent-assets/agents/source-librarian/agent.md +51 -0
  7. package/agent-assets/docs/concepts/agent-day.md +15 -15
  8. package/agent-assets/docs/concepts/auth-health.md +10 -7
  9. package/agent-assets/docs/concepts/backends-and-tiers.md +21 -13
  10. package/agent-assets/docs/concepts/costs-and-quotas.md +10 -10
  11. package/agent-assets/docs/concepts/delegated-mode.md +18 -18
  12. package/agent-assets/docs/concepts/memory-model.md +25 -24
  13. package/agent-assets/docs/concepts/observations.md +27 -19
  14. package/agent-assets/docs/concepts/process-keys.md +25 -26
  15. package/agent-assets/docs/concepts/routines.md +18 -17
  16. package/agent-assets/docs/concepts/safety-and-execution.md +20 -17
  17. package/agent-assets/docs/concepts/safety-model.md +16 -15
  18. package/agent-assets/docs/concepts/skills.md +7 -4
  19. package/agent-assets/docs/features/integrations/browser-history.md +52 -47
  20. package/agent-assets/docs/features/integrations/calendar.md +7 -7
  21. package/agent-assets/docs/features/integrations/git.md +15 -13
  22. package/agent-assets/docs/features/integrations/github.md +12 -10
  23. package/agent-assets/docs/features/integrations/mail.md +47 -45
  24. package/agent-assets/docs/features/integrations/notion.md +15 -11
  25. package/agent-assets/docs/features/integrations/obsidian.md +27 -23
  26. package/agent-assets/docs/features/lifestyle/git.md +7 -8
  27. package/agent-assets/docs/features/lifestyle/reading.md +11 -8
  28. package/agent-assets/docs/features/lifestyle/receipts.md +21 -22
  29. package/agent-assets/docs/features/lifestyle/travel-bookings.md +9 -9
  30. package/agent-assets/docs/features/memory-files/agent-journal.md +12 -10
  31. package/agent-assets/docs/features/memory-files/agent-lessons.md +46 -21
  32. package/agent-assets/docs/features/memory-files/projects.md +13 -14
  33. package/agent-assets/docs/features/memory-files/roadmap.md +16 -15
  34. package/agent-assets/docs/features/memory-files/schedule.md +10 -10
  35. package/agent-assets/docs/features/memory-files/today.md +18 -18
  36. package/agent-assets/docs/features/memory-files/user-profile.md +17 -17
  37. package/agent-assets/docs/features/messaging/bang-commands.md +15 -15
  38. package/agent-assets/docs/features/messaging/dashboard-chat.md +7 -6
  39. package/agent-assets/docs/features/messaging/discord.md +7 -5
  40. package/agent-assets/docs/features/messaging/overview.md +14 -14
  41. package/agent-assets/docs/features/messaging/pairing-and-magic-phrase.md +12 -12
  42. package/agent-assets/docs/features/messaging/slack.md +9 -8
  43. package/agent-assets/docs/features/messaging/telegram.md +7 -7
  44. package/agent-assets/docs/features/messaging/whatsapp.md +6 -6
  45. package/agent-assets/docs/features/operations/activity-and-conversations.md +9 -9
  46. package/agent-assets/docs/features/operations/approvals.md +13 -12
  47. package/agent-assets/docs/features/operations/backend-routing.md +38 -37
  48. package/agent-assets/docs/features/operations/browser-tasks.md +63 -57
  49. package/agent-assets/docs/features/operations/cost-tracking.md +5 -5
  50. package/agent-assets/docs/features/operations/managed-chromium.md +23 -22
  51. package/agent-assets/docs/features/operations/notifications.md +15 -15
  52. package/agent-assets/docs/features/operations/quiet-hours.md +14 -15
  53. package/agent-assets/docs/features/operations/schedule-approaching.md +16 -14
  54. package/agent-assets/docs/features/routines/activity-scan.md +14 -11
  55. package/agent-assets/docs/features/routines/custom-routines.md +9 -7
  56. package/agent-assets/docs/features/routines/evening-review.md +6 -7
  57. package/agent-assets/docs/features/routines/morning-routine.md +22 -21
  58. package/agent-assets/docs/features/routines/weekly-review.md +57 -51
  59. package/agent-assets/docs/features/wiki/commands.md +27 -21
  60. package/agent-assets/docs/features/wiki/cost-and-approval.md +28 -23
  61. package/agent-assets/docs/features/wiki/dashboard.md +21 -23
  62. package/agent-assets/docs/features/wiki/overview.md +17 -25
  63. package/agent-assets/docs/features/wiki/search.md +15 -17
  64. package/agent-assets/docs/features/wiki/workspaces.md +55 -56
  65. package/agent-assets/docs/getting-started/01-what-is-this.md +3 -4
  66. package/agent-assets/docs/getting-started/02-first-steps.md +12 -13
  67. package/agent-assets/docs/getting-started/03-what-can-this-do.md +7 -7
  68. package/agent-assets/docs/getting-started/04-first-day.md +4 -5
  69. package/agent-assets/docs/glossary.md +17 -16
  70. package/agent-assets/docs/guides/add-a-custom-routine.md +17 -12
  71. package/agent-assets/docs/guides/backup-and-restore.md +19 -16
  72. package/agent-assets/docs/guides/budget-and-cost-for-wiki.md +55 -62
  73. package/agent-assets/docs/guides/build-your-wiki.md +11 -12
  74. package/agent-assets/docs/guides/change-which-model-handles-x.md +30 -28
  75. package/agent-assets/docs/guides/connect-a-new-mail-account.md +30 -29
  76. package/agent-assets/docs/guides/explore-with-trace-and-connect.md +30 -32
  77. package/agent-assets/docs/guides/import-knowledge-file.md +9 -10
  78. package/agent-assets/docs/guides/install-and-run.md +9 -10
  79. package/agent-assets/docs/guides/maintain-wiki-health.md +10 -10
  80. package/agent-assets/docs/guides/migrate-machines.md +16 -14
  81. package/agent-assets/docs/guides/multiple-wikis-for-multiple-domains.md +11 -12
  82. package/agent-assets/docs/guides/pause-the-agent.md +25 -25
  83. package/agent-assets/docs/guides/reinstall-cleanly.md +13 -12
  84. package/agent-assets/docs/guides/setup-wizard.md +9 -11
  85. package/agent-assets/docs/guides/switch-default-backend.md +9 -9
  86. package/agent-assets/docs/guides/use-an-existing-obsidian-vault.md +9 -11
  87. package/agent-assets/docs/pages/activity.md +76 -0
  88. package/agent-assets/docs/pages/agents.md +78 -0
  89. package/agent-assets/docs/pages/analytics.md +70 -0
  90. package/agent-assets/docs/pages/browser.md +73 -0
  91. package/agent-assets/docs/pages/chat.md +67 -0
  92. package/agent-assets/docs/pages/connections.md +78 -0
  93. package/agent-assets/docs/pages/git.md +73 -0
  94. package/agent-assets/docs/pages/knowledge.md +75 -0
  95. package/agent-assets/docs/pages/overview.md +90 -0
  96. package/agent-assets/docs/pages/reading.md +65 -0
  97. package/agent-assets/docs/pages/settings.md +77 -0
  98. package/agent-assets/docs/pages/tasks.md +74 -0
  99. package/agent-assets/docs/pages/wiki.md +73 -0
  100. package/agent-assets/docs/reference/api.md +18 -17
  101. package/agent-assets/docs/reference/cli-commands.md +13 -10
  102. package/agent-assets/docs/reference/config.md +40 -35
  103. package/agent-assets/docs/reference/disallowed-tools.md +18 -17
  104. package/agent-assets/docs/reference/keyboard-shortcuts.md +6 -8
  105. package/agent-assets/docs/reference/knowledge-layout.md +10 -10
  106. package/agent-assets/docs/reference/process-keys.md +20 -22
  107. package/agent-assets/docs/reference/skills.md +18 -16
  108. package/agent-assets/docs/troubleshooting/auth-failed.md +13 -11
  109. package/agent-assets/docs/troubleshooting/dashboard-shows-degraded.md +10 -10
  110. package/agent-assets/docs/troubleshooting/fallback-keeps-firing.md +26 -24
  111. package/agent-assets/docs/troubleshooting/messaging-not-pairing.md +8 -9
  112. package/agent-assets/docs/troubleshooting/morning-routine-didnt-run.md +19 -18
  113. package/agent-assets/docs/troubleshooting/observation-not-detected.md +14 -15
  114. package/agent-assets/docs/troubleshooting/quota-exhausted.md +28 -26
  115. package/agent-assets/docs/troubleshooting/wiki-ingest-full-blocked.md +35 -34
  116. package/agent-assets/docs/troubleshooting/wiki-write-failed.md +21 -24
  117. package/agent-assets/skills/agent-create/SKILL.md +39 -5
  118. package/agent-assets/skills/background-task/SKILL.md +9 -4
  119. package/agent-assets/skills/board/SKILL.md +8 -9
  120. package/agent-assets/skills/browser-task/SKILL.md +2 -0
  121. package/agent-assets/skills/context/seeds/file-responsibilities.seed.json +2 -1
  122. package/agent-assets/skills/schedule/SKILL.md +6 -5
  123. package/agent-assets/skills/sources/SKILL.md +68 -0
  124. package/agent-assets/skills/sources/curation.json +21 -0
  125. package/agent-assets/skills/sources/seeds/filing-rules.seed.json +25 -0
  126. package/agent-assets/skills/sources/seeds/source-collections.seed.json +20 -0
  127. package/agent-assets/skills/task/SKILL.md +5 -2
  128. package/agent-assets/task-flows/background_task.md +29 -3
  129. package/agent-assets/task-flows/message.received.dm.md +1 -1
  130. package/agent-assets/task-flows/routine.activity_scan.md +17 -2
  131. package/agent-assets/task-flows/routine.evening_review.md +72 -11
  132. package/agent-assets/task-flows/routine.fetch_window.md +21 -0
  133. package/agent-assets/task-flows/routine.monthly_review.md +3 -1
  134. package/agent-assets/task-flows/routine.morning_routine_today.md +26 -7
  135. package/agent-assets/task-flows/routine.source_maintenance.md +50 -0
  136. package/agent-assets/task-flows/scheduled.dm.md +8 -3
  137. package/agent-assets/templates/_manifest.json +1 -0
  138. package/agent-assets/templates/knowledge/sources/_index.md +19 -0
  139. package/package.json +4 -4
@@ -16,7 +16,6 @@ summary: |
16
16
  agent uses the same channel to send notifications back.
17
17
  section: messaging
18
18
  tags:
19
- - core
20
19
  - messaging
21
20
  - integrations
22
21
  - pairing
@@ -29,7 +28,7 @@ ask_examples:
29
28
  - Can I send the agent a voice note?
30
29
  locale: en-US
31
30
  created: 2026-04-25
32
- updated: 2026-06-07
31
+ updated: 2026-07-01
33
32
  keywords:
34
33
  - messaging
35
34
  - dm
@@ -66,17 +65,17 @@ config_keys:
66
65
 
67
66
  # Messaging Overview
68
67
 
69
- Aitne treats DMs from a paired messaging app as its primary reactive
70
- surface you message it, it answers; it messages you when a
71
- notification fires. Voice notes are transcribed locally with Whisper
68
+ Direct messages (DMs) from a paired messaging app are Aitne's main way
69
+ to talk with you: you message it, it answers; it messages you back when
70
+ a notification fires. Voice notes are transcribed locally with Whisper,
72
71
  so you can talk to the agent the same way you'd type.
73
72
 
74
73
  ## What It Does
75
74
 
76
75
  - **Reactive DMs**: the agent answers every direct message you send.
77
76
  - **@-mentions (Slack and Discord)**: @-mentioning the agent inside a
78
- shared channel routes to the `message.mention` ProcessKey and is
79
- answered the same way as a DM. Telegram and WhatsApp drop all non-DM
77
+ shared channel routes to the `message.mention` process key and is
78
+ answered the same way as a DM. Telegram and WhatsApp ignore all non-DM
80
79
  traffic (no group support).
81
80
  - **Outbound notifications**: routines and observations fire alerts
82
81
  back through the same channel.
@@ -94,16 +93,17 @@ so you can talk to the agent the same way you'd type.
94
93
 
95
94
  Aitne serves exactly one owner. Any message that does not come from a
96
95
  paired owner channel is dropped — group chats, multi-user Slack DMs
97
- (`mpim`), and unrecognized senders never reach the agent. This is
98
- defense in depth: both the messaging adapter and the dispatcher check
99
- the owner channel independently.
96
+ (`mpim`), and unrecognized senders never reach the agent. Two layers
97
+ enforce this independently (defense in depth): the messaging adapter
98
+ and the dispatcher each check the owner channel on their own.
100
99
 
101
100
  ## When It Runs / How It Is Triggered
102
101
 
103
- - The messaging adapter for each connected platform long-polls
104
- (Telegram) or holds a persistent WebSocket connection (Slack,
105
- Discord, WhatsApp) for incoming messages.
106
- - An incoming DM dispatches to the `message.dm` ProcessKey.
102
+ - The messaging adapter for each connected platform watches for
103
+ incoming messages Telegram by long-polling (repeatedly asking the
104
+ server for updates), Slack, Discord, and WhatsApp by holding an
105
+ always-open WebSocket connection.
106
+ - An incoming DM dispatches to the `message.dm` process key.
107
107
  - An incoming mention dispatches to `message.mention`.
108
108
  - Notifications fire as a side-effect of routines and observations
109
109
  reaching the notifier (subject to quiet hours and rate limits).
@@ -17,7 +17,6 @@ summary: |
17
17
  to your owner identity so nobody else can impersonate you.
18
18
  section: messaging
19
19
  tags:
20
- - core
21
20
  - messaging
22
21
  - pairing
23
22
  - safety
@@ -25,7 +24,7 @@ tags:
25
24
  status: stable
26
25
  locale: en-US
27
26
  created: 2026-04-25
28
- updated: 2026-05-28
27
+ updated: 2026-07-01
29
28
  keywords:
30
29
  - pairing
31
30
  - magic phrase
@@ -86,23 +85,24 @@ on the platform.
86
85
 
87
86
  ### The magic phrase (Slack, Discord)
88
87
 
89
- The dashboard generates a short, memorable phrase of four lowercase words
90
- joined by hyphens, drawn from a 64-word list (24 bits of entropy). You DM
91
- that exact phrase to the bot. Matching is tolerant it ignores case,
92
- punctuation, and emojibut the phrase must be **sent by itself**. If you
93
- wrap it in a sentence ("my phrase is apple-banana-cherry-date"), the agent
94
- will reply asking you to send the phrase on its own.
88
+ The dashboard generates a short, memorable phrase: four lowercase words
89
+ joined by hyphens, drawn from a 64-word list. That makes it easy to type
90
+ but hard to guess (24 bits of entropy). You DM that exact phrase to the
91
+ bot. Matching is forgiving it ignores case, punctuation, and emoji but
92
+ you have to send the phrase **by itself**. If you wrap it in a sentence
93
+ ("my phrase is apple-banana-cherry-date"), the agent replies asking you to
94
+ send just the phrase on its own.
95
95
 
96
- The phrase is single-use and expires after **5 minutes**. If it lapses,
97
- regenerate a fresh one from the dashboard.
96
+ The phrase works once and expires after **5 minutes**. If it runs out,
97
+ generate a fresh one from the dashboard.
98
98
 
99
99
  ### Token pairing (Telegram, WhatsApp)
100
100
 
101
101
  Telegram and WhatsApp don't use a typed phrase:
102
102
 
103
- - **Telegram** encodes a high-entropy, single-use token in a QR / deep
103
+ - **Telegram** hides a hard-to-guess, one-time token inside the QR / deep
104
104
  link. Tapping **START** sends `/start <token>` to the bot, which
105
- promotes you to owner. The token is matched exactly and also expires
105
+ promotes you to owner. The token has to match exactly and also expires
106
106
  after 5 minutes.
107
107
  - **WhatsApp** uses WhatsApp's own linked-device flow — you scan a QR from
108
108
  your phone to attach the daemon as a device. Set the owner phone number
@@ -17,7 +17,6 @@ section: messaging
17
17
  tags:
18
18
  - messaging
19
19
  - integrations
20
- - slack
21
20
  - pairing
22
21
  status: stable
23
22
  ask_examples:
@@ -26,7 +25,7 @@ ask_examples:
26
25
  - Can the agent listen in shared channels?
27
26
  locale: en-US
28
27
  created: 2026-04-25
29
- updated: 2026-05-28
28
+ updated: 2026-07-01
30
29
  keywords:
31
30
  - slack
32
31
  - socket mode
@@ -49,18 +48,20 @@ config_keys:
49
48
 
50
49
  ## In One Sentence
51
50
 
52
- A Slack bot user becomes the agent's surface in your workspace: DMs to
53
- the bot are owner messages, and `@`-mentions of the bot in channels are
54
- mention events but only from the one paired owner.
51
+ You add a Slack bot user to your workspace, and that bot is how you talk
52
+ to the agent: DMs you send the bot are treated as owner messages, and
53
+ `@`-mentions of the bot in channels are treated as mentions — but only
54
+ when they come from the one paired owner.
55
55
 
56
56
  ## What It Does
57
57
 
58
- - Listens for **DMs** to the bot (owner reactive path).
58
+ - Listens for **DMs** to the bot your direct messages to the agent.
59
59
  - Listens for **`@`-mentions of the bot** in channels you've added it to.
60
60
  - Sends notifications back to your owner DM.
61
61
 
62
- The adapter runs over Slack **Socket Mode** (a WebSocket), so Aitne does
63
- not need a public inbound URL or webhook endpoint.
62
+ The adapter connects to Slack over **Socket Mode**, a WebSocket (a
63
+ persistent two-way link Slack opens to Aitne). Because Slack does the
64
+ reaching-out, Aitne needs no public inbound URL or webhook endpoint.
64
65
 
65
66
  ## Single-Owner Scope
66
67
 
@@ -13,7 +13,6 @@ section: messaging
13
13
  tags:
14
14
  - messaging
15
15
  - integrations
16
- - telegram
17
16
  status: stable
18
17
  config_keys:
19
18
  - telegramOwnerChatId
@@ -24,7 +23,7 @@ ask_examples:
24
23
  - Where do I get a Telegram bot token?
25
24
  locale: en-US
26
25
  created: 2026-04-25
27
- updated: 2026-06-07
26
+ updated: 2026-07-01
28
27
  keywords:
29
28
  - telegram
30
29
  - telegram bot
@@ -45,14 +44,15 @@ token, scan the pairing QR code.
45
44
 
46
45
  ## What It Does
47
46
 
48
- - Acts as the agent's reactive surface for your incoming direct messages (owner DMs only — group chats are ignored).
49
- - Delivers the agent's outbound notifications and replies back to the same Telegram chat.
47
+ - Receives your incoming direct messages so the agent can react to them (owner DMs only — group chats are ignored).
48
+ - Sends the agent's notifications and replies back to the same Telegram chat.
50
49
 
51
50
  ## When It Runs / How It Is Triggered
52
51
 
53
- Before pairing, nothing listens. Once you paste the bot token and complete
54
- QR / deep-link pairing, Aitne long-polls Telegram's Bot API continuously for new
55
- direct messages.
52
+ Before pairing, nothing listens. Once you paste the bot token and finish pairing
53
+ (scan the QR code or tap the deep link), Aitne continuously long-polls Telegram's
54
+ Bot API — it keeps an open request that returns the moment a new direct message
55
+ arrives.
56
56
 
57
57
  ## Where in the Dashboard
58
58
 
@@ -17,7 +17,6 @@ summary: |
17
17
  section: messaging
18
18
  tags:
19
19
  - messaging
20
- - whatsapp
21
20
  - integrations
22
21
  - pairing
23
22
  status: stable
@@ -27,7 +26,7 @@ ask_examples:
27
26
  - Why does WhatsApp say the device is unlinked?
28
27
  locale: en-US
29
28
  created: 2026-04-25
30
- updated: 2026-05-28
29
+ updated: 2026-07-01
31
30
  keywords:
32
31
  - whatsapp
33
32
  - qr code
@@ -57,10 +56,11 @@ messages that flow exactly like Telegram.
57
56
 
58
57
  ## How It Works
59
58
 
60
- Aitne connects to WhatsApp as a **linked device** (the multi-device feature
61
- in the WhatsApp mobile app), not through the WhatsApp Cloud API or a paid
62
- bridge such as Twilio. There is no business account, no bot token, and no
63
- inbound webhook to expose:
59
+ Aitne connects to WhatsApp as a **linked device** the same "linked
60
+ devices" feature in the WhatsApp mobile app that powers WhatsApp Web. It does
61
+ not use the WhatsApp Cloud API or a paid bridge such as Twilio. There is no
62
+ business account, no bot token, and no inbound webhook (a public URL that
63
+ WhatsApp would call) to expose:
64
64
 
65
65
  - You scan a QR code once to link the daemon as a device on your account.
66
66
  - Incoming WhatsApp messages arrive over the linked-device connection.
@@ -15,7 +15,6 @@ summary: |
15
15
  answer "what happened" and "what was said".
16
16
  section: operations
17
17
  tags:
18
- - core
19
18
  - operations
20
19
  - audit
21
20
  - dashboard
@@ -26,7 +25,7 @@ ask_examples:
26
25
  - How do I find why a routine failed?
27
26
  locale: en-US
28
27
  created: 2026-04-25
29
- updated: 2026-06-07
28
+ updated: 2026-07-01
30
29
  keywords:
31
30
  - activity
32
31
  - conversations
@@ -53,9 +52,9 @@ ui_anchors:
53
52
 
54
53
  ## In One Sentence
55
54
 
56
- Every agent session, action, and outcome is logged to SQLite and
57
- surfaced as the Activity timeline; the matching message-by-message
58
- detail lives one click deeper under Conversations.
55
+ The agent logs every session, action, and outcome to a local SQLite
56
+ database and shows them as the Activity timeline; the matching
57
+ message-by-message detail lives one click deeper under Conversations.
59
58
 
60
59
  ## What It Does
61
60
 
@@ -71,10 +70,11 @@ Each row links to the underlying conversation when one exists.
71
70
 
72
71
  ## How It Works
73
72
 
74
- Activity has no trigger of its own — it is a read-only projection.
75
- Every other event in the system writes to it as a side effect, landing
76
- in three SQLite tables: `agent_actions` (what happened), and
77
- `conversation_sessions` + `messages` (what was said).
73
+ Activity never runs anything on its own — it only mirrors what already
74
+ happened (a read-only view). Every other event in the system writes to
75
+ it as a side effect, landing in three SQLite tables: `agent_actions`
76
+ (what happened), plus `conversation_sessions` and `messages` (what was
77
+ said).
78
78
 
79
79
  ## What You See
80
80
 
@@ -9,12 +9,11 @@ aliases:
9
9
  - human in the loop
10
10
  category: features
11
11
  summary: |
12
- A few high-blast-radius actions queue as approvals. The action
13
- blocks until you click Approve on the dashboard Overview page;
14
- the approval card stays visible there regardless of quiet hours.
12
+ A few high-impact actions queue as approvals. The action blocks
13
+ until you click Approve on the dashboard Overview page; the
14
+ approval card stays visible there regardless of quiet hours.
15
15
  section: operations
16
16
  tags:
17
- - core
18
17
  - safety
19
18
  - operations
20
19
  status: stable
@@ -24,7 +23,7 @@ ask_examples:
24
23
  - Where do I approve a pending action?
25
24
  locale: en-US
26
25
  created: 2026-04-25
27
- updated: 2026-06-07
26
+ updated: 2026-07-01
28
27
  keywords:
29
28
  - approval
30
29
  - approve tier
@@ -47,9 +46,10 @@ api_endpoints:
47
46
 
48
47
  ## In One Sentence
49
48
 
50
- A small set of high-blast-radius actions queue as approvals; the
51
- agent waits for you to click **Approve** on the dashboard before it
52
- proceeds.
49
+ A small set of high-impact actions the ones that could cause
50
+ real harm if they ran by mistake queue as approvals. The agent
51
+ waits for you to click **Approve** on the dashboard before it runs
52
+ one.
53
53
 
54
54
  ## How It Works
55
55
 
@@ -84,10 +84,11 @@ Deny asks for confirmation before discarding the item.
84
84
  ## When Something Goes Wrong
85
85
 
86
86
  - **A stale approval you never answered:** a pending approval is
87
- discarded once the agent day rolls over (the next 04:00 local
88
- boundary) it's marked skipped rather than replayed after the
89
- day turns. If that happens, redo the request that triggered it
90
- (for example, re-send the DM or re-run the routine).
87
+ discarded once the agent day rolls over the moment "today"
88
+ resets, at 04:00 local time by default. It is marked skipped
89
+ rather than replayed after the day turns. If that happens, redo
90
+ the request that triggered it (for example, re-send the DM or
91
+ re-run the routine).
91
92
 
92
93
  ## Related
93
94
 
@@ -14,7 +14,6 @@ summary: |
14
14
  main backend's session fails over to the fallback's mid-run.
15
15
  section: operations
16
16
  tags:
17
- - core
18
17
  - operations
19
18
  - backends
20
19
  - routing
@@ -25,7 +24,7 @@ ask_examples:
25
24
  - How do fallbacks work?
26
25
  locale: en-US
27
26
  created: 2026-04-25
28
- updated: 2026-05-28
27
+ updated: 2026-07-01
29
28
  keywords:
30
29
  - backend routing
31
30
  - BackendRouter
@@ -55,64 +54,66 @@ related:
55
54
 
56
55
  ## In One Sentence
57
56
 
58
- Every job carries a ProcessKey. The router resolves that key to a
59
- `(main, fallback)` backend pair plus a tier — and if the main backend
60
- hits a quota wall or a decisive failure, the dispatcher transitions to
61
- the fallback mid-run, then DMs you that it happened.
57
+ Every job carries a ProcessKey (a label saying what kind of work it is).
58
+ The router turns that key into a `(main, fallback)` backend pair plus a
59
+ tier and if the main backend runs out of quota or hits a decisive
60
+ failure, the dispatcher switches to the fallback partway through the run,
61
+ then DMs you that it happened.
62
62
 
63
63
  ## How It Resolves a Backend
64
64
 
65
- The router never picks a model itself. The dispatcher hands it a
66
- ProcessKey, and `BackendRouter` resolves the binding in this order:
65
+ The router never picks a model on its own. The dispatcher hands it a
66
+ ProcessKey, and `BackendRouter` works out the binding in this order:
67
67
 
68
- 1. Read the `process_backend_config` table for a per-key override
68
+ 1. Check the `process_backend_config` table for a per-key override
69
69
  (`main_backend` / `main_model` / `fallback_backend` / `fallback_model`).
70
- 2. If no override exists, fall back to the ProcessKey's **default tier**
71
- (`lite` → Haiku-class, `medium` → Sonnet-class, `high` → Opus-class)
72
- and the seeded backend for that tier.
73
- 3. `dashboard.docs_qa` is **tier-locked to `medium`** — an operator pin
74
- can't move it.
70
+ 2. If there is no override, use the ProcessKey's **default tier** (a
71
+ size band: `lite` → Haiku-class, `medium` → Sonnet-class, `high` →
72
+ Opus-class) and the backend seeded for that tier.
73
+ 3. `dashboard.docs_qa` is **tier-locked to `medium`** — pinning it in the
74
+ dashboard can't move it.
75
75
 
76
76
  Only one ProcessKey — `delegated_task_heavy` — defaults to the `high`
77
- tier, and it is opt-in (gated by the `delegatedTaskHeavyEnabled` flag).
78
- No install-time surface defaults to Opus.
77
+ tier, and it is opt-in (turned on by the `delegatedTaskHeavyEnabled`
78
+ flag). Nothing you get at install time defaults to Opus.
79
79
 
80
80
  ## What Happens on Failover
81
81
 
82
- The two failover signals are `BackendQuotaError` (the backend hit a
83
- usage/budget limit) and `BackendDecisiveFailure` (auth failure, model
84
- unavailable, policy-denied, timeout, or turn-limit). When the main
85
- backend raises either:
86
-
87
- - The router **re-materializes the session workdir** for the fallback
88
- backend — writing its instruction file (`AGENTS.md` for Codex,
89
- `GEMINI.md` for Gemini, etc.) and skill set into the shared dir. Without
90
- this step a Claude → Codex fallover would leave only `CLAUDE.md` and
91
- `.claude/skills/`, and the fallback would run blind.
92
- - The fallback then executes with the same prompt and any
93
- per-session tool overrides applied to the main run.
94
- - On success, you get a **low-priority DM** noting the main backend
95
- failed and the fallback served the turn.
82
+ Two signals trigger a failover: `BackendQuotaError` (the backend hit a
83
+ usage or budget limit) and `BackendDecisiveFailure` (an auth failure,
84
+ an unavailable model, a policy-denied request, a timeout, or a
85
+ turn-limit). When the main backend raises either one:
86
+
87
+ - The router **rebuilds the working directory** for the fallback
88
+ backend — writing that backend's instruction file (`AGENTS.md` for
89
+ Codex, `GEMINI.md` for Gemini, and so on) and its skill set into the
90
+ shared folder. Skip this step and a Claude → Codex failover would find
91
+ only `CLAUDE.md` and `.claude/skills/`, so the fallback would run
92
+ blind.
93
+ - The fallback then runs with the same prompt and any per-session tool
94
+ overrides that applied to the main run.
95
+ - If it succeeds, you get a **low-priority DM** noting that the main
96
+ backend failed and the fallback served the turn.
96
97
  - If the fallback *also* fails, you get a higher-priority notification:
97
98
  `Backend execution failed: <key> encountered <kind> on <main>, then
98
- <kind> on <fallback>.` This is usually a credentials problem on both
99
+ <kind> on <fallback>.` This usually means a credentials problem on both
99
100
  sides.
100
101
 
101
102
  ## Where in the Dashboard
102
103
 
103
- - **[Settings → Models](/settings/models)** is the unified surface for
104
- picking the main and fallback backend (and tier) per ProcessKey.
104
+ - **[Settings → Models](/settings/models)** is the one place to pick the
105
+ main and fallback backend (and tier) for each ProcessKey.
105
106
  - **[Activity](/activity)** rows show which backend actually served each
106
- turn after fallback resolution, so you can see when a fallover fired.
107
+ turn once fallback was resolved, so you can spot when a failover fired.
107
108
 
108
109
  ## When Something Goes Wrong
109
110
 
110
111
  - **A `Backend execution failed` notification** means both the main and
111
112
  the fallback rejected the run. Check authentication for both backends
112
- first re-authorize from the dashboard if needed.
113
- - **A routine ran on the "wrong" backend** is usually a fallover: the
113
+ first, and re-authorize from the dashboard if needed.
114
+ - **A routine ran on the "wrong" backend** is usually a failover: the
114
115
  main backend was over quota, so the fallback served it. The Activity
115
- row will confirm which backend ran.
116
+ row confirms which backend ran.
116
117
 
117
118
  ## Related
118
119
 
@@ -20,7 +20,6 @@ summary: |
20
20
  section: operations
21
21
  tags:
22
22
  - operations
23
- - browser-automation
24
23
  - safety
25
24
  status: beta
26
25
  ask_examples:
@@ -32,7 +31,7 @@ ask_examples:
32
31
  - Where do I see the screenshots from a browser task?
33
32
  locale: en-US
34
33
  created: 2026-06-16
35
- updated: 2026-06-16
34
+ updated: 2026-07-01
36
35
  keywords:
37
36
  - browser tasks
38
37
  - browser-task
@@ -73,46 +72,49 @@ api_endpoints:
73
72
  A **browser task** is an open-ended action you ask the agent to carry
74
73
  out on the web — "send a contact form on Amazon's contact-us page",
75
74
  "check the price of X", "fill in this signup". Each task runs in a
76
- sandboxed sub-agent with **one browser tab to itself**, under allowlist
77
- enforcement, a payment-path block, and a screenshot trace. The
78
- **Browser Tasks** page (`/browser-tasks`) is the operational surface
79
- where every run shows up — what is queued, running, waiting on you, or
80
- finished.
81
-
82
- This is different from two neighbouring surfaces:
83
-
84
- - **[Browser History](browser-history)** reads your *existing* Chrome
85
- passively (research clusters, revisit nudges). It never drives a
86
- browser.
87
- - **[Managed Chromium / B-4](managed-chromium)** is the heavily-gated,
88
- default-off *purchase-confirmation* flow. Browser tasks are the
89
- general-purpose, non-purchasing actions; a final purchase confirm is
90
- the one thing they hand off to the B-4 token primitive.
75
+ *sandboxed sub-agent* (an isolated, throwaway helper the agent spins
76
+ up) that gets **one browser tab to itself**, guarded by an allowlist, a
77
+ payment-path block, and a screenshot trace of every step. The **Browser
78
+ Tasks** page (`/browser-tasks`) is where every run shows up — what is
79
+ queued, running, waiting on you, or finished.
80
+
81
+ Browser tasks are different from two related features:
82
+
83
+ - **[Browser History](../integrations/browser-history.md)** only
84
+ *reads* your existing Chrome history, passively (research clusters,
85
+ revisit nudges). It never drives a browser.
86
+ - **[Managed Chromium / B-4](managed-chromium.md)** is the
87
+ heavily-gated, default-off flow for *confirming a purchase*. Browser
88
+ tasks handle the general-purpose, non-purchasing actions; the one
89
+ thing they hand off to the B-4 token flow is a final purchase
90
+ confirmation.
91
91
 
92
92
  ## Starting a Task
93
93
 
94
- You don't start a task from this page — you ask in **DM** or `/chat`:
94
+ You don't start a task from this page — you ask in a **DM** or in
95
+ `/chat`:
95
96
 
96
97
  > "Send a contact form on Amazon's contact-us page saying my order
97
98
  > #123 never arrived."
98
99
 
99
100
  The agent creates the task (`POST /api/browser-task`), opens a tab, and
100
- works the goal step by step. You can also **schedule** one to run later
101
- (it appears here when it fires). The page itself is a read + monitor
102
- surface: filter, search, open a run, or cancel it.
101
+ works toward the goal step by step. You can also **schedule** one to
102
+ run later — it shows up here when it fires. The page itself is just for
103
+ watching and managing runs: filter, search, open a run, or cancel it.
103
104
 
104
105
  ## Reading the Page
105
106
 
106
- - **Tasks awaiting you** — a strip pinned to the top that only appears
107
+ - **Tasks awaiting you** — a strip pinned to the top that appears only
107
108
  when one or more tasks are blocked on your input. It links straight
108
- to the run that needs you. The same signal drives the nav red-dot and
109
- the persistent shell banner, so they stay in lock-step.
110
- - **Filter chips** — narrow by state (`All`, `Active`, or a specific
111
- state) and by **site**. `Active` means any non-terminal task.
112
- - **Search** — free-text match over the task description.
109
+ to the run that needs you. The same signal drives the red dot in the
110
+ nav and the banner across the top of the app, so they always agree.
111
+ - **Filter chips** — narrow the list by state (`All`, `Active`, or one
112
+ specific state) and by **site**. `Active` means any task that hasn't
113
+ finished yet.
114
+ - **Search** — free-text match against the task description.
113
115
  - **Table** — one row per task: state, description (click to open the
114
- run), site, originating channel, created time, and duration. Active
115
- rows expose a **Cancel** button.
116
+ run), site, the channel it came from, created time, and duration.
117
+ Active rows show a **Cancel** button.
116
118
 
117
119
  Click any row to open the **run detail** (`/browser-tasks/:id`): the
118
120
  step-by-step event log and the **screenshot trace** the sub-agent
@@ -120,8 +122,9 @@ captured along the way.
120
122
 
121
123
  ## Task States
122
124
 
123
- A task moves through a small state machine. Non-terminal states are
124
- still in flight; terminal states are done.
125
+ A task moves through a small set of states. Some are *non-terminal*
126
+ (the task is still going); the rest are *terminal* (the task is
127
+ finished and won't change).
125
128
 
126
129
  | State | Meaning |
127
130
  | --- | --- |
@@ -135,50 +138,53 @@ still in flight; terminal states are done.
135
138
  | `timeout` | Exceeded its time budget. |
136
139
  | `abandoned` | A pending task expired in the queue before it could start (see `browserTaskPendingQueueTimeoutMinutes`). |
137
140
 
138
- When a task is `awaiting_user` or `final_confirm`, **answer in the DM
139
- the agent sent you** — that is the loop that unblocks it. The dashboard
140
- strip and banner are just where you notice it.
141
+ When a task is `awaiting_user` or `final_confirm`, **reply in the DM
142
+ the agent sent you** — that reply is what unblocks it. The dashboard
143
+ strip and banner are just where you notice it needs you.
141
144
 
142
145
  ## Cancelling
143
146
 
144
- Active tasks have a **Cancel** button (and `POST
147
+ Active tasks have a **Cancel** button (which calls `POST
145
148
  /api/browser-task/:id/cancel`). Cancelling releases the browser context
146
- immediately and DMs you a confirmation. Terminal tasks can't be
147
- cancelled — there is nothing left to stop.
149
+ (the task's tab) right away and DMs you a confirmation. A finished
150
+ (terminal) task can't be cancelled — there is nothing left to stop.
148
151
 
149
152
  ## Safety Model (why it's safe to let it drive)
150
153
 
151
- Browser tasks inherit the project's structural browser defences — there
152
- is **no hardcoded category/brand denylist**:
154
+ Browser tasks inherit the project's structural browser defenses. There
155
+ is **no hardcoded category or brand denylist** — the safety is built
156
+ into how a task runs, not a list of banned sites:
153
157
 
154
158
  1. **One sandboxed tab per task.** Tasks don't share a browser context,
155
159
  so one task can't read another's session.
156
- 2. **Allowlist enforcement + hostname denylist.** Navigation is
157
- constrained; you manage blocked hostnames via
160
+ 2. **Allowlist enforcement plus a hostname denylist.** Where a task may
161
+ navigate is restricted; you manage the blocked hostnames via
158
162
  `browserTaskHostnameDenylist`.
159
- 3. **IP egress layer (not configurable).** Navigations that resolve to
160
- private, loopback, link-local, or cloud-metadata addresses are
161
- denied at the egress chokepointdefence-in-depth against SSRF.
163
+ 3. **IP egress layer (not configurable).** If a navigation resolves to
164
+ a private, loopback, link-local, or cloud-metadata address, it is
165
+ blocked at the network exit point defense-in-depth against SSRF
166
+ (server-side request forgery, where a request is tricked into
167
+ reaching an internal address).
162
168
  4. **Payment-path block.** A URL-pattern matcher trips at form-submit
163
- time on payment-handoff paths, so a task can't silently push a
169
+ time on payment-handoff paths, so a task can't quietly push a
164
170
  transaction through. An actual purchase requires the separate,
165
- default-off [B-4 token flow](managed-chromium).
166
- 5. **Human-in-the-loop gates.** Anything ambiguous or consequential
167
- surfaces as `awaiting_user` / `final_confirm` and waits for your DM.
171
+ default-off [B-4 token flow](managed-chromium.md).
172
+ 5. **Human-in-the-loop gates.** Anything ambiguous or high-stakes
173
+ pauses as `awaiting_user` or `final_confirm` and waits for your DM.
168
174
 
169
- See **[Safety and Execution](../../concepts/safety-and-execution)** and
170
- the **[Safety Model](../../concepts/safety-model)** for the full
175
+ See **[Safety and Execution](../../concepts/safety-and-execution.md)**
176
+ and the **[Safety Model](../../concepts/safety-model.md)** for the full
171
177
  picture.
172
178
 
173
179
  ## Configuration
174
180
 
175
181
  These keys live in the editable config (Settings → Infrastructure):
176
182
 
177
- - `browserTaskMaxConcurrent` — how many tasks may run at once; the rest
178
- queue (`pending`).
183
+ - `browserTaskMaxConcurrent` — how many tasks may run at the same time;
184
+ any extras wait in the queue (`pending`).
179
185
  - `browserTaskPendingQueueTimeoutMinutes` — how long a `pending` task
180
- waits before it is `abandoned`.
181
- - `browserTaskRespectQuietHours` — when on, tasks defer during your
182
- quiet hours rather than running overnight.
183
- - `browserTaskHostnameDenylist` — hostnames a task may never navigate
184
- to (user-managed; there is no shipped default brand/category list).
186
+ waits in the queue before it is marked `abandoned`.
187
+ - `browserTaskRespectQuietHours` — when on, tasks hold off during your
188
+ quiet hours instead of running overnight.
189
+ - `browserTaskHostnameDenylist` — hostnames a task may never visit (you
190
+ manage this list; nothing is blocked here by default).