Local-first agent development environment for solo developers coordinating CLI agents across worktrees and devices
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport http counts 14 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
comment_resolve
-
comment_resolve_batch
-
create_worker_session
-
delete_artifact
-
edit_artifact
-
get_artifact
-
get_artifact_authoring_guide
-
get_worker_status
-
list_artifacts
-
list_worker_events
-
open_diff_for_commits
-
publish_artifact
-
send_worker_prompt
-
stop_worker_session
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 474cd17 · analyzer v33 · 6d ago
skills & prompt files 1
- agent-rules mheraskin-soloe-ide-474cd17/AGENTS.md
danger signals1
- suspicious endpoint 172.99.0.1 mheraskin-soloe-ide-474cd17/electron/integrations/HookInstaller.test.ts :1296
drifted.mcpServers['soloe-ide'].url = 'http://172.99.0.1:17896/mcp';
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 729
filesystem 137
- fs (weak) mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeEndpoint.test.ts :2
import { mkdtemp, rm, stat, writeFile } from "node:fs/promises"; - fs (weak) mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeHost.test.ts :6
import { mkdtemp, rm } from 'node:fs/promises'; - fs mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeSocket.ts :1
import { chmod, rm } from "node:fs/promises"; - fs (weak) mheraskin-soloe-ide-474cd17/apps/runtime/src/ServiceRendezvous.test.ts :1
import { mkdtemp, readFile, rm } from "node:fs/promises"; - fs mheraskin-soloe-ide-474cd17/apps/runtime/src/ServiceRendezvous.ts :1
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises"; - fs mheraskin-soloe-ide-474cd17/apps/runtime/src/main.ts :3
import { mkdir } from "node:fs/promises"; - fs (weak) mheraskin-soloe-ide-474cd17/apps/server/src/DeviceIdentityStore.test.ts :1
import { chmod, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; - fs mheraskin-soloe-ide-474cd17/apps/server/src/DeviceIdentityStore.ts :9
} from 'node:fs/promises'; - fs mheraskin-soloe-ide-474cd17/apps/server/src/LocalDeviceMaintenance.ts :3
import { promises as fs } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/apps/server/src/ServerHost.ts :3
import { readFile } from "node:fs/promises"; - fs (weak) mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeDomain.test.ts :10
} from "node:fs/promises"; - fs (weak) mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeServer.test.ts :12
} from 'node:fs/promises';
show 28 more
- fs mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeServer.ts :4
import { readFile } from "node:fs/promises"; - fs (weak) mheraskin-soloe-ide-474cd17/apps/web/scripts/host.mjs :1
import { access, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises"; - fs (weak) mheraskin-soloe-ide-474cd17/electron/agents/AgentHookDispatcher.test.ts :1
import { mkdtempSync, rmSync } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/agents/AgentObserverStore.test.ts :1
import { mkdtempSync, rmSync } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/agents/AgentObserverStore.ts :1
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/agents/AutoRenameService.test.ts :3
import { promises as fs } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/agents/BackgroundAgentExecution.ts :2
import { constants as fsConstants, promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/agents/CodexShellSnapshotWatcher.test.ts :1
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/agents/CodexShellSnapshotWatcher.ts :1
import { watch, type FSWatcher } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/artifacts/ArtifactMcpTools.test.ts :2
import { promises as fs } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/artifacts/ArtifactMcpTools.ts :1
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/artifacts/ArtifactsMcpIntegration.test.ts :2
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/browser/BrowserSessionStore.test.ts :1
import { mkdtemp, readFile } from 'node:fs/promises'; - fs mheraskin-soloe-ide-474cd17/electron/browser/BrowserSessionStore.ts :1
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/connections/ConnectionRegistry.test.ts :2
import { promises as fs } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/connections/ConnectionRegistry.ts :4
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/connections/DeviceDnsSetup.test.ts :2
import { mkdtemp, mkdir, writeFile, rm } from 'node:fs/promises'; - fs mheraskin-soloe-ide-474cd17/electron/connections/DeviceDnsSetup.ts :3
import { existsSync, promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/connections/DeviceMaintenance.test.ts :2
import { promises as fs } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/connections/device-maintenance-script.ts :4
const fs = require('node:fs'); - fs (weak) mheraskin-soloe-ide-474cd17/electron/desktop-platform.test.ts :2
import { readFileSync } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/devices/DeviceSoftware.ts :3
import { promises as fs } from 'node:fs'; - fs mheraskin-soloe-ide-474cd17/electron/devices/LocalDeviceIdentity.ts :3
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/diagnostics/DiagnosticsService.test.ts :2
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/features/FeatureService.test.ts :1
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/files/WorktreeFileIndex.test.ts :2
import { promises as fs } from 'node:fs'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/git/GitClone.test.ts :1
import { mkdtemp, rm } from 'node:fs/promises'; - fs (weak) mheraskin-soloe-ide-474cd17/electron/git/GitService.test.ts :2
import { promises as fs } from 'node:fs';
97 more not shown — this panel samples each group; the count above is the real total.
shell / exec 60
- shell mheraskin-soloe-ide-474cd17/apps/runtime/src/NodePtyRuntimeProcessFactory.ts :35
spawn(options: Parameters<RuntimeProcessFactory['spawn']>[0]): RuntimeProcess { - shell mheraskin-soloe-ide-474cd17/apps/runtime/src/ProcessTreeUsageSampler.ts :1
import { spawn } from "node:child_process"; - shell (weak) mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeEsmStartup.test.ts :1
import { execFileSync } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeProcess.ts :18
spawn(options: { - shell mheraskin-soloe-ide-474cd17/apps/server/src/LocalDeviceMaintenance.ts :1
import { spawn } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeDomain.test.ts :11
import { spawnSync } from "node:child_process"; - shell mheraskin-soloe-ide-474cd17/electron/agents/AgentCliDiscovery.ts :1
import { spawn } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/agents/AutoRenameService.test.ts :10
import type { spawn } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/agents/AutoRenameService.ts :1
import { spawn } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/agents/BackgroundAgentExecution.test.ts :3
import type { spawn } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/agents/BackgroundAgentExecution.ts :1
import { spawn, spawnSync, type ChildProcess } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/agents/CursorWorkerAdapter.test.ts :4
import type { ChildProcessWithoutNullStreams } from 'node:child_process';
show 28 more
- shell mheraskin-soloe-ide-474cd17/electron/agents/CursorWorkerAdapter.ts :1
import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/agents/ModelCatalogService.ts :1
import { spawn } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/connections/DeviceDnsSetup.ts :2
import { execFile } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/connections/DeviceMaintenance.test.ts :1
import { execFile, spawn } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/connections/DeviceMaintenance.ts :1
import { spawn } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/connections/device-maintenance-script.ts :6
const { execFileSync } = require('node:child_process'); - shell mheraskin-soloe-ide-474cd17/electron/devices/DeviceSoftware.ts :1
import { execFile } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/diagnostics/WslUsageSampler.ts :1
import { spawn } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/git/GitCommandRunner.test.ts :3
import { spawn as spawnProcess } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/git/GitService.test.ts :6
import { spawnSync } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/git/WorkingTreeLaunch.test.ts :3
import { execFileSync } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/ipc/system.ipc.ts :2
import { spawn } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/overview/GitEvidenceAdapter.test.ts :7
import { execFile, spawn as spawnProcess } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/overview/WorktreeOverviewService.ts :1
import type { spawn } from "node:child_process"; - shell (weak) mheraskin-soloe-ide-474cd17/electron/projects/ProjectStore.test.ts :3
import { spawnSync } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/sessions/NativeSessionArchive.test.ts :7
import { execFile } from 'node:child_process'; - shell (weak) mheraskin-soloe-ide-474cd17/electron/sessions/SessionCommandBuilder.test.ts :2
import { execFileSync } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/terminal/NodePtyProcessFactory.ts :7
spawn(options: PtyProcessSpawnOptions): PtyProcess { - shell mheraskin-soloe-ide-474cd17/electron/terminal/PtyProcess.ts :50
spawn(options: PtyProcessSpawnOptions): Promise<PtyProcess> | PtyProcess; - shell mheraskin-soloe-ide-474cd17/electron/terminal/RemoteRuntimePtyProcessFactory.ts :142
async spawn(options: PtyProcessSpawnOptions): Promise<PtyProcess> { - shell (weak) mheraskin-soloe-ide-474cd17/electron/terminal/RustPtyProcessFactory.test.ts :3
import type { ChildProcessWithoutNullStreams } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/electron/terminal/RustPtyProcessFactory.ts :6
} from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/packages/domain/src/files/FileService.ts :2
import { spawn } from "node:child_process"; - shell mheraskin-soloe-ide-474cd17/packages/domain/src/git/GitCommandRunner.ts :1
import { spawn, type SpawnOptions } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/packages/domain/src/integrations/WslHostDetector.ts :1
import { spawn } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/packages/domain/src/network/TailscaleServeManager.ts :1
import { execFile } from "node:child_process"; - shell mheraskin-soloe-ide-474cd17/packages/domain/src/overview/GitEvidenceAdapter.ts :1
import { spawn } from 'node:child_process'; - shell mheraskin-soloe-ide-474cd17/packages/domain/src/overview/WorktreeFactsCollector.ts :1
import type { spawn } from 'node:child_process';
20 more not shown — this panel samples each group; the count above is the real total.
network 28
- net mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeClient.ts :2
import { connect, type Socket } from 'node:net'; - net (weak) mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeHost.test.ts :3
import type { Socket } from 'node:net'; - net mheraskin-soloe-ide-474cd17/apps/runtime/src/RuntimeHost.ts :2
import { createServer, type Server, type Socket } from 'node:net'; - net mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeDomain.ts :1891
return this.git.fetch(request.cwd, request.remote, request); - net (weak) mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeServer.test.ts :93
expect((await fetch(url)).status).toBe(401); - net mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeServer.ts :2
import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http"; - net (weak) mheraskin-soloe-ide-474cd17/apps/web/browser-host.test.ts :1
import type { IncomingMessage, ServerResponse } from "node:http"; - net mheraskin-soloe-ide-474cd17/build/sw.js :31
fetch(request) - net (weak) mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.test.ts :227
const response = await fetch(`${info.url}${path}`, { - net mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :1
import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http'; - net (weak) mheraskin-soloe-ide-474cd17/electron/connections/DeviceMaintenance.test.ts :3
import { createServer, type Server } from 'node:http'; - net mheraskin-soloe-ide-474cd17/electron/connections/device-maintenance-script.ts :29
const response = await fetch(new URL('/api/device/describe', info.address), {
show 16 more
- net mheraskin-soloe-ide-474cd17/electron/ipc/git.ipc.ts :319
this.opts.service.fetch(request.cwd, request.remote, { - net mheraskin-soloe-ide-474cd17/electron/main.ts :218
localDeviceServerEndpoint, (input, init) => net.fetch(String(input), init), - net mheraskin-soloe-ide-474cd17/packages/domain/src/git/GitService.ts :1054
async fetch( - net mheraskin-soloe-ide-474cd17/packages/domain/src/integrations/HookInstaller.ts :1163
await fetch(\`${'${baseUrl}'}/hook/opencode\`, { - net (weak) mheraskin-soloe-ide-474cd17/packages/domain/src/network/BrowserRouteProxy.test.ts :1
import { createServer, request as requestHttp } from "node:http"; - net mheraskin-soloe-ide-474cd17/packages/domain/src/network/BrowserRouteProxy.ts :7
} from "node:http"; - net (weak) mheraskin-soloe-ide-474cd17/packages/domain/src/network/LocalhostBridgeManager.test.ts :1
import { createConnection, createServer, type Server } from "node:net"; - net mheraskin-soloe-ide-474cd17/packages/domain/src/network/LocalhostBridgeManager.ts :6
} from "node:net"; - net mheraskin-soloe-ide-474cd17/packages/domain/src/network/TailscaleServeManager.ts :2
import { createConnection } from "node:net"; - net (weak) mheraskin-soloe-ide-474cd17/packages/domain/src/system/TrayClipboardImageWriter.test.ts :2
import { createServer } from "node:net"; - net mheraskin-soloe-ide-474cd17/packages/domain/src/system/TrayClipboardImageWriter.ts :1
import { createConnection } from "node:net"; - net (weak) mheraskin-soloe-ide-474cd17/scripts/benchmark-electron.mjs :4
import net from 'node:net'; - net (weak) mheraskin-soloe-ide-474cd17/scripts/browser-integration.mjs :5
import net from 'node:net'; - net mheraskin-soloe-ide-474cd17/shared/types/ipc.ts :739
fetch(request: GitRemoteOpRequest): Promise<IpcResult<GitRemoteOpResult>>; - net mheraskin-soloe-ide-474cd17/src/lib/ghostty/runtime.ts :45
const response = await fetch(ghosttyWasmUrl); - net mheraskin-soloe-ide-474cd17/src/lib/ipc.ts :699
unwrap(await c.git.fetch(toIpcPayload(request))),
secrets 6
- secrets mheraskin-soloe-ide-474cd17/apps/server/src/ServerHost.ts :48
process.env.SOLOE_IDE_SERVER_TOKEN ?? - secrets (weak) mheraskin-soloe-ide-474cd17/apps/web/vite.config.ts :77
token: process.env.SOLOE_IDE_SERVER_TOKEN, - secrets mheraskin-soloe-ide-474cd17/electron/main.ts :219
process.env.SOLOE_IDE_SERVER_TOKEN ? { token: process.env.SOLOE_IDE_SERVER_TOKEN } : {} - secrets (weak) mheraskin-soloe-ide-474cd17/electron/preload-remote.test.ts :32
const previousServerToken = process.env.SOLOE_IDE_SERVER_TOKEN; - secrets mheraskin-soloe-ide-474cd17/electron/preload-remote.ts :29
...(!tailscaleSession && process.env.SOLOE_IDE_SERVER_TOKEN - secrets mheraskin-soloe-ide-474cd17/packages/domain/src/integrations/HookInstaller.ts :1158
const token = process.env.SOLOE_IDE_BRIDGE_TOKEN;
tool registrations 14
- get_artifact_authoring_guide mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :88
- list_artifacts mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :107
- get_artifact mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :124
- publish_artifact mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :144
- edit_artifact mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :164
- delete_artifact mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :183
- create_worker_session mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :197
- send_worker_prompt mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :211
- get_worker_status mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :223
- list_worker_events mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :232
- stop_worker_session mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :244
- comment_resolve mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :253
show 2 more
- comment_resolve_batch mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :266
- open_diff_for_commits mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :279
install hooks 1
- postinstall mheraskin-soloe-ide-474cd17/package.json :61
electron-builder install-app-deps
declared dependencies 57
- @codemirror/commands@^6.10.3
- @codemirror/lang-html@^6.4.11
- @codemirror/language@^6.12.3
- @codemirror/language-data@^6.5.2
- @codemirror/search@^6.7.0
- @codemirror/state@^6.6.0
- @codemirror/view@^6.43.0
- @fontsource/cascadia-code@^5.2.3
- @fontsource/jetbrains-mono@^5.2.8
- @lezer/highlight@^1.2.3
- @pierre/trees@^1.0.0-beta.3
- @soloe-ide/domain@workspace:*
show 28 more
- @soloe-ide/protocol@workspace:*
- @soloe-ide/runtime@workspace:*
- @tauri-apps/api@^2.11.1
- codemirror@^6.0.2
- element-source@^0.0.5
- highlight.js@^11.11.1
- marked@^18.0.3
- node-pty@^1.0.0
- smol-toml@^1.6.1
- ws@^8.21.1
- @electron/rebuild@^4.0.4
- @fontsource-variable/inter@^5.2.8
- @internationalized/date@^3.12.1
- @lucide/svelte@^1.14.0
- @sveltejs/vite-plugin-svelte@^6.2.4
- @tailwindcss/vite@^4.2.4
- @tauri-apps/cli@^2.11.4
- @types/jsdom@^30.0.0
- @types/node@^25.6.0
- @types/ws@^8.18.1
- bits-ui@^2.18.1
- clsx@^2.1.1
- electron@^41.5.0
- electron-builder@^26.8.1
- electron-vite@^5.0.0
- jsdom@^29.1.1
- mode-watcher@^1.1.0
- shadcn-svelte@^1.2.7
17 more not shown — this panel samples each group; the count above is the real total.
clipboard 6
- clipboard shell call mheraskin-soloe-ide-474cd17/packages/domain/src/files/FileService.test.ts :258
throw new Error("wl-copy and xclip are unavailable"); - clipboard shell call mheraskin-soloe-ide-474cd17/packages/domain/src/system/SystemClipboardImageWriter.test.ts :41
expect(run).toHaveBeenCalledWith("wl-copy", ["--type", "image/png"], data); - clipboard shell call mheraskin-soloe-ide-474cd17/packages/domain/src/system/SystemClipboardImageWriter.ts :85
["wl-copy", ["--type", image.mimeType]], - clipboard shell call mheraskin-soloe-ide-474cd17/scripts/setup-linux-electron-sandbox.mjs :11
const clipboardReader = spawnSync('wl-paste', ['--version'], { stdio: 'ignore' }); - navigator.clipboard mheraskin-soloe-ide-474cd17/src/lib/clipboard-images.ts :37
clipboard: Pick<Clipboard, 'read'> | undefined = navigator.clipboard - clipboard shell call mheraskin-soloe-ide-474cd17/tests/linux-packaging.test.ts :13
expect(setup).toContain("spawnSync('wl-paste', ['--version']");
perm:untrusted 1
- untrusted (weak) mheraskin-soloe-ide-474cd17/apps/server/src/SoloeIdeServer.test.ts :94
expect(await (await fetch(url, { headers: authorizationHeaders() })).json()).toEqual({ pathMaps: [] });
transport_posture 1
- binds all interfaces (0.0.0.0) mheraskin-soloe-ide-474cd17/electron/agents/SoloeIdeMcpServer.ts :315
server.listen(this.opts.port ?? 0, this.opts.host ?? '0.0.0.0', () => {