Skip to content

Commit 2a7f85d

Browse files
authored
v0.9.8: search cleanup recovery, new search providers, billing and chat reliability
2 parents 7cf57f3 + c57c905 commit 2a7f85d

446 files changed

Lines changed: 56653 additions & 2438 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.

‎.claude/rules/sim-list-ordering.md‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
description: List and menu ordering that mirrors the sidebar or toolbar, with one separator before the destructive action
2+
description: List and menu ordering that mirrors the toolbar or settings nav, encoded once, with one separator before the destructive action
33
paths:
44
- "apps/sim/app/**/*.tsx"
55
- "apps/sim/ee/**/*.tsx"
@@ -8,7 +8,7 @@ paths:
88

99
# List & Menu Ordering
1010

11-
**A list orders itself the way the user already reads the same things somewhere else.** Dropdowns, context menus, tab strips, command palettes, and settings navs are all *second* presentations of a set the user has already seen — in the sidebar, in a toolbar, in a column-header row. When the second presentation reorders that set, the user re-reads it from scratch every time.
11+
**A list orders itself the way the user already reads the same things somewhere else.** Dropdowns, context menus, tab strips, command palettes, and settings navs are all *second* presentations of a set the user has already seen — in a toolbar, in the settings nav, in a column-header row. When the second presentation reorders that set, the user re-reads it from scratch every time.
1212

1313
This is not a style preference. Order is the cheapest affordance a list has, and the only one that costs nothing to get right.
1414

@@ -18,13 +18,14 @@ Before writing a list of items, find where the user sees those same items *first
1818

1919
| The list | Mirrors |
2020
| --- | --- |
21-
| Resource menus (`+` attach, `@` mention, resource-tab `+`) | the workspace **sidebar**, top-down |
2221
| A row / root **context menu** | that surface's **toolbar**, left-to-right → top-to-bottom |
2322
| Settings tab strip, recently-deleted tabs | the **settings nav**, top-down |
2423
| A "New …" menu | the order those things appear once created |
2524

2625
Left-to-right becomes top-to-bottom. A toolbar reading `Filter · Sort · Export · Delete` becomes a menu reading Filter, Sort, Export, Delete — never alphabetized, never grouped by implementation, never "destructive last" unless the toolbar already puts it last.
2726

27+
Resource menus (`+` attach, `@` mention, resource-tab `+`) do not mirror the sidebar. Their order is a product decision encoded in `RESOURCE_MENU_ORDER` (see below), and every resource menu shares it.
28+
2829
Platform-only entries (desktop **Browser** and **Terminal**) trail the shared set rather than interleaving, so the common prefix is identical on every platform.
2930

3031
## Grouping: a rule marks a change in what the action acts on
@@ -107,10 +108,10 @@ grouping wants the standard grouping.
107108
An order duplicated across surfaces is an order that will drift. Export **one** constant and sort by it — do not hand-maintain a matching literal per menu.
108109

109110
```ts
110-
/** Top-down order for every menu listing resource families, mirroring the sidebar. */
111+
/** Top-down order for every menu listing resource families. */
111112
export const RESOURCE_MENU_ORDER: readonly MothershipResourceType[] = [
112-
'integration', 'task', 'table', 'file', 'filefolder',
113-
'knowledgebase', 'log', 'workflow', 'folder', 'browser', 'terminal', 'generic',
113+
'integration', 'task', 'dashboard', 'table', 'file', 'filefolder',
114+
'knowledgebase', 'workflow', 'log', 'folder', 'browser', 'terminal', 'generic',
114115
]
115116

116117
export function byResourceMenuOrder<T extends { type: MothershipResourceType }>(a: T, b: T) {

‎.cursor/rules/sim-list-ordering.mdc‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
---
2-
description: "List and menu ordering that mirrors the sidebar or toolbar, with one separator before the destructive action"
2+
description: "List and menu ordering that mirrors the toolbar or settings nav, encoded once, with one separator before the destructive action"
33
globs: ["apps/sim/app/**/*.tsx","apps/sim/ee/**/*.tsx","apps/sim/components/**/*.tsx"]
44
---
55

66
<!-- Generated from .claude/rules/sim-list-ordering.md by `bun run skills:sync`. Edit the source, not this file. -->
77

88
# List & Menu Ordering
99

10-
**A list orders itself the way the user already reads the same things somewhere else.** Dropdowns, context menus, tab strips, command palettes, and settings navs are all *second* presentations of a set the user has already seen — in the sidebar, in a toolbar, in a column-header row. When the second presentation reorders that set, the user re-reads it from scratch every time.
10+
**A list orders itself the way the user already reads the same things somewhere else.** Dropdowns, context menus, tab strips, command palettes, and settings navs are all *second* presentations of a set the user has already seen — in a toolbar, in the settings nav, in a column-header row. When the second presentation reorders that set, the user re-reads it from scratch every time.
1111

1212
This is not a style preference. Order is the cheapest affordance a list has, and the only one that costs nothing to get right.
1313

@@ -17,13 +17,14 @@ Before writing a list of items, find where the user sees those same items *first
1717

1818
| The list | Mirrors |
1919
| --- | --- |
20-
| Resource menus (`+` attach, `@` mention, resource-tab `+`) | the workspace **sidebar**, top-down |
2120
| A row / root **context menu** | that surface's **toolbar**, left-to-right → top-to-bottom |
2221
| Settings tab strip, recently-deleted tabs | the **settings nav**, top-down |
2322
| A "New …" menu | the order those things appear once created |
2423

2524
Left-to-right becomes top-to-bottom. A toolbar reading `Filter · Sort · Export · Delete` becomes a menu reading Filter, Sort, Export, Delete — never alphabetized, never grouped by implementation, never "destructive last" unless the toolbar already puts it last.
2625

26+
Resource menus (`+` attach, `@` mention, resource-tab `+`) do not mirror the sidebar. Their order is a product decision encoded in `RESOURCE_MENU_ORDER` (see below), and every resource menu shares it.
27+
2728
Platform-only entries (desktop **Browser** and **Terminal**) trail the shared set rather than interleaving, so the common prefix is identical on every platform.
2829

2930
## Grouping: a rule marks a change in what the action acts on
@@ -106,10 +107,10 @@ grouping wants the standard grouping.
106107
An order duplicated across surfaces is an order that will drift. Export **one** constant and sort by it — do not hand-maintain a matching literal per menu.
107108

108109
```ts
109-
/** Top-down order for every menu listing resource families, mirroring the sidebar. */
110+
/** Top-down order for every menu listing resource families. */
110111
export const RESOURCE_MENU_ORDER: readonly MothershipResourceType[] = [
111-
'integration', 'task', 'table', 'file', 'filefolder',
112-
'knowledgebase', 'log', 'workflow', 'folder', 'browser', 'terminal', 'generic',
112+
'integration', 'task', 'dashboard', 'table', 'file', 'filefolder',
113+
'knowledgebase', 'workflow', 'log', 'folder', 'browser', 'terminal', 'generic',
113114
]
114115

115116
export function byResourceMenuOrder<T extends { type: MothershipResourceType }>(a: T, b: T) {

‎.github/workflows/desktop-e2e.yml‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ on:
1414
- 'apps/sim/app/layout.tsx'
1515
- 'apps/sim/hooks/use-desktop-update-state.ts'
1616
- 'apps/sim/lib/desktop/**'
17+
- 'apps/sim/app/desktop/connect/**'
18+
- 'apps/sim/app/credential-groups/**'
19+
- 'apps/sim/hooks/queries/slack-search.ts'
20+
- 'apps/sim/hooks/queries/personal-search-integrations.ts'
21+
- 'apps/sim/hooks/use-search-integration-connection.ts'
22+
- 'apps/sim/hooks/use-github-installation-setup.ts'
23+
- 'apps/sim/app/o/**/integrations/indexed/use-member-enrollment.ts'
24+
- 'apps/sim/lib/api/contracts/desktop-source-connect.ts'
25+
- 'apps/sim/scripts/fixtures/desktop-source-connect.tsx'
1726
- 'apps/sim/app/workspace/**/browser-session/**'
1827
- 'apps/sim/app/_styles/**'
1928
- 'apps/sim/lib/postcss/**'
@@ -61,6 +70,10 @@ jobs:
6170
working-directory: apps/desktop
6271
run: bun run build
6372

73+
- name: Install system-browser fixture
74+
working-directory: apps/desktop
75+
run: bunx playwright install chromium
76+
6477
- name: Run Playwright _electron smoke suite
6578
working-directory: apps/desktop
6679
run: bunx playwright test
@@ -98,6 +111,10 @@ jobs:
98111
working-directory: apps/desktop
99112
run: bun run build
100113

114+
- name: Install system-browser fixture
115+
working-directory: apps/desktop
116+
run: bunx playwright install chromium
117+
101118
- name: Run Playwright _electron smoke suite
102119
working-directory: apps/desktop
103120
run: bunx playwright test

‎.github/workflows/desktop-release.yml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ jobs:
172172
SIM_DESKTOP_DEFAULT_ORIGIN: ${{ steps.channel.outputs.origin }}
173173
run: bun run build
174174

175+
- name: Install system-browser fixture
176+
working-directory: apps/desktop
177+
run: bunx playwright install chromium
178+
175179
- name: Run Electron smoke tests
176180
working-directory: apps/desktop
177181
env:

‎.github/workflows/test-build.yml‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,60 @@ jobs:
147147
if-no-files-found: ignore
148148
retention-days: 7
149149

150+
- name: Verify Lucid MCP search and complete diagram reads over real HTTP
151+
if: matrix.provision == 'push'
152+
working-directory: apps/sim
153+
env:
154+
NEXT_PUBLIC_APP_URL: http://127.0.0.1:3040
155+
NEXT_PUBLIC_FORCE_HOSTED: 'false'
156+
SEARCH_LUCID_REPORT_PATH: ${{ runner.temp }}/search-lucid.json
157+
run: bun scripts/test-search-lucid-e2e.ts
158+
159+
- name: Upload Lucid acceptance report
160+
if: failure() && matrix.provision == 'push'
161+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
162+
with:
163+
name: search-lucid
164+
path: ${{ runner.temp }}/search-lucid.json
165+
if-no-files-found: ignore
166+
retention-days: 7
167+
168+
- name: Verify Zoom search over real HTTP
169+
if: matrix.provision == 'push'
170+
working-directory: apps/sim
171+
env:
172+
NEXT_PUBLIC_APP_URL: http://127.0.0.1:3040
173+
NEXT_PUBLIC_FORCE_HOSTED: 'false'
174+
SEARCH_ZOOM_REPORT_PATH: ${{ runner.temp }}/search-zoom.json
175+
run: bun scripts/test-search-zoom-e2e.ts
176+
177+
- name: Upload Zoom acceptance report
178+
if: failure() && matrix.provision == 'push'
179+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
180+
with:
181+
name: search-zoom
182+
path: ${{ runner.temp }}/search-zoom.json
183+
if-no-files-found: ignore
184+
retention-days: 7
185+
186+
- name: Verify Google Meet search over real HTTP
187+
if: matrix.provision == 'push'
188+
working-directory: apps/sim
189+
env:
190+
NEXT_PUBLIC_APP_URL: http://127.0.0.1:3040
191+
NEXT_PUBLIC_FORCE_HOSTED: 'false'
192+
SEARCH_GOOGLE_MEET_REPORT_PATH: ${{ runner.temp }}/search-google-meet.json
193+
run: bun scripts/test-search-google-meet-e2e.ts
194+
195+
- name: Upload Google Meet acceptance report
196+
if: failure() && matrix.provision == 'push'
197+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
198+
with:
199+
name: search-google-meet
200+
path: ${{ runner.temp }}/search-google-meet.json
201+
if-no-files-found: ignore
202+
retention-days: 7
203+
150204
- name: Verify SCIM and administration over real HTTP
151205
working-directory: apps/sim
152206
env:

‎CLAUDE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ The `'use client'` server boundary, the app/worker runtime env split, and featur
9191
- **Components**: `'use client'` only for hooks or browser APIs. Structure order, extraction thresholds, and list-render rules: `.claude/rules/sim-components.md`. Render-performance idioms (lazy-init refs, hoisting, `Map` pre-indexing, `[...arr].sort()` never `toSorted()` on client paths): `.claude/rules/sim-react-performance.md`. For effect/state/memo/callback anti-patterns use the `/you-might-not-need-*` skills and verify against the running UI.
9292
- **State ownership**: React Query owns server data — never `useState` + `fetch`; shareable client view-state (tabs, filters, search, pagination, selected id) lives in the URL via `nuqs`; Zustand owns global client state; `useState` owns UI-only state. Hooks: `.claude/rules/sim-hooks.md`. Stores (`devtools`, `persist` only with an explicit `partialize` whitelist, workflow value invariants): `.claude/rules/sim-stores.md`. URL state: `.claude/rules/sim-url-state.md`.
9393
- **Utils**: inline a helper with one consumer; create `utils.ts` when 2+ files share it — in `lib/` (app-wide) or `feature/utils/` (feature-scoped). Check `lib/` before writing a new one.
94-
- **Lists and menus** mirror the order the user already reads elsewhere (sidebar, toolbar), encoded in one exported order constant; a separator marks only a change in what the action acts on (typically one, before the destructive action): `.claude/rules/sim-list-ordering.md`.
94+
- **Lists and menus** mirror the order the user already reads elsewhere (toolbar, settings nav), encoded in one exported order constant (resource menus share `RESOURCE_MENU_ORDER`, a product order that does not mirror the sidebar); a separator marks only a change in what the action acts on (typically one, before the destructive action): `.claude/rules/sim-list-ordering.md`.
9595
- **Caching**: `lru-cache` with a `max` ceiling, never a hand-rolled TTL `Map`; a lifecycle map is not a cache; cache the gate, never the credential: `.claude/rules/sim-caching.md`.
9696

9797
## API Contracts and Routes
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/** Matches Next's browser Buffer polyfill when bundling application code with esbuild. */
2+
export { Buffer } from 'buffer'

0 commit comments

Comments
 (0)