{"owner":"element-hq","repo":"element-web","hasSkills":true,"totalSkillsCount":71,"totalTokensCount":30802,"categories":["anthropic-skill","root-instruction","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":["packages/eslint-plugin-element-web/tsconfig.json","packages/RELEASING.md","AGENTS.md","packages/module-api/element-web-module-api.api.md","packages/module-api/project.json","packages/module-api/api-extractor.json","packages/module-api/package.json","packages/eslint-plugin-element-web/project.json","packages/module-api/tsconfig.json","packages/eslint-plugin-element-web/package.json","packages/module-api/README.md","packages/playwright-common/README.md","packages/playwright-common/package.json","packages/playwright-common/project.json","packages/playwright-common/tsconfig.build.json","packages/playwright-common/tsconfig.json","packages/shared-components/README.md","packages/shared-components/package.json","packages/shared-components/project.json","packages/shared-components/tsconfig.json","packages/shared-components/tsconfig.node.json","packages/shared-components/typedoc.json","packages/shared-types/package.json","packages/shared-types/tsconfig.json","packages/shared-utils/README.md","packages/shared-utils/package.json","packages/shared-utils/project.json","packages/shared-utils/tsconfig.json","packages/shared-components/static/README.md","apps/web/playwright/plugins/oauth_server/README.md","packages/shared-components/src/i18n/strings/cs.json","packages/shared-components/src/i18n/strings/cy.json","packages/shared-components/src/i18n/strings/da.json","packages/shared-components/src/i18n/strings/de_DE.json","packages/shared-components/src/i18n/strings/el.json","packages/shared-components/src/i18n/strings/en_EN.json","packages/shared-components/src/i18n/strings/eo.json","packages/shared-components/src/i18n/strings/es.json","packages/shared-components/src/i18n/strings/et.json","packages/shared-components/src/i18n/strings/fa.json","packages/shared-components/src/i18n/strings/fi.json","packages/shared-components/src/i18n/strings/fr.json","packages/shared-components/src/i18n/strings/gl.json","packages/shared-components/src/i18n/strings/he.json","packages/shared-components/src/i18n/strings/hr.json","packages/shared-components/src/i18n/strings/hu.json","packages/shared-components/src/i18n/strings/hy.json","packages/shared-components/src/i18n/strings/id.json","packages/shared-components/src/i18n/strings/is.json","packages/shared-components/src/i18n/strings/it.json","packages/shared-components/src/i18n/strings/ja.json","packages/shared-components/src/i18n/strings/ka.json","packages/shared-components/src/i18n/strings/ko.json","packages/shared-components/src/i18n/strings/lo.json","packages/shared-components/src/i18n/strings/lt.json","packages/shared-components/src/i18n/strings/lv.json","packages/shared-components/src/i18n/strings/mg_MG.json","packages/shared-components/src/i18n/strings/nb_NO.json","packages/shared-components/src/i18n/strings/nl.json","packages/shared-components/src/i18n/strings/pl.json","packages/shared-components/src/i18n/strings/pt.json","packages/shared-components/src/i18n/strings/pt_BR.json","packages/shared-components/src/i18n/strings/ru.json","packages/shared-components/src/i18n/strings/sk.json","packages/shared-components/src/i18n/strings/sq.json","packages/shared-components/src/i18n/strings/sv.json","packages/shared-components/src/i18n/strings/tr.json","packages/shared-components/src/i18n/strings/uk.json","packages/shared-components/src/i18n/strings/vi.json","packages/shared-components/src/i18n/strings/zh_Hans.json","packages/shared-components/src/i18n/strings/zh_Hant.json"],"skills":{"packages/eslint-plugin-element-web/tsconfig.json":"{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"strict\": true,\n        \"module\": \"nodenext\",\n        \"moduleResolution\": \"nodenext\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"allowImportingTsExtensions\": true,\n        \"verbatimModuleSyntax\": true,\n        \"erasableSyntaxOnly\": true\n    },\n    \"include\": [\"src\"]\n}\n","packages/RELEASING.md":"# Release process for packages in element-web/packages\n\n1. Update `package.json` with the new version. One way to do this is\n   `pnpm version --no-git-tag-version <major|minor|patch>`. Or just do it manually.\n\n2. Commit to a release prep branch, and open a PR.\n\n3. Once the PR has merged to `develop`, run the\n   [npm-publish](https://github.com/element-hq/element-web/actions/workflows/npm-publish.yaml)\n   Github Actions workflow, specifying the package to be released.\n","AGENTS.md":"# AGENTS.md\n\nInstructions for AI coding agents working in this repository. Humans should read\n[CONTRIBUTING.md](./CONTRIBUTING.md) and [code_style.md](./code_style.md) instead — this file summarises those and\nadds the things that are easy to get wrong here.\n\n## Repository layout\n\nA pnpm + nx monorepo (`element-web-monorepo`). Workspaces are `apps/*`, `packages/*`, `modules` and `modules/*`.\n\n| Path                                                                                                  | Contents                                                                                                      |\n| ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| `apps/web`                                                                                            | The Element Web app. Also hosts view models (`src/viewmodels/`) and the Playwright e2e suite (`playwright/`). |\n| `apps/desktop`                                                                                        | Element Desktop.                                                                                              |\n| `packages/shared-components`                                                                          | Published UI component library, `@element-hq/web-shared-components`. New views go here.                       |\n| `packages/module-api`, `packages/shared-utils`, `packages/shared-types`, `packages/playwright-common` | Published support packages.                                                                                   |\n| `modules/*`                                                                                           | Optional runtime modules (banner, widget toggles, …).                                                         |\n| `docs/`                                                                                               | VitePress docs site.                                                                                          |\n\nThere is **no** top-level `playwright/` directory; `docs/playwright.md` uses paths relative to `apps/web`.\n\n## Commands\n\nRun from the repo root unless stated otherwise.\n\n| Task                                                   | Command                                           |\n| ------------------------------------------------------ | ------------------------------------------------- |\n| Full lint (types, format, js, styles, workflows, knip) | `pnpm lint`                                       |\n| Format                                                 | `pnpm lint:fmt:fix`                               |\n| Lint JS/TS                                             | `pnpm lint:js:fix`                                |\n| Typecheck                                              | `pnpm -r --workspace-concurrency=1 lint:types`    |\n| All unit tests                                         | `pnpm test:unit`                                  |\n| Regenerate i18n strings                                | `pnpm i18n`                                       |\n| Start the app                                          | `cd apps/web && pnpm start`                       |\n| Storybook                                              | `cd packages/shared-components && pnpm storybook` |\n\nFormatting is **oxfmt** and linting is **oxlint**. This repo does not use prettier or eslint — running prettier here\nreformats files against the project style and reports failures that do not exist.\n\nRun `pnpm i18n` after adding or changing any translated string.\n\n## Running unit tests\n\nBoth jest and vitest are in use; a migration to vitest is in progress. **The file path decides the runner.**\n\n| Test file                                      | Runner           | Command                                                     |\n| ---------------------------------------------- | ---------------- | ----------------------------------------------------------- |\n| `apps/web/test/**/*-test.[tj]s?(x)`            | jest             | `cd apps/web && pnpm jest <path>`                           |\n| `apps/web/src/**/*.test.{ts,tsx}`              | vitest           | `pnpm vitest run <path>`                                    |\n| `apps/web/src/**/*.test.browser.{ts,tsx}`      | vitest (browser) | `pnpm vitest run --project web-browser <path>`              |\n| `packages/shared-components/src/**/*.test.tsx` | vitest           | `cd packages/shared-components && pnpm test:unit -- <path>` |\n\nNotes:\n\n- Write new tests as co-located vitest `*.test.ts(x)` next to the source file. The `apps/web/test/` jest tree is\n  legacy; extend it only when the file you are changing already lives there.\n- Vitest runs with `globals: false`, so import `describe`, `it`, `expect` and friends explicitly.\n- `packages/shared-components` is excluded from the root vitest config and must be run from its own directory.\n- \"No test files found\" means you picked the wrong runner or path. It is not a pass.\n- Prefer extending an existing test over adding a new file when covering a close variant of existing behaviour.\n\n## Running e2e tests\n\nSpecs live in `apps/web/playwright/e2e`. See [docs/playwright.md](./docs/playwright.md) for the full guide.\n\n```sh\ncd apps/web && pnpm test:playwright -- playwright/e2e/<spec>.spec.ts --project=Chrome\n```\n\n- Requires a container runtime (Docker/Podman/Colima) for the homeserver testcontainers.\n- On macOS, add `--ignore-snapshots`. Screenshot baselines are only committed for Linux, so comparisons fail locally.\n- Never run `pnpm test:playwright:screenshots` locally to \"fix\" a screenshot diff — it writes host-rendered baselines.\n  Screenshots are updated in the Docker environment, which CI matches.\n- The config uses `reuseExistingServer: true`. Check `lsof -ti:8080` first; a stale dev server silently serves the\n  tests. Port-bind errors are an infrastructure problem, not a test failure.\n- Locate elements by role, label and accessible name, not CSS classes.\n- Tag any test using `toMatchScreenshot` with `@screenshot`.\n\n### Reviewing updated screenshots\n\nUpdated baselines are part of the diff and must be reviewed, not accepted blindly. Before committing any changed\n`.png` under `apps/web/playwright/snapshots/` or `packages/shared-components/__vis__/`:\n\n- Look at the image. Confirm every visible difference is one your change was meant to produce.\n- Treat anything else as a regression until proven otherwise: shifted or clipped layout, changed spacing or font,\n  missing or duplicated elements, a wrong theme, an untranslated or placeholder string, a loading or error state\n  captured instead of the real content.\n- Unrelated files changing baselines is a signal in itself — if a screenshot moved for a component you did not\n  touch, find out why rather than committing it.\n- Never regenerate baselines to make a failing test pass. A diff you cannot explain is a bug in the change.\n\n## Writing UI code: MVVM\n\nNew UI follows MVVM. Full details in [docs/MVVM.md](./docs/MVVM.md); the shape for a feature `Foo`:\n\n**View** — `packages/shared-components/src/<domain>/FooView/` containing `FooView.tsx`, `FooView.module.css`,\n`FooView.test.tsx`, `FooView.stories.tsx` and `index.ts`. The view declares the contract:\n\n```tsx\nexport interface FooViewSnapshot { title: string }\ninterface FooViewActions { setTitle: (title: string) => void }\nexport type FooViewModel = ViewModel<FooViewSnapshot, FooViewActions>;\n\nexport function FooView({ vm }: { vm: FooViewModel }): JSX.Element {\n    const { title } = useViewModel(vm);\n    ...\n}\n```\n\nViews are dumb: they read the snapshot and call actions, nothing else. Develop them in Storybook.\n\n**ViewModel** — `apps/web/src/viewmodels/<domain>/FooViewModel.ts`, a class extending `BaseViewModel` that implements\nthe interface from the view. `apps/web/src/components/viewmodels/` is the deprecated v1 location; do not add there.\n\nRules that are easy to miss:\n\n- Define actions as arrow-function class properties (`public doThing = (): void => {}`) so `this` survives being\n  passed as a callback.\n- Use `this.snapshot.merge({ field })` for partial updates. `merge` already skips emitting when nothing changed, so\n  do not add equality guards around it, and do not recompute the whole snapshot for one field.\n- Track listeners and sub-view-models with `this.disposables.trackListener(...)` / `this.disposables.track(...)`.\n- A non-MVVM function component owning a view model should create it with `useCreateAutoDisposedViewModel`; a class\n  component creates it in `componentDidMount` and disposes it in `componentWillUnmount`.\n\nReference implementation: `packages/shared-components/src/room-list/RoomListSearchView/` with\n`apps/web/src/viewmodels/room-list/RoomListSearchViewModel.ts`.\n\n## Code style\n\nRead [code_style.md](./code_style.md). The points most often missed:\n\n- **Every new file needs a copyright header**, enforced by oxlint (`element-call/copyright-header`). Lint fails\n  without it. Substitute the actual current year — check it rather than copying a year from another file — and leave\n  headers on existing files alone:\n\n    ```\n    /*\n    Copyright <current year> <copyright holder>\n\n    SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\n    Please see LICENSE in the repository root for full details.\n    */\n    ```\n\n    The holder is `Element Creations Ltd.` **only for contributions made as part of Element**. An external\n    contributor puts their own name or their company's there instead. Note that `oxlint --fix` inserts the Element\n    line unconditionally, so external contributors should write the header by hand and check what the autofix added.\n\n- TypeScript only, named exports only — avoid `export default`.\n- 4-space indent, 120-column limit, double quotes, semicolons.\n- Declare member visibility (`public`/`private`/`protected`) on class members.\n- Avoid `any`; if unavoidable, comment why.\n- Roughly one interface, class or enum per file, named after the file.\n- Never mix cosmetic and functional changes.\n- **Styles:** `apps/web` uses PostCSS (`res/css/**/_Component.pcss`, `mx_`-prefixed classes).\n  `packages/shared-components` uses CSS modules (`Component.module.css`, semantic camelCase class names, no `mx_`\n  prefix) imported as `styles`. Use Compound design tokens (`var(--cpd-color-…)`, `var(--cpd-space-…)`) for all values.\n- Prefer Compound typography components over raw text elements, and `Flex`/`Box` from shared-components over raw\n  flexbox markup.\n\n## Comments\n\nKeep comments short and relevant.\n\n- Add TSDoc to exported types, functions, classes and components. Document a component's props.\n- Inside a function, explain _why_, not line by line. Add a short overview before a non-obvious block.\n- Use plain language matching the identifiers around the comment — no metaphors or CS jargon.\n- When changing code, update the comments around it so they stay accurate.\n- Any intentionally suppressed lint or type rule needs a nearby comment explaining why.\n\n## Tests are required\n\n- Every change needs unit tests, including features behind labs flags.\n- New user-facing features need a \"happy path\" Playwright e2e test before leaving labs.\n- Aim for ≥80% coverage on the diff; CI checks this. There is no `coverage` script at the root — generate the\n  reports in the workspaces you touched, then compare from the root:\n\n    ```sh\n    pnpm test:unit --coverage                              # vitest, writes coverage/lcov.info\n    cd apps/web && pnpm coverage                           # jest only, writes apps/web/coverage/lcov.info\n    cd packages/shared-components && pnpm coverage\n    pnpm coverage:diff                                     # from the root, needs diff_cover installed\n    ```\n\n## Commits\n\n- Split the work into logically separate commits: one concern per commit. Keep refactors, formatting and behaviour\n  changes in separate commits.\n- Short imperative subject line, no conventional-commit prefix (`feat:`, `fix:`, …).\n- Add a body only when it says something the diff does not; keep it to a line or two.\n\n## Pull requests\n\n- Don't open PR. This should be done by the human, not the agent.\n","packages/module-api/element-web-module-api.api.md":"## API Report File for \"@element-hq/element-web-module-api\"\r\n\r\n> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).\r\n\r\n```ts\r\n\r\nimport { ComponentType } from 'react';\r\nimport { IWidget } from 'matrix-widget-api';\r\nimport { JSX } from 'react';\r\nimport { ReactNode } from 'react';\r\nimport { Root } from 'react-dom/client';\r\nimport { SVGAttributes } from 'react';\r\n\r\n// @public\r\nexport interface AccountAuthApiExtension {\r\n    overwriteAccountAuth(accountInfo: AccountAuthInfo): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface AccountAuthInfo {\r\n    accessToken: string;\r\n    deviceId: string;\r\n    homeserverUrl: string;\r\n    refreshToken?: string;\r\n    userId: string;\r\n}\r\n\r\n// @public\r\nexport interface AccountDataApi {\r\n    delete(eventType: string): Promise<void>;\r\n    get(eventType: string): Watchable<unknown>;\r\n    set(eventType: string, content: unknown): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface Api extends DialogApiExtension, AccountAuthApiExtension, ProfileApiExtension {\r\n    // @alpha\r\n    readonly builtins: BuiltinsApi;\r\n    readonly client: ClientApi;\r\n    // @alpha\r\n    readonly composer: ComposerApi;\r\n    readonly config: ConfigApi;\r\n    createRoot(element: Element): Root;\r\n    // @alpha\r\n    readonly customComponents: CustomComponentsApi;\r\n    // @alpha\r\n    readonly customisations: CustomisationsApi;\r\n    // @alpha\r\n    readonly extras: ExtrasApi;\r\n    readonly i18n: I18nApi;\r\n    readonly navigation: NavigationApi;\r\n    readonly rootNode: HTMLElement;\r\n    // @alpha\r\n    readonly settings: SettingsApi;\r\n    // @alpha\r\n    readonly storageHelper: StorageHelperApi;\r\n    readonly stores: StoresApi;\r\n    // @alpha\r\n    readonly urlPreviews: UrlPreviewApi;\r\n    // @alpha\r\n    readonly widget: WidgetApi;\r\n    // @alpha\r\n    readonly widgetLifecycle: WidgetLifecycleApi;\r\n    // @alpha\r\n    readonly x509?: X509Api;\r\n}\r\n\r\n// @alpha\r\nexport interface BuiltinsApi {\r\n    renderNotificationDecoration(roomId: string): React.ReactNode;\r\n    renderRoomAvatar(roomId: string, size?: string): React.ReactNode;\r\n    renderRoomView(roomId: string, props?: RoomViewProps): React.ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type CapabilitiesApprover = (widget: WidgetDescriptor, requestedCapabilities: Set<string>) => MaybePromise<Set<string> | undefined>;\r\n\r\n// @alpha\r\nexport interface CertificateInfo {\r\n    // (undocumented)\r\n    issuer: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n    // (undocumented)\r\n    subject: string;\r\n    // (undocumented)\r\n    subjectAltName?: string;\r\n    // (undocumented)\r\n    validFrom: Date;\r\n    // (undocumented)\r\n    validTo: Date;\r\n}\r\n\r\n// @public\r\nexport interface ClientApi {\r\n    accountData: AccountDataApi;\r\n    // @alpha\r\n    readonly creationManagement: ClientCreationManagementApi;\r\n    getRoom: (id: string) => Room | null;\r\n}\r\n\r\n// @public\r\nexport interface ClientCreationManagementApi {\r\n    // @deprecated\r\n    setUserVerificationCaCertsPem(pem: string | null): void;\r\n    setX509ClientInitOpts(opts: X509ClientInitOpts): void;\r\n}\r\n\r\n// @alpha\r\nexport interface ComposerApi {\r\n    addFileUploadOption(option: ComposerApiFileUploadOption): void;\r\n    insertPlaintextIntoComposer(plaintext: string, view: ComposerApiTarget): void;\r\n    openFileUploadConfirmation(files: File[], view: ComposerApiTarget): void;\r\n}\r\n\r\n// @alpha\r\nexport type ComposerApiFileUploadOption = {\r\n    type: string;\r\n    label: string;\r\n    icon?: ComponentType<SVGAttributes<SVGElement>>;\r\n    onSelected: (roomId?: string, view?: ComposerApiTarget, relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    }) => Promise<void> | void;\r\n};\r\n\r\n// @alpha\r\nexport type ComposerApiTarget = {\r\n    view: \"room\";\r\n} | {\r\n    view: \"thread\";\r\n};\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"WebConfigJson\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @public\r\nexport interface Config extends WebConfigJson {\r\n    // (undocumented)\r\n    brand: string;\r\n}\r\n\r\n// @public\r\nexport interface ConfigApi {\r\n    // (undocumented)\r\n    get(): Config;\r\n    // (undocumented)\r\n    get<K extends keyof Config>(key: K): Config[K];\r\n    // (undocumented)\r\n    get<K extends keyof Config = never>(key?: K): Config | Config[K];\r\n}\r\n\r\n// @alpha\r\nexport type Container = \"top\" | \"right\" | \"center\";\r\n\r\n// @alpha\r\nexport interface CustomComponentsApi {\r\n    registerComposerPreview(filterFn: (composerText: string, roomId: string) => boolean, renderer: CustomComposerPreviewRenderFunction): void;\r\n    registerLoginComponent(renderer: CustomLoginRenderFunction): void;\r\n    registerMessageRenderer(eventTypeOrFilter: string | ((mxEvent: MatrixEvent) => boolean), renderer: CustomMessageRenderFunction, hints?: CustomMessageRenderHints): void;\r\n    registerRoomPreviewBar(renderer: CustomRoomPreviewBarRenderFunction): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewComponentProps = {\r\n    text: string;\r\n    roomId: string;\r\n    target?: ComposerApiTarget;\r\n    relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    };\r\n};\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewRenderFunction = ExtendablePropsRenderFunction<CustomComposerPreviewComponentProps>;\r\n\r\n// @alpha\r\nexport interface CustomisationsApi {\r\n    registerShouldShowComponent(fn: (this: void, component: UIComponent) => boolean | void): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginComponentProps = {\r\n    serverConfig: CustomLoginComponentPropsServerConfig;\r\n    fragmentAfterLogin?: string;\r\n    children?: ReactNode;\r\n    onLoggedIn(this: void, data: AccountAuthInfo): void;\r\n    onServerConfigChange(this: void, config: CustomLoginComponentPropsServerConfig): void;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomLoginComponentPropsServerConfig {\r\n    hsName: string;\r\n    hsUrl: string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginRenderFunction = ExtendablePropsRenderFunction<CustomLoginComponentProps>;\r\n\r\n// @alpha\r\nexport type CustomMessageComponentProps = {\r\n    mxEvent: MatrixEvent;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomMessageGrouping {\r\n    getKey?: (mxEvent: MatrixEvent) => string;\r\n    getSummary: (events: readonly MatrixEvent[]) => string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomMessageRenderFunction = (\r\nprops: CustomMessageComponentProps,\r\noriginalComponent?: (props?: OriginalMessageComponentProps) => React.JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport type CustomMessageRenderHints = {\r\n    allowEditingEvent?: boolean;\r\n    allowDownloadingMedia?: (mxEvent: MatrixEvent) => Promise<boolean>;\r\n    renderAsInfoMessage?: boolean;\r\n    renderSenderProfile?: boolean;\r\n    renderGroupSummary?: CustomMessageGrouping;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarComponentProps = {\r\n    roomId?: string;\r\n    roomAlias?: string;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarRenderFunction = (\r\nprops: CustomRoomPreviewBarComponentProps,\r\noriginalComponent: (props: CustomRoomPreviewBarComponentProps) => JSX.Element) => JSX.Element;\r\n\r\n// @public\r\nexport interface DialogApiExtension {\r\n    openDialog<M, P extends object>(initialOptions: DialogOptions, dialog: ComponentType<P & DialogProps<M>>, props: P): DialogHandle<M>;\r\n}\r\n\r\n// @public\r\nexport type DialogHandle<M> = {\r\n    finished: Promise<{\r\n        ok: boolean;\r\n        model: M | null;\r\n    }>;\r\n    close(this: void): void;\r\n};\r\n\r\n// @public\r\nexport interface DialogOptions {\r\n    ariaLabel?: string;\r\n    title?: string;\r\n}\r\n\r\n// @public\r\nexport type DialogProps<M> = {\r\n    onSubmit(this: void, model: M): void;\r\n    onCancel(this: void): void;\r\n};\r\n\r\n// @alpha\r\nexport type ExtendablePropsRenderFunction<BaseProps> = <P extends BaseProps>(\r\nprops: P,\r\noriginalComponent: (props: P) => JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport interface ExtrasApi {\r\n    addRoomHeaderButtonCallback(cb: RoomHeaderButtonsCallback): void;\r\n    getVisibleRoomBySpaceKey(spaceKey: string, cb: () => string[]): void;\r\n    setSpacePanelItem(spaceKey: string, props: SpacePanelItemProps): void;\r\n}\r\n\r\n// @alpha\r\nexport interface HardwareKey {\r\n    // (undocumented)\r\n    label: string;\r\n    // (undocumented)\r\n    manufacturerID: string;\r\n    // (undocumented)\r\n    maxPinLength: number;\r\n    // (undocumented)\r\n    minPinLength: number;\r\n    // (undocumented)\r\n    model: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n}\r\n\r\n// @alpha\r\nexport type HardwareKeyState = \"absent\" | \"noSigningKey\" | \"open\" | \"authenticated\";\r\n\r\n// @public\r\nexport interface I18nApi {\r\n    humanizeTime(this: void, timeMillis: number): string;\r\n    get language(): string;\r\n    register(this: void, translations: Partial<Translations>): void;\r\n    translate(this: void, key: keyof Translations, variables?: StringVariables): string;\r\n    translate(this: void, key: keyof Translations, variables: Variables | undefined, tags: Tags): ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type IdentityApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @alpha\r\nexport type LocationRenderFunction = () => JSX.Element;\r\n\r\n// @alpha\r\nexport interface MatrixEvent {\r\n    content: Record<string, unknown>;\r\n    eventId: string;\r\n    originServerTs: number;\r\n    roomId: string;\r\n    sender: string;\r\n    stateKey?: string;\r\n    type: string;\r\n    unsigned: Record<string, unknown>;\r\n}\r\n\r\n// @public\r\nexport type MaybePromise<T> = T | PromiseLike<T>;\r\n\r\n// @public\r\nexport interface Module {\r\n    // (undocumented)\r\n    load(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface ModuleFactory {\r\n    // (undocumented)\r\n    new (api: Api): Module;\r\n    // (undocumented)\r\n    readonly moduleApiVersion: string;\r\n    // (undocumented)\r\n    readonly prototype: Module;\r\n}\r\n\r\n// @public\r\nexport class ModuleIncompatibleError extends Error {\r\n    constructor(pluginVersion: string);\r\n}\r\n\r\n// @public\r\nexport class ModuleLoader {\r\n    constructor(api: Api);\r\n    // Warning: (ae-forgotten-export) The symbol \"ModuleExport\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    load(moduleExport: ModuleExport): Promise<void>;\r\n    // (undocumented)\r\n    start(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface NavigationApi {\r\n    openRoom(roomIdOrAlias: string, opts?: OpenRoomOptions): void;\r\n    // @alpha\r\n    registerLocationRenderer(path: string, renderer: LocationRenderFunction): void;\r\n    toMatrixToLink(link: string, join?: boolean): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface OpenRoomOptions {\r\n    autoJoin?: boolean;\r\n    viaServers?: string[];\r\n}\r\n\r\n// @alpha\r\nexport type OriginalMessageComponentProps = {\r\n    showUrlPreview?: boolean;\r\n};\r\n\r\n// @alpha\r\nexport type PreloadApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @public\r\nexport interface Profile {\r\n    displayName?: string;\r\n    isGuest?: boolean;\r\n    userId?: string;\r\n}\r\n\r\n// @public\r\nexport interface ProfileApiExtension {\r\n    readonly profile: Watchable<Profile>;\r\n}\r\n\r\n// @public\r\nexport interface RichVariables {\r\n    // (undocumented)\r\n    [key: string]: SubstitutionValue;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport interface Room {\r\n    getLastActiveTimestamp: () => number;\r\n    id: string;\r\n    name: Watchable<string>;\r\n}\r\n\r\n// @alpha\r\nexport type RoomHeaderButtonsCallback = (roomId: string) => JSX.Element | undefined;\r\n\r\n// @public\r\nexport interface RoomListStoreApi {\r\n    getRooms(): Watchable<Room[]>;\r\n    waitForReady(): Promise<void>;\r\n}\r\n\r\n// @alpha\r\nexport interface RoomViewProps {\r\n    enableReadReceiptsAndMarkersOnActivity?: boolean;\r\n    hideComposer?: boolean;\r\n    hideHeader?: boolean;\r\n    hidePinnedMessageBanner?: boolean;\r\n    hideRightPanel?: boolean;\r\n    hideWidgets?: boolean;\r\n}\r\n\r\n// @alpha\r\nexport interface SettingsApi {\r\n    getValue<T = any>(settingName: string, roomId?: string | null, excludeDefault?: boolean): T | undefined;\r\n}\r\n\r\n// @alpha\r\nexport interface SpacePanelItemProps {\r\n    className?: string;\r\n    icon?: JSX.Element;\r\n    label: string;\r\n    onSelected: () => void;\r\n    style?: React.CSSProperties;\r\n    tooltip?: string;\r\n}\r\n\r\n// @alpha\r\nexport interface StorageHelperApi {\r\n    getPickleKey(userId: string, deviceId: string): Promise<string | null>;\r\n}\r\n\r\n// @public\r\nexport interface StoresApi {\r\n    roomListStore: RoomListStoreApi;\r\n}\r\n\r\n// @public\r\nexport interface StringVariables {\r\n    // (undocumented)\r\n    [key: string]: number | string | null | undefined;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport type SubstitutionValue = number | string | ReactNode | ((sub: string) => ReactNode);\r\n\r\n// @public\r\nexport type Tags = Record<string, SubstitutionValue>;\r\n\r\n// @public\r\nexport type Translations = Record<string, {\r\n    [ietfLanguageTag: string]: string;\r\n}>;\r\n\r\n// @alpha\r\nexport const enum UIComponent {\r\n    AddIntegrations = \"UIComponent.addIntegrations\",\r\n    CreateRooms = \"UIComponent.roomCreation\",\r\n    CreateSpaces = \"UIComponent.spaceCreation\",\r\n    ExploreRooms = \"UIComponent.exploreRooms\",\r\n    FilterContainer = \"UIComponent.filterContainer\",\r\n    InviteUsers = \"UIComponent.sendInvites\",\r\n    RoomOptionsMenu = \"UIComponent.roomOptionsMenu\"\r\n}\r\n\r\n// @alpha\r\nexport interface UrlPreviewApi {\r\n    registerPreviewHandler(regex: RegExp, handler: UrlPreviewHandler): void;\r\n}\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"UrlPreview\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @alpha\r\nexport type UrlPreviewHandler = (url: string, mxEvent?: MatrixEvent) => Promise<UrlPreview | null>;\r\n\r\n// @alpha\r\nexport interface UserCertificate {\r\n    // (undocumented)\r\n    certificate: CertificateInfo;\r\n    chain: string;\r\n}\r\n\r\n// @public\r\nexport function useWatchable<T>(watchable: Watchable<T>): T;\r\n\r\n// @public\r\nexport type Variables = StringVariables | RichVariables;\r\n\r\n// @public\r\nexport class Watchable<T> {\r\n    constructor(currentValue: T);\r\n    // Warning: (ae-forgotten-export) The symbol \"WatchFn\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    protected readonly listeners: Set<WatchFn<T>>;\r\n    protected onFirstWatch(): void;\r\n    protected onLastWatch(): void;\r\n    // (undocumented)\r\n    unwatch(listener: (value: T) => void): void;\r\n    get value(): T;\r\n    set value(value: T);\r\n    // (undocumented)\r\n    watch(listener: (value: T) => void): void;\r\n}\r\n\r\n// @alpha\r\nexport interface WidgetApi {\r\n    getAppAvatarUrl(app: IWidget, width?: number, height?: number, resizeMethod?: string): string | null;\r\n    getWidgetsInRoom(roomId: string): IWidget[];\r\n    isAppInContainer(app: IWidget, container: Container, roomId: string): boolean;\r\n    moveAppToContainer(app: IWidget, container: Container, roomId: string): void;\r\n}\r\n\r\n// @alpha\r\nexport type WidgetDescriptor = {\r\n    id: string;\r\n    templateUrl: string;\r\n    creatorUserId: string;\r\n    type: string;\r\n    origin: string;\r\n    roomId?: string;\r\n};\r\n\r\n// @alpha\r\nexport interface WidgetLifecycleApi {\r\n    registerCapabilitiesApprover(approver: CapabilitiesApprover): void;\r\n    registerIdentityApprover(approver: IdentityApprover): void;\r\n    registerPreloadApprover(approver: PreloadApprover): void;\r\n}\r\n\r\n// @alpha\r\nexport interface X509Api {\r\n    getKeyState(serialNumber: string): Promise<X509Result<HardwareKeyState>>;\r\n    getUserCertificate(): Promise<X509Result<UserCertificate>>;\r\n    listHardwareKeys(): Promise<X509Result<HardwareKey[]>>;\r\n    logIntoKey(serialNumber: string, pin: string): Promise<X509LoginResult>;\r\n    signData(serialNumber: string, data: Uint8Array): Promise<X509Result<Uint8Array>>;\r\n}\r\n\r\n// @public\r\nexport interface X509ClientInitOpts {\r\n    signer?: (item: Uint8Array) => Promise<{\r\n        signature_bytes: Uint8Array;\r\n        certificate_chain: string;\r\n        signature_scheme: \"RsaPssSha512\";\r\n    }>;\r\n    userVerificationCaCertsPem?: string;\r\n    validity?: () => number;\r\n}\r\n\r\n// @alpha\r\nexport interface X509IpcError {\r\n    // (undocumented)\r\n    code: X509IpcErrorCode;\r\n    // (undocumented)\r\n    message?: string;\r\n    pkcs11Code?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509IpcErrorCode =\r\n/**\r\n* No PKCS#11 library is configured or it could not be loaded.\r\n*/\r\n| \"MODULE_NOT_LOADED\"\r\n| \"KEY_NOT_FOUND\"\r\n| \"CERTIFICATE_NOT_FOUND\"\r\n| \"PRIVATE_KEY_NOT_FOUND\"\r\n/**\r\n* `signData` was called before `logIntoKey`, or the session was invalidated since.\r\n*/\r\n| \"LOGIN_REQUIRED\"\r\n/**\r\n* An upstream error from the PKCS#11 library. Carries a `CKR_*` code.\r\n*/\r\n| \"UPSTREAM_PKCS11\"\r\n| \"UNKNOWN\";\r\n\r\n// @alpha\r\nexport interface X509LoginError extends X509IpcError {\r\n    triesRemaining?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509LoginResult = X509Result<void, X509LoginError>;\r\n\r\n// @alpha\r\nexport type X509Result<T, E extends X509IpcError = X509IpcError> = { ok: true; data: T } | { ok: false; error: E };\r\n\r\n// (No @packageDocumentation comment for this package)\r\n\r\n```\r\n","packages/module-api/project.json":"{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/module-api\",\n    \"targets\": {\n        \"build\": {\n            \"cache\": true,\n            \"inputs\": [\"src\"],\n            \"outputs\": [\"{projectRoot}/lib\"],\n            \"command\": \"vite build\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        },\n        \"start\": {\n            \"command\": \"vite build --watch\",\n            \"options\": { \"cwd\": \"packages/module-api\" },\n            \"dependsOn\": [\"^start\"],\n            \"continuous\": true\n        },\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        }\n    }\n}\n","packages/module-api/api-extractor.json":"/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n\n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n\n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    // \"projectFolder\": \"..\",\n\n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/lib/index.d.ts\",\n\n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we might specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     *\n     * The \"bundledPackages\" elements may specify glob patterns using minimatch syntax.  To ensure deterministic\n     * output, globs are expanded by matching explicitly declared top-level dependencies only.  For example,\n     * the pattern below will NOT match \"@my-company/example\" unless it appears in a field such as \"dependencies\"\n     * or \"devDependencies\" of the project's package.json file:\n     *\n     *   \"bundledPackages\": [ \"@my-company/*\" ],\n     */\n    \"bundledPackages\": [\"shared-types\"],\n\n    /**\n     * Specifies what type of newlines API Extractor should use when writing output files.  By default, the output files\n     * will be written with Windows-style newlines.  To use POSIX-style newlines, specify \"lf\" instead.\n     * To use the OS's default newline kind, specify \"os\".\n     *\n     * DEFAULT VALUE: \"crlf\"\n     */\n    // \"newlineKind\": \"crlf\",\n\n    /**\n     * Specifies how API Extractor sorts members of an enum when generating the .api.json file. By default, the output\n     * files will be sorted alphabetically, which is \"by-name\". To keep the ordering in the source code, specify\n     * \"preserve\".\n     *\n     * DEFAULT VALUE: \"by-name\"\n     */\n    // \"enumMemberOrder\": \"by-name\",\n\n    /**\n     * Set to true when invoking API Extractor's test harness. When `testMode` is true, the `toolVersion` field in the\n     * .api.json file is assigned an empty string to prevent spurious diffs in output files tracked for tests.\n     *\n     * DEFAULT VALUE: \"false\"\n     */\n    // \"testMode\": false,\n\n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n        /**\n         * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n         */\n        // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n        /**\n         * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n         * The object must conform to the TypeScript tsconfig schema:\n         *\n         * http://json.schemastore.org/tsconfig\n         *\n         * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n         *\n         * DEFAULT VALUE: no overrideTsconfig section\n         */\n        // \"overrideTsconfig\": {\n        //   . . .\n        // }\n        /**\n         * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n         * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n         * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n         * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"skipLibCheck\": true,\n    },\n\n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n        /**\n         * (REQUIRED) Whether to generate an API report.\n         */\n        \"enabled\": true,\n\n        /**\n         * The base filename for the API report files, to be combined with \"reportFolder\" or \"reportTempFolder\"\n         * to produce the full file path.  The \"reportFileName\" should not include any path separators such as\n         * \"\\\" or \"/\".  The \"reportFileName\" should not include a file extension, since API Extractor will automatically\n         * append an appropriate file extension such as \".api.md\".  If the \"reportVariants\" setting is used, then the\n         * file extension includes the variant name, for example \"my-report.public.api.md\" or \"my-report.beta.api.md\".\n         * The \"complete\" variant always uses the simple extension \"my-report.api.md\".\n         *\n         * Previous versions of API Extractor required \"reportFileName\" to include the \".api.md\" extension explicitly;\n         * for backwards compatibility, that is still accepted but will be discarded before applying the above rules.\n         *\n         * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<unscopedPackageName>\"\n         */\n        // \"reportFileName\": \"<unscopedPackageName>\",\n\n        /**\n         * To support different approval requirements for different API levels, multiple \"variants\" of the API report can\n         * be generated.  The \"reportVariants\" setting specifies a list of variants to be generated.  If omitted,\n         * by default only the \"complete\" variant will be generated, which includes all @internal, @alpha, @beta,\n         * and @public items.  Other possible variants are \"alpha\" (@alpha + @beta + @public), \"beta\" (@beta + @public),\n         * and \"public\" (@public only).\n         *\n         * DEFAULT VALUE: [ \"complete\" ]\n         */\n        // \"reportVariants\": [\"public\", \"beta\"],\n\n        /**\n         * Specifies the folder where the API report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n         * e.g. for an API review.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/etc/\"\n         */\n        \"reportFolder\": \"<projectFolder>/\"\n\n        /**\n         * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n         * If they are different, a production build will fail.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/\"\n         */\n        // \"reportTempFolder\": \"<projectFolder>/temp/\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the API report file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false\n    },\n\n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n        /**\n         * (REQUIRED) Whether to generate a doc model file.\n         */\n        \"enabled\": true\n\n        /**\n         * The output path for the doc model file.  The file extension should be \".api.json\".\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n         */\n        // \"apiJsonFilePath\": \"<projectFolder>/temp/<unscopedPackageName>.api.json\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the doc model file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false,\n\n        /**\n         * The base URL where the project's source code can be viewed on a website such as GitHub or\n         * Azure DevOps. This URL path corresponds to the `<projectFolder>` path on disk.\n         *\n         * This URL is concatenated with the file paths serialized to the doc model to produce URL file paths to individual API items.\n         * For example, if the `projectFolderUrl` is \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor\" and an API\n         * item's file path is \"api/ExtractorConfig.ts\", the full URL file path would be\n         * \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor/api/ExtractorConfig.js\".\n         *\n         * This setting can be omitted if you don't need source code links in your API documentation reference.\n         *\n         * SUPPORTED TOKENS: none\n         * DEFAULT VALUE: \"\"\n         */\n        // \"projectFolderUrl\": \"http://github.com/path/to/your/projectFolder\"\n    },\n\n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n        /**\n         * (REQUIRED) Whether to generate the .d.ts rollup file.\n         */\n        \"enabled\": true,\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n         * This file will include all declarations that are exported by the main entry point.\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n         */\n        \"untrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for an \"alpha\" release.\n         * This file will include only declarations that are marked as \"@public\", \"@beta\", or \"@alpha\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"alphaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-alpha.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n         * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"betaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-beta.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n         * This file will include only declarations that are marked as \"@public\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"publicTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-public.d.ts\"\n\n        /**\n         * When a declaration is trimmed, by default it will be replaced by a code comment such as\n         * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n         * declaration completely.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"omitTrimmingComments\": true\n    },\n\n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n        /**\n         * Whether to generate the tsdoc-metadata.json file.\n         *\n         * DEFAULT VALUE: true\n         */\n        // \"enabled\": true,\n        /**\n         * Specifies where the TSDoc metadata file should be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n         * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n         * falls back to \"tsdoc-metadata.json\" in the package folder.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<lookup>\"\n         */\n        // \"tsdocMetadataFilePath\": \"<projectFolder>/dist/tsdoc-metadata.json\"\n    },\n\n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n        /**\n         * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n         * the input .d.ts files.\n         *\n         * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"compilerMessageReporting\": {\n            /**\n             * Configures the default routing for messages that don't match an explicit rule in this table.\n             */\n            \"default\": {\n                /**\n                 * Specifies whether the message should be written to the the tool's output log.  Note that\n                 * the \"addToApiReportFile\" property may supersede this option.\n                 *\n                 * Possible values: \"error\", \"warning\", \"none\"\n                 *\n                 * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n                 * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n                 * the \"--local\" option), the warning is displayed but the build will not fail.\n                 *\n                 * DEFAULT VALUE: \"warning\"\n                 */\n                \"logLevel\": \"warning\"\n\n                /**\n                 * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n                 * then the message will be written inside that file; otherwise, the message is instead logged according to\n                 * the \"logLevel\" option.\n                 *\n                 * DEFAULT VALUE: false\n                 */\n                // \"addToApiReportFile\": false\n            }\n\n            // \"TS2551\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by API Extractor during its analysis.\n         *\n         * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n         *\n         * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n         */\n        \"extractorMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"ae-extra-release-tag\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n         *\n         * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"tsdocMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"tsdoc-link-tag-unescaped-text\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        }\n    }\n}\n","packages/module-api/package.json":"{\n    \"name\": \"@element-hq/element-web-module-api\",\n    \"type\": \"module\",\n    \"version\": \"2.2.0\",\n    \"description\": \"Module API surface for element-web\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/element-hq/element-web.git\",\n        \"directory\": \"packages/module-api\"\n    },\n    \"author\": \"element-hq\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"engines\": {\n        \"node\": \">=20.0.0\"\n    },\n    \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n    \"exports\": {\n        \".\": {\n            \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n            \"import\": \"./lib/element-web-plugin-engine.js\",\n            \"require\": \"./lib/element-web-plugin-engine.umd.cjs\"\n        },\n        \"./vite.base.ts\": {\n            \"types\": \"./vite.base.ts\",\n            \"import\": \"./vite.base.ts\"\n        }\n    },\n    \"files\": [\n        \"lib\",\n        \"vite.base.ts\"\n    ],\n    \"scripts\": {\n        \"prepack\": \"nx build\",\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\",\n        \"coverage\": \"pnpm test:unit --coverage\",\n        \"coverage:diff\": \"diff-cover --config-file ../../diff-cover.toml coverage/lcov.info\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.49.1\",\n        \"@types/node\": \"catalog:ts6\",\n        \"@types/react\": \"catalog:\",\n        \"@types/react-dom\": \"catalog:\",\n        \"@types/semver\": \"^7.5.8\",\n        \"@typescript/native\": \"catalog:\",\n        \"matrix-widget-api\": \"^1.17.0\",\n        \"rollup-plugin-external-globals\": \"^0.13.0\",\n        \"semver\": \"^7.6.3\",\n        \"shared-types\": \"workspace:*\",\n        \"typescript\": \"catalog:ts6\",\n        \"unplugin-dts\": \"catalog:\",\n        \"vite\": \"catalog:\",\n        \"vitest\": \"catalog:\"\n    },\n    \"peerDependencies\": {\n        \"@types/react\": \"*\",\n        \"@types/react-dom\": \"*\",\n        \"matrix-web-i18n\": \"*\",\n        \"matrix-widget-api\": \"*\",\n        \"react\": \"^19\"\n    },\n    \"peerDependenciesMeta\": {\n        \"matrix-widget-api\": {\n            \"optional\": true\n        },\n        \"matrix-web-i18n\": {\n            \"optional\": true\n        }\n    }\n}\n","packages/eslint-plugin-element-web/project.json":"{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/eslint-plugin-element-web\",\n    \"targets\": {\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/eslint-plugin-element-web\" }\n        }\n    }\n}\n","packages/module-api/tsconfig.json":"{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"rootDir\": \"./src\",\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"esModuleInterop\": true,\n        \"strict\": true,\n        \"declaration\": true,\n        \"module\": \"es2022\",\n        \"moduleResolution\": \"bundler\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"jsx\": \"react-jsx\",\n        \"declarationMap\": true,\n        \"allowImportingTsExtensions\": true\n    },\n    \"include\": [\"src\"]\n}\n","packages/eslint-plugin-element-web/package.json":"{\n    \"name\": \"eslint-plugin-element-web\",\n    \"type\": \"module\",\n    \"version\": \"0.0.0\",\n    \"private\": true,\n    \"description\": \"Element Web specific lint rules, loaded by oxlint as a JS plugin\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"exports\": {\n        \".\": \"./src/index.ts\"\n    },\n    \"scripts\": {\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\"\n    },\n    \"devDependencies\": {\n        \"@typescript/native\": \"catalog:\",\n        \"oxlint\": \"catalog:\",\n        \"typescript\": \"catalog:ts6\",\n        \"vitest\": \"catalog:\"\n    }\n}\n","packages/module-api/README.md":"# @element-hq/element-web-module-api\n\nAPI surface for extending Element Web in a safe & predictable way.\n\n## Using the API\n\nModules are loaded by Element Web at runtime via a dynamic ecmascript import, but can be bundled into a webapp for deployment convenience.\n\nThe module's default export MUST be a class which accepts a single argument, an instance of `ModuleApi`.\nThis class must also bear a static property `moduleApiVersion` which is a semver range string\nand a `load` method which is called when the module is to be loaded.\n\n```typescript\nimport type { Module, Api, ModuleFactory } from \"@element-hq/element-web-module-api\";\n\nclass ExampleModule implements Module {\n    public static readonly moduleApiVersion = \"^2.0.0\";\n\n    public constructor(private api: Api) {}\n\n    public async load(): Promise<void> {\n        // Your extension code goes here\n    }\n}\n\nexport default ExampleModule satisfies ModuleFactory;\n```\n\n### Accessing application configuration\n\nThe `api` object passed to the module constructor provides access to the application configuration.\nYou can extend the Config types using declaration merging, though please ensure that you do not trust the types you specify,\nand opt for runtime validation due to the dynamic nature of the configuration.\n\n```typescript\n// ...\ndeclare module \"@element-hq/element-web-module-api\" {\n    interface Config {\n        \"this.is.my.config.key\": string;\n    }\n}\n\nclass ExampleModule implements Module {\n    // ...\n    public async load(): Promise<void> {\n        const configValue = this.api.config.get(\"this.is.my.config.key\");\n        // Your extension code goes here\n    }\n}\n// ...\n```\n\n## Releases\n\nThe API is versioned using semver, with the major version incremented for breaking changes.\n\nTo carry out a release, see the documentation at [`../RELEASING.md`](../RELEASING.md).\n\n## Copyright & License\n\nCopyright (c) 2025 New Vector Ltd\n\nThis software is multi licensed by New Vector Ltd (Element). It can be used either:\n\n(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR\n\n(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).\nUnless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.\n","packages/playwright-common/README.md":"# @element-hq/element-web-playwright-common\n\nSet of Playwright & testcontainers utilities to make it easier to write tests for Element Web, Element Web Modules & Element Desktop.\n\nThe main export includes a number of fixtures and custom assertions as documented in JSDoc.\n\nThe `lib/testcontainers` export contains the following modules:\n\n- `SynapseContainer` - A testcontainer for running a Synapse server\n- `MatrixAuthenticationServiceContainer` - A testcontainer for running a Matrix Authentication Service\n- `MailpitContainer` - A testcontainer for running a Mailpit SMTP server\n\nThere are a number of utils available in the `lib/utils` export.\n\n## Releases\n\nThe API is versioned using semver, with the major version incremented for breaking changes.\n\nTo carry out a release, see the documentation at [`../RELEASING.md`](../RELEASING.md).\n\n## Copyright & License\n\nCopyright (c) 2026 Element Creations Ltd\n\nThis software is multi licensed by Element Creations Ltd (Element). It can be used either:\n\n(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR\n\n(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).\nUnless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.\n","packages/playwright-common/package.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/package.json)","packages/playwright-common/project.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/project.json)","packages/playwright-common/tsconfig.build.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.build.json)","packages/playwright-common/tsconfig.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.json)","packages/shared-components/README.md":"# shared-components Documentation\n\nPath: `packages/shared-components/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/README.md)","packages/shared-components/package.json":"# Shared-components Skill\n\nPath: `packages/shared-components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/package.json)","packages/shared-components/project.json":"# Shared-components Skill\n\nPath: `packages/shared-components/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/project.json)","packages/shared-components/tsconfig.json":"# Shared-components Skill\n\nPath: `packages/shared-components/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.json)","packages/shared-components/tsconfig.node.json":"# Shared-components Skill\n\nPath: `packages/shared-components/tsconfig.node.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.node.json)","packages/shared-components/typedoc.json":"# Shared-components Skill\n\nPath: `packages/shared-components/typedoc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/typedoc.json)","packages/shared-types/package.json":"# Shared-types Skill\n\nPath: `packages/shared-types/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/package.json)","packages/shared-types/tsconfig.json":"# Shared-types Skill\n\nPath: `packages/shared-types/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/tsconfig.json)","packages/shared-utils/README.md":"# shared-utils Documentation\n\nPath: `packages/shared-utils/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/README.md)","packages/shared-utils/package.json":"# Shared-utils Skill\n\nPath: `packages/shared-utils/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/package.json)","packages/shared-utils/project.json":"# Shared-utils Skill\n\nPath: `packages/shared-utils/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/project.json)","packages/shared-utils/tsconfig.json":"# Shared-utils Skill\n\nPath: `packages/shared-utils/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/tsconfig.json)","packages/shared-components/static/README.md":"# static Documentation\n\nPath: `packages/shared-components/static/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/static/README.md)","apps/web/playwright/plugins/oauth_server/README.md":"# oauth_server Documentation\n\nPath: `apps/web/playwright/plugins/oauth_server/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/apps/web/playwright/plugins/oauth_server/README.md)","packages/shared-components/src/i18n/strings/cs.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cs.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cs.json)","packages/shared-components/src/i18n/strings/cy.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cy.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cy.json)","packages/shared-components/src/i18n/strings/da.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/da.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/da.json)","packages/shared-components/src/i18n/strings/de_DE.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/de_DE.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/de_DE.json)","packages/shared-components/src/i18n/strings/el.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/el.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/el.json)","packages/shared-components/src/i18n/strings/en_EN.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/en_EN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/en_EN.json)","packages/shared-components/src/i18n/strings/eo.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/eo.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/eo.json)","packages/shared-components/src/i18n/strings/es.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/es.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/es.json)","packages/shared-components/src/i18n/strings/et.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/et.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/et.json)","packages/shared-components/src/i18n/strings/fa.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fa.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fa.json)","packages/shared-components/src/i18n/strings/fi.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fi.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fi.json)","packages/shared-components/src/i18n/strings/fr.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fr.json)","packages/shared-components/src/i18n/strings/gl.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/gl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/gl.json)","packages/shared-components/src/i18n/strings/he.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/he.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/he.json)","packages/shared-components/src/i18n/strings/hr.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hr.json)","packages/shared-components/src/i18n/strings/hu.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hu.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hu.json)","packages/shared-components/src/i18n/strings/hy.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hy.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hy.json)","packages/shared-components/src/i18n/strings/id.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/id.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/id.json)","packages/shared-components/src/i18n/strings/is.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/is.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/is.json)","packages/shared-components/src/i18n/strings/it.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/it.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/it.json)","packages/shared-components/src/i18n/strings/ja.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ja.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ja.json)","packages/shared-components/src/i18n/strings/ka.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ka.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ka.json)","packages/shared-components/src/i18n/strings/ko.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ko.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ko.json)","packages/shared-components/src/i18n/strings/lo.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lo.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lo.json)","packages/shared-components/src/i18n/strings/lt.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lt.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lt.json)","packages/shared-components/src/i18n/strings/lv.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lv.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lv.json)","packages/shared-components/src/i18n/strings/mg_MG.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/mg_MG.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/mg_MG.json)","packages/shared-components/src/i18n/strings/nb_NO.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/nb_NO.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nb_NO.json)","packages/shared-components/src/i18n/strings/nl.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/nl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nl.json)","packages/shared-components/src/i18n/strings/pl.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pl.json)","packages/shared-components/src/i18n/strings/pt.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pt.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt.json)","packages/shared-components/src/i18n/strings/pt_BR.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pt_BR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt_BR.json)","packages/shared-components/src/i18n/strings/ru.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ru.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ru.json)","packages/shared-components/src/i18n/strings/sk.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sk.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sk.json)","packages/shared-components/src/i18n/strings/sq.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sq.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sq.json)","packages/shared-components/src/i18n/strings/sv.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sv.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sv.json)","packages/shared-components/src/i18n/strings/tr.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/tr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/tr.json)","packages/shared-components/src/i18n/strings/uk.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/uk.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/uk.json)","packages/shared-components/src/i18n/strings/vi.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/vi.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/vi.json)","packages/shared-components/src/i18n/strings/zh_Hans.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/zh_Hans.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hans.json)","packages/shared-components/src/i18n/strings/zh_Hant.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/zh_Hant.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hant.json)"},"files":{"packages/eslint-plugin-element-web/tsconfig.json":"{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"strict\": true,\n        \"module\": \"nodenext\",\n        \"moduleResolution\": \"nodenext\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"allowImportingTsExtensions\": true,\n        \"verbatimModuleSyntax\": true,\n        \"erasableSyntaxOnly\": true\n    },\n    \"include\": [\"src\"]\n}\n","packages/RELEASING.md":"# Release process for packages in element-web/packages\n\n1. Update `package.json` with the new version. One way to do this is\n   `pnpm version --no-git-tag-version <major|minor|patch>`. Or just do it manually.\n\n2. Commit to a release prep branch, and open a PR.\n\n3. Once the PR has merged to `develop`, run the\n   [npm-publish](https://github.com/element-hq/element-web/actions/workflows/npm-publish.yaml)\n   Github Actions workflow, specifying the package to be released.\n","AGENTS.md":"# AGENTS.md\n\nInstructions for AI coding agents working in this repository. Humans should read\n[CONTRIBUTING.md](./CONTRIBUTING.md) and [code_style.md](./code_style.md) instead — this file summarises those and\nadds the things that are easy to get wrong here.\n\n## Repository layout\n\nA pnpm + nx monorepo (`element-web-monorepo`). Workspaces are `apps/*`, `packages/*`, `modules` and `modules/*`.\n\n| Path                                                                                                  | Contents                                                                                                      |\n| ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| `apps/web`                                                                                            | The Element Web app. Also hosts view models (`src/viewmodels/`) and the Playwright e2e suite (`playwright/`). |\n| `apps/desktop`                                                                                        | Element Desktop.                                                                                              |\n| `packages/shared-components`                                                                          | Published UI component library, `@element-hq/web-shared-components`. New views go here.                       |\n| `packages/module-api`, `packages/shared-utils`, `packages/shared-types`, `packages/playwright-common` | Published support packages.                                                                                   |\n| `modules/*`                                                                                           | Optional runtime modules (banner, widget toggles, …).                                                         |\n| `docs/`                                                                                               | VitePress docs site.                                                                                          |\n\nThere is **no** top-level `playwright/` directory; `docs/playwright.md` uses paths relative to `apps/web`.\n\n## Commands\n\nRun from the repo root unless stated otherwise.\n\n| Task                                                   | Command                                           |\n| ------------------------------------------------------ | ------------------------------------------------- |\n| Full lint (types, format, js, styles, workflows, knip) | `pnpm lint`                                       |\n| Format                                                 | `pnpm lint:fmt:fix`                               |\n| Lint JS/TS                                             | `pnpm lint:js:fix`                                |\n| Typecheck                                              | `pnpm -r --workspace-concurrency=1 lint:types`    |\n| All unit tests                                         | `pnpm test:unit`                                  |\n| Regenerate i18n strings                                | `pnpm i18n`                                       |\n| Start the app                                          | `cd apps/web && pnpm start`                       |\n| Storybook                                              | `cd packages/shared-components && pnpm storybook` |\n\nFormatting is **oxfmt** and linting is **oxlint**. This repo does not use prettier or eslint — running prettier here\nreformats files against the project style and reports failures that do not exist.\n\nRun `pnpm i18n` after adding or changing any translated string.\n\n## Running unit tests\n\nBoth jest and vitest are in use; a migration to vitest is in progress. **The file path decides the runner.**\n\n| Test file                                      | Runner           | Command                                                     |\n| ---------------------------------------------- | ---------------- | ----------------------------------------------------------- |\n| `apps/web/test/**/*-test.[tj]s?(x)`            | jest             | `cd apps/web && pnpm jest <path>`                           |\n| `apps/web/src/**/*.test.{ts,tsx}`              | vitest           | `pnpm vitest run <path>`                                    |\n| `apps/web/src/**/*.test.browser.{ts,tsx}`      | vitest (browser) | `pnpm vitest run --project web-browser <path>`              |\n| `packages/shared-components/src/**/*.test.tsx` | vitest           | `cd packages/shared-components && pnpm test:unit -- <path>` |\n\nNotes:\n\n- Write new tests as co-located vitest `*.test.ts(x)` next to the source file. The `apps/web/test/` jest tree is\n  legacy; extend it only when the file you are changing already lives there.\n- Vitest runs with `globals: false`, so import `describe`, `it`, `expect` and friends explicitly.\n- `packages/shared-components` is excluded from the root vitest config and must be run from its own directory.\n- \"No test files found\" means you picked the wrong runner or path. It is not a pass.\n- Prefer extending an existing test over adding a new file when covering a close variant of existing behaviour.\n\n## Running e2e tests\n\nSpecs live in `apps/web/playwright/e2e`. See [docs/playwright.md](./docs/playwright.md) for the full guide.\n\n```sh\ncd apps/web && pnpm test:playwright -- playwright/e2e/<spec>.spec.ts --project=Chrome\n```\n\n- Requires a container runtime (Docker/Podman/Colima) for the homeserver testcontainers.\n- On macOS, add `--ignore-snapshots`. Screenshot baselines are only committed for Linux, so comparisons fail locally.\n- Never run `pnpm test:playwright:screenshots` locally to \"fix\" a screenshot diff — it writes host-rendered baselines.\n  Screenshots are updated in the Docker environment, which CI matches.\n- The config uses `reuseExistingServer: true`. Check `lsof -ti:8080` first; a stale dev server silently serves the\n  tests. Port-bind errors are an infrastructure problem, not a test failure.\n- Locate elements by role, label and accessible name, not CSS classes.\n- Tag any test using `toMatchScreenshot` with `@screenshot`.\n\n### Reviewing updated screenshots\n\nUpdated baselines are part of the diff and must be reviewed, not accepted blindly. Before committing any changed\n`.png` under `apps/web/playwright/snapshots/` or `packages/shared-components/__vis__/`:\n\n- Look at the image. Confirm every visible difference is one your change was meant to produce.\n- Treat anything else as a regression until proven otherwise: shifted or clipped layout, changed spacing or font,\n  missing or duplicated elements, a wrong theme, an untranslated or placeholder string, a loading or error state\n  captured instead of the real content.\n- Unrelated files changing baselines is a signal in itself — if a screenshot moved for a component you did not\n  touch, find out why rather than committing it.\n- Never regenerate baselines to make a failing test pass. A diff you cannot explain is a bug in the change.\n\n## Writing UI code: MVVM\n\nNew UI follows MVVM. Full details in [docs/MVVM.md](./docs/MVVM.md); the shape for a feature `Foo`:\n\n**View** — `packages/shared-components/src/<domain>/FooView/` containing `FooView.tsx`, `FooView.module.css`,\n`FooView.test.tsx`, `FooView.stories.tsx` and `index.ts`. The view declares the contract:\n\n```tsx\nexport interface FooViewSnapshot { title: string }\ninterface FooViewActions { setTitle: (title: string) => void }\nexport type FooViewModel = ViewModel<FooViewSnapshot, FooViewActions>;\n\nexport function FooView({ vm }: { vm: FooViewModel }): JSX.Element {\n    const { title } = useViewModel(vm);\n    ...\n}\n```\n\nViews are dumb: they read the snapshot and call actions, nothing else. Develop them in Storybook.\n\n**ViewModel** — `apps/web/src/viewmodels/<domain>/FooViewModel.ts`, a class extending `BaseViewModel` that implements\nthe interface from the view. `apps/web/src/components/viewmodels/` is the deprecated v1 location; do not add there.\n\nRules that are easy to miss:\n\n- Define actions as arrow-function class properties (`public doThing = (): void => {}`) so `this` survives being\n  passed as a callback.\n- Use `this.snapshot.merge({ field })` for partial updates. `merge` already skips emitting when nothing changed, so\n  do not add equality guards around it, and do not recompute the whole snapshot for one field.\n- Track listeners and sub-view-models with `this.disposables.trackListener(...)` / `this.disposables.track(...)`.\n- A non-MVVM function component owning a view model should create it with `useCreateAutoDisposedViewModel`; a class\n  component creates it in `componentDidMount` and disposes it in `componentWillUnmount`.\n\nReference implementation: `packages/shared-components/src/room-list/RoomListSearchView/` with\n`apps/web/src/viewmodels/room-list/RoomListSearchViewModel.ts`.\n\n## Code style\n\nRead [code_style.md](./code_style.md). The points most often missed:\n\n- **Every new file needs a copyright header**, enforced by oxlint (`element-call/copyright-header`). Lint fails\n  without it. Substitute the actual current year — check it rather than copying a year from another file — and leave\n  headers on existing files alone:\n\n    ```\n    /*\n    Copyright <current year> <copyright holder>\n\n    SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\n    Please see LICENSE in the repository root for full details.\n    */\n    ```\n\n    The holder is `Element Creations Ltd.` **only for contributions made as part of Element**. An external\n    contributor puts their own name or their company's there instead. Note that `oxlint --fix` inserts the Element\n    line unconditionally, so external contributors should write the header by hand and check what the autofix added.\n\n- TypeScript only, named exports only — avoid `export default`.\n- 4-space indent, 120-column limit, double quotes, semicolons.\n- Declare member visibility (`public`/`private`/`protected`) on class members.\n- Avoid `any`; if unavoidable, comment why.\n- Roughly one interface, class or enum per file, named after the file.\n- Never mix cosmetic and functional changes.\n- **Styles:** `apps/web` uses PostCSS (`res/css/**/_Component.pcss`, `mx_`-prefixed classes).\n  `packages/shared-components` uses CSS modules (`Component.module.css`, semantic camelCase class names, no `mx_`\n  prefix) imported as `styles`. Use Compound design tokens (`var(--cpd-color-…)`, `var(--cpd-space-…)`) for all values.\n- Prefer Compound typography components over raw text elements, and `Flex`/`Box` from shared-components over raw\n  flexbox markup.\n\n## Comments\n\nKeep comments short and relevant.\n\n- Add TSDoc to exported types, functions, classes and components. Document a component's props.\n- Inside a function, explain _why_, not line by line. Add a short overview before a non-obvious block.\n- Use plain language matching the identifiers around the comment — no metaphors or CS jargon.\n- When changing code, update the comments around it so they stay accurate.\n- Any intentionally suppressed lint or type rule needs a nearby comment explaining why.\n\n## Tests are required\n\n- Every change needs unit tests, including features behind labs flags.\n- New user-facing features need a \"happy path\" Playwright e2e test before leaving labs.\n- Aim for ≥80% coverage on the diff; CI checks this. There is no `coverage` script at the root — generate the\n  reports in the workspaces you touched, then compare from the root:\n\n    ```sh\n    pnpm test:unit --coverage                              # vitest, writes coverage/lcov.info\n    cd apps/web && pnpm coverage                           # jest only, writes apps/web/coverage/lcov.info\n    cd packages/shared-components && pnpm coverage\n    pnpm coverage:diff                                     # from the root, needs diff_cover installed\n    ```\n\n## Commits\n\n- Split the work into logically separate commits: one concern per commit. Keep refactors, formatting and behaviour\n  changes in separate commits.\n- Short imperative subject line, no conventional-commit prefix (`feat:`, `fix:`, …).\n- Add a body only when it says something the diff does not; keep it to a line or two.\n\n## Pull requests\n\n- Don't open PR. This should be done by the human, not the agent.\n","packages/module-api/element-web-module-api.api.md":"## API Report File for \"@element-hq/element-web-module-api\"\r\n\r\n> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).\r\n\r\n```ts\r\n\r\nimport { ComponentType } from 'react';\r\nimport { IWidget } from 'matrix-widget-api';\r\nimport { JSX } from 'react';\r\nimport { ReactNode } from 'react';\r\nimport { Root } from 'react-dom/client';\r\nimport { SVGAttributes } from 'react';\r\n\r\n// @public\r\nexport interface AccountAuthApiExtension {\r\n    overwriteAccountAuth(accountInfo: AccountAuthInfo): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface AccountAuthInfo {\r\n    accessToken: string;\r\n    deviceId: string;\r\n    homeserverUrl: string;\r\n    refreshToken?: string;\r\n    userId: string;\r\n}\r\n\r\n// @public\r\nexport interface AccountDataApi {\r\n    delete(eventType: string): Promise<void>;\r\n    get(eventType: string): Watchable<unknown>;\r\n    set(eventType: string, content: unknown): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface Api extends DialogApiExtension, AccountAuthApiExtension, ProfileApiExtension {\r\n    // @alpha\r\n    readonly builtins: BuiltinsApi;\r\n    readonly client: ClientApi;\r\n    // @alpha\r\n    readonly composer: ComposerApi;\r\n    readonly config: ConfigApi;\r\n    createRoot(element: Element): Root;\r\n    // @alpha\r\n    readonly customComponents: CustomComponentsApi;\r\n    // @alpha\r\n    readonly customisations: CustomisationsApi;\r\n    // @alpha\r\n    readonly extras: ExtrasApi;\r\n    readonly i18n: I18nApi;\r\n    readonly navigation: NavigationApi;\r\n    readonly rootNode: HTMLElement;\r\n    // @alpha\r\n    readonly settings: SettingsApi;\r\n    // @alpha\r\n    readonly storageHelper: StorageHelperApi;\r\n    readonly stores: StoresApi;\r\n    // @alpha\r\n    readonly urlPreviews: UrlPreviewApi;\r\n    // @alpha\r\n    readonly widget: WidgetApi;\r\n    // @alpha\r\n    readonly widgetLifecycle: WidgetLifecycleApi;\r\n    // @alpha\r\n    readonly x509?: X509Api;\r\n}\r\n\r\n// @alpha\r\nexport interface BuiltinsApi {\r\n    renderNotificationDecoration(roomId: string): React.ReactNode;\r\n    renderRoomAvatar(roomId: string, size?: string): React.ReactNode;\r\n    renderRoomView(roomId: string, props?: RoomViewProps): React.ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type CapabilitiesApprover = (widget: WidgetDescriptor, requestedCapabilities: Set<string>) => MaybePromise<Set<string> | undefined>;\r\n\r\n// @alpha\r\nexport interface CertificateInfo {\r\n    // (undocumented)\r\n    issuer: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n    // (undocumented)\r\n    subject: string;\r\n    // (undocumented)\r\n    subjectAltName?: string;\r\n    // (undocumented)\r\n    validFrom: Date;\r\n    // (undocumented)\r\n    validTo: Date;\r\n}\r\n\r\n// @public\r\nexport interface ClientApi {\r\n    accountData: AccountDataApi;\r\n    // @alpha\r\n    readonly creationManagement: ClientCreationManagementApi;\r\n    getRoom: (id: string) => Room | null;\r\n}\r\n\r\n// @public\r\nexport interface ClientCreationManagementApi {\r\n    // @deprecated\r\n    setUserVerificationCaCertsPem(pem: string | null): void;\r\n    setX509ClientInitOpts(opts: X509ClientInitOpts): void;\r\n}\r\n\r\n// @alpha\r\nexport interface ComposerApi {\r\n    addFileUploadOption(option: ComposerApiFileUploadOption): void;\r\n    insertPlaintextIntoComposer(plaintext: string, view: ComposerApiTarget): void;\r\n    openFileUploadConfirmation(files: File[], view: ComposerApiTarget): void;\r\n}\r\n\r\n// @alpha\r\nexport type ComposerApiFileUploadOption = {\r\n    type: string;\r\n    label: string;\r\n    icon?: ComponentType<SVGAttributes<SVGElement>>;\r\n    onSelected: (roomId?: string, view?: ComposerApiTarget, relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    }) => Promise<void> | void;\r\n};\r\n\r\n// @alpha\r\nexport type ComposerApiTarget = {\r\n    view: \"room\";\r\n} | {\r\n    view: \"thread\";\r\n};\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"WebConfigJson\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @public\r\nexport interface Config extends WebConfigJson {\r\n    // (undocumented)\r\n    brand: string;\r\n}\r\n\r\n// @public\r\nexport interface ConfigApi {\r\n    // (undocumented)\r\n    get(): Config;\r\n    // (undocumented)\r\n    get<K extends keyof Config>(key: K): Config[K];\r\n    // (undocumented)\r\n    get<K extends keyof Config = never>(key?: K): Config | Config[K];\r\n}\r\n\r\n// @alpha\r\nexport type Container = \"top\" | \"right\" | \"center\";\r\n\r\n// @alpha\r\nexport interface CustomComponentsApi {\r\n    registerComposerPreview(filterFn: (composerText: string, roomId: string) => boolean, renderer: CustomComposerPreviewRenderFunction): void;\r\n    registerLoginComponent(renderer: CustomLoginRenderFunction): void;\r\n    registerMessageRenderer(eventTypeOrFilter: string | ((mxEvent: MatrixEvent) => boolean), renderer: CustomMessageRenderFunction, hints?: CustomMessageRenderHints): void;\r\n    registerRoomPreviewBar(renderer: CustomRoomPreviewBarRenderFunction): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewComponentProps = {\r\n    text: string;\r\n    roomId: string;\r\n    target?: ComposerApiTarget;\r\n    relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    };\r\n};\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewRenderFunction = ExtendablePropsRenderFunction<CustomComposerPreviewComponentProps>;\r\n\r\n// @alpha\r\nexport interface CustomisationsApi {\r\n    registerShouldShowComponent(fn: (this: void, component: UIComponent) => boolean | void): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginComponentProps = {\r\n    serverConfig: CustomLoginComponentPropsServerConfig;\r\n    fragmentAfterLogin?: string;\r\n    children?: ReactNode;\r\n    onLoggedIn(this: void, data: AccountAuthInfo): void;\r\n    onServerConfigChange(this: void, config: CustomLoginComponentPropsServerConfig): void;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomLoginComponentPropsServerConfig {\r\n    hsName: string;\r\n    hsUrl: string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginRenderFunction = ExtendablePropsRenderFunction<CustomLoginComponentProps>;\r\n\r\n// @alpha\r\nexport type CustomMessageComponentProps = {\r\n    mxEvent: MatrixEvent;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomMessageGrouping {\r\n    getKey?: (mxEvent: MatrixEvent) => string;\r\n    getSummary: (events: readonly MatrixEvent[]) => string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomMessageRenderFunction = (\r\nprops: CustomMessageComponentProps,\r\noriginalComponent?: (props?: OriginalMessageComponentProps) => React.JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport type CustomMessageRenderHints = {\r\n    allowEditingEvent?: boolean;\r\n    allowDownloadingMedia?: (mxEvent: MatrixEvent) => Promise<boolean>;\r\n    renderAsInfoMessage?: boolean;\r\n    renderSenderProfile?: boolean;\r\n    renderGroupSummary?: CustomMessageGrouping;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarComponentProps = {\r\n    roomId?: string;\r\n    roomAlias?: string;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarRenderFunction = (\r\nprops: CustomRoomPreviewBarComponentProps,\r\noriginalComponent: (props: CustomRoomPreviewBarComponentProps) => JSX.Element) => JSX.Element;\r\n\r\n// @public\r\nexport interface DialogApiExtension {\r\n    openDialog<M, P extends object>(initialOptions: DialogOptions, dialog: ComponentType<P & DialogProps<M>>, props: P): DialogHandle<M>;\r\n}\r\n\r\n// @public\r\nexport type DialogHandle<M> = {\r\n    finished: Promise<{\r\n        ok: boolean;\r\n        model: M | null;\r\n    }>;\r\n    close(this: void): void;\r\n};\r\n\r\n// @public\r\nexport interface DialogOptions {\r\n    ariaLabel?: string;\r\n    title?: string;\r\n}\r\n\r\n// @public\r\nexport type DialogProps<M> = {\r\n    onSubmit(this: void, model: M): void;\r\n    onCancel(this: void): void;\r\n};\r\n\r\n// @alpha\r\nexport type ExtendablePropsRenderFunction<BaseProps> = <P extends BaseProps>(\r\nprops: P,\r\noriginalComponent: (props: P) => JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport interface ExtrasApi {\r\n    addRoomHeaderButtonCallback(cb: RoomHeaderButtonsCallback): void;\r\n    getVisibleRoomBySpaceKey(spaceKey: string, cb: () => string[]): void;\r\n    setSpacePanelItem(spaceKey: string, props: SpacePanelItemProps): void;\r\n}\r\n\r\n// @alpha\r\nexport interface HardwareKey {\r\n    // (undocumented)\r\n    label: string;\r\n    // (undocumented)\r\n    manufacturerID: string;\r\n    // (undocumented)\r\n    maxPinLength: number;\r\n    // (undocumented)\r\n    minPinLength: number;\r\n    // (undocumented)\r\n    model: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n}\r\n\r\n// @alpha\r\nexport type HardwareKeyState = \"absent\" | \"noSigningKey\" | \"open\" | \"authenticated\";\r\n\r\n// @public\r\nexport interface I18nApi {\r\n    humanizeTime(this: void, timeMillis: number): string;\r\n    get language(): string;\r\n    register(this: void, translations: Partial<Translations>): void;\r\n    translate(this: void, key: keyof Translations, variables?: StringVariables): string;\r\n    translate(this: void, key: keyof Translations, variables: Variables | undefined, tags: Tags): ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type IdentityApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @alpha\r\nexport type LocationRenderFunction = () => JSX.Element;\r\n\r\n// @alpha\r\nexport interface MatrixEvent {\r\n    content: Record<string, unknown>;\r\n    eventId: string;\r\n    originServerTs: number;\r\n    roomId: string;\r\n    sender: string;\r\n    stateKey?: string;\r\n    type: string;\r\n    unsigned: Record<string, unknown>;\r\n}\r\n\r\n// @public\r\nexport type MaybePromise<T> = T | PromiseLike<T>;\r\n\r\n// @public\r\nexport interface Module {\r\n    // (undocumented)\r\n    load(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface ModuleFactory {\r\n    // (undocumented)\r\n    new (api: Api): Module;\r\n    // (undocumented)\r\n    readonly moduleApiVersion: string;\r\n    // (undocumented)\r\n    readonly prototype: Module;\r\n}\r\n\r\n// @public\r\nexport class ModuleIncompatibleError extends Error {\r\n    constructor(pluginVersion: string);\r\n}\r\n\r\n// @public\r\nexport class ModuleLoader {\r\n    constructor(api: Api);\r\n    // Warning: (ae-forgotten-export) The symbol \"ModuleExport\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    load(moduleExport: ModuleExport): Promise<void>;\r\n    // (undocumented)\r\n    start(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface NavigationApi {\r\n    openRoom(roomIdOrAlias: string, opts?: OpenRoomOptions): void;\r\n    // @alpha\r\n    registerLocationRenderer(path: string, renderer: LocationRenderFunction): void;\r\n    toMatrixToLink(link: string, join?: boolean): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface OpenRoomOptions {\r\n    autoJoin?: boolean;\r\n    viaServers?: string[];\r\n}\r\n\r\n// @alpha\r\nexport type OriginalMessageComponentProps = {\r\n    showUrlPreview?: boolean;\r\n};\r\n\r\n// @alpha\r\nexport type PreloadApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @public\r\nexport interface Profile {\r\n    displayName?: string;\r\n    isGuest?: boolean;\r\n    userId?: string;\r\n}\r\n\r\n// @public\r\nexport interface ProfileApiExtension {\r\n    readonly profile: Watchable<Profile>;\r\n}\r\n\r\n// @public\r\nexport interface RichVariables {\r\n    // (undocumented)\r\n    [key: string]: SubstitutionValue;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport interface Room {\r\n    getLastActiveTimestamp: () => number;\r\n    id: string;\r\n    name: Watchable<string>;\r\n}\r\n\r\n// @alpha\r\nexport type RoomHeaderButtonsCallback = (roomId: string) => JSX.Element | undefined;\r\n\r\n// @public\r\nexport interface RoomListStoreApi {\r\n    getRooms(): Watchable<Room[]>;\r\n    waitForReady(): Promise<void>;\r\n}\r\n\r\n// @alpha\r\nexport interface RoomViewProps {\r\n    enableReadReceiptsAndMarkersOnActivity?: boolean;\r\n    hideComposer?: boolean;\r\n    hideHeader?: boolean;\r\n    hidePinnedMessageBanner?: boolean;\r\n    hideRightPanel?: boolean;\r\n    hideWidgets?: boolean;\r\n}\r\n\r\n// @alpha\r\nexport interface SettingsApi {\r\n    getValue<T = any>(settingName: string, roomId?: string | null, excludeDefault?: boolean): T | undefined;\r\n}\r\n\r\n// @alpha\r\nexport interface SpacePanelItemProps {\r\n    className?: string;\r\n    icon?: JSX.Element;\r\n    label: string;\r\n    onSelected: () => void;\r\n    style?: React.CSSProperties;\r\n    tooltip?: string;\r\n}\r\n\r\n// @alpha\r\nexport interface StorageHelperApi {\r\n    getPickleKey(userId: string, deviceId: string): Promise<string | null>;\r\n}\r\n\r\n// @public\r\nexport interface StoresApi {\r\n    roomListStore: RoomListStoreApi;\r\n}\r\n\r\n// @public\r\nexport interface StringVariables {\r\n    // (undocumented)\r\n    [key: string]: number | string | null | undefined;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport type SubstitutionValue = number | string | ReactNode | ((sub: string) => ReactNode);\r\n\r\n// @public\r\nexport type Tags = Record<string, SubstitutionValue>;\r\n\r\n// @public\r\nexport type Translations = Record<string, {\r\n    [ietfLanguageTag: string]: string;\r\n}>;\r\n\r\n// @alpha\r\nexport const enum UIComponent {\r\n    AddIntegrations = \"UIComponent.addIntegrations\",\r\n    CreateRooms = \"UIComponent.roomCreation\",\r\n    CreateSpaces = \"UIComponent.spaceCreation\",\r\n    ExploreRooms = \"UIComponent.exploreRooms\",\r\n    FilterContainer = \"UIComponent.filterContainer\",\r\n    InviteUsers = \"UIComponent.sendInvites\",\r\n    RoomOptionsMenu = \"UIComponent.roomOptionsMenu\"\r\n}\r\n\r\n// @alpha\r\nexport interface UrlPreviewApi {\r\n    registerPreviewHandler(regex: RegExp, handler: UrlPreviewHandler): void;\r\n}\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"UrlPreview\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @alpha\r\nexport type UrlPreviewHandler = (url: string, mxEvent?: MatrixEvent) => Promise<UrlPreview | null>;\r\n\r\n// @alpha\r\nexport interface UserCertificate {\r\n    // (undocumented)\r\n    certificate: CertificateInfo;\r\n    chain: string;\r\n}\r\n\r\n// @public\r\nexport function useWatchable<T>(watchable: Watchable<T>): T;\r\n\r\n// @public\r\nexport type Variables = StringVariables | RichVariables;\r\n\r\n// @public\r\nexport class Watchable<T> {\r\n    constructor(currentValue: T);\r\n    // Warning: (ae-forgotten-export) The symbol \"WatchFn\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    protected readonly listeners: Set<WatchFn<T>>;\r\n    protected onFirstWatch(): void;\r\n    protected onLastWatch(): void;\r\n    // (undocumented)\r\n    unwatch(listener: (value: T) => void): void;\r\n    get value(): T;\r\n    set value(value: T);\r\n    // (undocumented)\r\n    watch(listener: (value: T) => void): void;\r\n}\r\n\r\n// @alpha\r\nexport interface WidgetApi {\r\n    getAppAvatarUrl(app: IWidget, width?: number, height?: number, resizeMethod?: string): string | null;\r\n    getWidgetsInRoom(roomId: string): IWidget[];\r\n    isAppInContainer(app: IWidget, container: Container, roomId: string): boolean;\r\n    moveAppToContainer(app: IWidget, container: Container, roomId: string): void;\r\n}\r\n\r\n// @alpha\r\nexport type WidgetDescriptor = {\r\n    id: string;\r\n    templateUrl: string;\r\n    creatorUserId: string;\r\n    type: string;\r\n    origin: string;\r\n    roomId?: string;\r\n};\r\n\r\n// @alpha\r\nexport interface WidgetLifecycleApi {\r\n    registerCapabilitiesApprover(approver: CapabilitiesApprover): void;\r\n    registerIdentityApprover(approver: IdentityApprover): void;\r\n    registerPreloadApprover(approver: PreloadApprover): void;\r\n}\r\n\r\n// @alpha\r\nexport interface X509Api {\r\n    getKeyState(serialNumber: string): Promise<X509Result<HardwareKeyState>>;\r\n    getUserCertificate(): Promise<X509Result<UserCertificate>>;\r\n    listHardwareKeys(): Promise<X509Result<HardwareKey[]>>;\r\n    logIntoKey(serialNumber: string, pin: string): Promise<X509LoginResult>;\r\n    signData(serialNumber: string, data: Uint8Array): Promise<X509Result<Uint8Array>>;\r\n}\r\n\r\n// @public\r\nexport interface X509ClientInitOpts {\r\n    signer?: (item: Uint8Array) => Promise<{\r\n        signature_bytes: Uint8Array;\r\n        certificate_chain: string;\r\n        signature_scheme: \"RsaPssSha512\";\r\n    }>;\r\n    userVerificationCaCertsPem?: string;\r\n    validity?: () => number;\r\n}\r\n\r\n// @alpha\r\nexport interface X509IpcError {\r\n    // (undocumented)\r\n    code: X509IpcErrorCode;\r\n    // (undocumented)\r\n    message?: string;\r\n    pkcs11Code?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509IpcErrorCode =\r\n/**\r\n* No PKCS#11 library is configured or it could not be loaded.\r\n*/\r\n| \"MODULE_NOT_LOADED\"\r\n| \"KEY_NOT_FOUND\"\r\n| \"CERTIFICATE_NOT_FOUND\"\r\n| \"PRIVATE_KEY_NOT_FOUND\"\r\n/**\r\n* `signData` was called before `logIntoKey`, or the session was invalidated since.\r\n*/\r\n| \"LOGIN_REQUIRED\"\r\n/**\r\n* An upstream error from the PKCS#11 library. Carries a `CKR_*` code.\r\n*/\r\n| \"UPSTREAM_PKCS11\"\r\n| \"UNKNOWN\";\r\n\r\n// @alpha\r\nexport interface X509LoginError extends X509IpcError {\r\n    triesRemaining?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509LoginResult = X509Result<void, X509LoginError>;\r\n\r\n// @alpha\r\nexport type X509Result<T, E extends X509IpcError = X509IpcError> = { ok: true; data: T } | { ok: false; error: E };\r\n\r\n// (No @packageDocumentation comment for this package)\r\n\r\n```\r\n","packages/module-api/project.json":"{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/module-api\",\n    \"targets\": {\n        \"build\": {\n            \"cache\": true,\n            \"inputs\": [\"src\"],\n            \"outputs\": [\"{projectRoot}/lib\"],\n            \"command\": \"vite build\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        },\n        \"start\": {\n            \"command\": \"vite build --watch\",\n            \"options\": { \"cwd\": \"packages/module-api\" },\n            \"dependsOn\": [\"^start\"],\n            \"continuous\": true\n        },\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        }\n    }\n}\n","packages/module-api/api-extractor.json":"/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n\n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n\n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    // \"projectFolder\": \"..\",\n\n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/lib/index.d.ts\",\n\n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we might specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     *\n     * The \"bundledPackages\" elements may specify glob patterns using minimatch syntax.  To ensure deterministic\n     * output, globs are expanded by matching explicitly declared top-level dependencies only.  For example,\n     * the pattern below will NOT match \"@my-company/example\" unless it appears in a field such as \"dependencies\"\n     * or \"devDependencies\" of the project's package.json file:\n     *\n     *   \"bundledPackages\": [ \"@my-company/*\" ],\n     */\n    \"bundledPackages\": [\"shared-types\"],\n\n    /**\n     * Specifies what type of newlines API Extractor should use when writing output files.  By default, the output files\n     * will be written with Windows-style newlines.  To use POSIX-style newlines, specify \"lf\" instead.\n     * To use the OS's default newline kind, specify \"os\".\n     *\n     * DEFAULT VALUE: \"crlf\"\n     */\n    // \"newlineKind\": \"crlf\",\n\n    /**\n     * Specifies how API Extractor sorts members of an enum when generating the .api.json file. By default, the output\n     * files will be sorted alphabetically, which is \"by-name\". To keep the ordering in the source code, specify\n     * \"preserve\".\n     *\n     * DEFAULT VALUE: \"by-name\"\n     */\n    // \"enumMemberOrder\": \"by-name\",\n\n    /**\n     * Set to true when invoking API Extractor's test harness. When `testMode` is true, the `toolVersion` field in the\n     * .api.json file is assigned an empty string to prevent spurious diffs in output files tracked for tests.\n     *\n     * DEFAULT VALUE: \"false\"\n     */\n    // \"testMode\": false,\n\n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n        /**\n         * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n         */\n        // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n        /**\n         * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n         * The object must conform to the TypeScript tsconfig schema:\n         *\n         * http://json.schemastore.org/tsconfig\n         *\n         * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n         *\n         * DEFAULT VALUE: no overrideTsconfig section\n         */\n        // \"overrideTsconfig\": {\n        //   . . .\n        // }\n        /**\n         * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n         * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n         * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n         * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"skipLibCheck\": true,\n    },\n\n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n        /**\n         * (REQUIRED) Whether to generate an API report.\n         */\n        \"enabled\": true,\n\n        /**\n         * The base filename for the API report files, to be combined with \"reportFolder\" or \"reportTempFolder\"\n         * to produce the full file path.  The \"reportFileName\" should not include any path separators such as\n         * \"\\\" or \"/\".  The \"reportFileName\" should not include a file extension, since API Extractor will automatically\n         * append an appropriate file extension such as \".api.md\".  If the \"reportVariants\" setting is used, then the\n         * file extension includes the variant name, for example \"my-report.public.api.md\" or \"my-report.beta.api.md\".\n         * The \"complete\" variant always uses the simple extension \"my-report.api.md\".\n         *\n         * Previous versions of API Extractor required \"reportFileName\" to include the \".api.md\" extension explicitly;\n         * for backwards compatibility, that is still accepted but will be discarded before applying the above rules.\n         *\n         * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<unscopedPackageName>\"\n         */\n        // \"reportFileName\": \"<unscopedPackageName>\",\n\n        /**\n         * To support different approval requirements for different API levels, multiple \"variants\" of the API report can\n         * be generated.  The \"reportVariants\" setting specifies a list of variants to be generated.  If omitted,\n         * by default only the \"complete\" variant will be generated, which includes all @internal, @alpha, @beta,\n         * and @public items.  Other possible variants are \"alpha\" (@alpha + @beta + @public), \"beta\" (@beta + @public),\n         * and \"public\" (@public only).\n         *\n         * DEFAULT VALUE: [ \"complete\" ]\n         */\n        // \"reportVariants\": [\"public\", \"beta\"],\n\n        /**\n         * Specifies the folder where the API report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n         * e.g. for an API review.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/etc/\"\n         */\n        \"reportFolder\": \"<projectFolder>/\"\n\n        /**\n         * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n         * If they are different, a production build will fail.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/\"\n         */\n        // \"reportTempFolder\": \"<projectFolder>/temp/\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the API report file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false\n    },\n\n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n        /**\n         * (REQUIRED) Whether to generate a doc model file.\n         */\n        \"enabled\": true\n\n        /**\n         * The output path for the doc model file.  The file extension should be \".api.json\".\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n         */\n        // \"apiJsonFilePath\": \"<projectFolder>/temp/<unscopedPackageName>.api.json\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the doc model file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false,\n\n        /**\n         * The base URL where the project's source code can be viewed on a website such as GitHub or\n         * Azure DevOps. This URL path corresponds to the `<projectFolder>` path on disk.\n         *\n         * This URL is concatenated with the file paths serialized to the doc model to produce URL file paths to individual API items.\n         * For example, if the `projectFolderUrl` is \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor\" and an API\n         * item's file path is \"api/ExtractorConfig.ts\", the full URL file path would be\n         * \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor/api/ExtractorConfig.js\".\n         *\n         * This setting can be omitted if you don't need source code links in your API documentation reference.\n         *\n         * SUPPORTED TOKENS: none\n         * DEFAULT VALUE: \"\"\n         */\n        // \"projectFolderUrl\": \"http://github.com/path/to/your/projectFolder\"\n    },\n\n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n        /**\n         * (REQUIRED) Whether to generate the .d.ts rollup file.\n         */\n        \"enabled\": true,\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n         * This file will include all declarations that are exported by the main entry point.\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n         */\n        \"untrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for an \"alpha\" release.\n         * This file will include only declarations that are marked as \"@public\", \"@beta\", or \"@alpha\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"alphaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-alpha.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n         * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"betaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-beta.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n         * This file will include only declarations that are marked as \"@public\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"publicTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-public.d.ts\"\n\n        /**\n         * When a declaration is trimmed, by default it will be replaced by a code comment such as\n         * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n         * declaration completely.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"omitTrimmingComments\": true\n    },\n\n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n        /**\n         * Whether to generate the tsdoc-metadata.json file.\n         *\n         * DEFAULT VALUE: true\n         */\n        // \"enabled\": true,\n        /**\n         * Specifies where the TSDoc metadata file should be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n         * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n         * falls back to \"tsdoc-metadata.json\" in the package folder.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<lookup>\"\n         */\n        // \"tsdocMetadataFilePath\": \"<projectFolder>/dist/tsdoc-metadata.json\"\n    },\n\n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n        /**\n         * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n         * the input .d.ts files.\n         *\n         * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"compilerMessageReporting\": {\n            /**\n             * Configures the default routing for messages that don't match an explicit rule in this table.\n             */\n            \"default\": {\n                /**\n                 * Specifies whether the message should be written to the the tool's output log.  Note that\n                 * the \"addToApiReportFile\" property may supersede this option.\n                 *\n                 * Possible values: \"error\", \"warning\", \"none\"\n                 *\n                 * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n                 * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n                 * the \"--local\" option), the warning is displayed but the build will not fail.\n                 *\n                 * DEFAULT VALUE: \"warning\"\n                 */\n                \"logLevel\": \"warning\"\n\n                /**\n                 * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n                 * then the message will be written inside that file; otherwise, the message is instead logged according to\n                 * the \"logLevel\" option.\n                 *\n                 * DEFAULT VALUE: false\n                 */\n                // \"addToApiReportFile\": false\n            }\n\n            // \"TS2551\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by API Extractor during its analysis.\n         *\n         * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n         *\n         * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n         */\n        \"extractorMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"ae-extra-release-tag\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n         *\n         * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"tsdocMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"tsdoc-link-tag-unescaped-text\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        }\n    }\n}\n","packages/module-api/package.json":"{\n    \"name\": \"@element-hq/element-web-module-api\",\n    \"type\": \"module\",\n    \"version\": \"2.2.0\",\n    \"description\": \"Module API surface for element-web\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/element-hq/element-web.git\",\n        \"directory\": \"packages/module-api\"\n    },\n    \"author\": \"element-hq\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"engines\": {\n        \"node\": \">=20.0.0\"\n    },\n    \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n    \"exports\": {\n        \".\": {\n            \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n            \"import\": \"./lib/element-web-plugin-engine.js\",\n            \"require\": \"./lib/element-web-plugin-engine.umd.cjs\"\n        },\n        \"./vite.base.ts\": {\n            \"types\": \"./vite.base.ts\",\n            \"import\": \"./vite.base.ts\"\n        }\n    },\n    \"files\": [\n        \"lib\",\n        \"vite.base.ts\"\n    ],\n    \"scripts\": {\n        \"prepack\": \"nx build\",\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\",\n        \"coverage\": \"pnpm test:unit --coverage\",\n        \"coverage:diff\": \"diff-cover --config-file ../../diff-cover.toml coverage/lcov.info\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.49.1\",\n        \"@types/node\": \"catalog:ts6\",\n        \"@types/react\": \"catalog:\",\n        \"@types/react-dom\": \"catalog:\",\n        \"@types/semver\": \"^7.5.8\",\n        \"@typescript/native\": \"catalog:\",\n        \"matrix-widget-api\": \"^1.17.0\",\n        \"rollup-plugin-external-globals\": \"^0.13.0\",\n        \"semver\": \"^7.6.3\",\n        \"shared-types\": \"workspace:*\",\n        \"typescript\": \"catalog:ts6\",\n        \"unplugin-dts\": \"catalog:\",\n        \"vite\": \"catalog:\",\n        \"vitest\": \"catalog:\"\n    },\n    \"peerDependencies\": {\n        \"@types/react\": \"*\",\n        \"@types/react-dom\": \"*\",\n        \"matrix-web-i18n\": \"*\",\n        \"matrix-widget-api\": \"*\",\n        \"react\": \"^19\"\n    },\n    \"peerDependenciesMeta\": {\n        \"matrix-widget-api\": {\n            \"optional\": true\n        },\n        \"matrix-web-i18n\": {\n            \"optional\": true\n        }\n    }\n}\n","packages/eslint-plugin-element-web/project.json":"{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/eslint-plugin-element-web\",\n    \"targets\": {\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/eslint-plugin-element-web\" }\n        }\n    }\n}\n","packages/module-api/tsconfig.json":"{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"rootDir\": \"./src\",\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"esModuleInterop\": true,\n        \"strict\": true,\n        \"declaration\": true,\n        \"module\": \"es2022\",\n        \"moduleResolution\": \"bundler\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"jsx\": \"react-jsx\",\n        \"declarationMap\": true,\n        \"allowImportingTsExtensions\": true\n    },\n    \"include\": [\"src\"]\n}\n","packages/eslint-plugin-element-web/package.json":"{\n    \"name\": \"eslint-plugin-element-web\",\n    \"type\": \"module\",\n    \"version\": \"0.0.0\",\n    \"private\": true,\n    \"description\": \"Element Web specific lint rules, loaded by oxlint as a JS plugin\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"exports\": {\n        \".\": \"./src/index.ts\"\n    },\n    \"scripts\": {\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\"\n    },\n    \"devDependencies\": {\n        \"@typescript/native\": \"catalog:\",\n        \"oxlint\": \"catalog:\",\n        \"typescript\": \"catalog:ts6\",\n        \"vitest\": \"catalog:\"\n    }\n}\n","packages/module-api/README.md":"# @element-hq/element-web-module-api\n\nAPI surface for extending Element Web in a safe & predictable way.\n\n## Using the API\n\nModules are loaded by Element Web at runtime via a dynamic ecmascript import, but can be bundled into a webapp for deployment convenience.\n\nThe module's default export MUST be a class which accepts a single argument, an instance of `ModuleApi`.\nThis class must also bear a static property `moduleApiVersion` which is a semver range string\nand a `load` method which is called when the module is to be loaded.\n\n```typescript\nimport type { Module, Api, ModuleFactory } from \"@element-hq/element-web-module-api\";\n\nclass ExampleModule implements Module {\n    public static readonly moduleApiVersion = \"^2.0.0\";\n\n    public constructor(private api: Api) {}\n\n    public async load(): Promise<void> {\n        // Your extension code goes here\n    }\n}\n\nexport default ExampleModule satisfies ModuleFactory;\n```\n\n### Accessing application configuration\n\nThe `api` object passed to the module constructor provides access to the application configuration.\nYou can extend the Config types using declaration merging, though please ensure that you do not trust the types you specify,\nand opt for runtime validation due to the dynamic nature of the configuration.\n\n```typescript\n// ...\ndeclare module \"@element-hq/element-web-module-api\" {\n    interface Config {\n        \"this.is.my.config.key\": string;\n    }\n}\n\nclass ExampleModule implements Module {\n    // ...\n    public async load(): Promise<void> {\n        const configValue = this.api.config.get(\"this.is.my.config.key\");\n        // Your extension code goes here\n    }\n}\n// ...\n```\n\n## Releases\n\nThe API is versioned using semver, with the major version incremented for breaking changes.\n\nTo carry out a release, see the documentation at [`../RELEASING.md`](../RELEASING.md).\n\n## Copyright & License\n\nCopyright (c) 2025 New Vector Ltd\n\nThis software is multi licensed by New Vector Ltd (Element). It can be used either:\n\n(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR\n\n(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).\nUnless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.\n","packages/playwright-common/README.md":"# @element-hq/element-web-playwright-common\n\nSet of Playwright & testcontainers utilities to make it easier to write tests for Element Web, Element Web Modules & Element Desktop.\n\nThe main export includes a number of fixtures and custom assertions as documented in JSDoc.\n\nThe `lib/testcontainers` export contains the following modules:\n\n- `SynapseContainer` - A testcontainer for running a Synapse server\n- `MatrixAuthenticationServiceContainer` - A testcontainer for running a Matrix Authentication Service\n- `MailpitContainer` - A testcontainer for running a Mailpit SMTP server\n\nThere are a number of utils available in the `lib/utils` export.\n\n## Releases\n\nThe API is versioned using semver, with the major version incremented for breaking changes.\n\nTo carry out a release, see the documentation at [`../RELEASING.md`](../RELEASING.md).\n\n## Copyright & License\n\nCopyright (c) 2026 Element Creations Ltd\n\nThis software is multi licensed by Element Creations Ltd (Element). It can be used either:\n\n(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR\n\n(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).\nUnless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.\n","packages/playwright-common/package.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/package.json)","packages/playwright-common/project.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/project.json)","packages/playwright-common/tsconfig.build.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.build.json)","packages/playwright-common/tsconfig.json":"# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.json)","packages/shared-components/README.md":"# shared-components Documentation\n\nPath: `packages/shared-components/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/README.md)","packages/shared-components/package.json":"# Shared-components Skill\n\nPath: `packages/shared-components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/package.json)","packages/shared-components/project.json":"# Shared-components Skill\n\nPath: `packages/shared-components/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/project.json)","packages/shared-components/tsconfig.json":"# Shared-components Skill\n\nPath: `packages/shared-components/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.json)","packages/shared-components/tsconfig.node.json":"# Shared-components Skill\n\nPath: `packages/shared-components/tsconfig.node.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.node.json)","packages/shared-components/typedoc.json":"# Shared-components Skill\n\nPath: `packages/shared-components/typedoc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/typedoc.json)","packages/shared-types/package.json":"# Shared-types Skill\n\nPath: `packages/shared-types/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/package.json)","packages/shared-types/tsconfig.json":"# Shared-types Skill\n\nPath: `packages/shared-types/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/tsconfig.json)","packages/shared-utils/README.md":"# shared-utils Documentation\n\nPath: `packages/shared-utils/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/README.md)","packages/shared-utils/package.json":"# Shared-utils Skill\n\nPath: `packages/shared-utils/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/package.json)","packages/shared-utils/project.json":"# Shared-utils Skill\n\nPath: `packages/shared-utils/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/project.json)","packages/shared-utils/tsconfig.json":"# Shared-utils Skill\n\nPath: `packages/shared-utils/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/tsconfig.json)","packages/shared-components/static/README.md":"# static Documentation\n\nPath: `packages/shared-components/static/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/static/README.md)","apps/web/playwright/plugins/oauth_server/README.md":"# oauth_server Documentation\n\nPath: `apps/web/playwright/plugins/oauth_server/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/apps/web/playwright/plugins/oauth_server/README.md)","packages/shared-components/src/i18n/strings/cs.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cs.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cs.json)","packages/shared-components/src/i18n/strings/cy.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cy.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cy.json)","packages/shared-components/src/i18n/strings/da.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/da.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/da.json)","packages/shared-components/src/i18n/strings/de_DE.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/de_DE.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/de_DE.json)","packages/shared-components/src/i18n/strings/el.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/el.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/el.json)","packages/shared-components/src/i18n/strings/en_EN.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/en_EN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/en_EN.json)","packages/shared-components/src/i18n/strings/eo.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/eo.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/eo.json)","packages/shared-components/src/i18n/strings/es.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/es.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/es.json)","packages/shared-components/src/i18n/strings/et.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/et.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/et.json)","packages/shared-components/src/i18n/strings/fa.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fa.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fa.json)","packages/shared-components/src/i18n/strings/fi.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fi.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fi.json)","packages/shared-components/src/i18n/strings/fr.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fr.json)","packages/shared-components/src/i18n/strings/gl.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/gl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/gl.json)","packages/shared-components/src/i18n/strings/he.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/he.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/he.json)","packages/shared-components/src/i18n/strings/hr.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hr.json)","packages/shared-components/src/i18n/strings/hu.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hu.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hu.json)","packages/shared-components/src/i18n/strings/hy.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hy.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hy.json)","packages/shared-components/src/i18n/strings/id.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/id.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/id.json)","packages/shared-components/src/i18n/strings/is.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/is.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/is.json)","packages/shared-components/src/i18n/strings/it.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/it.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/it.json)","packages/shared-components/src/i18n/strings/ja.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ja.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ja.json)","packages/shared-components/src/i18n/strings/ka.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ka.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ka.json)","packages/shared-components/src/i18n/strings/ko.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ko.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ko.json)","packages/shared-components/src/i18n/strings/lo.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lo.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lo.json)","packages/shared-components/src/i18n/strings/lt.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lt.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lt.json)","packages/shared-components/src/i18n/strings/lv.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lv.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lv.json)","packages/shared-components/src/i18n/strings/mg_MG.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/mg_MG.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/mg_MG.json)","packages/shared-components/src/i18n/strings/nb_NO.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/nb_NO.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nb_NO.json)","packages/shared-components/src/i18n/strings/nl.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/nl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nl.json)","packages/shared-components/src/i18n/strings/pl.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pl.json)","packages/shared-components/src/i18n/strings/pt.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pt.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt.json)","packages/shared-components/src/i18n/strings/pt_BR.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pt_BR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt_BR.json)","packages/shared-components/src/i18n/strings/ru.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ru.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ru.json)","packages/shared-components/src/i18n/strings/sk.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sk.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sk.json)","packages/shared-components/src/i18n/strings/sq.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sq.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sq.json)","packages/shared-components/src/i18n/strings/sv.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sv.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sv.json)","packages/shared-components/src/i18n/strings/tr.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/tr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/tr.json)","packages/shared-components/src/i18n/strings/uk.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/uk.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/uk.json)","packages/shared-components/src/i18n/strings/vi.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/vi.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/vi.json)","packages/shared-components/src/i18n/strings/zh_Hans.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/zh_Hans.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hans.json)","packages/shared-components/src/i18n/strings/zh_Hant.json":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/zh_Hant.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hant.json)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md\n\nInstructions for AI coding agents working in this repository. Humans should read\n[CONTRIBUTING.md](./CONTRIBUTING.md) and [code_style.md](./code_style.md) instead — this file summarises those and\nadds the things that are easy to get wrong here.\n\n## Repository layout\n\nA pnpm + nx monorepo (`element-web-monorepo`). Workspaces are `apps/*`, `packages/*`, `modules` and `modules/*`.\n\n| Path                                                                                                  | Contents                                                                                                      |\n| ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| `apps/web`                                                                                            | The Element Web app. Also hosts view models (`src/viewmodels/`) and the Playwright e2e suite (`playwright/`). |\n| `apps/desktop`                                                                                        | Element Desktop.                                                                                              |\n| `packages/shared-components`                                                                          | Published UI component library, `@element-hq/web-shared-components`. New views go here.                       |\n| `packages/module-api`, `packages/shared-utils`, `packages/shared-types`, `packages/playwright-common` | Published support packages.                                                                                   |\n| `modules/*`                                                                                           | Optional runtime modules (banner, widget toggles, …).                                                         |\n| `docs/`                                                                                               | VitePress docs site.                                                                                          |\n\nThere is **no** top-level `playwright/` directory; `docs/playwright.md` uses paths relative to `apps/web`.\n\n## Commands\n\nRun from the repo root unless stated otherwise.\n\n| Task                                                   | Command                                           |\n| ------------------------------------------------------ | ------------------------------------------------- |\n| Full lint (types, format, js, styles, workflows, knip) | `pnpm lint`                                       |\n| Format                                                 | `pnpm lint:fmt:fix`                               |\n| Lint JS/TS                                             | `pnpm lint:js:fix`                                |\n| Typecheck                                              | `pnpm -r --workspace-concurrency=1 lint:types`    |\n| All unit tests                                         | `pnpm test:unit`                                  |\n| Regenerate i18n strings                                | `pnpm i18n`                                       |\n| Start the app                                          | `cd apps/web && pnpm start`                       |\n| Storybook                                              | `cd packages/shared-components && pnpm storybook` |\n\nFormatting is **oxfmt** and linting is **oxlint**. This repo does not use prettier or eslint — running prettier here\nreformats files against the project style and reports failures that do not exist.\n\nRun `pnpm i18n` after adding or changing any translated string.\n\n## Running unit tests\n\nBoth jest and vitest are in use; a migration to vitest is in progress. **The file path decides the runner.**\n\n| Test file                                      | Runner           | Command                                                     |\n| ---------------------------------------------- | ---------------- | ----------------------------------------------------------- |\n| `apps/web/test/**/*-test.[tj]s?(x)`            | jest             | `cd apps/web && pnpm jest <path>`                           |\n| `apps/web/src/**/*.test.{ts,tsx}`              | vitest           | `pnpm vitest run <path>`                                    |\n| `apps/web/src/**/*.test.browser.{ts,tsx}`      | vitest (browser) | `pnpm vitest run --project web-browser <path>`              |\n| `packages/shared-components/src/**/*.test.tsx` | vitest           | `cd packages/shared-components && pnpm test:unit -- <path>` |\n\nNotes:\n\n- Write new tests as co-located vitest `*.test.ts(x)` next to the source file. The `apps/web/test/` jest tree is\n  legacy; extend it only when the file you are changing already lives there.\n- Vitest runs with `globals: false`, so import `describe`, `it`, `expect` and friends explicitly.\n- `packages/shared-components` is excluded from the root vitest config and must be run from its own directory.\n- \"No test files found\" means you picked the wrong runner or path. It is not a pass.\n- Prefer extending an existing test over adding a new file when covering a close variant of existing behaviour.\n\n## Running e2e tests\n\nSpecs live in `apps/web/playwright/e2e`. See [docs/playwright.md](./docs/playwright.md) for the full guide.\n\n```sh\ncd apps/web && pnpm test:playwright -- playwright/e2e/<spec>.spec.ts --project=Chrome\n```\n\n- Requires a container runtime (Docker/Podman/Colima) for the homeserver testcontainers.\n- On macOS, add `--ignore-snapshots`. Screenshot baselines are only committed for Linux, so comparisons fail locally.\n- Never run `pnpm test:playwright:screenshots` locally to \"fix\" a screenshot diff — it writes host-rendered baselines.\n  Screenshots are updated in the Docker environment, which CI matches.\n- The config uses `reuseExistingServer: true`. Check `lsof -ti:8080` first; a stale dev server silently serves the\n  tests. Port-bind errors are an infrastructure problem, not a test failure.\n- Locate elements by role, label and accessible name, not CSS classes.\n- Tag any test using `toMatchScreenshot` with `@screenshot`.\n\n### Reviewing updated screenshots\n\nUpdated baselines are part of the diff and must be reviewed, not accepted blindly. Before committing any changed\n`.png` under `apps/web/playwright/snapshots/` or `packages/shared-components/__vis__/`:\n\n- Look at the image. Confirm every visible difference is one your change was meant to produce.\n- Treat anything else as a regression until proven otherwise: shifted or clipped layout, changed spacing or font,\n  missing or duplicated elements, a wrong theme, an untranslated or placeholder string, a loading or error state\n  captured instead of the real content.\n- Unrelated files changing baselines is a signal in itself — if a screenshot moved for a component you did not\n  touch, find out why rather than committing it.\n- Never regenerate baselines to make a failing test pass. A diff you cannot explain is a bug in the change.\n\n## Writing UI code: MVVM\n\nNew UI follows MVVM. Full details in [docs/MVVM.md](./docs/MVVM.md); the shape for a feature `Foo`:\n\n**View** — `packages/shared-components/src/<domain>/FooView/` containing `FooView.tsx`, `FooView.module.css`,\n`FooView.test.tsx`, `FooView.stories.tsx` and `index.ts`. The view declares the contract:\n\n```tsx\nexport interface FooViewSnapshot { title: string }\ninterface FooViewActions { setTitle: (title: string) => void }\nexport type FooViewModel = ViewModel<FooViewSnapshot, FooViewActions>;\n\nexport function FooView({ vm }: { vm: FooViewModel }): JSX.Element {\n    const { title } = useViewModel(vm);\n    ...\n}\n```\n\nViews are dumb: they read the snapshot and call actions, nothing else. Develop them in Storybook.\n\n**ViewModel** — `apps/web/src/viewmodels/<domain>/FooViewModel.ts`, a class extending `BaseViewModel` that implements\nthe interface from the view. `apps/web/src/components/viewmodels/` is the deprecated v1 location; do not add there.\n\nRules that are easy to miss:\n\n- Define actions as arrow-function class properties (`public doThing = (): void => {}`) so `this` survives being\n  passed as a callback.\n- Use `this.snapshot.merge({ field })` for partial updates. `merge` already skips emitting when nothing changed, so\n  do not add equality guards around it, and do not recompute the whole snapshot for one field.\n- Track listeners and sub-view-models with `this.disposables.trackListener(...)` / `this.disposables.track(...)`.\n- A non-MVVM function component owning a view model should create it with `useCreateAutoDisposedViewModel`; a class\n  component creates it in `componentDidMount` and disposes it in `componentWillUnmount`.\n\nReference implementation: `packages/shared-components/src/room-list/RoomListSearchView/` with\n`apps/web/src/viewmodels/room-list/RoomListSearchViewModel.ts`.\n\n## Code style\n\nRead [code_style.md](./code_style.md). The points most often missed:\n\n- **Every new file needs a copyright header**, enforced by oxlint (`element-call/copyright-header`). Lint fails\n  without it. Substitute the actual current year — check it rather than copying a year from another file — and leave\n  headers on existing files alone:\n\n    ```\n    /*\n    Copyright <current year> <copyright holder>\n\n    SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\n    Please see LICENSE in the repository root for full details.\n    */\n    ```\n\n    The holder is `Element Creations Ltd.` **only for contributions made as part of Element**. An external\n    contributor puts their own name or their company's there instead. Note that `oxlint --fix` inserts the Element\n    line unconditionally, so external contributors should write the header by hand and check what the autofix added.\n\n- TypeScript only, named exports only — avoid `export default`.\n- 4-space indent, 120-column limit, double quotes, semicolons.\n- Declare member visibility (`public`/`private`/`protected`) on class members.\n- Avoid `any`; if unavoidable, comment why.\n- Roughly one interface, class or enum per file, named after the file.\n- Never mix cosmetic and functional changes.\n- **Styles:** `apps/web` uses PostCSS (`res/css/**/_Component.pcss`, `mx_`-prefixed classes).\n  `packages/shared-components` uses CSS modules (`Component.module.css`, semantic camelCase class names, no `mx_`\n  prefix) imported as `styles`. Use Compound design tokens (`var(--cpd-color-…)`, `var(--cpd-space-…)`) for all values.\n- Prefer Compound typography components over raw text elements, and `Flex`/`Box` from shared-components over raw\n  flexbox markup.\n\n## Comments\n\nKeep comments short and relevant.\n\n- Add TSDoc to exported types, functions, classes and components. Document a component's props.\n- Inside a function, explain _why_, not line by line. Add a short overview before a non-obvious block.\n- Use plain language matching the identifiers around the comment — no metaphors or CS jargon.\n- When changing code, update the comments around it so they stay accurate.\n- Any intentionally suppressed lint or type rule needs a nearby comment explaining why.\n\n## Tests are required\n\n- Every change needs unit tests, including features behind labs flags.\n- New user-facing features need a \"happy path\" Playwright e2e test before leaving labs.\n- Aim for ≥80% coverage on the diff; CI checks this. There is no `coverage` script at the root — generate the\n  reports in the workspaces you touched, then compare from the root:\n\n    ```sh\n    pnpm test:unit --coverage                              # vitest, writes coverage/lcov.info\n    cd apps/web && pnpm coverage                           # jest only, writes apps/web/coverage/lcov.info\n    cd packages/shared-components && pnpm coverage\n    pnpm coverage:diff                                     # from the root, needs diff_cover installed\n    ```\n\n## Commits\n\n- Split the work into logically separate commits: one concern per commit. Keep refactors, formatting and behaviour\n  changes in separate commits.\n- Short imperative subject line, no conventional-commit prefix (`feat:`, `fix:`, …).\n- Add a body only when it says something the diff does not; keep it to a line or two.\n\n## Pull requests\n\n- Don't open PR. This should be done by the human, not the agent.\n","isInternal":false,"tokens":2470,"sizeBytes":12295},{"name":"package.json","path":"packages/eslint-plugin-element-web/package.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/eslint-plugin-element-web/package.json","title":"eslint-plugin-element-web","category":"anthropic-skill","format":"json","content":"{\n    \"name\": \"eslint-plugin-element-web\",\n    \"type\": \"module\",\n    \"version\": \"0.0.0\",\n    \"private\": true,\n    \"description\": \"Element Web specific lint rules, loaded by oxlint as a JS plugin\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"exports\": {\n        \".\": \"./src/index.ts\"\n    },\n    \"scripts\": {\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\"\n    },\n    \"devDependencies\": {\n        \"@typescript/native\": \"catalog:\",\n        \"oxlint\": \"catalog:\",\n        \"typescript\": \"catalog:ts6\",\n        \"vitest\": \"catalog:\"\n    }\n}\n","frontmatter":{"name":"eslint-plugin-element-web","type":"module","version":"0.0.0","private":true,"description":"Element Web specific lint rules, loaded by oxlint as a JS plugin","license":"SEE LICENSE IN README.md","exports":{".":"./src/index.ts"},"scripts":{"lint:types":"nx lint:types","test:unit":"vitest"},"devDependencies":{"@typescript/native":"catalog:","oxlint":"catalog:","typescript":"catalog:ts6","vitest":"catalog:"}},"isInternal":false,"tokens":153,"sizeBytes":558},{"name":"project.json","path":"packages/eslint-plugin-element-web/project.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/eslint-plugin-element-web/project.json","title":"Eslint-plugin-element-web Skill","category":"anthropic-skill","format":"json","content":"{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/eslint-plugin-element-web\",\n    \"targets\": {\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/eslint-plugin-element-web\" }\n        }\n    }\n}\n","frontmatter":{"$schema":"../../node_modules/nx/schemas/project-schema.json","projectType":"library","root":"packages/eslint-plugin-element-web","targets":{"lint:types":{"command":"pnpm exec tsc --noEmit","options":{"cwd":"packages/eslint-plugin-element-web"}}}},"isInternal":false,"tokens":85,"sizeBytes":329},{"name":"tsconfig.json","path":"packages/eslint-plugin-element-web/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/eslint-plugin-element-web/tsconfig.json","title":"Eslint-plugin-element-web Skill","category":"anthropic-skill","format":"json","content":"{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"strict\": true,\n        \"module\": \"nodenext\",\n        \"moduleResolution\": \"nodenext\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"allowImportingTsExtensions\": true,\n        \"verbatimModuleSyntax\": true,\n        \"erasableSyntaxOnly\": true\n    },\n    \"include\": [\"src\"]\n}\n","frontmatter":{"$schema":"http://json.schemastore.org/tsconfig","compilerOptions":{"target":"esnext","lib":["dom","es2022","esnext"],"strict":true,"module":"nodenext","moduleResolution":"nodenext","types":[],"noEmit":true,"allowImportingTsExtensions":true,"verbatimModuleSyntax":true,"erasableSyntaxOnly":true},"include":["src"]},"isInternal":false,"tokens":122,"sizeBytes":442},{"name":"api-extractor.json","path":"packages/module-api/api-extractor.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/module-api/api-extractor.json","title":"Module-api Skill","category":"anthropic-skill","format":"json","content":"/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n\n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n\n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    // \"projectFolder\": \"..\",\n\n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/lib/index.d.ts\",\n\n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we might specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     *\n     * The \"bundledPackages\" elements may specify glob patterns using minimatch syntax.  To ensure deterministic\n     * output, globs are expanded by matching explicitly declared top-level dependencies only.  For example,\n     * the pattern below will NOT match \"@my-company/example\" unless it appears in a field such as \"dependencies\"\n     * or \"devDependencies\" of the project's package.json file:\n     *\n     *   \"bundledPackages\": [ \"@my-company/*\" ],\n     */\n    \"bundledPackages\": [\"shared-types\"],\n\n    /**\n     * Specifies what type of newlines API Extractor should use when writing output files.  By default, the output files\n     * will be written with Windows-style newlines.  To use POSIX-style newlines, specify \"lf\" instead.\n     * To use the OS's default newline kind, specify \"os\".\n     *\n     * DEFAULT VALUE: \"crlf\"\n     */\n    // \"newlineKind\": \"crlf\",\n\n    /**\n     * Specifies how API Extractor sorts members of an enum when generating the .api.json file. By default, the output\n     * files will be sorted alphabetically, which is \"by-name\". To keep the ordering in the source code, specify\n     * \"preserve\".\n     *\n     * DEFAULT VALUE: \"by-name\"\n     */\n    // \"enumMemberOrder\": \"by-name\",\n\n    /**\n     * Set to true when invoking API Extractor's test harness. When `testMode` is true, the `toolVersion` field in the\n     * .api.json file is assigned an empty string to prevent spurious diffs in output files tracked for tests.\n     *\n     * DEFAULT VALUE: \"false\"\n     */\n    // \"testMode\": false,\n\n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n        /**\n         * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n         */\n        // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n        /**\n         * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n         * The object must conform to the TypeScript tsconfig schema:\n         *\n         * http://json.schemastore.org/tsconfig\n         *\n         * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n         *\n         * DEFAULT VALUE: no overrideTsconfig section\n         */\n        // \"overrideTsconfig\": {\n        //   . . .\n        // }\n        /**\n         * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n         * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n         * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n         * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"skipLibCheck\": true,\n    },\n\n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n        /**\n         * (REQUIRED) Whether to generate an API report.\n         */\n        \"enabled\": true,\n\n        /**\n         * The base filename for the API report files, to be combined with \"reportFolder\" or \"reportTempFolder\"\n         * to produce the full file path.  The \"reportFileName\" should not include any path separators such as\n         * \"\\\" or \"/\".  The \"reportFileName\" should not include a file extension, since API Extractor will automatically\n         * append an appropriate file extension such as \".api.md\".  If the \"reportVariants\" setting is used, then the\n         * file extension includes the variant name, for example \"my-report.public.api.md\" or \"my-report.beta.api.md\".\n         * The \"complete\" variant always uses the simple extension \"my-report.api.md\".\n         *\n         * Previous versions of API Extractor required \"reportFileName\" to include the \".api.md\" extension explicitly;\n         * for backwards compatibility, that is still accepted but will be discarded before applying the above rules.\n         *\n         * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<unscopedPackageName>\"\n         */\n        // \"reportFileName\": \"<unscopedPackageName>\",\n\n        /**\n         * To support different approval requirements for different API levels, multiple \"variants\" of the API report can\n         * be generated.  The \"reportVariants\" setting specifies a list of variants to be generated.  If omitted,\n         * by default only the \"complete\" variant will be generated, which includes all @internal, @alpha, @beta,\n         * and @public items.  Other possible variants are \"alpha\" (@alpha + @beta + @public), \"beta\" (@beta + @public),\n         * and \"public\" (@public only).\n         *\n         * DEFAULT VALUE: [ \"complete\" ]\n         */\n        // \"reportVariants\": [\"public\", \"beta\"],\n\n        /**\n         * Specifies the folder where the API report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n         * e.g. for an API review.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/etc/\"\n         */\n        \"reportFolder\": \"<projectFolder>/\"\n\n        /**\n         * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n         * If they are different, a production build will fail.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/\"\n         */\n        // \"reportTempFolder\": \"<projectFolder>/temp/\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the API report file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false\n    },\n\n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n        /**\n         * (REQUIRED) Whether to generate a doc model file.\n         */\n        \"enabled\": true\n\n        /**\n         * The output path for the doc model file.  The file extension should be \".api.json\".\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n         */\n        // \"apiJsonFilePath\": \"<projectFolder>/temp/<unscopedPackageName>.api.json\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the doc model file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false,\n\n        /**\n         * The base URL where the project's source code can be viewed on a website such as GitHub or\n         * Azure DevOps. This URL path corresponds to the `<projectFolder>` path on disk.\n         *\n         * This URL is concatenated with the file paths serialized to the doc model to produce URL file paths to individual API items.\n         * For example, if the `projectFolderUrl` is \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor\" and an API\n         * item's file path is \"api/ExtractorConfig.ts\", the full URL file path would be\n         * \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor/api/ExtractorConfig.js\".\n         *\n         * This setting can be omitted if you don't need source code links in your API documentation reference.\n         *\n         * SUPPORTED TOKENS: none\n         * DEFAULT VALUE: \"\"\n         */\n        // \"projectFolderUrl\": \"http://github.com/path/to/your/projectFolder\"\n    },\n\n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n        /**\n         * (REQUIRED) Whether to generate the .d.ts rollup file.\n         */\n        \"enabled\": true,\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n         * This file will include all declarations that are exported by the main entry point.\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n         */\n        \"untrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for an \"alpha\" release.\n         * This file will include only declarations that are marked as \"@public\", \"@beta\", or \"@alpha\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"alphaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-alpha.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n         * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"betaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-beta.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n         * This file will include only declarations that are marked as \"@public\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"publicTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-public.d.ts\"\n\n        /**\n         * When a declaration is trimmed, by default it will be replaced by a code comment such as\n         * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n         * declaration completely.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"omitTrimmingComments\": true\n    },\n\n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n        /**\n         * Whether to generate the tsdoc-metadata.json file.\n         *\n         * DEFAULT VALUE: true\n         */\n        // \"enabled\": true,\n        /**\n         * Specifies where the TSDoc metadata file should be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n         * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n         * falls back to \"tsdoc-metadata.json\" in the package folder.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<lookup>\"\n         */\n        // \"tsdocMetadataFilePath\": \"<projectFolder>/dist/tsdoc-metadata.json\"\n    },\n\n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n        /**\n         * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n         * the input .d.ts files.\n         *\n         * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"compilerMessageReporting\": {\n            /**\n             * Configures the default routing for messages that don't match an explicit rule in this table.\n             */\n            \"default\": {\n                /**\n                 * Specifies whether the message should be written to the the tool's output log.  Note that\n                 * the \"addToApiReportFile\" property may supersede this option.\n                 *\n                 * Possible values: \"error\", \"warning\", \"none\"\n                 *\n                 * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n                 * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n                 * the \"--local\" option), the warning is displayed but the build will not fail.\n                 *\n                 * DEFAULT VALUE: \"warning\"\n                 */\n                \"logLevel\": \"warning\"\n\n                /**\n                 * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n                 * then the message will be written inside that file; otherwise, the message is instead logged according to\n                 * the \"logLevel\" option.\n                 *\n                 * DEFAULT VALUE: false\n                 */\n                // \"addToApiReportFile\": false\n            }\n\n            // \"TS2551\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by API Extractor during its analysis.\n         *\n         * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n         *\n         * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n         */\n        \"extractorMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"ae-extra-release-tag\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n         *\n         * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"tsdocMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"tsdoc-link-tag-unescaped-text\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        }\n    }\n}\n","isInternal":false,"tokens":4438,"sizeBytes":20453},{"name":"element-web-module-api.api.md","path":"packages/module-api/element-web-module-api.api.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/module-api/element-web-module-api.api.md","title":"Module-api Skill","category":"anthropic-skill","format":"markdown","content":"## API Report File for \"@element-hq/element-web-module-api\"\r\n\r\n> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).\r\n\r\n```ts\r\n\r\nimport { ComponentType } from 'react';\r\nimport { IWidget } from 'matrix-widget-api';\r\nimport { JSX } from 'react';\r\nimport { ReactNode } from 'react';\r\nimport { Root } from 'react-dom/client';\r\nimport { SVGAttributes } from 'react';\r\n\r\n// @public\r\nexport interface AccountAuthApiExtension {\r\n    overwriteAccountAuth(accountInfo: AccountAuthInfo): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface AccountAuthInfo {\r\n    accessToken: string;\r\n    deviceId: string;\r\n    homeserverUrl: string;\r\n    refreshToken?: string;\r\n    userId: string;\r\n}\r\n\r\n// @public\r\nexport interface AccountDataApi {\r\n    delete(eventType: string): Promise<void>;\r\n    get(eventType: string): Watchable<unknown>;\r\n    set(eventType: string, content: unknown): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface Api extends DialogApiExtension, AccountAuthApiExtension, ProfileApiExtension {\r\n    // @alpha\r\n    readonly builtins: BuiltinsApi;\r\n    readonly client: ClientApi;\r\n    // @alpha\r\n    readonly composer: ComposerApi;\r\n    readonly config: ConfigApi;\r\n    createRoot(element: Element): Root;\r\n    // @alpha\r\n    readonly customComponents: CustomComponentsApi;\r\n    // @alpha\r\n    readonly customisations: CustomisationsApi;\r\n    // @alpha\r\n    readonly extras: ExtrasApi;\r\n    readonly i18n: I18nApi;\r\n    readonly navigation: NavigationApi;\r\n    readonly rootNode: HTMLElement;\r\n    // @alpha\r\n    readonly settings: SettingsApi;\r\n    // @alpha\r\n    readonly storageHelper: StorageHelperApi;\r\n    readonly stores: StoresApi;\r\n    // @alpha\r\n    readonly urlPreviews: UrlPreviewApi;\r\n    // @alpha\r\n    readonly widget: WidgetApi;\r\n    // @alpha\r\n    readonly widgetLifecycle: WidgetLifecycleApi;\r\n    // @alpha\r\n    readonly x509?: X509Api;\r\n}\r\n\r\n// @alpha\r\nexport interface BuiltinsApi {\r\n    renderNotificationDecoration(roomId: string): React.ReactNode;\r\n    renderRoomAvatar(roomId: string, size?: string): React.ReactNode;\r\n    renderRoomView(roomId: string, props?: RoomViewProps): React.ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type CapabilitiesApprover = (widget: WidgetDescriptor, requestedCapabilities: Set<string>) => MaybePromise<Set<string> | undefined>;\r\n\r\n// @alpha\r\nexport interface CertificateInfo {\r\n    // (undocumented)\r\n    issuer: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n    // (undocumented)\r\n    subject: string;\r\n    // (undocumented)\r\n    subjectAltName?: string;\r\n    // (undocumented)\r\n    validFrom: Date;\r\n    // (undocumented)\r\n    validTo: Date;\r\n}\r\n\r\n// @public\r\nexport interface ClientApi {\r\n    accountData: AccountDataApi;\r\n    // @alpha\r\n    readonly creationManagement: ClientCreationManagementApi;\r\n    getRoom: (id: string) => Room | null;\r\n}\r\n\r\n// @public\r\nexport interface ClientCreationManagementApi {\r\n    // @deprecated\r\n    setUserVerificationCaCertsPem(pem: string | null): void;\r\n    setX509ClientInitOpts(opts: X509ClientInitOpts): void;\r\n}\r\n\r\n// @alpha\r\nexport interface ComposerApi {\r\n    addFileUploadOption(option: ComposerApiFileUploadOption): void;\r\n    insertPlaintextIntoComposer(plaintext: string, view: ComposerApiTarget): void;\r\n    openFileUploadConfirmation(files: File[], view: ComposerApiTarget): void;\r\n}\r\n\r\n// @alpha\r\nexport type ComposerApiFileUploadOption = {\r\n    type: string;\r\n    label: string;\r\n    icon?: ComponentType<SVGAttributes<SVGElement>>;\r\n    onSelected: (roomId?: string, view?: ComposerApiTarget, relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    }) => Promise<void> | void;\r\n};\r\n\r\n// @alpha\r\nexport type ComposerApiTarget = {\r\n    view: \"room\";\r\n} | {\r\n    view: \"thread\";\r\n};\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"WebConfigJson\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @public\r\nexport interface Config extends WebConfigJson {\r\n    // (undocumented)\r\n    brand: string;\r\n}\r\n\r\n// @public\r\nexport interface ConfigApi {\r\n    // (undocumented)\r\n    get(): Config;\r\n    // (undocumented)\r\n    get<K extends keyof Config>(key: K): Config[K];\r\n    // (undocumented)\r\n    get<K extends keyof Config = never>(key?: K): Config | Config[K];\r\n}\r\n\r\n// @alpha\r\nexport type Container = \"top\" | \"right\" | \"center\";\r\n\r\n// @alpha\r\nexport interface CustomComponentsApi {\r\n    registerComposerPreview(filterFn: (composerText: string, roomId: string) => boolean, renderer: CustomComposerPreviewRenderFunction): void;\r\n    registerLoginComponent(renderer: CustomLoginRenderFunction): void;\r\n    registerMessageRenderer(eventTypeOrFilter: string | ((mxEvent: MatrixEvent) => boolean), renderer: CustomMessageRenderFunction, hints?: CustomMessageRenderHints): void;\r\n    registerRoomPreviewBar(renderer: CustomRoomPreviewBarRenderFunction): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewComponentProps = {\r\n    text: string;\r\n    roomId: string;\r\n    target?: ComposerApiTarget;\r\n    relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    };\r\n};\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewRenderFunction = ExtendablePropsRenderFunction<CustomComposerPreviewComponentProps>;\r\n\r\n// @alpha\r\nexport interface CustomisationsApi {\r\n    registerShouldShowComponent(fn: (this: void, component: UIComponent) => boolean | void): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginComponentProps = {\r\n    serverConfig: CustomLoginComponentPropsServerConfig;\r\n    fragmentAfterLogin?: string;\r\n    children?: ReactNode;\r\n    onLoggedIn(this: void, data: AccountAuthInfo): void;\r\n    onServerConfigChange(this: void, config: CustomLoginComponentPropsServerConfig): void;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomLoginComponentPropsServerConfig {\r\n    hsName: string;\r\n    hsUrl: string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginRenderFunction = ExtendablePropsRenderFunction<CustomLoginComponentProps>;\r\n\r\n// @alpha\r\nexport type CustomMessageComponentProps = {\r\n    mxEvent: MatrixEvent;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomMessageGrouping {\r\n    getKey?: (mxEvent: MatrixEvent) => string;\r\n    getSummary: (events: readonly MatrixEvent[]) => string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomMessageRenderFunction = (\r\nprops: CustomMessageComponentProps,\r\noriginalComponent?: (props?: OriginalMessageComponentProps) => React.JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport type CustomMessageRenderHints = {\r\n    allowEditingEvent?: boolean;\r\n    allowDownloadingMedia?: (mxEvent: MatrixEvent) => Promise<boolean>;\r\n    renderAsInfoMessage?: boolean;\r\n    renderSenderProfile?: boolean;\r\n    renderGroupSummary?: CustomMessageGrouping;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarComponentProps = {\r\n    roomId?: string;\r\n    roomAlias?: string;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarRenderFunction = (\r\nprops: CustomRoomPreviewBarComponentProps,\r\noriginalComponent: (props: CustomRoomPreviewBarComponentProps) => JSX.Element) => JSX.Element;\r\n\r\n// @public\r\nexport interface DialogApiExtension {\r\n    openDialog<M, P extends object>(initialOptions: DialogOptions, dialog: ComponentType<P & DialogProps<M>>, props: P): DialogHandle<M>;\r\n}\r\n\r\n// @public\r\nexport type DialogHandle<M> = {\r\n    finished: Promise<{\r\n        ok: boolean;\r\n        model: M | null;\r\n    }>;\r\n    close(this: void): void;\r\n};\r\n\r\n// @public\r\nexport interface DialogOptions {\r\n    ariaLabel?: string;\r\n    title?: string;\r\n}\r\n\r\n// @public\r\nexport type DialogProps<M> = {\r\n    onSubmit(this: void, model: M): void;\r\n    onCancel(this: void): void;\r\n};\r\n\r\n// @alpha\r\nexport type ExtendablePropsRenderFunction<BaseProps> = <P extends BaseProps>(\r\nprops: P,\r\noriginalComponent: (props: P) => JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport interface ExtrasApi {\r\n    addRoomHeaderButtonCallback(cb: RoomHeaderButtonsCallback): void;\r\n    getVisibleRoomBySpaceKey(spaceKey: string, cb: () => string[]): void;\r\n    setSpacePanelItem(spaceKey: string, props: SpacePanelItemProps): void;\r\n}\r\n\r\n// @alpha\r\nexport interface HardwareKey {\r\n    // (undocumented)\r\n    label: string;\r\n    // (undocumented)\r\n    manufacturerID: string;\r\n    // (undocumented)\r\n    maxPinLength: number;\r\n    // (undocumented)\r\n    minPinLength: number;\r\n    // (undocumented)\r\n    model: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n}\r\n\r\n// @alpha\r\nexport type HardwareKeyState = \"absent\" | \"noSigningKey\" | \"open\" | \"authenticated\";\r\n\r\n// @public\r\nexport interface I18nApi {\r\n    humanizeTime(this: void, timeMillis: number): string;\r\n    get language(): string;\r\n    register(this: void, translations: Partial<Translations>): void;\r\n    translate(this: void, key: keyof Translations, variables?: StringVariables): string;\r\n    translate(this: void, key: keyof Translations, variables: Variables | undefined, tags: Tags): ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type IdentityApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @alpha\r\nexport type LocationRenderFunction = () => JSX.Element;\r\n\r\n// @alpha\r\nexport interface MatrixEvent {\r\n    content: Record<string, unknown>;\r\n    eventId: string;\r\n    originServerTs: number;\r\n    roomId: string;\r\n    sender: string;\r\n    stateKey?: string;\r\n    type: string;\r\n    unsigned: Record<string, unknown>;\r\n}\r\n\r\n// @public\r\nexport type MaybePromise<T> = T | PromiseLike<T>;\r\n\r\n// @public\r\nexport interface Module {\r\n    // (undocumented)\r\n    load(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface ModuleFactory {\r\n    // (undocumented)\r\n    new (api: Api): Module;\r\n    // (undocumented)\r\n    readonly moduleApiVersion: string;\r\n    // (undocumented)\r\n    readonly prototype: Module;\r\n}\r\n\r\n// @public\r\nexport class ModuleIncompatibleError extends Error {\r\n    constructor(pluginVersion: string);\r\n}\r\n\r\n// @public\r\nexport class ModuleLoader {\r\n    constructor(api: Api);\r\n    // Warning: (ae-forgotten-export) The symbol \"ModuleExport\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    load(moduleExport: ModuleExport): Promise<void>;\r\n    // (undocumented)\r\n    start(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface NavigationApi {\r\n    openRoom(roomIdOrAlias: string, opts?: OpenRoomOptions): void;\r\n    // @alpha\r\n    registerLocationRenderer(path: string, renderer: LocationRenderFunction): void;\r\n    toMatrixToLink(link: string, join?: boolean): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface OpenRoomOptions {\r\n    autoJoin?: boolean;\r\n    viaServers?: string[];\r\n}\r\n\r\n// @alpha\r\nexport type OriginalMessageComponentProps = {\r\n    showUrlPreview?: boolean;\r\n};\r\n\r\n// @alpha\r\nexport type PreloadApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @public\r\nexport interface Profile {\r\n    displayName?: string;\r\n    isGuest?: boolean;\r\n    userId?: string;\r\n}\r\n\r\n// @public\r\nexport interface ProfileApiExtension {\r\n    readonly profile: Watchable<Profile>;\r\n}\r\n\r\n// @public\r\nexport interface RichVariables {\r\n    // (undocumented)\r\n    [key: string]: SubstitutionValue;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport interface Room {\r\n    getLastActiveTimestamp: () => number;\r\n    id: string;\r\n    name: Watchable<string>;\r\n}\r\n\r\n// @alpha\r\nexport type RoomHeaderButtonsCallback = (roomId: string) => JSX.Element | undefined;\r\n\r\n// @public\r\nexport interface RoomListStoreApi {\r\n    getRooms(): Watchable<Room[]>;\r\n    waitForReady(): Promise<void>;\r\n}\r\n\r\n// @alpha\r\nexport interface RoomViewProps {\r\n    enableReadReceiptsAndMarkersOnActivity?: boolean;\r\n    hideComposer?: boolean;\r\n    hideHeader?: boolean;\r\n    hidePinnedMessageBanner?: boolean;\r\n    hideRightPanel?: boolean;\r\n    hideWidgets?: boolean;\r\n}\r\n\r\n// @alpha\r\nexport interface SettingsApi {\r\n    getValue<T = any>(settingName: string, roomId?: string | null, excludeDefault?: boolean): T | undefined;\r\n}\r\n\r\n// @alpha\r\nexport interface SpacePanelItemProps {\r\n    className?: string;\r\n    icon?: JSX.Element;\r\n    label: string;\r\n    onSelected: () => void;\r\n    style?: React.CSSProperties;\r\n    tooltip?: string;\r\n}\r\n\r\n// @alpha\r\nexport interface StorageHelperApi {\r\n    getPickleKey(userId: string, deviceId: string): Promise<string | null>;\r\n}\r\n\r\n// @public\r\nexport interface StoresApi {\r\n    roomListStore: RoomListStoreApi;\r\n}\r\n\r\n// @public\r\nexport interface StringVariables {\r\n    // (undocumented)\r\n    [key: string]: number | string | null | undefined;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport type SubstitutionValue = number | string | ReactNode | ((sub: string) => ReactNode);\r\n\r\n// @public\r\nexport type Tags = Record<string, SubstitutionValue>;\r\n\r\n// @public\r\nexport type Translations = Record<string, {\r\n    [ietfLanguageTag: string]: string;\r\n}>;\r\n\r\n// @alpha\r\nexport const enum UIComponent {\r\n    AddIntegrations = \"UIComponent.addIntegrations\",\r\n    CreateRooms = \"UIComponent.roomCreation\",\r\n    CreateSpaces = \"UIComponent.spaceCreation\",\r\n    ExploreRooms = \"UIComponent.exploreRooms\",\r\n    FilterContainer = \"UIComponent.filterContainer\",\r\n    InviteUsers = \"UIComponent.sendInvites\",\r\n    RoomOptionsMenu = \"UIComponent.roomOptionsMenu\"\r\n}\r\n\r\n// @alpha\r\nexport interface UrlPreviewApi {\r\n    registerPreviewHandler(regex: RegExp, handler: UrlPreviewHandler): void;\r\n}\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"UrlPreview\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @alpha\r\nexport type UrlPreviewHandler = (url: string, mxEvent?: MatrixEvent) => Promise<UrlPreview | null>;\r\n\r\n// @alpha\r\nexport interface UserCertificate {\r\n    // (undocumented)\r\n    certificate: CertificateInfo;\r\n    chain: string;\r\n}\r\n\r\n// @public\r\nexport function useWatchable<T>(watchable: Watchable<T>): T;\r\n\r\n// @public\r\nexport type Variables = StringVariables | RichVariables;\r\n\r\n// @public\r\nexport class Watchable<T> {\r\n    constructor(currentValue: T);\r\n    // Warning: (ae-forgotten-export) The symbol \"WatchFn\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    protected readonly listeners: Set<WatchFn<T>>;\r\n    protected onFirstWatch(): void;\r\n    protected onLastWatch(): void;\r\n    // (undocumented)\r\n    unwatch(listener: (value: T) => void): void;\r\n    get value(): T;\r\n    set value(value: T);\r\n    // (undocumented)\r\n    watch(listener: (value: T) => void): void;\r\n}\r\n\r\n// @alpha\r\nexport interface WidgetApi {\r\n    getAppAvatarUrl(app: IWidget, width?: number, height?: number, resizeMethod?: string): string | null;\r\n    getWidgetsInRoom(roomId: string): IWidget[];\r\n    isAppInContainer(app: IWidget, container: Container, roomId: string): boolean;\r\n    moveAppToContainer(app: IWidget, container: Container, roomId: string): void;\r\n}\r\n\r\n// @alpha\r\nexport type WidgetDescriptor = {\r\n    id: string;\r\n    templateUrl: string;\r\n    creatorUserId: string;\r\n    type: string;\r\n    origin: string;\r\n    roomId?: string;\r\n};\r\n\r\n// @alpha\r\nexport interface WidgetLifecycleApi {\r\n    registerCapabilitiesApprover(approver: CapabilitiesApprover): void;\r\n    registerIdentityApprover(approver: IdentityApprover): void;\r\n    registerPreloadApprover(approver: PreloadApprover): void;\r\n}\r\n\r\n// @alpha\r\nexport interface X509Api {\r\n    getKeyState(serialNumber: string): Promise<X509Result<HardwareKeyState>>;\r\n    getUserCertificate(): Promise<X509Result<UserCertificate>>;\r\n    listHardwareKeys(): Promise<X509Result<HardwareKey[]>>;\r\n    logIntoKey(serialNumber: string, pin: string): Promise<X509LoginResult>;\r\n    signData(serialNumber: string, data: Uint8Array): Promise<X509Result<Uint8Array>>;\r\n}\r\n\r\n// @public\r\nexport interface X509ClientInitOpts {\r\n    signer?: (item: Uint8Array) => Promise<{\r\n        signature_bytes: Uint8Array;\r\n        certificate_chain: string;\r\n        signature_scheme: \"RsaPssSha512\";\r\n    }>;\r\n    userVerificationCaCertsPem?: string;\r\n    validity?: () => number;\r\n}\r\n\r\n// @alpha\r\nexport interface X509IpcError {\r\n    // (undocumented)\r\n    code: X509IpcErrorCode;\r\n    // (undocumented)\r\n    message?: string;\r\n    pkcs11Code?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509IpcErrorCode =\r\n/**\r\n* No PKCS#11 library is configured or it could not be loaded.\r\n*/\r\n| \"MODULE_NOT_LOADED\"\r\n| \"KEY_NOT_FOUND\"\r\n| \"CERTIFICATE_NOT_FOUND\"\r\n| \"PRIVATE_KEY_NOT_FOUND\"\r\n/**\r\n* `signData` was called before `logIntoKey`, or the session was invalidated since.\r\n*/\r\n| \"LOGIN_REQUIRED\"\r\n/**\r\n* An upstream error from the PKCS#11 library. Carries a `CKR_*` code.\r\n*/\r\n| \"UPSTREAM_PKCS11\"\r\n| \"UNKNOWN\";\r\n\r\n// @alpha\r\nexport interface X509LoginError extends X509IpcError {\r\n    triesRemaining?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509LoginResult = X509Result<void, X509LoginError>;\r\n\r\n// @alpha\r\nexport type X509Result<T, E extends X509IpcError = X509IpcError> = { ok: true; data: T } | { ok: false; error: E };\r\n\r\n// (No @packageDocumentation comment for this package)\r\n\r\n```\r\n","isInternal":false,"tokens":3911,"sizeBytes":16810},{"name":"package.json","path":"packages/module-api/package.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/module-api/package.json","title":"@element-hq/element-web-module-api","category":"anthropic-skill","format":"json","content":"{\n    \"name\": \"@element-hq/element-web-module-api\",\n    \"type\": \"module\",\n    \"version\": \"2.2.0\",\n    \"description\": \"Module API surface for element-web\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/element-hq/element-web.git\",\n        \"directory\": \"packages/module-api\"\n    },\n    \"author\": \"element-hq\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"engines\": {\n        \"node\": \">=20.0.0\"\n    },\n    \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n    \"exports\": {\n        \".\": {\n            \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n            \"import\": \"./lib/element-web-plugin-engine.js\",\n            \"require\": \"./lib/element-web-plugin-engine.umd.cjs\"\n        },\n        \"./vite.base.ts\": {\n            \"types\": \"./vite.base.ts\",\n            \"import\": \"./vite.base.ts\"\n        }\n    },\n    \"files\": [\n        \"lib\",\n        \"vite.base.ts\"\n    ],\n    \"scripts\": {\n        \"prepack\": \"nx build\",\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\",\n        \"coverage\": \"pnpm test:unit --coverage\",\n        \"coverage:diff\": \"diff-cover --config-file ../../diff-cover.toml coverage/lcov.info\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.49.1\",\n        \"@types/node\": \"catalog:ts6\",\n        \"@types/react\": \"catalog:\",\n        \"@types/react-dom\": \"catalog:\",\n        \"@types/semver\": \"^7.5.8\",\n        \"@typescript/native\": \"catalog:\",\n        \"matrix-widget-api\": \"^1.17.0\",\n        \"rollup-plugin-external-globals\": \"^0.13.0\",\n        \"semver\": \"^7.6.3\",\n        \"shared-types\": \"workspace:*\",\n        \"typescript\": \"catalog:ts6\",\n        \"unplugin-dts\": \"catalog:\",\n        \"vite\": \"catalog:\",\n        \"vitest\": \"catalog:\"\n    },\n    \"peerDependencies\": {\n        \"@types/react\": \"*\",\n        \"@types/react-dom\": \"*\",\n        \"matrix-web-i18n\": \"*\",\n        \"matrix-widget-api\": \"*\",\n        \"react\": \"^19\"\n    },\n    \"peerDependenciesMeta\": {\n        \"matrix-widget-api\": {\n            \"optional\": true\n        },\n        \"matrix-web-i18n\": {\n            \"optional\": true\n        }\n    }\n}\n","frontmatter":{"name":"@element-hq/element-web-module-api","type":"module","version":"2.2.0","description":"Module API surface for element-web","repository":{"type":"git","url":"git+https://github.com/element-hq/element-web.git","directory":"packages/module-api"},"author":"element-hq","license":"SEE LICENSE IN README.md","engines":{"node":">=20.0.0"},"types":"./lib/element-web-module-api-alpha.d.ts","exports":{".":{"types":"./lib/element-web-module-api-alpha.d.ts","import":"./lib/element-web-plugin-engine.js","require":"./lib/element-web-plugin-engine.umd.cjs"},"./vite.base.ts":{"types":"./vite.base.ts","import":"./vite.base.ts"}},"files":["lib","vite.base.ts"],"scripts":{"prepack":"nx build","lint:types":"nx lint:types","test:unit":"vitest","coverage":"pnpm test:unit --coverage","coverage:diff":"diff-cover --config-file ../../diff-cover.toml coverage/lcov.info"},"devDependencies":{"@microsoft/api-extractor":"^7.49.1","@types/node":"catalog:ts6","@types/react":"catalog:","@types/react-dom":"catalog:","@types/semver":"^7.5.8","@typescript/native":"catalog:","matrix-widget-api":"^1.17.0","rollup-plugin-external-globals":"^0.13.0","semver":"^7.6.3","shared-types":"workspace:*","typescript":"catalog:ts6","unplugin-dts":"catalog:","vite":"catalog:","vitest":"catalog:"},"peerDependencies":{"@types/react":"*","@types/react-dom":"*","matrix-web-i18n":"*","matrix-widget-api":"*","react":"^19"},"peerDependenciesMeta":{"matrix-widget-api":{"optional":true},"matrix-web-i18n":{"optional":true}}},"isInternal":false,"tokens":571,"sizeBytes":2097},{"name":"project.json","path":"packages/module-api/project.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/module-api/project.json","title":"Module-api Skill","category":"anthropic-skill","format":"json","content":"{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/module-api\",\n    \"targets\": {\n        \"build\": {\n            \"cache\": true,\n            \"inputs\": [\"src\"],\n            \"outputs\": [\"{projectRoot}/lib\"],\n            \"command\": \"vite build\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        },\n        \"start\": {\n            \"command\": \"vite build --watch\",\n            \"options\": { \"cwd\": \"packages/module-api\" },\n            \"dependsOn\": [\"^start\"],\n            \"continuous\": true\n        },\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        }\n    }\n}\n","frontmatter":{"$schema":"../../node_modules/nx/schemas/project-schema.json","projectType":"library","root":"packages/module-api","targets":{"build":{"cache":true,"inputs":["src"],"outputs":["{projectRoot}/lib"],"command":"vite build","options":{"cwd":"packages/module-api"}},"start":{"command":"vite build --watch","options":{"cwd":"packages/module-api"},"dependsOn":["^start"],"continuous":true},"lint:types":{"command":"pnpm exec tsc --noEmit","options":{"cwd":"packages/module-api"}}}},"isInternal":false,"tokens":180,"sizeBytes":726},{"name":"tsconfig.json","path":"packages/module-api/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/module-api/tsconfig.json","title":"Module-api Skill","category":"anthropic-skill","format":"json","content":"{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"rootDir\": \"./src\",\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"esModuleInterop\": true,\n        \"strict\": true,\n        \"declaration\": true,\n        \"module\": \"es2022\",\n        \"moduleResolution\": \"bundler\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"jsx\": \"react-jsx\",\n        \"declarationMap\": true,\n        \"allowImportingTsExtensions\": true\n    },\n    \"include\": [\"src\"]\n}\n","frontmatter":{"$schema":"http://json.schemastore.org/tsconfig","compilerOptions":{"rootDir":"./src","target":"esnext","lib":["dom","es2022","esnext"],"esModuleInterop":true,"strict":true,"declaration":true,"module":"es2022","moduleResolution":"bundler","types":[],"noEmit":true,"jsx":"react-jsx","declarationMap":true,"allowImportingTsExtensions":true},"include":["src"]},"isInternal":false,"tokens":141,"sizeBytes":515},{"name":"package.json","path":"packages/playwright-common/package.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/package.json","title":"Playwright-common Skill","category":"anthropic-skill","format":"json","content":"# Playwright-common Skill\n\nPath: `packages/playwright-common/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/package.json)","tokens":300,"sizeBytes":207},{"name":"project.json","path":"packages/playwright-common/project.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/project.json","title":"Playwright-common Skill","category":"anthropic-skill","format":"json","content":"# Playwright-common Skill\n\nPath: `packages/playwright-common/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/project.json)","tokens":300,"sizeBytes":207},{"name":"tsconfig.build.json","path":"packages/playwright-common/tsconfig.build.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.build.json","title":"Playwright-common Skill","category":"anthropic-skill","format":"json","content":"# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.build.json)","tokens":300,"sizeBytes":221},{"name":"tsconfig.json","path":"packages/playwright-common/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.json","title":"Playwright-common Skill","category":"anthropic-skill","format":"json","content":"# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.json)","tokens":300,"sizeBytes":209},{"name":"RELEASING.md","path":"packages/RELEASING.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/RELEASING.md","title":"Packages Skill","category":"anthropic-skill","format":"markdown","content":"# Release process for packages in element-web/packages\n\n1. Update `package.json` with the new version. One way to do this is\n   `pnpm version --no-git-tag-version <major|minor|patch>`. Or just do it manually.\n\n2. Commit to a release prep branch, and open a PR.\n\n3. Once the PR has merged to `develop`, run the\n   [npm-publish](https://github.com/element-hq/element-web/actions/workflows/npm-publish.yaml)\n   Github Actions workflow, specifying the package to be released.\n","isInternal":false,"tokens":116,"sizeBytes":472},{"name":"package.json","path":"packages/shared-components/package.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/package.json","title":"Shared-components Skill","category":"anthropic-skill","format":"json","content":"# Shared-components Skill\n\nPath: `packages/shared-components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/package.json)","tokens":300,"sizeBytes":207},{"name":"project.json","path":"packages/shared-components/project.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/project.json","title":"Shared-components Skill","category":"anthropic-skill","format":"json","content":"# Shared-components Skill\n\nPath: `packages/shared-components/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/project.json)","tokens":300,"sizeBytes":207},{"name":"cs.json","path":"packages/shared-components/src/i18n/strings/cs.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cs.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cs.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cs.json)","tokens":300,"sizeBytes":221},{"name":"cy.json","path":"packages/shared-components/src/i18n/strings/cy.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cy.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cy.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cy.json)","tokens":300,"sizeBytes":221},{"name":"da.json","path":"packages/shared-components/src/i18n/strings/da.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/da.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/da.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/da.json)","tokens":300,"sizeBytes":221},{"name":"de_DE.json","path":"packages/shared-components/src/i18n/strings/de_DE.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/de_DE.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/de_DE.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/de_DE.json)","tokens":300,"sizeBytes":227},{"name":"el.json","path":"packages/shared-components/src/i18n/strings/el.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/el.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/el.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/el.json)","tokens":300,"sizeBytes":221},{"name":"en_EN.json","path":"packages/shared-components/src/i18n/strings/en_EN.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/en_EN.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/en_EN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/en_EN.json)","tokens":300,"sizeBytes":227},{"name":"eo.json","path":"packages/shared-components/src/i18n/strings/eo.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/eo.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/eo.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/eo.json)","tokens":300,"sizeBytes":221},{"name":"es.json","path":"packages/shared-components/src/i18n/strings/es.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/es.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/es.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/es.json)","tokens":300,"sizeBytes":221},{"name":"et.json","path":"packages/shared-components/src/i18n/strings/et.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/et.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/et.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/et.json)","tokens":300,"sizeBytes":221},{"name":"fa.json","path":"packages/shared-components/src/i18n/strings/fa.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fa.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fa.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fa.json)","tokens":300,"sizeBytes":221},{"name":"fi.json","path":"packages/shared-components/src/i18n/strings/fi.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fi.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fi.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fi.json)","tokens":300,"sizeBytes":221},{"name":"fr.json","path":"packages/shared-components/src/i18n/strings/fr.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fr.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fr.json)","tokens":300,"sizeBytes":221},{"name":"gl.json","path":"packages/shared-components/src/i18n/strings/gl.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/gl.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/gl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/gl.json)","tokens":300,"sizeBytes":221},{"name":"he.json","path":"packages/shared-components/src/i18n/strings/he.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/he.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/he.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/he.json)","tokens":300,"sizeBytes":221},{"name":"hr.json","path":"packages/shared-components/src/i18n/strings/hr.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hr.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hr.json)","tokens":300,"sizeBytes":221},{"name":"hu.json","path":"packages/shared-components/src/i18n/strings/hu.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hu.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hu.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hu.json)","tokens":300,"sizeBytes":221},{"name":"hy.json","path":"packages/shared-components/src/i18n/strings/hy.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hy.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/hy.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/hy.json)","tokens":300,"sizeBytes":221},{"name":"id.json","path":"packages/shared-components/src/i18n/strings/id.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/id.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/id.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/id.json)","tokens":300,"sizeBytes":221},{"name":"is.json","path":"packages/shared-components/src/i18n/strings/is.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/is.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/is.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/is.json)","tokens":300,"sizeBytes":221},{"name":"it.json","path":"packages/shared-components/src/i18n/strings/it.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/it.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/it.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/it.json)","tokens":300,"sizeBytes":221},{"name":"ja.json","path":"packages/shared-components/src/i18n/strings/ja.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ja.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ja.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ja.json)","tokens":300,"sizeBytes":221},{"name":"ka.json","path":"packages/shared-components/src/i18n/strings/ka.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ka.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ka.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ka.json)","tokens":300,"sizeBytes":221},{"name":"ko.json","path":"packages/shared-components/src/i18n/strings/ko.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ko.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ko.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ko.json)","tokens":300,"sizeBytes":221},{"name":"lo.json","path":"packages/shared-components/src/i18n/strings/lo.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lo.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lo.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lo.json)","tokens":300,"sizeBytes":221},{"name":"lt.json","path":"packages/shared-components/src/i18n/strings/lt.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lt.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lt.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lt.json)","tokens":300,"sizeBytes":221},{"name":"lv.json","path":"packages/shared-components/src/i18n/strings/lv.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lv.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/lv.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/lv.json)","tokens":300,"sizeBytes":221},{"name":"mg_MG.json","path":"packages/shared-components/src/i18n/strings/mg_MG.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/mg_MG.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/mg_MG.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/mg_MG.json)","tokens":300,"sizeBytes":227},{"name":"nb_NO.json","path":"packages/shared-components/src/i18n/strings/nb_NO.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nb_NO.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/nb_NO.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nb_NO.json)","tokens":300,"sizeBytes":227},{"name":"nl.json","path":"packages/shared-components/src/i18n/strings/nl.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nl.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/nl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/nl.json)","tokens":300,"sizeBytes":221},{"name":"pl.json","path":"packages/shared-components/src/i18n/strings/pl.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pl.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pl.json)","tokens":300,"sizeBytes":221},{"name":"pt_BR.json","path":"packages/shared-components/src/i18n/strings/pt_BR.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt_BR.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pt_BR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt_BR.json)","tokens":300,"sizeBytes":227},{"name":"pt.json","path":"packages/shared-components/src/i18n/strings/pt.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/pt.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/pt.json)","tokens":300,"sizeBytes":221},{"name":"ru.json","path":"packages/shared-components/src/i18n/strings/ru.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ru.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/ru.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/ru.json)","tokens":300,"sizeBytes":221},{"name":"sk.json","path":"packages/shared-components/src/i18n/strings/sk.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sk.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sk.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sk.json)","tokens":300,"sizeBytes":221},{"name":"sq.json","path":"packages/shared-components/src/i18n/strings/sq.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sq.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sq.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sq.json)","tokens":300,"sizeBytes":221},{"name":"sv.json","path":"packages/shared-components/src/i18n/strings/sv.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sv.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/sv.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/sv.json)","tokens":300,"sizeBytes":221},{"name":"tr.json","path":"packages/shared-components/src/i18n/strings/tr.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/tr.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/tr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/tr.json)","tokens":300,"sizeBytes":221},{"name":"uk.json","path":"packages/shared-components/src/i18n/strings/uk.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/uk.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/uk.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/uk.json)","tokens":300,"sizeBytes":221},{"name":"vi.json","path":"packages/shared-components/src/i18n/strings/vi.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/vi.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/vi.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/vi.json)","tokens":300,"sizeBytes":221},{"name":"zh_Hans.json","path":"packages/shared-components/src/i18n/strings/zh_Hans.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hans.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/zh_Hans.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hans.json)","tokens":300,"sizeBytes":231},{"name":"zh_Hant.json","path":"packages/shared-components/src/i18n/strings/zh_Hant.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hant.json","title":"Strings Skill","category":"anthropic-skill","format":"json","content":"# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/zh_Hant.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/zh_Hant.json)","tokens":300,"sizeBytes":231},{"name":"tsconfig.json","path":"packages/shared-components/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.json","title":"Shared-components Skill","category":"anthropic-skill","format":"json","content":"# Shared-components Skill\n\nPath: `packages/shared-components/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.json)","tokens":300,"sizeBytes":209},{"name":"tsconfig.node.json","path":"packages/shared-components/tsconfig.node.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.node.json","title":"Shared-components Skill","category":"anthropic-skill","format":"json","content":"# Shared-components Skill\n\nPath: `packages/shared-components/tsconfig.node.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/tsconfig.node.json)","tokens":300,"sizeBytes":219},{"name":"typedoc.json","path":"packages/shared-components/typedoc.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/typedoc.json","title":"Shared-components Skill","category":"anthropic-skill","format":"json","content":"# Shared-components Skill\n\nPath: `packages/shared-components/typedoc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/typedoc.json)","tokens":300,"sizeBytes":207},{"name":"package.json","path":"packages/shared-types/package.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/package.json","title":"Shared-types Skill","category":"anthropic-skill","format":"json","content":"# Shared-types Skill\n\nPath: `packages/shared-types/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/package.json)","tokens":300,"sizeBytes":192},{"name":"tsconfig.json","path":"packages/shared-types/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/tsconfig.json","title":"Shared-types Skill","category":"anthropic-skill","format":"json","content":"# Shared-types Skill\n\nPath: `packages/shared-types/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-types/tsconfig.json)","tokens":300,"sizeBytes":194},{"name":"package.json","path":"packages/shared-utils/package.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/package.json","title":"Shared-utils Skill","category":"anthropic-skill","format":"json","content":"# Shared-utils Skill\n\nPath: `packages/shared-utils/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/package.json)","tokens":300,"sizeBytes":192},{"name":"project.json","path":"packages/shared-utils/project.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/project.json","title":"Shared-utils Skill","category":"anthropic-skill","format":"json","content":"# Shared-utils Skill\n\nPath: `packages/shared-utils/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/project.json)","tokens":300,"sizeBytes":192},{"name":"tsconfig.json","path":"packages/shared-utils/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/tsconfig.json","title":"Shared-utils Skill","category":"anthropic-skill","format":"json","content":"# Shared-utils Skill\n\nPath: `packages/shared-utils/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/tsconfig.json)","tokens":300,"sizeBytes":194},{"name":"README.md","path":"apps/web/playwright/plugins/oauth_server/README.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/apps/web/playwright/plugins/oauth_server/README.md","title":"oauth_server Documentation","category":"plugin-manifest","format":"markdown","content":"# oauth_server Documentation\n\nPath: `apps/web/playwright/plugins/oauth_server/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/apps/web/playwright/plugins/oauth_server/README.md)","tokens":300,"sizeBytes":232},{"name":"README.md","path":"packages/module-api/README.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/module-api/README.md","title":"module-api Documentation","category":"plugin-manifest","format":"markdown","content":"# @element-hq/element-web-module-api\n\nAPI surface for extending Element Web in a safe & predictable way.\n\n## Using the API\n\nModules are loaded by Element Web at runtime via a dynamic ecmascript import, but can be bundled into a webapp for deployment convenience.\n\nThe module's default export MUST be a class which accepts a single argument, an instance of `ModuleApi`.\nThis class must also bear a static property `moduleApiVersion` which is a semver range string\nand a `load` method which is called when the module is to be loaded.\n\n```typescript\nimport type { Module, Api, ModuleFactory } from \"@element-hq/element-web-module-api\";\n\nclass ExampleModule implements Module {\n    public static readonly moduleApiVersion = \"^2.0.0\";\n\n    public constructor(private api: Api) {}\n\n    public async load(): Promise<void> {\n        // Your extension code goes here\n    }\n}\n\nexport default ExampleModule satisfies ModuleFactory;\n```\n\n### Accessing application configuration\n\nThe `api` object passed to the module constructor provides access to the application configuration.\nYou can extend the Config types using declaration merging, though please ensure that you do not trust the types you specify,\nand opt for runtime validation due to the dynamic nature of the configuration.\n\n```typescript\n// ...\ndeclare module \"@element-hq/element-web-module-api\" {\n    interface Config {\n        \"this.is.my.config.key\": string;\n    }\n}\n\nclass ExampleModule implements Module {\n    // ...\n    public async load(): Promise<void> {\n        const configValue = this.api.config.get(\"this.is.my.config.key\");\n        // Your extension code goes here\n    }\n}\n// ...\n```\n\n## Releases\n\nThe API is versioned using semver, with the major version incremented for breaking changes.\n\nTo carry out a release, see the documentation at [`../RELEASING.md`](../RELEASING.md).\n\n## Copyright & License\n\nCopyright (c) 2025 New Vector Ltd\n\nThis software is multi licensed by New Vector Ltd (Element). It can be used either:\n\n(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR\n\n(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).\nUnless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.\n","isInternal":false,"tokens":561,"sizeBytes":2663},{"name":"README.md","path":"packages/playwright-common/README.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/README.md","title":"playwright-common Documentation","category":"plugin-manifest","format":"markdown","content":"# @element-hq/element-web-playwright-common\n\nSet of Playwright & testcontainers utilities to make it easier to write tests for Element Web, Element Web Modules & Element Desktop.\n\nThe main export includes a number of fixtures and custom assertions as documented in JSDoc.\n\nThe `lib/testcontainers` export contains the following modules:\n\n- `SynapseContainer` - A testcontainer for running a Synapse server\n- `MatrixAuthenticationServiceContainer` - A testcontainer for running a Matrix Authentication Service\n- `MailpitContainer` - A testcontainer for running a Mailpit SMTP server\n\nThere are a number of utils available in the `lib/utils` export.\n\n## Releases\n\nThe API is versioned using semver, with the major version incremented for breaking changes.\n\nTo carry out a release, see the documentation at [`../RELEASING.md`](../RELEASING.md).\n\n## Copyright & License\n\nCopyright (c) 2026 Element Creations Ltd\n\nThis software is multi licensed by Element Creations Ltd (Element). It can be used either:\n\n(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR\n\n(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).\nUnless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.\n","isInternal":false,"tokens":354,"sizeBytes":1679},{"name":"README.md","path":"packages/shared-components/README.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/README.md","title":"shared-components Documentation","category":"plugin-manifest","format":"markdown","content":"# shared-components Documentation\n\nPath: `packages/shared-components/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/README.md)","tokens":300,"sizeBytes":209},{"name":"README.md","path":"packages/shared-components/static/README.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/static/README.md","title":"static Documentation","category":"plugin-manifest","format":"markdown","content":"# static Documentation\n\nPath: `packages/shared-components/static/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/static/README.md)","tokens":300,"sizeBytes":212},{"name":"README.md","path":"packages/shared-utils/README.md","rawUrl":"https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/README.md","title":"shared-utils Documentation","category":"plugin-manifest","format":"markdown","content":"# shared-utils Documentation\n\nPath: `packages/shared-utils/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-utils/README.md)","tokens":300,"sizeBytes":194}],"systemPromptSnippet":"<yakaai_skills repo=\"element-hq/element-web\">\n<!-- File: AGENTS.md (Tokens: ~2470 | Category: root-instruction) -->\n# AGENTS.md\n\nInstructions for AI coding agents working in this repository. Humans should read\n[CONTRIBUTING.md](./CONTRIBUTING.md) and [code_style.md](./code_style.md) instead — this file summarises those and\nadds the things that are easy to get wrong here.\n\n## Repository layout\n\nA pnpm + nx monorepo (`element-web-monorepo`). Workspaces are `apps/*`, `packages/*`, `modules` and `modules/*`.\n\n| Path                                                                                                  | Contents                                                                                                      |\n| ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |\n| `apps/web`                                                                                            | The Element Web app. Also hosts view models (`src/viewmodels/`) and the Playwright e2e suite (`playwright/`). |\n| `apps/desktop`                                                                                        | Element Desktop.                                                                                              |\n| `packages/shared-components`                                                                          | Published UI component library, `@element-hq/web-shared-components`. New views go here.                       |\n| `packages/module-api`, `packages/shared-utils`, `packages/shared-types`, `packages/playwright-common` | Published support packages.                                                                                   |\n| `modules/*`                                                                                           | Optional runtime modules (banner, widget toggles, …).                                                         |\n| `docs/`                                                                                               | VitePress docs site.                                                                                          |\n\nThere is **no** top-level `playwright/` directory; `docs/playwright.md` uses paths relative to `apps/web`.\n\n## Commands\n\nRun from the repo root unless stated otherwise.\n\n| Task                                                   | Command                                           |\n| ------------------------------------------------------ | ------------------------------------------------- |\n| Full lint (types, format, js, styles, workflows, knip) | `pnpm lint`                                       |\n| Format                                                 | `pnpm lint:fmt:fix`                               |\n| Lint JS/TS                                             | `pnpm lint:js:fix`                                |\n| Typecheck                                              | `pnpm -r --workspace-concurrency=1 lint:types`    |\n| All unit tests                                         | `pnpm test:unit`                                  |\n| Regenerate i18n strings                                | `pnpm i18n`                                       |\n| Start the app                                          | `cd apps/web && pnpm start`                       |\n| Storybook                                              | `cd packages/shared-components && pnpm storybook` |\n\nFormatting is **oxfmt** and linting is **oxlint**. This repo does not use prettier or eslint — running prettier here\nreformats files against the project style and reports failures that do not exist.\n\nRun `pnpm i18n` after adding or changing any translated string.\n\n## Running unit tests\n\nBoth jest and vitest are in use; a migration to vitest is in progress. **The file path decides the runner.**\n\n| Test file                                      | Runner           | Command                                                     |\n| ---------------------------------------------- | ---------------- | ----------------------------------------------------------- |\n| `apps/web/test/**/*-test.[tj]s?(x)`            | jest             | `cd apps/web && pnpm jest <path>`                           |\n| `apps/web/src/**/*.test.{ts,tsx}`              | vitest           | `pnpm vitest run <path>`                                    |\n| `apps/web/src/**/*.test.browser.{ts,tsx}`      | vitest (browser) | `pnpm vitest run --project web-browser <path>`              |\n| `packages/shared-components/src/**/*.test.tsx` | vitest           | `cd packages/shared-components && pnpm test:unit -- <path>` |\n\nNotes:\n\n- Write new tests as co-located vitest `*.test.ts(x)` next to the source file. The `apps/web/test/` jest tree is\n  legacy; extend it only when the file you are changing already lives there.\n- Vitest runs with `globals: false`, so import `describe`, `it`, `expect` and friends explicitly.\n- `packages/shared-components` is excluded from the root vitest config and must be run from its own directory.\n- \"No test files found\" means you picked the wrong runner or path. It is not a pass.\n- Prefer extending an existing test over adding a new file when covering a close variant of existing behaviour.\n\n## Running e2e tests\n\nSpecs live in `apps/web/playwright/e2e`. See [docs/playwright.md](./docs/playwright.md) for the full guide.\n\n```sh\ncd apps/web && pnpm test:playwright -- playwright/e2e/<spec>.spec.ts --project=Chrome\n```\n\n- Requires a container runtime (Docker/Podman/Colima) for the homeserver testcontainers.\n- On macOS, add `--ignore-snapshots`. Screenshot baselines are only committed for Linux, so comparisons fail locally.\n- Never run `pnpm test:playwright:screenshots` locally to \"fix\" a screenshot diff — it writes host-rendered baselines.\n  Screenshots are updated in the Docker environment, which CI matches.\n- The config uses `reuseExistingServer: true`. Check `lsof -ti:8080` first; a stale dev server silently serves the\n  tests. Port-bind errors are an infrastructure problem, not a test failure.\n- Locate elements by role, label and accessible name, not CSS classes.\n- Tag any test using `toMatchScreenshot` with `@screenshot`.\n\n### Reviewing updated screenshots\n\nUpdated baselines are part of the diff and must be reviewed, not accepted blindly. Before committing any changed\n`.png` under `apps/web/playwright/snapshots/` or `packages/shared-components/__vis__/`:\n\n- Look at the image. Confirm every visible difference is one your change was meant to produce.\n- Treat anything else as a regression until proven otherwise: shifted or clipped layout, changed spacing or font,\n  missing or duplicated elements, a wrong theme, an untranslated or placeholder string, a loading or error state\n  captured instead of the real content.\n- Unrelated files changing baselines is a signal in itself — if a screenshot moved for a component you did not\n  touch, find out why rather than committing it.\n- Never regenerate baselines to make a failing test pass. A diff you cannot explain is a bug in the change.\n\n## Writing UI code: MVVM\n\nNew UI follows MVVM. Full details in [docs/MVVM.md](./docs/MVVM.md); the shape for a feature `Foo`:\n\n**View** — `packages/shared-components/src/<domain>/FooView/` containing `FooView.tsx`, `FooView.module.css`,\n`FooView.test.tsx`, `FooView.stories.tsx` and `index.ts`. The view declares the contract:\n\n```tsx\nexport interface FooViewSnapshot { title: string }\ninterface FooViewActions { setTitle: (title: string) => void }\nexport type FooViewModel = ViewModel<FooViewSnapshot, FooViewActions>;\n\nexport function FooView({ vm }: { vm: FooViewModel }): JSX.Element {\n    const { title } = useViewModel(vm);\n    ...\n}\n```\n\nViews are dumb: they read the snapshot and call actions, nothing else. Develop them in Storybook.\n\n**ViewModel** — `apps/web/src/viewmodels/<domain>/FooViewModel.ts`, a class extending `BaseViewModel` that implements\nthe interface from the view. `apps/web/src/components/viewmodels/` is the deprecated v1 location; do not add there.\n\nRules that are easy to miss:\n\n- Define actions as arrow-function class properties (`public doThing = (): void => {}`) so `this` survives being\n  passed as a callback.\n- Use `this.snapshot.merge({ field })` for partial updates. `merge` already skips emitting when nothing changed, so\n  do not add equality guards around it, and do not recompute the whole snapshot for one field.\n- Track listeners and sub-view-models with `this.disposables.trackListener(...)` / `this.disposables.track(...)`.\n- A non-MVVM function component owning a view model should create it with `useCreateAutoDisposedViewModel`; a class\n  component creates it in `componentDidMount` and disposes it in `componentWillUnmount`.\n\nReference implementation: `packages/shared-components/src/room-list/RoomListSearchView/` with\n`apps/web/src/viewmodels/room-list/RoomListSearchViewModel.ts`.\n\n## Code style\n\nRead [code_style.md](./code_style.md). The points most often missed:\n\n- **Every new file needs a copyright header**, enforced by oxlint (`element-call/copyright-header`). Lint fails\n  without it. Substitute the actual current year — check it rather than copying a year from another file — and leave\n  headers on existing files alone:\n\n    ```\n    /*\n    Copyright <current year> <copyright holder>\n\n    SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\n    Please see LICENSE in the repository root for full details.\n    */\n    ```\n\n    The holder is `Element Creations Ltd.` **only for contributions made as part of Element**. An external\n    contributor puts their own name or their company's there instead. Note that `oxlint --fix` inserts the Element\n    line unconditionally, so external contributors should write the header by hand and check what the autofix added.\n\n- TypeScript only, named exports only — avoid `export default`.\n- 4-space indent, 120-column limit, double quotes, semicolons.\n- Declare member visibility (`public`/`private`/`protected`) on class members.\n- Avoid `any`; if unavoidable, comment why.\n- Roughly one interface, class or enum per file, named after the file.\n- Never mix cosmetic and functional changes.\n- **Styles:** `apps/web` uses PostCSS (`res/css/**/_Component.pcss`, `mx_`-prefixed classes).\n  `packages/shared-components` uses CSS modules (`Component.module.css`, semantic camelCase class names, no `mx_`\n  prefix) imported as `styles`. Use Compound design tokens (`var(--cpd-color-…)`, `var(--cpd-space-…)`) for all values.\n- Prefer Compound typography components over raw text elements, and `Flex`/`Box` from shared-components over raw\n  flexbox markup.\n\n## Comments\n\nKeep comments short and relevant.\n\n- Add TSDoc to exported types, functions, classes and components. Document a component's props.\n- Inside a function, explain _why_, not line by line. Add a short overview before a non-obvious block.\n- Use plain language matching the identifiers around the comment — no metaphors or CS jargon.\n- When changing code, update the comments around it so they stay accurate.\n- Any intentionally suppressed lint or type rule needs a nearby comment explaining why.\n\n## Tests are required\n\n- Every change needs unit tests, including features behind labs flags.\n- New user-facing features need a \"happy path\" Playwright e2e test before leaving labs.\n- Aim for ≥80% coverage on the diff; CI checks this. There is no `coverage` script at the root — generate the\n  reports in the workspaces you touched, then compare from the root:\n\n    ```sh\n    pnpm test:unit --coverage                              # vitest, writes coverage/lcov.info\n    cd apps/web && pnpm coverage                           # jest only, writes apps/web/coverage/lcov.info\n    cd packages/shared-components && pnpm coverage\n    pnpm coverage:diff                                     # from the root, needs diff_cover installed\n    ```\n\n## Commits\n\n- Split the work into logically separate commits: one concern per commit. Keep refactors, formatting and behaviour\n  changes in separate commits.\n- Short imperative subject line, no conventional-commit prefix (`feat:`, `fix:`, …).\n- Add a body only when it says something the diff does not; keep it to a line or two.\n\n## Pull requests\n\n- Don't open PR. This should be done by the human, not the agent.\n\n<!-- File: packages/eslint-plugin-element-web/package.json (Tokens: ~153 | Category: anthropic-skill) -->\n{\n    \"name\": \"eslint-plugin-element-web\",\n    \"type\": \"module\",\n    \"version\": \"0.0.0\",\n    \"private\": true,\n    \"description\": \"Element Web specific lint rules, loaded by oxlint as a JS plugin\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"exports\": {\n        \".\": \"./src/index.ts\"\n    },\n    \"scripts\": {\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\"\n    },\n    \"devDependencies\": {\n        \"@typescript/native\": \"catalog:\",\n        \"oxlint\": \"catalog:\",\n        \"typescript\": \"catalog:ts6\",\n        \"vitest\": \"catalog:\"\n    }\n}\n\n<!-- File: packages/eslint-plugin-element-web/project.json (Tokens: ~85 | Category: anthropic-skill) -->\n{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/eslint-plugin-element-web\",\n    \"targets\": {\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/eslint-plugin-element-web\" }\n        }\n    }\n}\n\n<!-- File: packages/eslint-plugin-element-web/tsconfig.json (Tokens: ~122 | Category: anthropic-skill) -->\n{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"strict\": true,\n        \"module\": \"nodenext\",\n        \"moduleResolution\": \"nodenext\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"allowImportingTsExtensions\": true,\n        \"verbatimModuleSyntax\": true,\n        \"erasableSyntaxOnly\": true\n    },\n    \"include\": [\"src\"]\n}\n\n<!-- File: packages/module-api/api-extractor.json (Tokens: ~4438 | Category: anthropic-skill) -->\n/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n\n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n\n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    // \"projectFolder\": \"..\",\n\n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/lib/index.d.ts\",\n\n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we might specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     *\n     * The \"bundledPackages\" elements may specify glob patterns using minimatch syntax.  To ensure deterministic\n     * output, globs are expanded by matching explicitly declared top-level dependencies only.  For example,\n     * the pattern below will NOT match \"@my-company/example\" unless it appears in a field such as \"dependencies\"\n     * or \"devDependencies\" of the project's package.json file:\n     *\n     *   \"bundledPackages\": [ \"@my-company/*\" ],\n     */\n    \"bundledPackages\": [\"shared-types\"],\n\n    /**\n     * Specifies what type of newlines API Extractor should use when writing output files.  By default, the output files\n     * will be written with Windows-style newlines.  To use POSIX-style newlines, specify \"lf\" instead.\n     * To use the OS's default newline kind, specify \"os\".\n     *\n     * DEFAULT VALUE: \"crlf\"\n     */\n    // \"newlineKind\": \"crlf\",\n\n    /**\n     * Specifies how API Extractor sorts members of an enum when generating the .api.json file. By default, the output\n     * files will be sorted alphabetically, which is \"by-name\". To keep the ordering in the source code, specify\n     * \"preserve\".\n     *\n     * DEFAULT VALUE: \"by-name\"\n     */\n    // \"enumMemberOrder\": \"by-name\",\n\n    /**\n     * Set to true when invoking API Extractor's test harness. When `testMode` is true, the `toolVersion` field in the\n     * .api.json file is assigned an empty string to prevent spurious diffs in output files tracked for tests.\n     *\n     * DEFAULT VALUE: \"false\"\n     */\n    // \"testMode\": false,\n\n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n        /**\n         * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n         */\n        // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n        /**\n         * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n         * The object must conform to the TypeScript tsconfig schema:\n         *\n         * http://json.schemastore.org/tsconfig\n         *\n         * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n         *\n         * DEFAULT VALUE: no overrideTsconfig section\n         */\n        // \"overrideTsconfig\": {\n        //   . . .\n        // }\n        /**\n         * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n         * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n         * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n         * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"skipLibCheck\": true,\n    },\n\n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n        /**\n         * (REQUIRED) Whether to generate an API report.\n         */\n        \"enabled\": true,\n\n        /**\n         * The base filename for the API report files, to be combined with \"reportFolder\" or \"reportTempFolder\"\n         * to produce the full file path.  The \"reportFileName\" should not include any path separators such as\n         * \"\\\" or \"/\".  The \"reportFileName\" should not include a file extension, since API Extractor will automatically\n         * append an appropriate file extension such as \".api.md\".  If the \"reportVariants\" setting is used, then the\n         * file extension includes the variant name, for example \"my-report.public.api.md\" or \"my-report.beta.api.md\".\n         * The \"complete\" variant always uses the simple extension \"my-report.api.md\".\n         *\n         * Previous versions of API Extractor required \"reportFileName\" to include the \".api.md\" extension explicitly;\n         * for backwards compatibility, that is still accepted but will be discarded before applying the above rules.\n         *\n         * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<unscopedPackageName>\"\n         */\n        // \"reportFileName\": \"<unscopedPackageName>\",\n\n        /**\n         * To support different approval requirements for different API levels, multiple \"variants\" of the API report can\n         * be generated.  The \"reportVariants\" setting specifies a list of variants to be generated.  If omitted,\n         * by default only the \"complete\" variant will be generated, which includes all @internal, @alpha, @beta,\n         * and @public items.  Other possible variants are \"alpha\" (@alpha + @beta + @public), \"beta\" (@beta + @public),\n         * and \"public\" (@public only).\n         *\n         * DEFAULT VALUE: [ \"complete\" ]\n         */\n        // \"reportVariants\": [\"public\", \"beta\"],\n\n        /**\n         * Specifies the folder where the API report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n         * e.g. for an API review.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/etc/\"\n         */\n        \"reportFolder\": \"<projectFolder>/\"\n\n        /**\n         * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n         * the \"reportFileName\" setting.\n         *\n         * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n         * If they are different, a production build will fail.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/\"\n         */\n        // \"reportTempFolder\": \"<projectFolder>/temp/\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the API report file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false\n    },\n\n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n        /**\n         * (REQUIRED) Whether to generate a doc model file.\n         */\n        \"enabled\": true\n\n        /**\n         * The output path for the doc model file.  The file extension should be \".api.json\".\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n         */\n        // \"apiJsonFilePath\": \"<projectFolder>/temp/<unscopedPackageName>.api.json\",\n\n        /**\n         * Whether \"forgotten exports\" should be included in the doc model file. Forgotten exports are declarations\n         * flagged with `ae-forgotten-export` warnings. See https://api-extractor.com/pages/messages/ae-forgotten-export/ to\n         * learn more.\n         *\n         * DEFAULT VALUE: \"false\"\n         */\n        // \"includeForgottenExports\": false,\n\n        /**\n         * The base URL where the project's source code can be viewed on a website such as GitHub or\n         * Azure DevOps. This URL path corresponds to the `<projectFolder>` path on disk.\n         *\n         * This URL is concatenated with the file paths serialized to the doc model to produce URL file paths to individual API items.\n         * For example, if the `projectFolderUrl` is \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor\" and an API\n         * item's file path is \"api/ExtractorConfig.ts\", the full URL file path would be\n         * \"https://github.com/microsoft/rushstack/tree/main/apps/api-extractor/api/ExtractorConfig.js\".\n         *\n         * This setting can be omitted if you don't need source code links in your API documentation reference.\n         *\n         * SUPPORTED TOKENS: none\n         * DEFAULT VALUE: \"\"\n         */\n        // \"projectFolderUrl\": \"http://github.com/path/to/your/projectFolder\"\n    },\n\n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n        /**\n         * (REQUIRED) Whether to generate the .d.ts rollup file.\n         */\n        \"enabled\": true,\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n         * This file will include all declarations that are exported by the main entry point.\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n         */\n        \"untrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for an \"alpha\" release.\n         * This file will include only declarations that are marked as \"@public\", \"@beta\", or \"@alpha\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"alphaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-alpha.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n         * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"betaTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-beta.d.ts\",\n\n        /**\n         * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n         * This file will include only declarations that are marked as \"@public\".\n         *\n         * If the path is an empty string, then this file will not be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"\"\n         */\n        \"publicTrimmedFilePath\": \"<projectFolder>/lib/<unscopedPackageName>-public.d.ts\"\n\n        /**\n         * When a declaration is trimmed, by default it will be replaced by a code comment such as\n         * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n         * declaration completely.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"omitTrimmingComments\": true\n    },\n\n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n        /**\n         * Whether to generate the tsdoc-metadata.json file.\n         *\n         * DEFAULT VALUE: true\n         */\n        // \"enabled\": true,\n        /**\n         * Specifies where the TSDoc metadata file should be written.\n         *\n         * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n         * prepend a folder token such as \"<projectFolder>\".\n         *\n         * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n         * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n         * falls back to \"tsdoc-metadata.json\" in the package folder.\n         *\n         * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n         * DEFAULT VALUE: \"<lookup>\"\n         */\n        // \"tsdocMetadataFilePath\": \"<projectFolder>/dist/tsdoc-metadata.json\"\n    },\n\n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n        /**\n         * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n         * the input .d.ts files.\n         *\n         * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"compilerMessageReporting\": {\n            /**\n             * Configures the default routing for messages that don't match an explicit rule in this table.\n             */\n            \"default\": {\n                /**\n                 * Specifies whether the message should be written to the the tool's output log.  Note that\n                 * the \"addToApiReportFile\" property may supersede this option.\n                 *\n                 * Possible values: \"error\", \"warning\", \"none\"\n                 *\n                 * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n                 * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n                 * the \"--local\" option), the warning is displayed but the build will not fail.\n                 *\n                 * DEFAULT VALUE: \"warning\"\n                 */\n                \"logLevel\": \"warning\"\n\n                /**\n                 * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n                 * then the message will be written inside that file; otherwise, the message is instead logged according to\n                 * the \"logLevel\" option.\n                 *\n                 * DEFAULT VALUE: false\n                 */\n                // \"addToApiReportFile\": false\n            }\n\n            // \"TS2551\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by API Extractor during its analysis.\n         *\n         * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n         *\n         * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n         */\n        \"extractorMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"ae-extra-release-tag\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        },\n\n        /**\n         * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n         *\n         * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n         *\n         * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n         */\n        \"tsdocMessageReporting\": {\n            \"default\": {\n                \"logLevel\": \"warning\"\n                // \"addToApiReportFile\": false\n            }\n\n            // \"tsdoc-link-tag-unescaped-text\": {\n            //   \"logLevel\": \"warning\",\n            //   \"addToApiReportFile\": true\n            // },\n            //\n            // . . .\n        }\n    }\n}\n\n<!-- File: packages/module-api/element-web-module-api.api.md (Tokens: ~3911 | Category: anthropic-skill) -->\n## API Report File for \"@element-hq/element-web-module-api\"\r\n\r\n> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).\r\n\r\n```ts\r\n\r\nimport { ComponentType } from 'react';\r\nimport { IWidget } from 'matrix-widget-api';\r\nimport { JSX } from 'react';\r\nimport { ReactNode } from 'react';\r\nimport { Root } from 'react-dom/client';\r\nimport { SVGAttributes } from 'react';\r\n\r\n// @public\r\nexport interface AccountAuthApiExtension {\r\n    overwriteAccountAuth(accountInfo: AccountAuthInfo): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface AccountAuthInfo {\r\n    accessToken: string;\r\n    deviceId: string;\r\n    homeserverUrl: string;\r\n    refreshToken?: string;\r\n    userId: string;\r\n}\r\n\r\n// @public\r\nexport interface AccountDataApi {\r\n    delete(eventType: string): Promise<void>;\r\n    get(eventType: string): Watchable<unknown>;\r\n    set(eventType: string, content: unknown): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface Api extends DialogApiExtension, AccountAuthApiExtension, ProfileApiExtension {\r\n    // @alpha\r\n    readonly builtins: BuiltinsApi;\r\n    readonly client: ClientApi;\r\n    // @alpha\r\n    readonly composer: ComposerApi;\r\n    readonly config: ConfigApi;\r\n    createRoot(element: Element): Root;\r\n    // @alpha\r\n    readonly customComponents: CustomComponentsApi;\r\n    // @alpha\r\n    readonly customisations: CustomisationsApi;\r\n    // @alpha\r\n    readonly extras: ExtrasApi;\r\n    readonly i18n: I18nApi;\r\n    readonly navigation: NavigationApi;\r\n    readonly rootNode: HTMLElement;\r\n    // @alpha\r\n    readonly settings: SettingsApi;\r\n    // @alpha\r\n    readonly storageHelper: StorageHelperApi;\r\n    readonly stores: StoresApi;\r\n    // @alpha\r\n    readonly urlPreviews: UrlPreviewApi;\r\n    // @alpha\r\n    readonly widget: WidgetApi;\r\n    // @alpha\r\n    readonly widgetLifecycle: WidgetLifecycleApi;\r\n    // @alpha\r\n    readonly x509?: X509Api;\r\n}\r\n\r\n// @alpha\r\nexport interface BuiltinsApi {\r\n    renderNotificationDecoration(roomId: string): React.ReactNode;\r\n    renderRoomAvatar(roomId: string, size?: string): React.ReactNode;\r\n    renderRoomView(roomId: string, props?: RoomViewProps): React.ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type CapabilitiesApprover = (widget: WidgetDescriptor, requestedCapabilities: Set<string>) => MaybePromise<Set<string> | undefined>;\r\n\r\n// @alpha\r\nexport interface CertificateInfo {\r\n    // (undocumented)\r\n    issuer: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n    // (undocumented)\r\n    subject: string;\r\n    // (undocumented)\r\n    subjectAltName?: string;\r\n    // (undocumented)\r\n    validFrom: Date;\r\n    // (undocumented)\r\n    validTo: Date;\r\n}\r\n\r\n// @public\r\nexport interface ClientApi {\r\n    accountData: AccountDataApi;\r\n    // @alpha\r\n    readonly creationManagement: ClientCreationManagementApi;\r\n    getRoom: (id: string) => Room | null;\r\n}\r\n\r\n// @public\r\nexport interface ClientCreationManagementApi {\r\n    // @deprecated\r\n    setUserVerificationCaCertsPem(pem: string | null): void;\r\n    setX509ClientInitOpts(opts: X509ClientInitOpts): void;\r\n}\r\n\r\n// @alpha\r\nexport interface ComposerApi {\r\n    addFileUploadOption(option: ComposerApiFileUploadOption): void;\r\n    insertPlaintextIntoComposer(plaintext: string, view: ComposerApiTarget): void;\r\n    openFileUploadConfirmation(files: File[], view: ComposerApiTarget): void;\r\n}\r\n\r\n// @alpha\r\nexport type ComposerApiFileUploadOption = {\r\n    type: string;\r\n    label: string;\r\n    icon?: ComponentType<SVGAttributes<SVGElement>>;\r\n    onSelected: (roomId?: string, view?: ComposerApiTarget, relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    }) => Promise<void> | void;\r\n};\r\n\r\n// @alpha\r\nexport type ComposerApiTarget = {\r\n    view: \"room\";\r\n} | {\r\n    view: \"thread\";\r\n};\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"WebConfigJson\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @public\r\nexport interface Config extends WebConfigJson {\r\n    // (undocumented)\r\n    brand: string;\r\n}\r\n\r\n// @public\r\nexport interface ConfigApi {\r\n    // (undocumented)\r\n    get(): Config;\r\n    // (undocumented)\r\n    get<K extends keyof Config>(key: K): Config[K];\r\n    // (undocumented)\r\n    get<K extends keyof Config = never>(key?: K): Config | Config[K];\r\n}\r\n\r\n// @alpha\r\nexport type Container = \"top\" | \"right\" | \"center\";\r\n\r\n// @alpha\r\nexport interface CustomComponentsApi {\r\n    registerComposerPreview(filterFn: (composerText: string, roomId: string) => boolean, renderer: CustomComposerPreviewRenderFunction): void;\r\n    registerLoginComponent(renderer: CustomLoginRenderFunction): void;\r\n    registerMessageRenderer(eventTypeOrFilter: string | ((mxEvent: MatrixEvent) => boolean), renderer: CustomMessageRenderFunction, hints?: CustomMessageRenderHints): void;\r\n    registerRoomPreviewBar(renderer: CustomRoomPreviewBarRenderFunction): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewComponentProps = {\r\n    text: string;\r\n    roomId: string;\r\n    target?: ComposerApiTarget;\r\n    relation?: {\r\n        inReplyToEventId?: string;\r\n        relType?: string;\r\n    };\r\n};\r\n\r\n// @alpha\r\nexport type CustomComposerPreviewRenderFunction = ExtendablePropsRenderFunction<CustomComposerPreviewComponentProps>;\r\n\r\n// @alpha\r\nexport interface CustomisationsApi {\r\n    registerShouldShowComponent(fn: (this: void, component: UIComponent) => boolean | void): void;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginComponentProps = {\r\n    serverConfig: CustomLoginComponentPropsServerConfig;\r\n    fragmentAfterLogin?: string;\r\n    children?: ReactNode;\r\n    onLoggedIn(this: void, data: AccountAuthInfo): void;\r\n    onServerConfigChange(this: void, config: CustomLoginComponentPropsServerConfig): void;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomLoginComponentPropsServerConfig {\r\n    hsName: string;\r\n    hsUrl: string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomLoginRenderFunction = ExtendablePropsRenderFunction<CustomLoginComponentProps>;\r\n\r\n// @alpha\r\nexport type CustomMessageComponentProps = {\r\n    mxEvent: MatrixEvent;\r\n};\r\n\r\n// @alpha\r\nexport interface CustomMessageGrouping {\r\n    getKey?: (mxEvent: MatrixEvent) => string;\r\n    getSummary: (events: readonly MatrixEvent[]) => string;\r\n}\r\n\r\n// @alpha\r\nexport type CustomMessageRenderFunction = (\r\nprops: CustomMessageComponentProps,\r\noriginalComponent?: (props?: OriginalMessageComponentProps) => React.JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport type CustomMessageRenderHints = {\r\n    allowEditingEvent?: boolean;\r\n    allowDownloadingMedia?: (mxEvent: MatrixEvent) => Promise<boolean>;\r\n    renderAsInfoMessage?: boolean;\r\n    renderSenderProfile?: boolean;\r\n    renderGroupSummary?: CustomMessageGrouping;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarComponentProps = {\r\n    roomId?: string;\r\n    roomAlias?: string;\r\n};\r\n\r\n// @alpha\r\nexport type CustomRoomPreviewBarRenderFunction = (\r\nprops: CustomRoomPreviewBarComponentProps,\r\noriginalComponent: (props: CustomRoomPreviewBarComponentProps) => JSX.Element) => JSX.Element;\r\n\r\n// @public\r\nexport interface DialogApiExtension {\r\n    openDialog<M, P extends object>(initialOptions: DialogOptions, dialog: ComponentType<P & DialogProps<M>>, props: P): DialogHandle<M>;\r\n}\r\n\r\n// @public\r\nexport type DialogHandle<M> = {\r\n    finished: Promise<{\r\n        ok: boolean;\r\n        model: M | null;\r\n    }>;\r\n    close(this: void): void;\r\n};\r\n\r\n// @public\r\nexport interface DialogOptions {\r\n    ariaLabel?: string;\r\n    title?: string;\r\n}\r\n\r\n// @public\r\nexport type DialogProps<M> = {\r\n    onSubmit(this: void, model: M): void;\r\n    onCancel(this: void): void;\r\n};\r\n\r\n// @alpha\r\nexport type ExtendablePropsRenderFunction<BaseProps> = <P extends BaseProps>(\r\nprops: P,\r\noriginalComponent: (props: P) => JSX.Element) => JSX.Element;\r\n\r\n// @alpha\r\nexport interface ExtrasApi {\r\n    addRoomHeaderButtonCallback(cb: RoomHeaderButtonsCallback): void;\r\n    getVisibleRoomBySpaceKey(spaceKey: string, cb: () => string[]): void;\r\n    setSpacePanelItem(spaceKey: string, props: SpacePanelItemProps): void;\r\n}\r\n\r\n// @alpha\r\nexport interface HardwareKey {\r\n    // (undocumented)\r\n    label: string;\r\n    // (undocumented)\r\n    manufacturerID: string;\r\n    // (undocumented)\r\n    maxPinLength: number;\r\n    // (undocumented)\r\n    minPinLength: number;\r\n    // (undocumented)\r\n    model: string;\r\n    // (undocumented)\r\n    serialNumber: string;\r\n}\r\n\r\n// @alpha\r\nexport type HardwareKeyState = \"absent\" | \"noSigningKey\" | \"open\" | \"authenticated\";\r\n\r\n// @public\r\nexport interface I18nApi {\r\n    humanizeTime(this: void, timeMillis: number): string;\r\n    get language(): string;\r\n    register(this: void, translations: Partial<Translations>): void;\r\n    translate(this: void, key: keyof Translations, variables?: StringVariables): string;\r\n    translate(this: void, key: keyof Translations, variables: Variables | undefined, tags: Tags): ReactNode;\r\n}\r\n\r\n// @alpha\r\nexport type IdentityApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @alpha\r\nexport type LocationRenderFunction = () => JSX.Element;\r\n\r\n// @alpha\r\nexport interface MatrixEvent {\r\n    content: Record<string, unknown>;\r\n    eventId: string;\r\n    originServerTs: number;\r\n    roomId: string;\r\n    sender: string;\r\n    stateKey?: string;\r\n    type: string;\r\n    unsigned: Record<string, unknown>;\r\n}\r\n\r\n// @public\r\nexport type MaybePromise<T> = T | PromiseLike<T>;\r\n\r\n// @public\r\nexport interface Module {\r\n    // (undocumented)\r\n    load(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface ModuleFactory {\r\n    // (undocumented)\r\n    new (api: Api): Module;\r\n    // (undocumented)\r\n    readonly moduleApiVersion: string;\r\n    // (undocumented)\r\n    readonly prototype: Module;\r\n}\r\n\r\n// @public\r\nexport class ModuleIncompatibleError extends Error {\r\n    constructor(pluginVersion: string);\r\n}\r\n\r\n// @public\r\nexport class ModuleLoader {\r\n    constructor(api: Api);\r\n    // Warning: (ae-forgotten-export) The symbol \"ModuleExport\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    load(moduleExport: ModuleExport): Promise<void>;\r\n    // (undocumented)\r\n    start(): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface NavigationApi {\r\n    openRoom(roomIdOrAlias: string, opts?: OpenRoomOptions): void;\r\n    // @alpha\r\n    registerLocationRenderer(path: string, renderer: LocationRenderFunction): void;\r\n    toMatrixToLink(link: string, join?: boolean): Promise<void>;\r\n}\r\n\r\n// @public\r\nexport interface OpenRoomOptions {\r\n    autoJoin?: boolean;\r\n    viaServers?: string[];\r\n}\r\n\r\n// @alpha\r\nexport type OriginalMessageComponentProps = {\r\n    showUrlPreview?: boolean;\r\n};\r\n\r\n// @alpha\r\nexport type PreloadApprover = (widget: WidgetDescriptor) => MaybePromise<boolean | undefined>;\r\n\r\n// @public\r\nexport interface Profile {\r\n    displayName?: string;\r\n    isGuest?: boolean;\r\n    userId?: string;\r\n}\r\n\r\n// @public\r\nexport interface ProfileApiExtension {\r\n    readonly profile: Watchable<Profile>;\r\n}\r\n\r\n// @public\r\nexport interface RichVariables {\r\n    // (undocumented)\r\n    [key: string]: SubstitutionValue;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport interface Room {\r\n    getLastActiveTimestamp: () => number;\r\n    id: string;\r\n    name: Watchable<string>;\r\n}\r\n\r\n// @alpha\r\nexport type RoomHeaderButtonsCallback = (roomId: string) => JSX.Element | undefined;\r\n\r\n// @public\r\nexport interface RoomListStoreApi {\r\n    getRooms(): Watchable<Room[]>;\r\n    waitForReady(): Promise<void>;\r\n}\r\n\r\n// @alpha\r\nexport interface RoomViewProps {\r\n    enableReadReceiptsAndMarkersOnActivity?: boolean;\r\n    hideComposer?: boolean;\r\n    hideHeader?: boolean;\r\n    hidePinnedMessageBanner?: boolean;\r\n    hideRightPanel?: boolean;\r\n    hideWidgets?: boolean;\r\n}\r\n\r\n// @alpha\r\nexport interface SettingsApi {\r\n    getValue<T = any>(settingName: string, roomId?: string | null, excludeDefault?: boolean): T | undefined;\r\n}\r\n\r\n// @alpha\r\nexport interface SpacePanelItemProps {\r\n    className?: string;\r\n    icon?: JSX.Element;\r\n    label: string;\r\n    onSelected: () => void;\r\n    style?: React.CSSProperties;\r\n    tooltip?: string;\r\n}\r\n\r\n// @alpha\r\nexport interface StorageHelperApi {\r\n    getPickleKey(userId: string, deviceId: string): Promise<string | null>;\r\n}\r\n\r\n// @public\r\nexport interface StoresApi {\r\n    roomListStore: RoomListStoreApi;\r\n}\r\n\r\n// @public\r\nexport interface StringVariables {\r\n    // (undocumented)\r\n    [key: string]: number | string | null | undefined;\r\n    // (undocumented)\r\n    count?: number;\r\n}\r\n\r\n// @public\r\nexport type SubstitutionValue = number | string | ReactNode | ((sub: string) => ReactNode);\r\n\r\n// @public\r\nexport type Tags = Record<string, SubstitutionValue>;\r\n\r\n// @public\r\nexport type Translations = Record<string, {\r\n    [ietfLanguageTag: string]: string;\r\n}>;\r\n\r\n// @alpha\r\nexport const enum UIComponent {\r\n    AddIntegrations = \"UIComponent.addIntegrations\",\r\n    CreateRooms = \"UIComponent.roomCreation\",\r\n    CreateSpaces = \"UIComponent.spaceCreation\",\r\n    ExploreRooms = \"UIComponent.exploreRooms\",\r\n    FilterContainer = \"UIComponent.filterContainer\",\r\n    InviteUsers = \"UIComponent.sendInvites\",\r\n    RoomOptionsMenu = \"UIComponent.roomOptionsMenu\"\r\n}\r\n\r\n// @alpha\r\nexport interface UrlPreviewApi {\r\n    registerPreviewHandler(regex: RegExp, handler: UrlPreviewHandler): void;\r\n}\r\n\r\n// Warning: (ae-forgotten-export) The symbol \"UrlPreview\" needs to be exported by the entry point index.d.ts\r\n//\r\n// @alpha\r\nexport type UrlPreviewHandler = (url: string, mxEvent?: MatrixEvent) => Promise<UrlPreview | null>;\r\n\r\n// @alpha\r\nexport interface UserCertificate {\r\n    // (undocumented)\r\n    certificate: CertificateInfo;\r\n    chain: string;\r\n}\r\n\r\n// @public\r\nexport function useWatchable<T>(watchable: Watchable<T>): T;\r\n\r\n// @public\r\nexport type Variables = StringVariables | RichVariables;\r\n\r\n// @public\r\nexport class Watchable<T> {\r\n    constructor(currentValue: T);\r\n    // Warning: (ae-forgotten-export) The symbol \"WatchFn\" needs to be exported by the entry point index.d.ts\r\n    //\r\n    // (undocumented)\r\n    protected readonly listeners: Set<WatchFn<T>>;\r\n    protected onFirstWatch(): void;\r\n    protected onLastWatch(): void;\r\n    // (undocumented)\r\n    unwatch(listener: (value: T) => void): void;\r\n    get value(): T;\r\n    set value(value: T);\r\n    // (undocumented)\r\n    watch(listener: (value: T) => void): void;\r\n}\r\n\r\n// @alpha\r\nexport interface WidgetApi {\r\n    getAppAvatarUrl(app: IWidget, width?: number, height?: number, resizeMethod?: string): string | null;\r\n    getWidgetsInRoom(roomId: string): IWidget[];\r\n    isAppInContainer(app: IWidget, container: Container, roomId: string): boolean;\r\n    moveAppToContainer(app: IWidget, container: Container, roomId: string): void;\r\n}\r\n\r\n// @alpha\r\nexport type WidgetDescriptor = {\r\n    id: string;\r\n    templateUrl: string;\r\n    creatorUserId: string;\r\n    type: string;\r\n    origin: string;\r\n    roomId?: string;\r\n};\r\n\r\n// @alpha\r\nexport interface WidgetLifecycleApi {\r\n    registerCapabilitiesApprover(approver: CapabilitiesApprover): void;\r\n    registerIdentityApprover(approver: IdentityApprover): void;\r\n    registerPreloadApprover(approver: PreloadApprover): void;\r\n}\r\n\r\n// @alpha\r\nexport interface X509Api {\r\n    getKeyState(serialNumber: string): Promise<X509Result<HardwareKeyState>>;\r\n    getUserCertificate(): Promise<X509Result<UserCertificate>>;\r\n    listHardwareKeys(): Promise<X509Result<HardwareKey[]>>;\r\n    logIntoKey(serialNumber: string, pin: string): Promise<X509LoginResult>;\r\n    signData(serialNumber: string, data: Uint8Array): Promise<X509Result<Uint8Array>>;\r\n}\r\n\r\n// @public\r\nexport interface X509ClientInitOpts {\r\n    signer?: (item: Uint8Array) => Promise<{\r\n        signature_bytes: Uint8Array;\r\n        certificate_chain: string;\r\n        signature_scheme: \"RsaPssSha512\";\r\n    }>;\r\n    userVerificationCaCertsPem?: string;\r\n    validity?: () => number;\r\n}\r\n\r\n// @alpha\r\nexport interface X509IpcError {\r\n    // (undocumented)\r\n    code: X509IpcErrorCode;\r\n    // (undocumented)\r\n    message?: string;\r\n    pkcs11Code?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509IpcErrorCode =\r\n/**\r\n* No PKCS#11 library is configured or it could not be loaded.\r\n*/\r\n| \"MODULE_NOT_LOADED\"\r\n| \"KEY_NOT_FOUND\"\r\n| \"CERTIFICATE_NOT_FOUND\"\r\n| \"PRIVATE_KEY_NOT_FOUND\"\r\n/**\r\n* `signData` was called before `logIntoKey`, or the session was invalidated since.\r\n*/\r\n| \"LOGIN_REQUIRED\"\r\n/**\r\n* An upstream error from the PKCS#11 library. Carries a `CKR_*` code.\r\n*/\r\n| \"UPSTREAM_PKCS11\"\r\n| \"UNKNOWN\";\r\n\r\n// @alpha\r\nexport interface X509LoginError extends X509IpcError {\r\n    triesRemaining?: number;\r\n}\r\n\r\n// @alpha\r\nexport type X509LoginResult = X509Result<void, X509LoginError>;\r\n\r\n// @alpha\r\nexport type X509Result<T, E extends X509IpcError = X509IpcError> = { ok: true; data: T } | { ok: false; error: E };\r\n\r\n// (No @packageDocumentation comment for this package)\r\n\r\n```\n\n<!-- File: packages/module-api/package.json (Tokens: ~571 | Category: anthropic-skill) -->\n{\n    \"name\": \"@element-hq/element-web-module-api\",\n    \"type\": \"module\",\n    \"version\": \"2.2.0\",\n    \"description\": \"Module API surface for element-web\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/element-hq/element-web.git\",\n        \"directory\": \"packages/module-api\"\n    },\n    \"author\": \"element-hq\",\n    \"license\": \"SEE LICENSE IN README.md\",\n    \"engines\": {\n        \"node\": \">=20.0.0\"\n    },\n    \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n    \"exports\": {\n        \".\": {\n            \"types\": \"./lib/element-web-module-api-alpha.d.ts\",\n            \"import\": \"./lib/element-web-plugin-engine.js\",\n            \"require\": \"./lib/element-web-plugin-engine.umd.cjs\"\n        },\n        \"./vite.base.ts\": {\n            \"types\": \"./vite.base.ts\",\n            \"import\": \"./vite.base.ts\"\n        }\n    },\n    \"files\": [\n        \"lib\",\n        \"vite.base.ts\"\n    ],\n    \"scripts\": {\n        \"prepack\": \"nx build\",\n        \"lint:types\": \"nx lint:types\",\n        \"test:unit\": \"vitest\",\n        \"coverage\": \"pnpm test:unit --coverage\",\n        \"coverage:diff\": \"diff-cover --config-file ../../diff-cover.toml coverage/lcov.info\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.49.1\",\n        \"@types/node\": \"catalog:ts6\",\n        \"@types/react\": \"catalog:\",\n        \"@types/react-dom\": \"catalog:\",\n        \"@types/semver\": \"^7.5.8\",\n        \"@typescript/native\": \"catalog:\",\n        \"matrix-widget-api\": \"^1.17.0\",\n        \"rollup-plugin-external-globals\": \"^0.13.0\",\n        \"semver\": \"^7.6.3\",\n        \"shared-types\": \"workspace:*\",\n        \"typescript\": \"catalog:ts6\",\n        \"unplugin-dts\": \"catalog:\",\n        \"vite\": \"catalog:\",\n        \"vitest\": \"catalog:\"\n    },\n    \"peerDependencies\": {\n        \"@types/react\": \"*\",\n        \"@types/react-dom\": \"*\",\n        \"matrix-web-i18n\": \"*\",\n        \"matrix-widget-api\": \"*\",\n        \"react\": \"^19\"\n    },\n    \"peerDependenciesMeta\": {\n        \"matrix-widget-api\": {\n            \"optional\": true\n        },\n        \"matrix-web-i18n\": {\n            \"optional\": true\n        }\n    }\n}\n\n<!-- File: packages/module-api/project.json (Tokens: ~180 | Category: anthropic-skill) -->\n{\n    \"$schema\": \"../../node_modules/nx/schemas/project-schema.json\",\n    \"projectType\": \"library\",\n    \"root\": \"packages/module-api\",\n    \"targets\": {\n        \"build\": {\n            \"cache\": true,\n            \"inputs\": [\"src\"],\n            \"outputs\": [\"{projectRoot}/lib\"],\n            \"command\": \"vite build\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        },\n        \"start\": {\n            \"command\": \"vite build --watch\",\n            \"options\": { \"cwd\": \"packages/module-api\" },\n            \"dependsOn\": [\"^start\"],\n            \"continuous\": true\n        },\n        \"lint:types\": {\n            \"command\": \"pnpm exec tsc --noEmit\",\n            \"options\": { \"cwd\": \"packages/module-api\" }\n        }\n    }\n}\n\n<!-- File: packages/module-api/tsconfig.json (Tokens: ~141 | Category: anthropic-skill) -->\n{\n    \"$schema\": \"http://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"rootDir\": \"./src\",\n        \"target\": \"esnext\",\n        \"lib\": [\"dom\", \"es2022\", \"esnext\"],\n        \"esModuleInterop\": true,\n        \"strict\": true,\n        \"declaration\": true,\n        \"module\": \"es2022\",\n        \"moduleResolution\": \"bundler\",\n        \"types\": [],\n        \"noEmit\": true,\n        \"jsx\": \"react-jsx\",\n        \"declarationMap\": true,\n        \"allowImportingTsExtensions\": true\n    },\n    \"include\": [\"src\"]\n}\n\n<!-- File: packages/playwright-common/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Playwright-common Skill\n\nPath: `packages/playwright-common/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/package.json)\n\n<!-- File: packages/playwright-common/project.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Playwright-common Skill\n\nPath: `packages/playwright-common/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/project.json)\n\n<!-- File: packages/playwright-common/tsconfig.build.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.build.json)\n\n<!-- File: packages/playwright-common/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Playwright-common Skill\n\nPath: `packages/playwright-common/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/playwright-common/tsconfig.json)\n\n<!-- File: packages/RELEASING.md (Tokens: ~116 | Category: anthropic-skill) -->\n# Release process for packages in element-web/packages\n\n1. Update `package.json` with the new version. One way to do this is\n   `pnpm version --no-git-tag-version <major|minor|patch>`. Or just do it manually.\n\n2. Commit to a release prep branch, and open a PR.\n\n3. Once the PR has merged to `develop`, run the\n   [npm-publish](https://github.com/element-hq/element-web/actions/workflows/npm-publish.yaml)\n   Github Actions workflow, specifying the package to be released.\n\n<!-- File: packages/shared-components/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Shared-components Skill\n\nPath: `packages/shared-components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/package.json)\n\n<!-- File: packages/shared-components/project.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Shared-components Skill\n\nPath: `packages/shared-components/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/project.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/cs.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cs.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cs.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/cy.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/cy.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/cy.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/da.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/da.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/da.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/de_DE.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/de_DE.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/de_DE.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/el.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/el.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/el.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/en_EN.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/en_EN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/en_EN.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/eo.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/eo.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/eo.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/es.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/es.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/es.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/et.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/et.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/et.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/fa.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fa.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fa.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/fi.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fi.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fi.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/fr.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/fr.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/fr.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/gl.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/gl.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/gl.json)\n\n<!-- File: packages/shared-components/src/i18n/strings/he.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Strings Skill\n\nPath: `packages/shared-components/src/i18n/strings/he.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/element-hq/element-web/HEAD/packages/shared-components/src/i18n/strings/he.json)\n\n<!-- ... +41 more modular skills available via /api/skills/element-hq/element-web?path={path} -->\n</yakaai_skills>"}