Skip to content

Commit 4ec5704

Browse files
committed
Merge origin/staging into fix/midrun-usage-enforcement
2 parents 1291fa8 + df47953 commit 4ec5704

32 files changed

Lines changed: 1086 additions & 112 deletions

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,24 @@ 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+
150168
- name: Verify SCIM and administration over real HTTP
151169
working-directory: apps/sim
152170
env:

‎apps/docs/components/icons.tsx‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
import type { SVGProps } from 'react'
22
import { useId } from 'react'
33

4+
interface LucidIconProps extends SVGProps<SVGSVGElement> {}
5+
6+
export function LucidIcon(props: LucidIconProps) {
7+
return (
8+
<svg
9+
{...props}
10+
viewBox='-22 0 144 144.5'
11+
fill='currentColor'
12+
xmlns='http://www.w3.org/2000/svg'
13+
>
14+
<path d='M50 0L0 28.9V144.5L50 115.6V0Z' />
15+
<path d='M100 142.7V86.7L50 115.6V142.7H100Z' />
16+
</svg>
17+
)
18+
}
19+
420
export function EnrichmentIcon(props: SVGProps<SVGSVGElement>) {
521
return (
622
<svg
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
title: Lucid
3+
description: Search Lucidchart diagrams and Lucidspark boards with your own Lucid account
4+
---
5+
6+
## Connect
7+
8+
An administrator enables **Lucid → Member accounts** in **Settings → Sources**. Each person then connects Lucid in **Integrations** and approves access with their own Lucid account.
9+
10+
Sim uses [Lucid’s official read-only MCP server](https://help.lucid.co/hc/en-us/articles/51290793390740-View-and-search-Lucid-content-with-AI-tools-using-the-Lucid-read-only-MCP-server), available on Free, Individual, Team and Enterprise plans; FedRAMP accounts are not supported. No developer app, API key or additional Sim environment variables are needed. Team and Enterprise administrators may need to enable MCP access in Lucid. Lucid excludes documents owned outside the connected account, even when shared with you.
11+
12+
## Search
13+
14+
Search requires terms, even when filtering by date. Results are ranked for relevance and may not match the title literally. Start with a short document-title query, such as `deployment architecture`. Select `lucidchart` or `lucidspark` to narrow the product, or search both. Read a result to inspect its diagram or board structure.
15+
16+
To find text inside a known document, use its UUID or Lucid URL as the native query’s `project` and enter a literal phrase such as `API Gateway`. This matches shape labels and sticky-note text, case-insensitively. It does not search notes, tags, links or comments.
17+
18+
Title queries allow up to 400 characters; document-scoped text queries allow 200. Boolean and field operators are unsupported. Document search has no continuation and verifies at most 10 candidates. Dates use modification time; filtering and sorting the returned candidates cannot establish the newest or oldest document across the entire account.
19+
20+
## Diagram content
21+
22+
Reads preserve Lucid’s structured pages, nodes, connections and properties, with links back to the source. Large responses can be read in successive windows of the same document version. Sim rejects incomplete or changed documents rather than treating a partial graph as complete.
23+
24+
A complete read is limited to 8 page regions and 512 KiB. Images and external links remain references; rendered diagrams, OCR, comments and Lucidscale are not included. See [Lucid’s MCP access rules](https://help.lucid.co/hc/en-us/articles/53780064823188-For-admins-Lucid-MCP-server-security-and-authorization) for account restrictions.

‎apps/docs/content/docs/search/meta.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"hubspot",
1717
"jira",
1818
"linear",
19+
"lucid",
1920
"notion",
2021
"slack"
2122
]

‎apps/sim/app/(auth)/components/auth-button-classes.ts‎

Lines changed: 0 additions & 3 deletions
This file was deleted.

‎apps/sim/app/(auth)/components/auth-text-link.tsx‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ interface AuthTextLinkProps {
2121
/**
2222
* The canonical inline text affordance for the auth pages — forgot-password,
2323
* resend, and the legal links. Renders a {@link Link} when `href` is set and a
24-
* `<button>` otherwise, both in one light-token style. Replaces the legacy dark
25-
* `AUTH_TEXT_LINK` class string with a single props-driven source of truth.
24+
* `<button>` otherwise, both using the shared neutral text tokens.
2625
*/
2726
export function AuthTextLink({
2827
children,

‎apps/sim/app/(interfaces)/chat/components/auth/email/email-auth.tsx‎

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import { cn, Input, InputOTP, InputOTPGroup, InputOTPSlot, Label } from '@sim/em
55
import { createLogger } from '@sim/logger'
66
import { toError } from '@sim/utils/errors'
77
import { quickValidateEmail } from '@/lib/messaging/email/validation'
8-
import { AuthSubmitButton } from '@/app/(auth)/components'
9-
import { AUTH_TEXT_LINK } from '@/app/(auth)/components/auth-button-classes'
8+
import { AuthSubmitButton, AuthTextLink } from '@/app/(auth)/components'
109
import { useChatEmailOtpRequest, useChatEmailOtpVerify } from '@/hooks/queries/chats'
1110

1211
const logger = createLogger('EmailAuth')
@@ -220,28 +219,26 @@ export default function EmailAuth({ identifier }: EmailAuthProps) {
220219
Resend in <span className='text-[var(--text-primary)]'>{countdown}s</span>
221220
</span>
222221
) : (
223-
<button
224-
className={AUTH_TEXT_LINK}
222+
<AuthTextLink
225223
onClick={handleResendOtp}
226224
disabled={verifyOtp.isPending || requestOtp.isPending}
227225
>
228226
Resend
229-
</button>
227+
</AuthTextLink>
230228
)}
231229
</p>
232230
</div>
233231

234232
<div className='text-center font-light text-sm'>
235-
<button
233+
<AuthTextLink
236234
onClick={() => {
237235
setShowOtpVerification(false)
238236
setOtpValue('')
239237
setAuthError(null)
240238
}}
241-
className={AUTH_TEXT_LINK}
242239
>
243240
Change email
244-
</button>
241+
</AuthTextLink>
245242
</div>
246243
</div>
247244
)}

‎apps/sim/app/f/[token]/public-file-email-auth.tsx‎

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import { getErrorMessage } from '@sim/utils/errors'
66
import { normalizeEmail } from '@sim/utils/string'
77
import { useRouter } from 'next/navigation'
88
import { quickValidateEmail } from '@/lib/messaging/email/validation'
9-
import { AuthSubmitButton } from '@/app/(auth)/components'
10-
import { AUTH_TEXT_LINK } from '@/app/(auth)/components/auth-button-classes'
9+
import { AuthSubmitButton, AuthTextLink } from '@/app/(auth)/components'
1110
import { PublicFileAuthShell } from '@/app/f/[token]/public-file-auth-shell'
1211
import { usePublicFileOtpRequest, usePublicFileOtpVerify } from '@/hooks/queries/public-shares'
1312

@@ -176,28 +175,23 @@ export function PublicFileEmailAuth({ token }: PublicFileEmailAuthProps) {
176175
Resend in <span className='text-[var(--text-primary)]'>{countdown}s</span>
177176
</span>
178177
) : (
179-
<button
180-
className={AUTH_TEXT_LINK}
181-
onClick={resend}
182-
disabled={requestOtp.isPending || verifyOtp.isPending}
183-
>
178+
<AuthTextLink onClick={resend} disabled={requestOtp.isPending || verifyOtp.isPending}>
184179
Resend
185-
</button>
180+
</AuthTextLink>
186181
)}
187182
</p>
188183
</div>
189184

190185
<div className='text-center font-light text-sm'>
191-
<button
186+
<AuthTextLink
192187
onClick={() => {
193188
setSent(false)
194189
setOtp('')
195190
setError(null)
196191
}}
197-
className={AUTH_TEXT_LINK}
198192
>
199193
Change email
200-
</button>
194+
</AuthTextLink>
201195
</div>
202196
</div>
203197
</PublicFileAuthShell>

‎apps/sim/components/icons.tsx‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
import type { SVGProps } from 'react'
22
import { useId } from 'react'
33

4+
interface LucidIconProps extends SVGProps<SVGSVGElement> {}
5+
6+
export function LucidIcon(props: LucidIconProps) {
7+
return (
8+
<svg
9+
{...props}
10+
viewBox='-22 0 144 144.5'
11+
fill='currentColor'
12+
xmlns='http://www.w3.org/2000/svg'
13+
>
14+
<path d='M50 0L0 28.9V144.5L50 115.6V0Z' />
15+
<path d='M100 142.7V86.7L50 115.6V142.7H100Z' />
16+
</svg>
17+
)
18+
}
19+
420
export function EnrichmentIcon(props: SVGProps<SVGSVGElement>) {
521
return (
622
<svg

‎apps/sim/lib/api/contracts/credential-groups.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ export const createCredentialGroupMcpConnectorBodySchema = z.discriminatedUnion(
372372
z.object({ connectorId: z.literal('notion') }).strict(),
373373
z.object({ connectorId: z.literal('coda') }).strict(),
374374
z.object({ connectorId: z.literal('hubspot') }).strict(),
375+
z.object({ connectorId: z.literal('lucid') }).strict(),
375376
z
376377
.object({
377378
connectorId: z.literal('databricks'),

0 commit comments

Comments
 (0)