diff --git a/apps/docs/content/docs/browser-extension/index.mdx b/apps/docs/content/docs/browser-extension/index.mdx index 8b0d35cfeca..20eb0d16ba8 100644 --- a/apps/docs/content/docs/browser-extension/index.mdx +++ b/apps/docs/content/docs/browser-extension/index.mdx @@ -1,6 +1,6 @@ --- title: Sim browser extension -description: Ask Sim about the page you’re reading, share a screenshot, and open your team’s Sim Links from Chrome. +description: Ask Sim about the page you’re reading, share a screenshot, and open your team’s go/ links from Chrome. --- [Install Sim for Chrome](https://chromewebstore.google.com/detail/sim/oanlcahddodnjpdoopcpjlcageejjpmg) to ask questions about a page without leaving it. Open Chrome’s **Extensions** menu and pin **Sim** to keep it one click away. @@ -13,13 +13,13 @@ description: Ask Sim about the page you’re reading, share a screenshot, and op To ask about a passage, select the text on the page, right-click, and choose **Ask Sim about selection**. You can attach up to three snapshots to compare pages. A snapshot stays as it was when you captured it. Chrome settings pages, other extensions, and pages without readable text can’t be attached. -In version 0.1.3 or later, open **+ → Reference current page on send** to include the active tab each time you send a message. This is off by default. The setting appears above the workspace list, and Sim remembers your choice in this Chrome profile. The globe shows **Current page** while this is on. If you attached a page or selection yourself, Sim uses those snapshots instead. Turn the setting off in the same menu. +Open **+ → Reference current page on send** to include the active tab each time you send a message. This is off by default. The setting appears above the workspace list, and Sim remembers your choice in this Chrome profile. The globe shows **Current page** while this is on. If you attached a page or selection yourself, Sim uses those snapshots instead. Turn the setting off in the same menu. If Chrome needs access after you switch tabs, your message stays in the composer. Select **Request site access**. If Chrome hasn’t shared the site address with Sim, paste it into **Site address**. Check the site shown on **Allow access**, approve it in Chrome’s permission dialog, then send again. For one-time access, click the Sim toolbar icon on the active tab and retry. Open **+ → Site access** to remove a saved permission. To share a screenshot, drag the image file onto the open chat. It uploads to Sim and appears as an attachment you can remove before sending. If a website supplies only an image URL, paste the image itself or use the file picker. -For faster access, press **Command + Shift + S** on macOS or **Alt + Shift + S** on Windows and Linux. In version 0.1.3 or later, the shortcut attaches highlighted text when you have a selection. It won't substitute the whole page for an unreadable selection. With no selection, it attaches the page or uses your send-time reference setting. On an already-open sidebar, Chrome may keep keyboard focus on the website. Click the message field, or use Chrome’s pane navigation (on Mac, **Command + Option + Up**). +For faster access, press **Command + Shift + S** on macOS or **Alt + Shift + S** on Windows and Linux. The shortcut attaches highlighted text when you have a selection. It won't substitute the whole page for an unreadable selection. With no selection, it attaches the page or uses your send-time reference setting. On an already-open sidebar, Chrome may keep keyboard focus on the website. Click the message field, or use Chrome’s pane navigation (on Mac, **Command + Option + Up**). If Chrome needs access to a new tab, the sidebar shows the shortcut assigned in this Chrome profile, or **Set shortcut** if none is assigned. You can change it under **Extensions → Keyboard shortcuts**. @@ -27,9 +27,9 @@ If Chrome needs access to a new tab, the sidebar shows the shortcut assigned in Share the chat extension’s install link with your team. In managed Chrome, an admin can [allow the extension for an organizational unit](https://support.google.com/chrome/a/answer/6306504) so people can install it themselves. -If your organization has [Sim Links](/search/sim-links), type `sim`, press **Space**, and enter part of a link name for suggestions. To open a shortcut by typing it directly, include the trailing slash, as in `sim/handbook/`. Teams that already use an internal host named `sim` should keep that hostname conflict in mind: the chat extension routes those navigations to Sim. +If your organization has [Links](/search/sim-links), type `sim`, press **Space**, and enter part of a link name for suggestions. To open a shortcut by typing it directly, include the trailing slash, as in `go/handbook/` or `sim/handbook/`. Teams that already use an internal host named `go` or `sim`, or another go-links extension, should keep that conflict in mind: the extension routes those navigations to Sim, and when two extensions redirect the same address, Chrome uses the most recently installed one. -In version 0.1.3 or later, **+ → Browser shortcuts** can recover explicit `sim/handbook` searches on Google, Bing, DuckDuckGo, and Yahoo. Enable your provider and approve the site access shown by Chrome. This leaves ordinary searches and your default search engine unchanged. See [shortcut setup and supported inputs](/search/sim-links#open-links-from-the-address-bar). +**+ → Browser shortcuts** can recover explicit `go/handbook` and `sim/handbook` searches on Google, Bing, DuckDuckGo, and Yahoo. Enable your provider and approve the site access shown by Chrome. This leaves ordinary searches and your default search engine unchanged. See [shortcut setup and supported inputs](/search/sim-links#open-links-from-the-address-bar). ## Page access and privacy diff --git a/apps/docs/content/docs/search/sim-links.mdx b/apps/docs/content/docs/search/sim-links.mdx index 3520c7c0eac..ed30b37e25a 100644 --- a/apps/docs/content/docs/search/sim-links.mdx +++ b/apps/docs/content/docs/search/sim-links.mdx @@ -1,11 +1,11 @@ --- -title: Sim Links -description: Short sim/ links that take everyone in your organization to the right page +title: Links +description: Short go/ and sim/ links that take everyone in your organization to the right page --- -Sim Links are short names for pages your team opens often, like `sim/handbook` or `sim/okta`. Every member of your organization can use them, with or without a Search seat. +Links are short names for pages your team opens often, like `handbook` or `okta`. They open as `sim/handbook` or `go/handbook`. Every member of your organization can use them, with or without a Search seat. -Open **Sim Links** in the organization sidebar to see your organization's links. Search by name, destination, or description, or use **Sort → Opens** to see the 50 most opened links. +Open **Links** in the organization sidebar to see your organization's links. Search by name, destination, or description, or use **Sort → Opens** to see the 50 most opened links. ## Open a link @@ -15,13 +15,13 @@ Names ignore case and punctuation, so `sim/Team-Handbook` and `sim/teamhandbook` ## Open links from the address bar -In Sim Cloud, open **Sim Links → Browser shortcuts** to install [Sim for Chrome](https://chromewebstore.google.com/detail/sim/oanlcahddodnjpdoopcpjlcageejjpmg) in your work profile. Type `sim` in Chrome’s address bar, press **Space**, and enter part of a link name. Chrome shows matching links, most opened first. Unlisted links can still open by name. +In Sim Cloud, open **Links → Browser shortcuts** to install [Sim for Chrome](https://chromewebstore.google.com/detail/sim/oanlcahddodnjpdoopcpjlcageejjpmg) in your work profile. Type `sim` in Chrome’s address bar, press **Space**, and enter part of a link name. Chrome shows matching links, most opened first. Unlisted links can still open by name. -To open links as `sim/handbook`, select **Enable sim/ shortcuts** in that dialog once, using the Chrome profile where Sim is installed. This opens your Sim Links directory in a new tab and lets Chrome remember the short host in that profile. If Chrome still sends a shortcut to search, enter `http://sim/handbook` or `sim/handbook/` with a trailing slash. Use **Copy link** in Sim to share an address that also works without the extension. +To open links as `go/handbook` or `sim/handbook`, select **Enable go/ shortcuts** and **Enable sim/ shortcuts** in that dialog once each, using the Chrome profile where Sim is installed. Each opens your Links directory in a new tab and lets Chrome remember the short host in that profile. If Chrome still sends a shortcut to search, enter `http://sim/handbook` or `sim/handbook/` with a trailing slash. Use **Copy link** in Sim to share an address that also works without the extension. -In Sim for Chrome 0.1.3 or later, open the extension sidebar’s **+ → Browser shortcuts** and enable your search provider to recover `sim/handbook` when Chrome treats it as a search. Approve access to the exact sites shown. This is optional and supports Google (`google.com`), Bing, DuckDuckGo, and Yahoo. Sim remembers the choice in this Chrome profile. Ordinary searches still use your search engine; its default is unchanged. +Open the extension sidebar’s **+ → Browser shortcuts** and enable your search provider to recover `go/handbook` or `sim/handbook` when Chrome treats it as a search. Approve access to the exact sites shown. This is optional and supports Google (`google.com`), Bing, DuckDuckGo, and Yahoo. Sim remembers the choice in this Chrome profile. Ordinary searches still use your search engine; its default is unchanged. -Recovery matches a whole `sim/` shortcut, including simple slash-separated values such as `sim/jira/123`. For values containing spaces, query parameters, unsupported search domains, or a managed browser that blocks site access, use `sim` + **Space** or the full `https://www.sim.ai/sim/` address. Turn recovery off in **Browser shortcuts**; this keeps the site permission, which you can remove through **Site access** or Chrome’s extension settings. +Recovery matches a whole `go/` or `sim/` shortcut, including simple slash-separated values such as `go/jira/123`. For values containing spaces, query parameters, unsupported search domains, or a managed browser that blocks site access, use `sim` + **Space** or the full `https://www.sim.ai/sim/` address. Turn recovery off in **Browser shortcuts**; this keeps the site permission, which you can remove through **Site access** or Chrome’s extension settings. If `sim` + **Space** sends link names to your search engine even when the address bar shows **Sim**, a Chrome site search may already use the `sim` shortcut. Enter `http://sim/handbook` to open the link directly. To restore suggestions, temporarily turn off the Sim extension, rename the old shortcut in `chrome://settings/searchEngines`, then turn Sim back on. If your organization manages the shortcut, ask your administrator to rename it. @@ -41,11 +41,11 @@ Organization admins can also open **Browser shortcuts → Team bookmarks**, choo ## Create a link -1. Open **Sim Links** and select **New link**. +1. Open **Links** and select **New link**. 2. Enter the **Destination URL** and a **Name**. Names use letters, numbers, and `. : @ & ~ - _`; spaces become hyphens as you type. 3. Optionally add a **Description**, then select **Create**. -With Sim for Chrome 0.1.3 or later, right-click an HTTP or HTTPS link on a page and choose **Create Sim Link**. Check the destination and organization, enter a name, then choose **Create**. Sim strips query parameters and fragments from the initial destination. You can edit the address before saving. Closing the draft creates nothing. +Right-click an HTTP or HTTPS link on a page and choose **Create link in Sim**. Check the destination and organization, enter a name, then choose **Create**. Sim strips query parameters and fragments from the initial destination. You can edit the address before saving. Closing the draft creates nothing. To share a link, right-click it and select **Copy link**. @@ -67,7 +67,7 @@ Values fill each `{*}` in order, and the last `{*}` takes the rest. A link with By default, any member can edit or delete a link. The link's creator and organization admins can change two options under **Access**: -- **Hide from the Sim Links page**: only the creator and admins see the link in the list, marked **Unlisted**. Anyone with the name can still open it. +- **Hide from the Links page**: only the creator and admins see the link in the list, marked **Unlisted**. Anyone with the name can still open it. - **Only the creator and admins can edit**: only the creator and admins can edit or delete the link, marked **Restricted**. Changes to links are recorded in your organization's [audit logs](/platform/enterprise/audit-logs). diff --git a/apps/extension/DESIGN.md b/apps/extension/DESIGN.md index b2fd6ea2244..bff44d7135d 100644 --- a/apps/extension/DESIGN.md +++ b/apps/extension/DESIGN.md @@ -55,14 +55,14 @@ other workspace resources or browser-control tools. - Required browser capabilities: side panel, scripting, active tab, context menus, and short-lived session storage for selection handoff. Required host access is - limited to the configured Sim origin and to `http(s)://sim/*`, which exists only so - one static redirect rule can send top-level navigations to that host to the Sim link resolver. + limited to the configured Sim origin and to `http(s)://sim/*` and `http(s)://go/*`, which exist + only so one static redirect rule can send top-level navigations to those hosts to the link resolver. - Other HTTP(S) origins are optional grants requested for the current site from a user gesture. Each grant can be revoked. Keeping the panel open is not a grant to read every subsequently selected tab. - No history, bookmarks, cookie API, debugger, native messaging, external messaging, or arbitrary remote code execution. The only network interception is the static - `sim/` redirect rule above. + `sim/` and `go/` redirect rule above, plus opt-in search recovery. - The only background network request is the `sim` address-bar keyword: after `sim` and Space, the text typed before the first `/` or `?` is sent to the configured Sim origin with the signed-in session to suggest matching Sim links, diff --git a/apps/extension/README.md b/apps/extension/README.md index 28584cfb483..0a194b3b8d9 100644 --- a/apps/extension/README.md +++ b/apps/extension/README.md @@ -4,7 +4,7 @@ The Chrome extension attaches an explicitly captured page or selection to the ex [User and administrator guide](https://docs.sim.ai/browser-extension) -The keyboard shortcut prefers highlighted text and preserves the draft when a selection cannot be read. Chrome’s **Extensions → Keyboard shortcuts** page controls the binding per profile. A link’s context menu opens the existing Sim Links creation form with a reviewed destination; only selecting **Create** writes a link. +The keyboard shortcut prefers highlighted text and preserves the draft when a selection cannot be read. Chrome’s **Extensions → Keyboard shortcuts** page controls the binding per profile. A link’s context menu opens the existing Links creation form with a reviewed destination; only selecting **Create** writes a link. ## Build and load @@ -29,10 +29,10 @@ SIM_EXTENSION_DEV=1 SIM_EXTENSION_ORIGIN=http://localhost:3000 bun run --cwd app ## Data and permissions -- Required capabilities: `activeTab`, `scripting`, `sidePanel`, `storage`, `contextMenus`, `declarativeNetRequestWithHostAccess`, and access to the configured Sim origin and to `http(s)://sim/*`. -- Type `sim`, press Space, enter the name, and press Enter to open an organization's [Sim link](https://docs.sim.ai/search/sim-links). Chrome can treat bare `sim/` as a search before the redirect rule runs. Typing `http://sim/` once lets Chrome learn the short host in that profile. A trailing slash (`sim//`) also selects navigation without relying on that history. A single static redirect rule rewrites top-level navigations to `http(s)://sim/*` to `/sim/*` with the path and query unchanged. The `sim` host permission exists only for that rule: every navigation to that host is redirected before it loads, and no other request is matched or observed. An organization that already serves an intranet host named `sim` should not install this build, since its links would be redirected to Sim. +- Required capabilities: `activeTab`, `scripting`, `sidePanel`, `storage`, `contextMenus`, `declarativeNetRequestWithHostAccess`, and access to the configured Sim origin and to `http(s)://sim/*` and `http(s)://go/*`. +- Type `sim`, press Space, enter the name, and press Enter to open an organization's [link](https://docs.sim.ai/search/sim-links). `go/` opens the same link. Chrome can treat bare `go/` or `sim/` as a search before the redirect rule runs. Typing `http://go/` once lets Chrome learn the short host in that profile. A trailing slash (`go//`) also selects navigation without relying on that history. A single static redirect rule rewrites top-level navigations to `http(s)://sim/*` and `http(s)://go/*` to `/sim/*` with the path and query unchanged. The `sim` and `go` host permissions exist only for that rule: every navigation to those hosts is redirected before it loads, and no other request is matched or observed. An organization that already serves an intranet host named `sim` or `go` should not install this build, since its links would be redirected to Sim. When another extension (such as another go-links tool) also redirects `go/`, Chrome applies the most recently installed extension's rule. - The `sim` address-bar keyword (`sim`, then Space) lists matching Sim links while you type and opens what you enter through the same resolver. For these suggestions, the background worker sends the text typed before the first `/` or `?`, and nothing else, unless that text contains a space (a search) or is longer than a link name can be, to `/api/sim-links/suggestions` with the signed-in session, and the extension's content security policy allows connections to that origin alone. Unlisted links are never suggested. -- **+ → Browser shortcuts** separately opts into recovery for exact Google, Bing, DuckDuckGo, or Yahoo HTTPS search hosts. After a direct Chrome permission grant, dynamic request rules redirect only top-level GET requests with one query parameter containing a whole `sim/` shortcut. Only that value reaches `/sim-links/recover`, which validates it and redirects to the existing authenticated resolver. Ordinary search terms, additional search parameters, subframes, and unsupported inputs are not forwarded. Chrome applies these rules without an extension search-URL observer. Turning a provider off removes its rules while preserving site access; revoking access clears its recovery choice. This does not enable page reference or change the default search provider. +- **+ → Browser shortcuts** separately opts into recovery for exact Google, Bing, DuckDuckGo, or Yahoo HTTPS search hosts. After a direct Chrome permission grant, dynamic request rules redirect only top-level GET requests with one query parameter containing a whole `go/` or `sim/` shortcut. Only that value reaches `/sim-links/recover`, which validates it and redirects to the existing authenticated resolver. Ordinary search terms, additional search parameters, subframes, and unsupported inputs are not forwarded. Chrome applies these rules without an extension search-URL observer. Turning a provider off removes its rules while preserving site access; revoking access clears its recovery choice. This does not enable page reference or change the default search provider. - Optional HTTP/HTTPS site access is requested only by a menu action naming that site. Chrome's `activeTab` access is temporary and does not follow arbitrary new sites. - Page capture runs on demand in Chrome's isolated world. It excludes editable fields, inputs, hidden elements, scripts, and embedded documents. It reads only the top frame. PDF viewers and canvas documents may have no accessible text. - Extraction stops at 50,000 text characters, 150,000 serialized UTF-8 bytes, 15,000 visited nodes, or 150ms. The composer exposes truncation. diff --git a/apps/extension/scripts/build.ts b/apps/extension/scripts/build.ts index 7bd61621109..1b44b2f98a3 100644 --- a/apps/extension/scripts/build.ts +++ b/apps/extension/scripts/build.ts @@ -2,6 +2,7 @@ import { createPublicKey } from 'node:crypto' import { cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises' import { dirname, resolve } from 'node:path' import { fileURLToPath } from 'node:url' +import { SIM_LINK_HOST_PATTERN, SIM_LINK_HOSTS } from '@sim/browser-extension-protocol' import { build } from 'esbuild' import postcss from 'postcss' import loadPostcssConfig from 'postcss-load-config' @@ -90,7 +91,7 @@ for (const [size, file] of [ await cp(resolve(root, '../sim/public/favicon', file), resolve(dist, `icon-${size}.png`)) } /** - * Only requests to the short host reach this rule. Chrome can classify bare `sim/` as a + * Only requests to the short hosts reach this rule. Chrome can classify a bare `go/` as a * search before navigation. Preserve the path and query for actual short-host navigations. */ const simLinkRules = [ @@ -98,7 +99,10 @@ const simLinkRules = [ id: 1, priority: 1, action: { type: 'redirect', redirect: { regexSubstitution: `${origin.origin}/sim/\\1` } }, - condition: { regexFilter: '^https?://sim/(.*)$', resourceTypes: ['main_frame'] }, + condition: { + regexFilter: `^https?://(?:${SIM_LINK_HOST_PATTERN})/(.*)$`, + resourceTypes: ['main_frame'], + }, }, ] await writeFile(resolve(dist, 'sim-links.json'), JSON.stringify(simLinkRules, null, 2)) @@ -110,7 +114,7 @@ await writeFile( name: development ? 'Sim (Development)' : 'Sim', version: packageJson.version, description: - "Ask Sim about the page you are reading, and open your organization's sim/ links from the address bar.", + "Ask Sim about the page you are reading, and open your organization's go/ and sim/ links from the address bar.", minimum_chrome_version: '120', permissions: [ 'activeTab', @@ -120,7 +124,10 @@ await writeFile( 'contextMenus', 'declarativeNetRequestWithHostAccess', ], - host_permissions: [`${origin.origin}/*`, 'http://sim/*', 'https://sim/*'], + host_permissions: [ + `${origin.origin}/*`, + ...SIM_LINK_HOSTS.flatMap((host) => [`http://${host}/*`, `https://${host}/*`]), + ], declarative_net_request: { rule_resources: [{ id: 'sim_links', enabled: true, path: 'sim-links.json' }], }, diff --git a/apps/extension/scripts/test-e2e.ts b/apps/extension/scripts/test-e2e.ts index 8d1da01cd73..83421d35c3d 100644 --- a/apps/extension/scripts/test-e2e.ts +++ b/apps/extension/scripts/test-e2e.ts @@ -11,6 +11,7 @@ import { type AppToExtensionMessage, extensionToAppMessageSchema, pageSnapshotSchema, + SIM_LINK_HOSTS, } from '@sim/browser-extension-protocol' import { SecretReveal } from '@sim/emcn' import { createLogger } from '@sim/logger' @@ -360,18 +361,20 @@ try { } await check( - 'HTTP and HTTPS navigations to the sim host reach the configured resolver', + 'HTTP and HTTPS navigations to the sim and go hosts reach the configured resolver', async () => { const tab = await page.context().newPage() for (const scheme of ['http', 'https']) { - for (const path of [ - 'handbook', - 'handbook/', - 'jira/123?view=board', - 'jira/a%2Fb?view=board%20view', - ]) { - await tab.goto(`${scheme}://sim/${path}`) - assert(tab.url() === `${origin}/sim/${path}`, `sim/${path} reached ${tab.url()}`) + for (const host of SIM_LINK_HOSTS) { + for (const path of [ + 'handbook', + 'handbook/', + 'jira/123?view=board', + 'jira/a%2Fb?view=board%20view', + ]) { + await tab.goto(`${scheme}://${host}/${path}`) + assert(tab.url() === `${origin}/sim/${path}`, `${host}/${path} reached ${tab.url()}`) + } } } await tab.close() @@ -1434,7 +1437,10 @@ try { await unchanged(url) await toggle(provider.id, true) for (const host of provider.hosts) { - for (const shortcut of ['sim%2Faskit', 'sim/jira/ABC-123']) { + for (const shortcut of SIM_LINK_HOSTS.flatMap((short) => [ + `${short}%2Faskit`, + `${short}/jira/ABC-123`, + ])) { const candidate = `https://${host}${provider.path}?client=chrome&${provider.parameter}=${shortcut}&source=qa` const prior = searchRequests.filter((request) => request.url === candidate).length await tab.goto(candidate) diff --git a/apps/extension/src/background.ts b/apps/extension/src/background.ts index b0a76732c7f..b836406d50e 100644 --- a/apps/extension/src/background.ts +++ b/apps/extension/src/background.ts @@ -29,7 +29,7 @@ async function configure() { }) chrome.contextMenus.create({ id: LINK_MENU, - title: 'Create Sim Link', + title: 'Create link in Sim', contexts: ['link'], documentUrlPatterns: ['http://*/*', 'https://*/*'], targetUrlPatterns: ['http://*/*', 'https://*/*'], diff --git a/apps/extension/src/omnibox.ts b/apps/extension/src/omnibox.ts index 008f9b9a3b7..1edfe3698c9 100644 --- a/apps/extension/src/omnibox.ts +++ b/apps/extension/src/omnibox.ts @@ -12,7 +12,7 @@ const logger = createLogger('BrowserExtensionOmnibox') /** Longer than the gap between a typist's keystrokes, so a name is looked up once it settles. */ const SUGGEST_DELAY_MS = 220 -const SEARCH_HINT = 'Find a Sim link' +const SEARCH_HINT = 'Find a link in Sim' // Chrome persists this template and substitutes the input when rendering the default row. const OPEN_LINK_HINT = 'Open %s in Sim' @@ -31,6 +31,7 @@ interface SuggestedLink { function readTyped(text: string): { name: string; rest: string } { const typed = text .trim() + // Only the keyword's own `sim/`: after it, `go/x` can be a link named `go` with a value. .replace(/^sim\//i, '') .replace(/^\/+/, '') .replace(/#.*$/, '') diff --git a/apps/extension/src/search-recovery-dialog.tsx b/apps/extension/src/search-recovery-dialog.tsx index bc89f7e943b..cdf7ae1d24f 100644 --- a/apps/extension/src/search-recovery-dialog.tsx +++ b/apps/extension/src/search-recovery-dialog.tsx @@ -112,8 +112,8 @@ export function SearchRecoveryDialog({ onClose }: SearchRecoveryDialogProps) { - Send explicit sim/ searches to your Sim Links. Ordinary searches stay with your search - engine. + Send explicit go/ and sim/ searches to your links in Sim. Ordinary searches stay with + your search engine. {SEARCH_RECOVERY_PROVIDERS.map((provider) => ( escapeRegExp(new URL(origin).host)).join('|') const character = '(?:[a-z0-9._~:@/-]|%(?:2[6def]|3[0-9a]|4[0-9a-f]|5[0-9af]|6[1-9a-f]|7[0-9ae]))' - const shortcut = `sim(?:/|%2f)${character}+` + const shortcut = `(?:${SIM_LINK_HOST_PATTERN})(?:/|%2f)${character}+` const condition = { isUrlFilterCaseSensitive: false, requestDomains: provider.origins.map((origin) => new URL(origin).hostname), diff --git a/apps/sim/app/(landing)/privacy/privacy-content.tsx b/apps/sim/app/(landing)/privacy/privacy-content.tsx index ff2c77b48eb..bc3e723c019 100644 --- a/apps/sim/app/(landing)/privacy/privacy-content.tsx +++ b/apps/sim/app/(landing)/privacy/privacy-content.tsx @@ -44,7 +44,7 @@ function richText(content: string): ReactNode { export const PRIVACY_CONFIG: LegalPageConfig = { title: 'Privacy Policy', description: 'Sim Studio, Inc. · Operating the Sim platform (sim.ai)', - lastUpdated: 'November 3, 2026', + lastUpdated: 'November 4, 2026', intro: [ { kind: 'paragraph', @@ -836,13 +836,13 @@ export const PRIVACY_CONFIG: LegalPageConfig = { { kind: 'paragraph', content: richText( - 'When You use the sim address-bar keyword, the extension sends the typed link name, before any path values or query, to Sim with Your authenticated session to suggest Your organization’s links. Suggestions are cached in memory and are not written to extension storage. Opening a sim/ shortcut sends its path and query to Sim to resolve the destination, then opens that destination. Sim records each link’s visit count and last-visited time. These requests also use the operational diagnostics described in this Privacy Policy. Choosing Create Sim Link from the browser menu opens a draft with the selected link’s address, omitting query parameters and fragments. The destination becomes an organization Sim Link only when You confirm creation. The extension does not read Your browser history or unrelated address-bar input.' + 'When You use the sim address-bar keyword, the extension sends the typed link name, before any path values or query, to Sim with Your authenticated session to suggest Your organization’s links. Suggestions are cached in memory and are not written to extension storage. Opening a sim/ or go/ shortcut sends its path and query to Sim to resolve the destination, then opens that destination. Sim records each link’s visit count and last-visited time. These requests also use the operational diagnostics described in this Privacy Policy. Choosing Create link in Sim from the browser menu opens a draft with the selected link’s address, omitting query parameters and fragments. The destination becomes an organization link only when You confirm creation. The extension does not read Your browser history or unrelated address-bar input.' ), }, { kind: 'paragraph', content: richText( - 'Browser shortcuts can optionally recover an explicit sim/ shortcut that Chrome sends to a supported search engine. After You enable a provider and approve access to its listed sites, Chrome applies request rules that send only the matching shortcut name and path values to Sim’s normal link resolver. Other search parameters and ordinary search terms are not sent to Sim by this feature. The extension stores Your provider choices locally and does not change Your default search engine. These site permissions can also allow page attachment when You explicitly request it; enabling shortcut recovery does not enable Reference current page or background capture. Turning recovery off stops these redirects. Site access remains until You revoke it in the extension or Chrome settings.' + 'Browser shortcuts can optionally recover an explicit sim/ or go/ shortcut that Chrome sends to a supported search engine. After You enable a provider and approve access to its listed sites, Chrome applies request rules that send only the matching shortcut name and path values to Sim’s normal link resolver. Other search parameters and ordinary search terms are not sent to Sim by this feature. The extension stores Your provider choices locally and does not change Your default search engine. These site permissions can also allow page attachment when You explicitly request it; enabling shortcut recovery does not enable Reference current page or background capture. Turning recovery off stops these redirects. Site access remains until You revoke it in the extension or Chrome settings.' ), }, { diff --git a/apps/sim/app/extension/create-link/page.tsx b/apps/sim/app/extension/create-link/page.tsx index 2da41389562..a5d369273e7 100644 --- a/apps/sim/app/extension/create-link/page.tsx +++ b/apps/sim/app/extension/create-link/page.tsx @@ -16,8 +16,8 @@ export default async function CreateLinkPage() { if (!context) return ( Open Sim diff --git a/apps/sim/app/extension/sign-in.tsx b/apps/sim/app/extension/sign-in.tsx index 4f959f01405..33e93d21b7b 100644 --- a/apps/sim/app/extension/sign-in.tsx +++ b/apps/sim/app/extension/sign-in.tsx @@ -13,7 +13,7 @@ function LinkDraftSignIn() { const href = `/login?callbackUrl=${encodeURIComponent(SIM_LINK_DRAFT_PATH)}` return (
-

Sign in to create a Sim Link

+

Sign in to create a link

{needsSeparateTab ? ( <>

Sign in in another tab, then reload this draft.

diff --git a/apps/sim/app/o/[organizationId]/components/organization-sidebar/navigation.ts b/apps/sim/app/o/[organizationId]/components/organization-sidebar/navigation.ts index 68cf01d3b59..56826273d6f 100644 --- a/apps/sim/app/o/[organizationId]/components/organization-sidebar/navigation.ts +++ b/apps/sim/app/o/[organizationId]/components/organization-sidebar/navigation.ts @@ -20,7 +20,7 @@ const ORGANIZATION_NAV_ENTRIES: readonly OrganizationNavEntry[] = [ { id: 'search', label: 'Search', icon: Search, route: 'search' }, { id: 'people', label: 'People', icon: Users, route: 'people' }, { id: 'integrations', label: 'Integrations', icon: Integration, route: 'integrations' }, - { id: 'sim-links', label: 'Sim Links', icon: Link, route: 'simLinks' }, + { id: 'sim-links', label: 'Links', icon: Link, route: 'simLinks' }, { id: 'benchmark', label: 'Benchmark', icon: ChartColumn, route: 'benchmark' }, ] diff --git a/apps/sim/app/o/[organizationId]/links/browser-shortcuts-modal.tsx b/apps/sim/app/o/[organizationId]/links/browser-shortcuts-modal.tsx index 59ccd7507ce..72aec24d7cc 100644 --- a/apps/sim/app/o/[organizationId]/links/browser-shortcuts-modal.tsx +++ b/apps/sim/app/o/[organizationId]/links/browser-shortcuts-modal.tsx @@ -33,15 +33,14 @@ export function BrowserShortcutsModal({ onClose }: BrowserShortcutsModalProps) { . - - Enable sim/ shortcuts - +
+ + Enable go/ shortcuts + + + Enable sim/ shortcuts + +
Still opening search results? In the Sim extension, open{' '} + → Browser shortcuts and enable your search provider. diff --git a/apps/sim/app/o/[organizationId]/links/columns.ts b/apps/sim/app/o/[organizationId]/links/columns.ts index d3e9db9c79e..5ecb9c92ee5 100644 --- a/apps/sim/app/o/[organizationId]/links/columns.ts +++ b/apps/sim/app/o/[organizationId]/links/columns.ts @@ -11,7 +11,7 @@ export const SIM_LINK_COLUMNS = [ { id: 'updated', header: 'Updated' }, ] as const satisfies readonly ResourceColumn[] -export const SIM_LINKS_SEARCH_PLACEHOLDER = 'Search Sim links...' +export const SIM_LINKS_SEARCH_PLACEHOLDER = 'Search links...' export const BROWSER_SHORTCUTS_ACTION = { text: 'Browser shortcuts', icon: Globe } as const export const NEW_SIM_LINK_ACTION = { text: 'New link', icon: Plus, variant: 'primary' } as const diff --git a/apps/sim/app/o/[organizationId]/links/loading.tsx b/apps/sim/app/o/[organizationId]/links/loading.tsx index 7e4b1438928..b5d14c95a2a 100644 --- a/apps/sim/app/o/[organizationId]/links/loading.tsx +++ b/apps/sim/app/o/[organizationId]/links/loading.tsx @@ -16,7 +16,7 @@ export default function SimLinksLoading() {
link.id)) const options = [...candidates.values()].map((link) => ({ value: link.id, - label: `sim/${link.name}`, + label: link.name, hidden: !visible.has(link.id), disabled: selected.length >= MAX_MANAGED_BOOKMARKS && !selectedIds.has(link.id), })) @@ -57,7 +57,7 @@ export function ManagedBookmarks({ organizationId }: ManagedBookmarksProps) { url: new URL(routes.openSimLink(name), window.location.origin).href, })) saveBlob( - new Blob([JSON.stringify([{ name: 'Sim Links', children }], null, 2)], { + new Blob([JSON.stringify([{ name: 'Links', children }], null, 2)], { type: 'application/json', }), 'sim-managed-bookmarks.json' @@ -90,7 +90,7 @@ export function ManagedBookmarks({ organizationId }: ManagedBookmarksProps) { hasMore={links.hasNextPage} onLoadMore={() => void links.fetchNextPage()} isLoadingMore={links.isFetchingNextPage} - error={links.isError ? 'Could not load Sim Links.' : undefined} + error={links.isError ? 'Could not load links.' : undefined} emptyMessage='No listed links found' /> diff --git a/apps/sim/app/o/[organizationId]/links/page.tsx b/apps/sim/app/o/[organizationId]/links/page.tsx index 4f4712dea23..21e80786b66 100644 --- a/apps/sim/app/o/[organizationId]/links/page.tsx +++ b/apps/sim/app/o/[organizationId]/links/page.tsx @@ -6,7 +6,7 @@ import { isSimLinksEnabled } from '@/lib/sim-links/feature-flag' import { buildAuthCrossLink } from '@/app/(auth)/auth-redirect' import { SimLinks } from '@/app/o/[organizationId]/links/sim-links' -export const metadata: Metadata = { title: 'Sim Links' } +export const metadata: Metadata = { title: 'Links' } interface SimLinksPageProps { params: Promise<{ organizationId: string }> diff --git a/apps/sim/app/o/[organizationId]/links/sim-link-modal.tsx b/apps/sim/app/o/[organizationId]/links/sim-link-modal.tsx index 7e758732525..eee1870a3e5 100644 --- a/apps/sim/app/o/[organizationId]/links/sim-link-modal.tsx +++ b/apps/sim/app/o/[organizationId]/links/sim-link-modal.tsx @@ -100,7 +100,7 @@ export function SimLinkModal({ else create.mutate(parsed.data, { onSuccess: onSaved ?? onClose }) } - const title = link ? `Edit sim/${link.name}` : 'New Sim link' + const title = link ? `Edit ${link.name}` : 'New link' const [actionLabel, pendingLabel] = link ? ['Save', 'Saving'] : ['Create', 'Creating'] return ( @@ -178,7 +178,7 @@ export function SimLinkModal({ onCheckedChange={(checked) => change('unlisted', checked === true)} /> - Hide from the Sim Links page + Hide from the Links page