Skip to content

Commit 4ff77c6

Browse files
committed
chore: merge main into the local-first storage epic
One conflict, in the provider hook that both sides rewrote. Main gave saveProvider a return value so callers learn which row actually persisted: a single-instance save keeps the earlier provider's id, and that is the id chat target selection needs. The epic replaced the same function with a query over the server and returned nothing. Resolved by keeping the epic's implementation and restoring the contract. planProviderSave already computes the row that gets written, so it returns that. Taking either side wholesale would have been wrong: the epic's alone silently breaks the first-run handoff, main's alone reverts the switch to server-backed storage.
2 parents fdd01e8 + 22a6d7e commit 4ff77c6

91 files changed

Lines changed: 2492 additions & 2755 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/nightly.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ jobs:
101101
uses: ./.github/workflows/release-claw-server.yml
102102
permissions:
103103
contents: write
104+
pull-requests: write
104105
with:
105106
mode: build
106107
defer_finalize: true
@@ -181,6 +182,8 @@ jobs:
181182
name: Build signed BrowserOS nightly
182183
needs: [transaction, verify-components]
183184
uses: ./.github/workflows/nightly-macos-product.yml
185+
permissions:
186+
contents: read
184187
with:
185188
product: browseros
186189
state_ref: ${{ needs.transaction.outputs.state_ref }}
@@ -196,6 +199,8 @@ jobs:
196199
name: Build signed BrowserOS neo nightly
197200
needs: [transaction, verify-components]
198201
uses: ./.github/workflows/nightly-macos-product.yml
202+
permissions:
203+
contents: read
199204
with:
200205
product: browserclaw
201206
state_ref: ${{ needs.transaction.outputs.state_ref }}
@@ -228,6 +233,7 @@ jobs:
228233
uses: ./.github/workflows/release-claw-server.yml
229234
permissions:
230235
contents: write
236+
pull-requests: write
231237
with:
232238
mode: finalize
233239
state_owner: suite
@@ -273,7 +279,8 @@ jobs:
273279
needs: [transaction, finalize-server]
274280
uses: ./.github/workflows/publish-server-ota.yml
275281
permissions:
276-
contents: read
282+
contents: write
283+
pull-requests: write
277284
with:
278285
product: browseros
279286
version: ${{ needs.transaction.outputs.server_version }}
@@ -287,7 +294,8 @@ jobs:
287294
needs: [transaction, finalize-claw-server]
288295
uses: ./.github/workflows/publish-server-ota.yml
289296
permissions:
290-
contents: read
297+
contents: write
298+
pull-requests: write
291299
with:
292300
product: browserclaw
293301
version: ${{ needs.transaction.outputs.claw_server_version }}

packages/browseros-agent/apps/app-onboard/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@browseros/app-onboard",
33
"type": "module",
44
"private": true,
5-
"version": "0.0.0",
5+
"version": "0.0.1",
66
"description": "Standalone Vite app for the BrowserOS onboarding flow (app theme, base-ui).",
77
"scripts": {
88
"dev": "vite",

packages/browseros-agent/apps/app/entrypoints/app/App.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { MCPSettingsPage } from '@/screens/mcp-settings/MCPSettingsPage'
1616
import { NewTabChat } from '@/screens/newtab/index/NewTabChat'
1717
import { NewTabLayout } from '@/screens/newtab/layout/NewTabLayout'
1818
import { Personalize } from '@/screens/newtab/personalize/Personalize'
19+
import { OnboardingAiPage } from '@/screens/onboarding-ai/OnboardingAiPage'
1920
import { ProfilePage } from '@/screens/profile/ProfilePage'
2021
import { ScheduledTasksPage } from '@/screens/scheduled-tasks/ScheduledTasksPage'
2122
import { UsagePage } from '@/screens/usage/UsagePage'
@@ -89,6 +90,13 @@ export const App: FC = () => {
8990

9091
<Route path="features" element={<FeaturesPage />} />
9192

93+
{/* First-run setup, opened by the native onboarding on completion.
94+
Outside every layout route on purpose: no sidebar, no chrome. */}
95+
<Route path="onboarding">
96+
<Route path="ai" element={<OnboardingAiPage />} />
97+
<Route index element={<Navigate to="/onboarding/ai" replace />} />
98+
</Route>
99+
92100
<Route path="/" element={<Navigate to="/home" replace />} />
93101
<Route
94102
path="/personalize"

packages/browseros-agent/apps/app/modules/llm-providers/llm-providers.hooks.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ export interface UseLlmProvidersReturn {
2828
* offering to set up a first provider and saying the list is unavailable.
2929
*/
3030
isUnavailable: boolean
31-
saveProvider: (provider: LlmProviderConfig) => Promise<void>
31+
/**
32+
* Resolves with the row that was actually written. A single-instance save
33+
* keeps the existing provider's id, so the caller must not assume the id it
34+
* passed in is the one that persisted.
35+
*/
36+
saveProvider: (provider: LlmProviderConfig) => Promise<LlmProviderConfig>
3237
setDefaultProvider: (providerId: string) => Promise<void>
3338
deleteProvider: (providerId: string) => Promise<void>
3439
}
@@ -88,6 +93,10 @@ export function useLlmProviders(): UseLlmProvidersReturn {
8893
const { saved, removedIds } = planProviderSave(providers, provider)
8994
await putProvider(saved)
9095
for (const id of removedIds) await deleteProviderRow(id)
96+
// The row that persisted, which is not always the one passed in: a
97+
// single-instance save keeps the earlier provider's id, and that is the
98+
// id chat target selection has to reference.
99+
return saved
91100
},
92101
onSuccess: invalidate,
93102
})
@@ -130,9 +139,7 @@ export function useLlmProviders(): UseLlmProvidersReturn {
130139
selectedProvider: resolveSelectedProvider(providers, defaultProviderId),
131140
isLoading: providersQuery.isPending,
132141
isUnavailable: providersQuery.isError,
133-
saveProvider: async (provider) => {
134-
await saveMutation.mutateAsync(provider)
135-
},
142+
saveProvider: (provider) => saveMutation.mutateAsync(provider),
136143
setDefaultProvider,
137144
deleteProvider: async (providerId) => {
138145
await deleteMutation.mutateAsync(providerId)

packages/browseros-agent/apps/app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@browseros/app",
33
"description": "manifest.json description",
44
"private": true,
5-
"version": "0.0.145",
5+
"version": "0.0.146",
66
"type": "module",
77
"scripts": {
88
"dev": "test -d generated/graphql || bun run codegen; bun --env-file=../../.env.development wxt",

0 commit comments

Comments
 (0)