@saadnvd1/agent-os 0.3.794 → 0.3.807
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/app/api/busy/route.ts +2 -2
- package/app/api/chat-views/[sessionId]/route.ts +19 -0
- package/app/api/chat-views/route.test.ts +79 -0
- package/app/api/chat-views/route.ts +8 -0
- package/app/api/tips/route.test.ts +56 -0
- package/app/api/tips/route.ts +45 -0
- package/app/api/updates/health/route.ts +22 -0
- package/app/api/updates/route.test.ts +53 -0
- package/app/api/updates/settings/route.ts +37 -10
- package/app/page.tsx +17 -14
- package/components/Chat/ChatPanel.tsx +74 -59
- package/components/Chat/NewDivider.tsx +15 -0
- package/components/Chat/needs-more-history.test.ts +28 -0
- package/components/Chat/needs-more-history.ts +14 -0
- package/components/Chat/session-link.ts +7 -4
- package/components/Chat/useFind.ts +50 -1
- package/components/Chat/usePosition.ts +363 -0
- package/components/CodeSearchDialog.tsx +90 -0
- package/components/CommandPalette/CommandsBody.tsx +12 -4
- package/components/CommandPalette/useAppCommands.ts +29 -11
- package/components/DevServers/ServerLogsModal.tsx +24 -21
- package/components/Nav/HistoryButtons.tsx +128 -0
- package/components/Pane/MobileTabBar.tsx +3 -0
- package/components/Pane/index.tsx +2 -2
- package/components/Recipes/TimerFields.tsx +2 -1
- package/components/Schedules/ScheduleForm.tsx +1 -1
- package/components/SessionList/useSessionSwitching.ts +3 -2
- package/components/Settings/SettingsDialog.tsx +1 -1
- package/components/Shortcuts/PendingKeys.tsx +19 -0
- package/components/Shortcuts/ShortcutsButton.tsx +22 -0
- package/components/Shortcuts/ShortcutsDialog.tsx +122 -0
- package/components/SidebarFooter.tsx +4 -0
- package/components/Terminal/hooks/useTerminalConnection.ts +4 -3
- package/components/Tips/TipButton.tsx +39 -0
- package/components/Tips/TipDialog.tsx +148 -0
- package/components/Tips/TipHost.tsx +14 -0
- package/components/Tips/TipMedia.tsx +71 -0
- package/components/Tips/index.ts +2 -0
- package/components/Updates/AutoUpdates.tsx +141 -0
- package/components/Updates/UpdateBanner.test.ts +39 -1
- package/components/Updates/UpdateBanner.tsx +31 -5
- package/components/Updates/UpdatesSection.tsx +24 -3
- package/components/views/DesktopView.tsx +7 -9
- package/components/views/MobileView.tsx +2 -8
- package/components/views/lazy.ts +2 -2
- package/content/tips.json +541 -0
- package/content/whats-new.json +56 -0
- package/data/chat-views/index.ts +2 -0
- package/data/chat-views/keys.ts +3 -0
- package/data/chat-views/queries.ts +34 -0
- package/data/sessions/pin.ts +0 -1
- package/data/tips/index.ts +49 -0
- package/data/updates/index.ts +5 -0
- package/hooks/useChatViewsSync.ts +12 -0
- package/hooks/useNavActions.ts +104 -0
- package/hooks/useNavKeys.ts +105 -0
- package/hooks/useReloadWhenUpdated.ts +5 -1
- package/hooks/useSessionUrl.ts +23 -5
- package/lib/bus/index.ts +4 -2
- package/lib/bus/role-alias.ts +4 -2
- package/lib/bus/targets.ts +2 -1
- package/lib/busy.ts +23 -1
- package/lib/chat/escape.ts +8 -4
- package/lib/chat-views/body.ts +41 -0
- package/lib/chat-views/store.ts +67 -0
- package/lib/chat-views/types.ts +20 -0
- package/lib/db/migrations/20261031T1500_chat_views.ts +30 -0
- package/lib/db/migrations.ts +21 -0
- package/lib/keybindings/focus.ts +17 -0
- package/lib/keybindings/keymap.ts +120 -0
- package/lib/keybindings/sequence.ts +64 -0
- package/lib/live/service.ts +1 -1
- package/lib/nav/history-mirror.ts +59 -0
- package/lib/nav/history-writer.ts +109 -0
- package/lib/nav/position.ts +67 -0
- package/lib/nav/recent.ts +34 -0
- package/lib/orchestrator/armed.ts +5 -0
- package/lib/palette/sections.ts +12 -6
- package/lib/recipes/timer.ts +3 -1
- package/lib/schedules/cron.ts +14 -5
- package/lib/schedules/store.ts +3 -2
- package/lib/security/demo.ts +2 -0
- package/lib/session-url.ts +11 -5
- package/lib/tasks/finish.ts +5 -5
- package/lib/tips/conditions.ts +38 -0
- package/lib/tips/index.ts +2 -0
- package/lib/tips/load.ts +26 -0
- package/lib/tips/media.ts +101 -0
- package/lib/tips/pick.ts +35 -0
- package/lib/tips/schema.ts +82 -0
- package/lib/tips/state.ts +26 -0
- package/lib/tips/view.ts +60 -0
- package/lib/updates/auto.ts +149 -0
- package/lib/updates/banner.ts +78 -3
- package/lib/updates/check.ts +64 -8
- package/lib/updates/history.ts +99 -0
- package/lib/updates/run.ts +334 -23
- package/lib/updates/settings.ts +66 -0
- package/lib/updates/view.ts +14 -3
- package/package.json +2 -2
- package/public/tips/.gitkeep +0 -0
- package/public/tips/chat-access-picker-dark.webp +0 -0
- package/public/tips/chat-access-picker.webp +0 -0
- package/public/tips/chat-attach-files-poster.webp +0 -0
- package/public/tips/chat-attach-files.mp4 +0 -0
- package/public/tips/chat-bookmark-dark.webp +0 -0
- package/public/tips/chat-bookmark.webp +0 -0
- package/public/tips/chat-plan-mode-dark.webp +0 -0
- package/public/tips/chat-plan-mode.webp +0 -0
- package/public/tips/chat-search-poster.webp +0 -0
- package/public/tips/chat-search.mp4 +0 -0
- package/public/tips/chat-slash-menu-poster.webp +0 -0
- package/public/tips/chat-slash-menu.mp4 +0 -0
- package/public/tips/chat-tab-suggestion-poster.webp +0 -0
- package/public/tips/chat-tab-suggestion.mp4 +0 -0
- package/public/tips/chat-terminal-handoff-poster.webp +0 -0
- package/public/tips/chat-terminal-handoff.mp4 +0 -0
- package/public/tips/chat-undo-dark.webp +0 -0
- package/public/tips/chat-undo.webp +0 -0
- package/public/tips/export-ai-dark.webp +0 -0
- package/public/tips/export-ai.webp +0 -0
- package/public/tips/net-messages-dark.webp +0 -0
- package/public/tips/net-messages.webp +0 -0
- package/public/tips/recipe-save-dark.webp +0 -0
- package/public/tips/recipe-save.webp +0 -0
- package/public/tips/schedule-first-dark.webp +0 -0
- package/public/tips/schedule-first.webp +0 -0
- package/public/tips/share-check-dark.webp +0 -0
- package/public/tips/share-check.webp +0 -0
- package/public/tips/sidebar-draft-poster.webp +0 -0
- package/public/tips/sidebar-draft.mp4 +0 -0
- package/public/tips/sidebar-groups-dark.webp +0 -0
- package/public/tips/sidebar-groups.webp +0 -0
- package/public/tips/sidebar-load-dark.webp +0 -0
- package/public/tips/sidebar-load.webp +0 -0
- package/public/tips/sidebar-snooze-dark.webp +0 -0
- package/public/tips/sidebar-snooze.webp +0 -0
- package/public/tips/tasks-plan-pieces-dark.webp +0 -0
- package/public/tips/tasks-plan-pieces.webp +0 -0
- package/public/tips/tasks-sign-off-dark.webp +0 -0
- package/public/tips/tasks-sign-off.webp +0 -0
- package/public/tips/tasks-stacks-dark.webp +0 -0
- package/public/tips/tasks-stacks.webp +0 -0
- package/scripts/autodeploy +4 -0
- package/scripts/autodeploy.test.ts +12 -0
- package/scripts/check +2 -2
- package/scripts/docs-links.test.ts +1 -25
- package/scripts/lib/commands.sh +32 -1
- package/scripts/lib/deps-swap.sh +8 -6
- package/scripts/lib/heading-slugs.ts +26 -0
- package/scripts/lib/update-verify.mjs +90 -0
- package/scripts/redeploy +31 -2
- package/scripts/redeploy.test.ts +94 -3
- package/scripts/tips-lint.test.ts +77 -0
- package/scripts/tips-media.ts +31 -0
- package/scripts/update-e2e.test.ts +215 -0
- package/scripts/update-recover.mjs +130 -0
- package/scripts/update-recover.test.ts +144 -0
- package/scripts/update-run.mjs +182 -40
- package/scripts/update-run.test.ts +208 -2
- package/server.ts +3 -2
- package/stores/chatJump.ts +2 -6
- package/stores/chatPositions.ts +65 -0
- package/stores/navHistory.ts +98 -0
- package/stores/shortcutsUi.ts +20 -0
- package/stores/tips.ts +14 -0
- package/components/QuickSwitcher.tsx +0 -286
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
{
|
|
2
|
+
"v": 1,
|
|
3
|
+
"tips": [
|
|
4
|
+
{
|
|
5
|
+
"id": "chat-enter-sends",
|
|
6
|
+
"title": "Enter sends, Shift+Enter adds a line",
|
|
7
|
+
"body": "Cmd/Ctrl+Enter always sends. On a phone, Enter is a new line.",
|
|
8
|
+
"guide": {
|
|
9
|
+
"file": "chat"
|
|
10
|
+
},
|
|
11
|
+
"added": "2026-10-31"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "chat-plan-mode",
|
|
15
|
+
"title": "Plan before anything changes",
|
|
16
|
+
"body": "Turn on Plan under the composer, or press Shift+Tab, and the agent reads and plans without editing. It stays on for that session.",
|
|
17
|
+
"guide": {
|
|
18
|
+
"file": "chat"
|
|
19
|
+
},
|
|
20
|
+
"added": "2026-10-31",
|
|
21
|
+
"media": {
|
|
22
|
+
"kind": "image",
|
|
23
|
+
"src": "/tips/chat-plan-mode.webp",
|
|
24
|
+
"srcDark": "/tips/chat-plan-mode-dark.webp",
|
|
25
|
+
"alt": "The chat composer with Plan switched on, the agent's plan shown above it.",
|
|
26
|
+
"width": 768,
|
|
27
|
+
"height": 481
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "chat-attach-files",
|
|
32
|
+
"title": "Attach PDFs, spreadsheets and documents",
|
|
33
|
+
"body": "The paperclip, a paste or a drag takes up to 8 files a message, 25 MB each. Big photos are shrunk for you.",
|
|
34
|
+
"guide": {
|
|
35
|
+
"file": "chat"
|
|
36
|
+
},
|
|
37
|
+
"added": "2026-10-31",
|
|
38
|
+
"media": {
|
|
39
|
+
"kind": "video",
|
|
40
|
+
"src": "/tips/chat-attach-files.mp4",
|
|
41
|
+
"poster": "/tips/chat-attach-files-poster.webp",
|
|
42
|
+
"alt": "Two files, a PDF and a CSV, attached to the composer as chips before sending.",
|
|
43
|
+
"width": 768,
|
|
44
|
+
"height": 480,
|
|
45
|
+
"durationMs": 7300
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "chat-slash-menu",
|
|
50
|
+
"title": "Type / for commands and skills",
|
|
51
|
+
"body": "/ in the composer lists every command and skill the agent knows, filtered as you type.",
|
|
52
|
+
"guide": {
|
|
53
|
+
"file": "chat"
|
|
54
|
+
},
|
|
55
|
+
"added": "2026-10-31",
|
|
56
|
+
"media": {
|
|
57
|
+
"kind": "video",
|
|
58
|
+
"src": "/tips/chat-slash-menu.mp4",
|
|
59
|
+
"poster": "/tips/chat-slash-menu-poster.webp",
|
|
60
|
+
"alt": "Typing a slash in the composer opens a filtered list of commands and skills.",
|
|
61
|
+
"width": 768,
|
|
62
|
+
"height": 480,
|
|
63
|
+
"durationMs": 6367
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "chat-tab-suggestion",
|
|
68
|
+
"title": "Tab takes the suggested reply",
|
|
69
|
+
"body": "After the first turn, a guess at your next message shows in the empty composer. Tab or → takes it; typing sets it aside.",
|
|
70
|
+
"guide": {
|
|
71
|
+
"file": "chat"
|
|
72
|
+
},
|
|
73
|
+
"added": "2026-10-31",
|
|
74
|
+
"media": {
|
|
75
|
+
"kind": "video",
|
|
76
|
+
"src": "/tips/chat-tab-suggestion.mp4",
|
|
77
|
+
"poster": "/tips/chat-tab-suggestion-poster.webp",
|
|
78
|
+
"alt": "A grey suggested next message appears in the composer and Tab accepts it.",
|
|
79
|
+
"width": 768,
|
|
80
|
+
"height": 480,
|
|
81
|
+
"durationMs": 5233
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "chat-access-picker",
|
|
86
|
+
"title": "Choose what the agent may do",
|
|
87
|
+
"body": "The access picker under the composer has Ask first, Accept edits and Full access. Ask first shows an approval card for anything not already allowed.",
|
|
88
|
+
"guide": {
|
|
89
|
+
"file": "chat"
|
|
90
|
+
},
|
|
91
|
+
"added": "2026-10-31",
|
|
92
|
+
"media": {
|
|
93
|
+
"kind": "image",
|
|
94
|
+
"src": "/tips/chat-access-picker.webp",
|
|
95
|
+
"srcDark": "/tips/chat-access-picker-dark.webp",
|
|
96
|
+
"alt": "The access picker open in the composer, listing Ask first, Accept edits and Full access.",
|
|
97
|
+
"width": 768,
|
|
98
|
+
"height": 480
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "chat-undo",
|
|
103
|
+
"title": "Undo a message and its edits",
|
|
104
|
+
"body": "Undo on a message puts back the files the agent edited since and returns the message to the composer. Shell command changes aren't tracked.",
|
|
105
|
+
"guide": {
|
|
106
|
+
"file": "chat"
|
|
107
|
+
},
|
|
108
|
+
"added": "2026-10-31",
|
|
109
|
+
"media": {
|
|
110
|
+
"kind": "image",
|
|
111
|
+
"src": "/tips/chat-undo.webp",
|
|
112
|
+
"srcDark": "/tips/chat-undo-dark.webp",
|
|
113
|
+
"alt": "The undo button on a user message in a chat transcript.",
|
|
114
|
+
"width": 768,
|
|
115
|
+
"height": 480
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "chat-terminal-handoff",
|
|
120
|
+
"title": "Hand a chat to the terminal",
|
|
121
|
+
"body": "The Chat / Terminal switch in the tab bar resumes the same conversation in the agent's own terminal, and back.",
|
|
122
|
+
"guide": {
|
|
123
|
+
"file": "chat"
|
|
124
|
+
},
|
|
125
|
+
"added": "2026-10-31",
|
|
126
|
+
"media": {
|
|
127
|
+
"kind": "video",
|
|
128
|
+
"src": "/tips/chat-terminal-handoff.mp4",
|
|
129
|
+
"poster": "/tips/chat-terminal-handoff-poster.webp",
|
|
130
|
+
"alt": "The Chat and Terminal switch flipping a session from the chat view to its terminal.",
|
|
131
|
+
"width": 768,
|
|
132
|
+
"height": 480,
|
|
133
|
+
"durationMs": 5967
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"id": "chat-bookmark",
|
|
138
|
+
"title": "Star a message to find it later",
|
|
139
|
+
"body": "Star a message, a step or a whole turn. The star in the chat header lists them and jumps to one.",
|
|
140
|
+
"guide": {
|
|
141
|
+
"file": "chat"
|
|
142
|
+
},
|
|
143
|
+
"when": ["no-bookmarks"],
|
|
144
|
+
"added": "2026-10-31",
|
|
145
|
+
"media": {
|
|
146
|
+
"kind": "image",
|
|
147
|
+
"src": "/tips/chat-bookmark.webp",
|
|
148
|
+
"srcDark": "/tips/chat-bookmark-dark.webp",
|
|
149
|
+
"alt": "A bookmarked message with the star filled in a chat transcript.",
|
|
150
|
+
"width": 768,
|
|
151
|
+
"height": 481
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "chat-search",
|
|
156
|
+
"title": "⌘K searches every conversation",
|
|
157
|
+
"body": "Type in ⌘K for matching chats, or Tab for a full search of what you and the agents said.",
|
|
158
|
+
"guide": {
|
|
159
|
+
"file": "chat"
|
|
160
|
+
},
|
|
161
|
+
"added": "2026-10-31",
|
|
162
|
+
"media": {
|
|
163
|
+
"kind": "video",
|
|
164
|
+
"src": "/tips/chat-search.mp4",
|
|
165
|
+
"poster": "/tips/chat-search-poster.webp",
|
|
166
|
+
"alt": "The command palette searching conversations for a phrase and listing matching sessions.",
|
|
167
|
+
"width": 768,
|
|
168
|
+
"height": 480,
|
|
169
|
+
"durationMs": 8000
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "sidebar-draft",
|
|
174
|
+
"title": "⌥N opens a draft",
|
|
175
|
+
"body": "A draft in the project you're in. Nothing starts until you send, and unsent drafts wait under Drafts.",
|
|
176
|
+
"guide": {
|
|
177
|
+
"file": "sessions",
|
|
178
|
+
"anchor": "new-sessions"
|
|
179
|
+
},
|
|
180
|
+
"added": "2026-10-31",
|
|
181
|
+
"media": {
|
|
182
|
+
"kind": "video",
|
|
183
|
+
"src": "/tips/sidebar-draft.mp4",
|
|
184
|
+
"poster": "/tips/sidebar-draft-poster.webp",
|
|
185
|
+
"alt": "A new draft session opened from the New menu with a prompt typed into its composer.",
|
|
186
|
+
"width": 768,
|
|
187
|
+
"height": 480,
|
|
188
|
+
"durationMs": 7667
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"id": "sidebar-open-pr",
|
|
193
|
+
"title": "Make a session a task",
|
|
194
|
+
"body": "Tick Open a PR when done on a draft and it runs in its own worktree and ends in a pull request.",
|
|
195
|
+
"guide": {
|
|
196
|
+
"file": "sessions",
|
|
197
|
+
"anchor": "new-sessions"
|
|
198
|
+
},
|
|
199
|
+
"added": "2026-10-31"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "sidebar-pin",
|
|
203
|
+
"title": "Pin a session",
|
|
204
|
+
"body": "Pin in a row's ⋯ menu keeps it on the Pinned shelf, and a pinned session never settles on its own.",
|
|
205
|
+
"guide": {
|
|
206
|
+
"file": "sessions",
|
|
207
|
+
"anchor": "the-sidebar"
|
|
208
|
+
},
|
|
209
|
+
"added": "2026-10-31"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"id": "sidebar-snooze",
|
|
213
|
+
"title": "Snooze until tomorrow",
|
|
214
|
+
"body": "Snooze in a row's ⋯ menu hides it until 9 AM tomorrow or next Monday. It wakes early if it needs you.",
|
|
215
|
+
"guide": {
|
|
216
|
+
"file": "sessions",
|
|
217
|
+
"anchor": "the-sidebar"
|
|
218
|
+
},
|
|
219
|
+
"added": "2026-10-31",
|
|
220
|
+
"media": {
|
|
221
|
+
"kind": "image",
|
|
222
|
+
"src": "/tips/sidebar-snooze.webp",
|
|
223
|
+
"srcDark": "/tips/sidebar-snooze-dark.webp",
|
|
224
|
+
"alt": "A session row's menu open with the snooze options in the sidebar.",
|
|
225
|
+
"width": 768,
|
|
226
|
+
"height": 480
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"id": "sidebar-groups",
|
|
231
|
+
"title": "Put sessions in a group",
|
|
232
|
+
"body": "Move to group → New group… in a row's ⋯ menu gives them their own shelf. Select moves many at once.",
|
|
233
|
+
"guide": {
|
|
234
|
+
"file": "sessions",
|
|
235
|
+
"anchor": "groups"
|
|
236
|
+
},
|
|
237
|
+
"when": ["no-groups"],
|
|
238
|
+
"added": "2026-10-31",
|
|
239
|
+
"media": {
|
|
240
|
+
"kind": "image",
|
|
241
|
+
"src": "/tips/sidebar-groups.webp",
|
|
242
|
+
"srcDark": "/tips/sidebar-groups-dark.webp",
|
|
243
|
+
"alt": "The sidebar with sessions grouped under a named group header.",
|
|
244
|
+
"width": 768,
|
|
245
|
+
"height": 480
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"id": "sidebar-load",
|
|
250
|
+
"title": "The dot that shows machine load",
|
|
251
|
+
"body": "The dot in the sidebar header turns amber or red when the machine is busy. Tap it to see which sessions use the most CPU.",
|
|
252
|
+
"guide": {
|
|
253
|
+
"file": "sessions",
|
|
254
|
+
"anchor": "machine-load"
|
|
255
|
+
},
|
|
256
|
+
"added": "2026-10-31",
|
|
257
|
+
"media": {
|
|
258
|
+
"kind": "image",
|
|
259
|
+
"src": "/tips/sidebar-load.webp",
|
|
260
|
+
"srcDark": "/tips/sidebar-load-dark.webp",
|
|
261
|
+
"alt": "The sidebar load indicator showing which sessions use the most CPU and memory.",
|
|
262
|
+
"width": 768,
|
|
263
|
+
"height": 480
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"id": "tasks-sign-off",
|
|
268
|
+
"title": "Sign off and merge from the app",
|
|
269
|
+
"body": "Sign off & merge merges a task's PR once CI is green, then removes its worktree and branches.",
|
|
270
|
+
"guide": {
|
|
271
|
+
"file": "tasks"
|
|
272
|
+
},
|
|
273
|
+
"added": "2026-10-31",
|
|
274
|
+
"media": {
|
|
275
|
+
"kind": "image",
|
|
276
|
+
"src": "/tips/tasks-sign-off.webp",
|
|
277
|
+
"srcDark": "/tips/tasks-sign-off-dark.webp",
|
|
278
|
+
"alt": "A task in review with checks passing and a Sign off action.",
|
|
279
|
+
"width": 768,
|
|
280
|
+
"height": 480
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"id": "tasks-queue",
|
|
285
|
+
"title": "Cap how many tasks run at once",
|
|
286
|
+
"body": "Settings → Workspaces sets a running limit. Extra tasks wait under Queued and start in order.",
|
|
287
|
+
"guide": {
|
|
288
|
+
"file": "tasks"
|
|
289
|
+
},
|
|
290
|
+
"added": "2026-10-31"
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"id": "tasks-pause",
|
|
294
|
+
"title": "Pause a task for a while",
|
|
295
|
+
"body": "A running task's row menu pauses it for an hour, until tomorrow, or until you resume it.",
|
|
296
|
+
"guide": {
|
|
297
|
+
"file": "tasks"
|
|
298
|
+
},
|
|
299
|
+
"added": "2026-10-31"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"id": "tasks-plan-pieces",
|
|
303
|
+
"title": "Approve a plan piece by piece",
|
|
304
|
+
"body": "A plan waiting on you lists its pieces, each with Merge into ① or Drop, and Approve with note… for the whole plan.",
|
|
305
|
+
"guide": {
|
|
306
|
+
"file": "tasks",
|
|
307
|
+
"anchor": "plans-in-pieces"
|
|
308
|
+
},
|
|
309
|
+
"added": "2026-10-31",
|
|
310
|
+
"media": {
|
|
311
|
+
"kind": "image",
|
|
312
|
+
"src": "/tips/tasks-plan-pieces.webp",
|
|
313
|
+
"srcDark": "/tips/tasks-plan-pieces-dark.webp",
|
|
314
|
+
"alt": "A task plan split into pieces awaiting approval.",
|
|
315
|
+
"width": 768,
|
|
316
|
+
"height": 480
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"id": "tasks-linked-machines",
|
|
321
|
+
"title": "Run tasks on another machine",
|
|
322
|
+
"body": "Link a second machine and queued tasks start there when this one is busy. Linking more than one machine with Connect needs Pro.",
|
|
323
|
+
"guide": {
|
|
324
|
+
"file": "install",
|
|
325
|
+
"anchor": "with-agentos-connect-any-network-free-for-one-machine-pro-to-link-several"
|
|
326
|
+
},
|
|
327
|
+
"added": "2026-10-31"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"id": "tasks-stacks",
|
|
331
|
+
"title": "Run a board as a stack",
|
|
332
|
+
"body": "In a project linked to a board, Run as stack starts the cards as stacked PRs, and Land merges them in order.",
|
|
333
|
+
"guide": {
|
|
334
|
+
"file": "tasks",
|
|
335
|
+
"anchor": "stacks"
|
|
336
|
+
},
|
|
337
|
+
"added": "2026-10-31",
|
|
338
|
+
"media": {
|
|
339
|
+
"kind": "image",
|
|
340
|
+
"src": "/tips/tasks-stacks.webp",
|
|
341
|
+
"srcDark": "/tips/tasks-stacks-dark.webp",
|
|
342
|
+
"alt": "A stack of pull requests listed in order under one stack.",
|
|
343
|
+
"width": 768,
|
|
344
|
+
"height": 480
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"id": "schedule-first",
|
|
349
|
+
"title": "Start work on a timer",
|
|
350
|
+
"body": "Schedules in the sidebar's ⋯ menu runs a prompt every day, every few hours, or once.",
|
|
351
|
+
"guide": {
|
|
352
|
+
"file": "schedules",
|
|
353
|
+
"anchor": "schedules"
|
|
354
|
+
},
|
|
355
|
+
"when": ["no-schedules"],
|
|
356
|
+
"added": "2026-10-31",
|
|
357
|
+
"media": {
|
|
358
|
+
"kind": "image",
|
|
359
|
+
"src": "/tips/schedule-first.webp",
|
|
360
|
+
"srcDark": "/tips/schedule-first-dark.webp",
|
|
361
|
+
"alt": "The schedule form with a prompt, a repeat interval and a time zone.",
|
|
362
|
+
"width": 768,
|
|
363
|
+
"height": 480
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"id": "schedule-check-in",
|
|
368
|
+
"title": "Check in on a long session",
|
|
369
|
+
"body": "Schedule check-ins in a session's ⋯ menu sends it a message on a timer.",
|
|
370
|
+
"guide": {
|
|
371
|
+
"file": "schedules",
|
|
372
|
+
"anchor": "schedules"
|
|
373
|
+
},
|
|
374
|
+
"added": "2026-10-31"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"id": "recipe-save",
|
|
378
|
+
"title": "Save a job you'll do again",
|
|
379
|
+
"body": "Save as recipe on a finished session or task fills in a recipe from what it did. Each run starts fresh.",
|
|
380
|
+
"guide": {
|
|
381
|
+
"file": "schedules",
|
|
382
|
+
"anchor": "recipes"
|
|
383
|
+
},
|
|
384
|
+
"when": ["no-recipes"],
|
|
385
|
+
"added": "2026-10-31",
|
|
386
|
+
"media": {
|
|
387
|
+
"kind": "image",
|
|
388
|
+
"src": "/tips/recipe-save.webp",
|
|
389
|
+
"srcDark": "/tips/recipe-save-dark.webp",
|
|
390
|
+
"alt": "The menu action that saves a conversation as a recipe.",
|
|
391
|
+
"width": 768,
|
|
392
|
+
"height": 480
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
"id": "net-peers",
|
|
397
|
+
"title": "Sessions can talk to each other",
|
|
398
|
+
"body": "Agents run aos peers to see other sessions and aos send to message one.",
|
|
399
|
+
"guide": {
|
|
400
|
+
"file": "agent-network"
|
|
401
|
+
},
|
|
402
|
+
"added": "2026-10-31"
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
"id": "net-await",
|
|
406
|
+
"title": "Wait for a reply without polling",
|
|
407
|
+
"body": "aos send <session> --await ends the agent's turn and wakes it with the answer.",
|
|
408
|
+
"guide": {
|
|
409
|
+
"file": "agent-network",
|
|
410
|
+
"anchor": "waiting-on-a-peer"
|
|
411
|
+
},
|
|
412
|
+
"added": "2026-10-31"
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"id": "net-messages",
|
|
416
|
+
"title": "Read what your agents say to each other",
|
|
417
|
+
"body": "Messages shows every conversation between sessions, and you can join any of them.",
|
|
418
|
+
"guide": {
|
|
419
|
+
"file": "agent-network"
|
|
420
|
+
},
|
|
421
|
+
"added": "2026-10-31",
|
|
422
|
+
"media": {
|
|
423
|
+
"kind": "image",
|
|
424
|
+
"src": "/tips/net-messages.webp",
|
|
425
|
+
"srcDark": "/tips/net-messages-dark.webp",
|
|
426
|
+
"alt": "A session sending and receiving messages from another session.",
|
|
427
|
+
"width": 768,
|
|
428
|
+
"height": 480
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"id": "phone-pair",
|
|
433
|
+
"title": "Use AgentOS from your phone",
|
|
434
|
+
"body": "Settings → Devices & access → Add a device shows a code to scan. Each code works once.",
|
|
435
|
+
"guide": {
|
|
436
|
+
"file": "phone",
|
|
437
|
+
"anchor": "pair-the-phone"
|
|
438
|
+
},
|
|
439
|
+
"when": ["no-paired-device"],
|
|
440
|
+
"added": "2026-10-31"
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"id": "phone-connect",
|
|
444
|
+
"title": "Reach this machine from anywhere",
|
|
445
|
+
"body": "Connect gives it a private address that works off your home network, free for one machine.",
|
|
446
|
+
"guide": {
|
|
447
|
+
"file": "phone",
|
|
448
|
+
"anchor": "from-anywhere-with-connect"
|
|
449
|
+
},
|
|
450
|
+
"when": ["connect-not-linked"],
|
|
451
|
+
"added": "2026-10-31"
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
"id": "phone-push",
|
|
455
|
+
"title": "Get pushes when an agent needs you",
|
|
456
|
+
"body": "Settings → Notifications → Your phone sends a test push to check it works.",
|
|
457
|
+
"guide": {
|
|
458
|
+
"file": "phone",
|
|
459
|
+
"anchor": "notifications"
|
|
460
|
+
},
|
|
461
|
+
"when": ["no-push-device"],
|
|
462
|
+
"added": "2026-10-31"
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
"id": "share-check",
|
|
466
|
+
"title": "Shares are masked before upload",
|
|
467
|
+
"body": "The Share dialog shows exactly what goes up, with secrets, addresses and emails masked. Nothing leaves until Create link.",
|
|
468
|
+
"guide": {
|
|
469
|
+
"file": "sharing",
|
|
470
|
+
"anchor": "check-it-first"
|
|
471
|
+
},
|
|
472
|
+
"when": ["no-shares"],
|
|
473
|
+
"added": "2026-10-31",
|
|
474
|
+
"media": {
|
|
475
|
+
"kind": "image",
|
|
476
|
+
"src": "/tips/share-check.webp",
|
|
477
|
+
"srcDark": "/tips/share-check-dark.webp",
|
|
478
|
+
"alt": "The share dialog preview showing secrets, addresses and emails masked.",
|
|
479
|
+
"width": 768,
|
|
480
|
+
"height": 481
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
"id": "share-expiry",
|
|
485
|
+
"title": "Links can expire",
|
|
486
|
+
"body": "Create link lasts 1, 7 or 30 days, or never. Revoke one in Settings → Shared links.",
|
|
487
|
+
"guide": {
|
|
488
|
+
"file": "sharing",
|
|
489
|
+
"anchor": "create-the-link"
|
|
490
|
+
},
|
|
491
|
+
"added": "2026-10-31"
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
"id": "export-ai",
|
|
495
|
+
"title": "Hand a chat to another AI",
|
|
496
|
+
"body": "Export for AI… in the ⋯ menu saves the chat as Markdown, JSON or HTML, with secrets masked.",
|
|
497
|
+
"guide": {
|
|
498
|
+
"file": "export"
|
|
499
|
+
},
|
|
500
|
+
"added": "2026-10-31",
|
|
501
|
+
"media": {
|
|
502
|
+
"kind": "image",
|
|
503
|
+
"src": "/tips/export-ai.webp",
|
|
504
|
+
"srcDark": "/tips/export-ai-dark.webp",
|
|
505
|
+
"alt": "The export menu with an option to copy the conversation for another AI.",
|
|
506
|
+
"width": 768,
|
|
507
|
+
"height": 481
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
"id": "export-compact",
|
|
512
|
+
"title": "Compact export for long chats",
|
|
513
|
+
"body": "Compact drops thinking and trims tool output, and the sheet warns when a file is too big for most models.",
|
|
514
|
+
"guide": {
|
|
515
|
+
"file": "export",
|
|
516
|
+
"anchor": "what-you-choose"
|
|
517
|
+
},
|
|
518
|
+
"added": "2026-10-31"
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"id": "update-when-idle",
|
|
522
|
+
"title": "Update without interrupting work",
|
|
523
|
+
"body": "Update when idle in the update banner waits until nothing is working.",
|
|
524
|
+
"guide": {
|
|
525
|
+
"file": "install",
|
|
526
|
+
"anchor": "update-from-the-app"
|
|
527
|
+
},
|
|
528
|
+
"added": "2026-10-31"
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
"id": "tips-whats-new",
|
|
532
|
+
"title": "See what changed in each update",
|
|
533
|
+
"body": "The sparkle next to the lightbulb lists every change. A dot on it means something new since you last looked.",
|
|
534
|
+
"guide": {
|
|
535
|
+
"file": "tips",
|
|
536
|
+
"anchor": "whats-new"
|
|
537
|
+
},
|
|
538
|
+
"added": "2026-10-31"
|
|
539
|
+
}
|
|
540
|
+
]
|
|
541
|
+
}
|
package/content/whats-new.json
CHANGED
|
@@ -1793,6 +1793,62 @@
|
|
|
1793
1793
|
"area": "Chat",
|
|
1794
1794
|
"text": "GitHub Copilot chats can now ask you questions with clickable answer cards, like Claude chats do.",
|
|
1795
1795
|
"url": "https://github.com/saadnvd1/agent-os/pull/530"
|
|
1796
|
+
},
|
|
1797
|
+
{
|
|
1798
|
+
"id": 531,
|
|
1799
|
+
"date": "2026-10-31",
|
|
1800
|
+
"kind": "new",
|
|
1801
|
+
"area": "Updates",
|
|
1802
|
+
"text": "AgentOS now keeps itself up to date once nothing is working, and goes back to the previous version on its own if an update doesn't start cleanly.",
|
|
1803
|
+
"url": "https://github.com/saadnvd1/agent-os/pull/531"
|
|
1804
|
+
},
|
|
1805
|
+
{
|
|
1806
|
+
"id": 532,
|
|
1807
|
+
"date": "2026-10-31",
|
|
1808
|
+
"kind": "new",
|
|
1809
|
+
"area": "AgentOS",
|
|
1810
|
+
"text": "A lightbulb in the sidebar shows one short tip a day about a feature you may have missed, and you can turn tips off in Settings.",
|
|
1811
|
+
"url": "https://github.com/saadnvd1/agent-os/pull/532"
|
|
1812
|
+
},
|
|
1813
|
+
{
|
|
1814
|
+
"id": 533,
|
|
1815
|
+
"date": "2026-10-31",
|
|
1816
|
+
"kind": "fixed",
|
|
1817
|
+
"area": "Chat",
|
|
1818
|
+
"text": "Chats now fill the screen with earlier messages on open instead of showing a nearly empty view with a \"Show earlier messages\" button.",
|
|
1819
|
+
"url": "https://github.com/saadnvd1/agent-os/pull/533"
|
|
1820
|
+
},
|
|
1821
|
+
{
|
|
1822
|
+
"id": 536,
|
|
1823
|
+
"date": "2026-10-31",
|
|
1824
|
+
"kind": "new",
|
|
1825
|
+
"area": "AgentOS",
|
|
1826
|
+
"text": "Tip of the Day now shows pictures and short clips that demonstrate each tip.",
|
|
1827
|
+
"url": "https://github.com/saadnvd1/agent-os/pull/536"
|
|
1828
|
+
},
|
|
1829
|
+
{
|
|
1830
|
+
"id": 537,
|
|
1831
|
+
"date": "2026-10-31",
|
|
1832
|
+
"kind": "new",
|
|
1833
|
+
"area": "AgentOS",
|
|
1834
|
+
"text": "Chats now reopen where you left off, with back and forward buttons, a quick chat switcher and a keyboard shortcuts list.",
|
|
1835
|
+
"url": "https://github.com/saadnvd1/agent-os/pull/537"
|
|
1836
|
+
},
|
|
1837
|
+
{
|
|
1838
|
+
"id": 539,
|
|
1839
|
+
"date": "2026-10-31",
|
|
1840
|
+
"kind": "fixed",
|
|
1841
|
+
"area": "AgentOS",
|
|
1842
|
+
"text": "Holding Shift with a letter no longer triggers the shortcut meant for that letter on its own.",
|
|
1843
|
+
"url": "https://github.com/saadnvd1/agent-os/pull/539"
|
|
1844
|
+
},
|
|
1845
|
+
{
|
|
1846
|
+
"id": 541,
|
|
1847
|
+
"date": "2026-10-31",
|
|
1848
|
+
"kind": "new",
|
|
1849
|
+
"area": "Chat",
|
|
1850
|
+
"text": "Pressing Esc now takes you out of the message box when there is nothing else for it to do.",
|
|
1851
|
+
"url": "https://github.com/saadnvd1/agent-os/pull/541"
|
|
1796
1852
|
}
|
|
1797
1853
|
]
|
|
1798
1854
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useQuery } from "@tanstack/react-query";
|
|
2
|
+
import type { ChatView, ChatViewInput } from "@/lib/chat-views/types";
|
|
3
|
+
import { chatViewKeys } from "./keys";
|
|
4
|
+
|
|
5
|
+
export type { ChatView } from "@/lib/chat-views/types";
|
|
6
|
+
|
|
7
|
+
/** Where each chat was last read and when, newest first. Another device's
|
|
8
|
+
* reading shows up when this tab is focused again. */
|
|
9
|
+
export function useChatViews() {
|
|
10
|
+
return useQuery({
|
|
11
|
+
queryKey: chatViewKeys.all,
|
|
12
|
+
queryFn: async (): Promise<ChatView[]> => {
|
|
13
|
+
const res = await fetch("/api/chat-views");
|
|
14
|
+
if (!res.ok) throw new Error("Failed to fetch chat views");
|
|
15
|
+
return (await res.json()).views;
|
|
16
|
+
},
|
|
17
|
+
staleTime: 30_000,
|
|
18
|
+
refetchOnWindowFocus: true,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Saves where the reader is, or (null) that they just opened the chat.
|
|
23
|
+
* keepalive lets it finish while the page unloads. */
|
|
24
|
+
export function saveChatView(
|
|
25
|
+
sessionId: string,
|
|
26
|
+
input: (Omit<ChatViewInput, "advance"> & { advance?: boolean }) | null
|
|
27
|
+
): void {
|
|
28
|
+
void fetch(`/api/chat-views/${encodeURIComponent(sessionId)}`, {
|
|
29
|
+
method: "PUT",
|
|
30
|
+
headers: { "Content-Type": "application/json" },
|
|
31
|
+
body: JSON.stringify(input ?? { viewed: true }),
|
|
32
|
+
keepalive: true,
|
|
33
|
+
}).catch(() => {});
|
|
34
|
+
}
|