diff --git a/apps/code/package.json b/apps/code/package.json index 8cc87ad3d3..356d351990 100644 --- a/apps/code/package.json +++ b/apps/code/package.json @@ -42,7 +42,6 @@ "author": "PostHog", "license": "MIT", "devDependencies": { - "@biomejs/biome": "2.2.4", "@electron-forge/cli": "^7.11.1", "@electron-forge/maker-deb": "^7.11.1", "@electron-forge/maker-dmg": "^7.11.1", @@ -60,15 +59,12 @@ "@storybook/addon-docs": "10.2.0", "@storybook/react-vite": "10.2.0", "@tanstack/devtools-vite": "^0.7.0", + "@tanstack/react-router": "catalog:", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/better-sqlite3": "^7.6.13", - "@types/canvas-confetti": "^1.9.0", "@types/node": "^24.0.0", "@types/react": "^19.1.0", "@types/react-dom": "^19.1.0", - "@types/semver": "^7.7.1", "@vitejs/plugin-react": "^4.2.1", "@vitest/ui": "^4.0.10", "adm-zip": "^0.5.16", @@ -77,10 +73,10 @@ "jimp": "^1.6.0", "jsdom": "^26.0.0", "lint-staged": "^15.5.2", - "memfs": "^4.56.10", "postcss": "^8.4.33", "storybook": "10.2.0", "tailwindcss": "^4.2.2", + "tar": "^7.5.0", "tsx": "^4.20.6", "typed-openapi": "^2.2.2", "typescript": "^5.9.3", @@ -92,9 +88,6 @@ "dependencies": { "@fontsource-variable/inter": "^5.2.8", "@inversifyjs/strongly-typed": "2.2.0", - "@json-render/core": "^0.19.0", - "@modelcontextprotocol/sdk": "^1.12.1", - "@opentelemetry/api-logs": "^0.208.0", "@opentelemetry/exporter-logs-otlp-http": "^0.208.0", "@opentelemetry/resources": "^2.5.0", "@opentelemetry/sdk-logs": "^0.208.0", @@ -134,7 +127,6 @@ "electron-store": "^11.0.0", "fflate": "^0.8.2", "file-icon": "^6.0.0", - "fzf": "^0.5.2", "ignore": "^7.0.5", "inversify": "^7.10.6", "is-glob": "^4.0.3", @@ -148,11 +140,7 @@ "react-dom": "19.1.0", "react-hotkeys-hook": "^4.4.4", "reflect-metadata": "^0.2.2", - "semver": "^7.6.0", - "shadcn": "^4.1.2", - "smol-toml": "^1.6.0", "tailwindcss-scroll-mask": "^0.0.3", - "tw-animate-css": "^1.4.0", "zod": "^4.1.12" } } diff --git a/apps/code/src/main/utils/__mocks__/logger.ts b/apps/code/src/main/utils/__mocks__/logger.ts index e6d62f2fa1..74f59e2cb1 100644 --- a/apps/code/src/main/utils/__mocks__/logger.ts +++ b/apps/code/src/main/utils/__mocks__/logger.ts @@ -14,8 +14,4 @@ export const logger = { debug: vi.fn(), scope: () => createScopedLogger(), }; - -export type Logger = typeof logger; -export type ScopedLogger = ReturnType; - export const getLogFilePath = vi.fn(() => "/mock/path/main.log"); diff --git a/apps/code/src/main/utils/logger.ts b/apps/code/src/main/utils/logger.ts index eb5d2435de..f808b5ccda 100644 --- a/apps/code/src/main/utils/logger.ts +++ b/apps/code/src/main/utils/logger.ts @@ -58,8 +58,6 @@ log.transports.ipc.level = level; log.transports.otel = initOtelTransport(level); export const logger = log; -export type Logger = typeof logger; -export type ScopedLogger = ReturnType; export function getLogFilePath(): string { return join(LOG_DIR, LOG_FILE); diff --git a/apps/code/src/renderer/di/container.ts b/apps/code/src/renderer/di/container.ts index 20138362fe..e48ac09616 100644 --- a/apps/code/src/renderer/di/container.ts +++ b/apps/code/src/renderer/di/container.ts @@ -355,7 +355,3 @@ container.bind(TITLE_GENERATOR_FILE_READ_CLIENT).toConstantValue({ container .bind(TITLE_GENERATOR_LOGGER) .toConstantValue(logger.scope("title-generator")); - -export function get(token: symbol): T { - return container.get(token); -} diff --git a/apps/code/src/renderer/di/tokens.ts b/apps/code/src/renderer/di/tokens.ts index dead53490a..256d64cc13 100644 --- a/apps/code/src/renderer/di/tokens.ts +++ b/apps/code/src/renderer/di/tokens.ts @@ -10,11 +10,3 @@ export const TRPC_CLIENT = Symbol.for("posthog.host.renderer.trpc-client"); // Services export const TASK_SERVICE = Symbol.for("posthog.host.renderer.task-service"); - -export const RENDERER_TOKENS = Object.freeze({ - // Infrastructure - TRPCClient: TRPC_CLIENT, - - // Services - TaskService: TASK_SERVICE, -}); diff --git a/apps/code/src/shared/constants.ts b/apps/code/src/shared/constants.ts index b3fc672e90..280a0c34cd 100644 --- a/apps/code/src/shared/constants.ts +++ b/apps/code/src/shared/constants.ts @@ -1,13 +1,3 @@ -export const BILLING_FLAG = "posthog-code-billing"; -export const EXPERIMENT_SUGGESTIONS_FLAG = - "posthog-code-experiment-suggestions"; -export const SELF_DRIVING_SETUP_TASK_FLAG = - "posthog-code-self-driving-setup-task"; -export const SYNC_CLOUD_TASKS_FLAG = "posthog-code-sync-cloud-tasks"; -export const HOME_TAB_FLAG = "posthog-code-home-tab"; -export const DISCOVERY_RUN_FLAG = "posthog-code-discovery-run"; -export const BRANCH_PREFIX = "posthog-code/"; -export const DATA_DIR = ".posthog-code"; export const WORKTREES_DIR = ".posthog-code/worktrees"; export const LEGACY_DATA_DIRS = [ ".twig", diff --git a/apps/web/package.json b/apps/web/package.json index 29a93f64a3..7e80c1f92f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,19 +11,17 @@ }, "dependencies": { "@inversifyjs/strongly-typed": "2.2.0", - "@posthog/core": "workspace:*", "@posthog/di": "workspace:*", "@posthog/host-router": "workspace:*", - "@posthog/platform": "workspace:*", "@posthog/shared": "workspace:*", "@posthog/ui": "workspace:*", - "@posthog/workspace-client": "workspace:*", "@tanstack/react-query": "^5.90.2", "@trpc/client": "^11.12.0", "@trpc/tanstack-react-query": "^11.12.0", "inversify": "^7.10.6", "react": "19.1.0", "react-dom": "19.1.0", + "react-hotkeys-hook": "^4.4.4", "reflect-metadata": "^0.2.2" }, "devDependencies": { diff --git a/knip.json b/knip.json index 03dfdecbfc..71b573c25b 100644 --- a/knip.json +++ b/knip.json @@ -1,6 +1,6 @@ { "$schema": "https://unpkg.com/knip@latest/schema.json", - "ignoreWorkspaces": ["apps/mobile", "apps/twig", "apps/web"], + "ignoreWorkspaces": ["apps/mobile"], "workspaces": { ".": { "entry": ["mprocs.yaml", "scripts/*.{mjs,js,ts}"] @@ -29,7 +29,11 @@ "is-glob", "micromatch", "node-addon-api", - "@vitest/coverage-v8" + "@vitest/coverage-v8", + "better-sqlite3", + "node-pty", + "@parcel/watcher", + "drizzle-orm" ] }, "apps/cli": { @@ -69,10 +73,10 @@ "includeEntryExports": true }, "packages/enricher": { - "entry": ["src/**/*.test.ts", "scripts/*.cjs"], + "entry": ["src/index.ts", "src/**/*.test.ts", "scripts/*.cjs"], "project": ["src/**/*.ts"], "ignoreDependencies": ["tree-sitter-cli"], - "includeEntryExports": true + "includeEntryExports": false }, "packages/git": { "entry": ["src/*.ts", "src/**/*.test.ts"], diff --git a/packages/agent/src/resume.ts b/packages/agent/src/resume.ts index 2f43181826..482f205088 100644 --- a/packages/agent/src/resume.ts +++ b/packages/agent/src/resume.ts @@ -96,18 +96,6 @@ export async function resumeFromLog( }; } -/** - * Convert resumed conversation back to API format for continuation. - */ -export function conversationToPromptHistory( - conversation: ConversationTurn[], -): Array<{ role: "user" | "assistant"; content: ContentBlock[] }> { - return conversation.map((turn) => ({ - role: turn.role, - content: turn.content, - })); -} - const RESUME_HISTORY_TOKEN_BUDGET = 50_000; const TOOL_RESULT_MAX_CHARS = 2000; diff --git a/packages/agent/src/server/schemas.ts b/packages/agent/src/server/schemas.ts index 2dfa791a9f..e60dfa2573 100644 --- a/packages/agent/src/server/schemas.ts +++ b/packages/agent/src/server/schemas.ts @@ -51,9 +51,6 @@ export const jsonRpcRequestSchema = z.object({ params: z.record(z.string(), z.unknown()).optional(), id: z.union([z.string(), z.number()]).optional(), }); - -export type JsonRpcRequest = z.infer; - export const userMessageParamsSchema = z .object({ content: z diff --git a/packages/agent/src/test/fixtures/api.ts b/packages/agent/src/test/fixtures/api.ts index 4cc68857fa..de20238693 100644 --- a/packages/agent/src/test/fixtures/api.ts +++ b/packages/agent/src/test/fixtures/api.ts @@ -4,9 +4,6 @@ import { mkdir, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { promisify } from "node:util"; -import { vi } from "vitest"; -import type { PostHogAPIClient } from "../../posthog-api"; -import type { TaskRun } from "../../types"; const execFileAsync = promisify(execFile); @@ -63,37 +60,3 @@ export async function createTestRepo(prefix = "test-repo"): Promise { }, }; } - -export function createMockApiClient( - overrides: Partial = {}, -): PostHogAPIClient { - return { - uploadTaskArtifacts: vi - .fn() - .mockResolvedValue([{ storage_path: "gs://bucket/handoff/test.pack" }]), - downloadArtifact: vi.fn(), - getTaskRun: vi.fn(), - fetchTaskRunLogs: vi.fn(), - ...overrides, - } as unknown as PostHogAPIClient; -} - -export function createTaskRun(overrides: Partial = {}): TaskRun { - return { - id: "run-1", - task: "task-1", - team: 1, - branch: null, - stage: null, - environment: "local", - status: "in_progress", - log_url: "https://logs.example.com/run-1", - error_message: null, - output: null, - state: {}, - created_at: new Date().toISOString(), - updated_at: new Date().toISOString(), - completed_at: null, - ...overrides, - }; -} diff --git a/packages/agent/src/test/fixtures/config.ts b/packages/agent/src/test/fixtures/config.ts deleted file mode 100644 index 24b3d51565..0000000000 --- a/packages/agent/src/test/fixtures/config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { AgentServerConfig } from "../../server/types"; -import type { TestRepo } from "./api"; - -export type { AgentServerConfig }; - -// Test RSA public key (for testing only - matches TEST_PRIVATE_KEY in agent-server.test.ts) -export const TEST_PUBLIC_KEY = `-----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6ofeEmDBbLxuAgqPQUho -7T69vzsc7jRq+NTuPgDJA0EXfaSjuPQ4UwOFc8Jzr6x/MuHiPTfDkJ3uwcKXaKLk -p+A6AwEv290lH4o/0aBVEsmYk0KFs9B+qNlbrn4s9B3/gc5WRFZ4UkNa7r6kn/uJ -fHFoHjF2hV4HQ+ZEPBo70ebqisbzthJ79YTCUSnjjhBoAnqf9HOkpDFE10ngvlY8 -qVYPfvMj8bSKTkO1yr/u3vzwNIpanoUUIeH6PQQFo1Ftfh527bIyQI43754MyI6W -o7kFcjIuxu/b/Dr4o4SzCYyQYd03W1SH4vkZFY/x/eFFHylkXyQNHi8pAFb04hX9 -JwIDAQAB ------END PUBLIC KEY-----`; - -export function createAgentServerConfig( - repo: TestRepo, - overrides: Partial = {}, -): AgentServerConfig { - return { - port: 3001, - repositoryPath: repo.path, - apiUrl: "http://localhost:8000", - apiKey: "test-api-key", - projectId: 1, - jwtPublicKey: TEST_PUBLIC_KEY, - mode: "interactive", - taskId: "test-task-id", - runId: "test-run-id", - ...overrides, - }; -} diff --git a/packages/agent/src/test/mocks/claude-sdk.ts b/packages/agent/src/test/mocks/claude-sdk.ts index 4bb084931d..b98798059b 100644 --- a/packages/agent/src/test/mocks/claude-sdk.ts +++ b/packages/agent/src/test/mocks/claude-sdk.ts @@ -162,116 +162,3 @@ export function createMockQuery( return mockQuery; } - -export function createSuccessResult( - overrides: Partial = {}, -): SDKResultSuccess { - return { - type: "result", - subtype: "success", - duration_ms: 100, - duration_api_ms: 50, - is_error: false, - num_turns: 1, - result: "Done", - stop_reason: null, - total_cost_usd: 0.01, - usage: { - input_tokens: 100, - output_tokens: 50, - output_tokens_details: { thinking_tokens: 0 }, - cache_read_input_tokens: 0, - cache_creation_input_tokens: 0, - cache_creation: { - ephemeral_1h_input_tokens: 0, - ephemeral_5m_input_tokens: 0, - }, - server_tool_use: { web_search_requests: 0, web_fetch_requests: 0 }, - service_tier: "standard", - inference_geo: "us", - iterations: [], - speed: "standard", - }, - modelUsage: {}, - permission_denials: [], - uuid: crypto.randomUUID() as `${string}-${string}-${string}-${string}-${string}`, - session_id: "test-session", - ...overrides, - }; -} - -export function createErrorResult( - overrides: Partial = {}, -): SDKResultError { - return { - type: "result", - subtype: "error_during_execution", - is_error: true, - errors: ["Test error"], - duration_ms: 100, - duration_api_ms: 50, - num_turns: 1, - stop_reason: null, - total_cost_usd: 0.01, - usage: { - input_tokens: 100, - output_tokens: 50, - output_tokens_details: { thinking_tokens: 0 }, - cache_read_input_tokens: 0, - cache_creation_input_tokens: 0, - cache_creation: { - ephemeral_1h_input_tokens: 0, - ephemeral_5m_input_tokens: 0, - }, - server_tool_use: { web_search_requests: 0, web_fetch_requests: 0 }, - service_tier: "standard", - inference_geo: "us", - iterations: [], - speed: "standard", - }, - modelUsage: {}, - permission_denials: [], - uuid: crypto.randomUUID() as `${string}-${string}-${string}-${string}-${string}`, - session_id: "test-session", - ...overrides, - }; -} - -export function createInitMessage(sessionId = "test-session"): SDKMessage { - return { - type: "system", - subtype: "init", - agents: [], - apiKeySource: "user", - betas: [], - claude_code_version: "1.0.0", - cwd: "/tmp", - tools: [], - mcp_servers: [], - model: "claude-sonnet-4-6", - permissionMode: "default", - slash_commands: [], - output_style: "default", - skills: [], - plugins: [], - uuid: crypto.randomUUID() as `${string}-${string}-${string}-${string}-${string}`, - session_id: sessionId, - }; -} - -export interface MockQueryRef { - current: MockQuery | null; -} - -export function createClaudeSdkMock(mockQueryRef: MockQueryRef) { - return { - query: vi.fn(() => { - const mq = createMockQuery(); - mockQueryRef.current = mq; - setTimeout(() => { - mq._mockHelpers.sendMessage(createInitMessage()); - }, 10); - return mq; - }), - }; -} diff --git a/packages/agent/src/types.ts b/packages/agent/src/types.ts index 6b75426ca3..894b477e6c 100644 --- a/packages/agent/src/types.ts +++ b/packages/agent/src/types.ts @@ -106,13 +106,6 @@ export interface DeviceInfo { export type AgentMode = "interactive" | "background"; // Git file status codes -export type FileStatus = "A" | "M" | "D"; - -export interface FileChange { - path: string; - status: FileStatus; -} - export type HandoffLocalGitState = GitHandoffLocalGitState; export interface GitCheckpoint extends GitHandoffCheckpoint { @@ -123,11 +116,3 @@ export interface GitCheckpoint extends GitHandoffCheckpoint { export interface GitCheckpointEvent extends GitCheckpoint { device?: DeviceInfo; } - -/** - * Keeps the emitted `@posthog/agent/types` entrypoint as a runtime ESM module. - * - * `export {}` is stripped by tsup in this package, which leaves `dist/types.js` - * empty and breaks downstream type resolution for the exported subpath. - */ -export const AGENT_TYPES_MODULE = true; diff --git a/packages/api-client/src/fetcher.ts b/packages/api-client/src/fetcher.ts index b9a7a4ed50..e3a3d6bdfe 100644 --- a/packages/api-client/src/fetcher.ts +++ b/packages/api-client/src/fetcher.ts @@ -1,6 +1,6 @@ import type { createApiClient } from "./generated"; -export type ApiFetcherConfig = { +type ApiFetcherConfig = { getAccessToken: () => Promise; refreshAccessToken: () => Promise; appVersion: string; diff --git a/packages/api-client/src/index.ts b/packages/api-client/src/index.ts index d1cf7861c4..634a951826 100644 --- a/packages/api-client/src/index.ts +++ b/packages/api-client/src/index.ts @@ -1,4 +1,3 @@ import "./generated.augment"; -export { type ApiFetcherConfig, buildApiFetcher } from "./fetcher"; -export { createApiClient, type Schemas } from "./generated"; +export type { Schemas } from "./generated"; diff --git a/packages/api-client/src/posthog-client.ts b/packages/api-client/src/posthog-client.ts index bb4392d620..2602b12150 100644 --- a/packages/api-client/src/posthog-client.ts +++ b/packages/api-client/src/posthog-client.ts @@ -62,7 +62,7 @@ export function setPosthogApiClientAppVersion(version: string): void { clientAppVersion = version; } -export class SeatSubscriptionRequiredError extends Error { +class SeatSubscriptionRequiredError extends Error { redirectUrl: string; constructor(redirectUrl: string) { super("Billing subscription required"); @@ -71,20 +71,20 @@ export class SeatSubscriptionRequiredError extends Error { } } -export class SeatPaymentFailedError extends Error { +class SeatPaymentFailedError extends Error { constructor(message?: string) { super(message ?? "Payment failed"); this.name = "SeatPaymentFailedError"; } } -export type UsageLimitType = "burst" | "sustained" | null; +type UsageLimitType = "burst" | "sustained" | null; // Stable message so callers recognize this after a saga reduces the error to a string. export const CLOUD_USAGE_LIMIT_ERROR_MESSAGE = "Cloud usage limit reached"; /** Thrown when the backend rejects a cloud run with a 429 usage-limit error. */ -export class CloudUsageLimitError extends Error { +class CloudUsageLimitError extends Error { limitType: UsageLimitType; resetAt: string | null; isPro: boolean; @@ -150,7 +150,7 @@ export interface LlmSkillCreatedBy { last_name?: string | null; } -export interface LlmSkillFileManifest { +interface LlmSkillFileManifest { path: string; content_type: string; } @@ -355,7 +355,7 @@ export interface TaskArtifactUploadRequest { source?: string; } -export interface DirectUploadPresignedPost { +interface DirectUploadPresignedPost { url: string; fields: Record; } diff --git a/packages/core/package.json b/packages/core/package.json index 99d84fffee..c1aaea201c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -16,6 +16,7 @@ "clean": "node ../../scripts/rimraf.mjs .turbo" }, "dependencies": { + "@agentclientprotocol/sdk": "0.22.1", "@modelcontextprotocol/ext-apps": "^1.1.2", "@modelcontextprotocol/sdk": "^1.12.1", "@pierre/diffs": "^1.1.21", @@ -24,6 +25,7 @@ "@posthog/platform": "workspace:*", "@posthog/shared": "workspace:*", "@posthog/workspace-client": "workspace:*", + "@tanstack/react-query": "catalog:", "fuse.js": "^7.1.0", "inversify": "catalog:", "reflect-metadata": "catalog:", diff --git a/packages/core/src/auth/auth.module.ts b/packages/core/src/auth/auth.module.ts index 6501241330..a5e3e5b2dd 100644 --- a/packages/core/src/auth/auth.module.ts +++ b/packages/core/src/auth/auth.module.ts @@ -1,9 +1 @@ -import { ContainerModule } from "inversify"; -import { AuthService } from "./auth"; - export const AUTH_SERVICE = Symbol.for("posthog.core.auth.service"); - -export const authCoreModule = new ContainerModule(({ bind }) => { - bind(AuthService).toSelf().inSingletonScope(); - bind(AUTH_SERVICE).toService(AuthService); -}); diff --git a/packages/core/src/auth/oauth.schemas.ts b/packages/core/src/auth/oauth.schemas.ts index c8d51cc73d..46a71b6eb0 100644 --- a/packages/core/src/auth/oauth.schemas.ts +++ b/packages/core/src/auth/oauth.schemas.ts @@ -16,8 +16,6 @@ export const oAuthErrorCode = z.enum([ "auth_error", "unknown_error", ]); -export type OAuthErrorCode = z.infer; - export const oAuthTokenResponse = z.object({ access_token: z.string(), expires_in: z.number(), @@ -27,12 +25,6 @@ export const oAuthTokenResponse = z.object({ scoped_organizations: z.array(z.string()).optional(), }); export type OAuthTokenResponse = z.infer; - -export const startFlowInput = z.object({ - region: cloudRegion, -}); -export type StartFlowInput = z.infer; - export const startFlowOutput = z.object({ success: z.boolean(), data: oAuthTokenResponse.optional(), @@ -40,16 +32,6 @@ export const startFlowOutput = z.object({ errorCode: oAuthErrorCode.optional(), }); export type StartFlowOutput = z.infer; - -export const startSignupFlowInput = startFlowInput; -export type StartSignupFlowInput = z.infer; - -export const refreshTokenInput = z.object({ - refreshToken: z.string(), - region: cloudRegion, -}); -export type RefreshTokenInput = z.infer; - export const refreshTokenOutput = z.object({ success: z.boolean(), data: oAuthTokenResponse.optional(), @@ -63,8 +45,3 @@ export const cancelFlowOutput = z.object({ error: z.string().optional(), }); export type CancelFlowOutput = z.infer; - -export const openExternalUrlInput = z.object({ - url: z.string().url(), -}); -export type OpenExternalUrlInput = z.infer; diff --git a/packages/core/src/auth/schemas.ts b/packages/core/src/auth/schemas.ts index 8e68bf6e15..aee30fd018 100644 --- a/packages/core/src/auth/schemas.ts +++ b/packages/core/src/auth/schemas.ts @@ -2,8 +2,6 @@ import { z } from "zod"; import { cloudRegion, type oAuthTokenResponse } from "./oauth.schemas"; export const authStatusSchema = z.enum(["anonymous", "authenticated"]); -export type AuthStatus = z.infer; - export const orgProjectsSchema = z.object({ orgName: z.string(), projects: z.array(z.object({ id: z.number(), name: z.string() })), @@ -82,13 +80,9 @@ export type AuthState = z.infer; export const loginInput = z.object({ region: cloudRegion, }); -export type LoginInput = z.infer; - export const loginOutput = z.object({ state: authStateSchema, }); -export type LoginOutput = z.infer; - export const redeemInviteCodeInput = z.object({ code: z.string().min(1), }); @@ -100,8 +94,6 @@ export const selectProjectInput = z.object({ export const switchOrgInput = z.object({ orgId: z.string().min(1), }); -export type SwitchOrgInput = z.infer; - export const validAccessTokenOutput = z.object({ accessToken: z.string(), apiHost: z.string(), diff --git a/packages/core/src/canvas/services.ts b/packages/core/src/canvas/services.ts index d43bb66554..a63e9ab6ed 100644 --- a/packages/core/src/canvas/services.ts +++ b/packages/core/src/canvas/services.ts @@ -5,10 +5,6 @@ import type { CanvasGenerateInput, CanvasThreadInput, } from "./genSchemas"; -import type { - DashboardQueryResult, - DashboardQueryRunInput, -} from "./querySchemas"; // Structural service interfaces the host-router routers depend on. The concrete // implementations live in the desktop app's main process and are bound to the @@ -48,10 +44,6 @@ export interface IDashboardsService { }>; } -export interface IDashboardQueryService { - run(input: DashboardQueryRunInput): Promise; -} - export interface IChannelTasksService { list(channelId: string): Promise; file(input: { diff --git a/packages/core/src/code-review/code-review.module.ts b/packages/core/src/code-review/code-review.module.ts index ca72ac7451..e69de29bb2 100644 --- a/packages/core/src/code-review/code-review.module.ts +++ b/packages/core/src/code-review/code-review.module.ts @@ -1,7 +0,0 @@ -import { ContainerModule } from "inversify"; -import { REVERT_HUNK_SERVICE } from "./identifiers"; -import { RevertHunkService } from "./revertHunkService"; - -export const codeReviewModule = new ContainerModule(({ bind }) => { - bind(REVERT_HUNK_SERVICE).to(RevertHunkService).inSingletonScope(); -}); diff --git a/packages/core/src/context-menu/schemas.ts b/packages/core/src/context-menu/schemas.ts index 469b95045c..d5edfe998b 100644 --- a/packages/core/src/context-menu/schemas.ts +++ b/packages/core/src/context-menu/schemas.ts @@ -153,17 +153,7 @@ export type ConfirmDeleteArchivedTaskInput = z.infer< export type ConfirmDeleteArchivedTaskResult = z.infer< typeof confirmDeleteArchivedTaskOutput >; -export type ConfirmDeleteWorktreeInput = z.infer< - typeof confirmDeleteWorktreeInput ->; -export type ConfirmDeleteWorktreeResult = z.infer< - typeof confirmDeleteWorktreeOutput ->; - export type TaskContextMenuResult = z.infer; -export type BulkTaskContextMenuResult = z.infer< - typeof bulkTaskContextMenuOutput ->; export type ArchivedTaskContextMenuResult = z.infer< typeof archivedTaskContextMenuOutput >; diff --git a/packages/core/src/deep-links/deep-links.module.ts b/packages/core/src/deep-links/deep-links.module.ts index de7ebb6abd..e69de29bb2 100644 --- a/packages/core/src/deep-links/deep-links.module.ts +++ b/packages/core/src/deep-links/deep-links.module.ts @@ -1,7 +0,0 @@ -import { ContainerModule } from "inversify"; -import { NEW_TASK_LINK_RESOLVER } from "./identifiers"; -import { NewTaskLinkResolver } from "./newTaskLinkResolver"; - -export const deepLinksCoreModule = new ContainerModule(({ bind }) => { - bind(NEW_TASK_LINK_RESOLVER).to(NewTaskLinkResolver).inSingletonScope(); -}); diff --git a/packages/core/src/editor/cloud-prompt.ts b/packages/core/src/editor/cloud-prompt.ts index 6ab68831be..f24838a1ce 100644 --- a/packages/core/src/editor/cloud-prompt.ts +++ b/packages/core/src/editor/cloud-prompt.ts @@ -73,10 +73,6 @@ function isTextAttachment(filePath: string): boolean { return TEXT_FILENAMES.has(fileName) || TEXT_EXTENSIONS.has(ext); } -export function isSupportedCloudTextAttachment(filePath: string): boolean { - return isTextAttachment(filePath); -} - function estimateBase64Bytes(base64: string): number { const padding = base64.endsWith("==") ? 2 : base64.endsWith("=") ? 1 : 0; return Math.floor((base64.length * 3) / 4) - padding; diff --git a/packages/core/src/external-apps/external-apps.module.ts b/packages/core/src/external-apps/external-apps.module.ts index 5e72c6ce5c..e69de29bb2 100644 --- a/packages/core/src/external-apps/external-apps.module.ts +++ b/packages/core/src/external-apps/external-apps.module.ts @@ -1,7 +0,0 @@ -import { ContainerModule } from "inversify"; -import { ExternalAppService } from "./externalAppService"; -import { EXTERNAL_APPS_SERVICE } from "./identifiers"; - -export const externalAppsCoreModule = new ContainerModule(({ bind }) => { - bind(EXTERNAL_APPS_SERVICE).to(ExternalAppService).inSingletonScope(); -}); diff --git a/packages/core/src/git-interaction/git-interaction.module.ts b/packages/core/src/git-interaction/git-interaction.module.ts index c82421a135..e69de29bb2 100644 --- a/packages/core/src/git-interaction/git-interaction.module.ts +++ b/packages/core/src/git-interaction/git-interaction.module.ts @@ -1,7 +0,0 @@ -import { ContainerModule } from "inversify"; -import { GitInteractionService } from "./gitInteractionService"; -import { GIT_INTERACTION_SERVICE } from "./identifiers"; - -export const gitInteractionModule = new ContainerModule(({ bind }) => { - bind(GIT_INTERACTION_SERVICE).to(GitInteractionService).inSingletonScope(); -}); diff --git a/packages/core/src/git-interaction/types.ts b/packages/core/src/git-interaction/types.ts index 292f76adf7..719a24ddb3 100644 --- a/packages/core/src/git-interaction/types.ts +++ b/packages/core/src/git-interaction/types.ts @@ -14,10 +14,6 @@ export interface GitMenuAction { disabledReason: string | null; } -export type CommitNextStep = "commit" | "commit-push"; -export type PushMode = "push" | "sync" | "publish"; -export type PushState = "idle" | "success" | "error"; - export type CreatePrStep = | "idle" | "creating-branch" diff --git a/packages/core/src/git/router-schemas.ts b/packages/core/src/git/router-schemas.ts index 7feadcce0e..4f1f8a5bde 100644 --- a/packages/core/src/git/router-schemas.ts +++ b/packages/core/src/git/router-schemas.ts @@ -31,9 +31,6 @@ export const gitFileStatusSchema = z.enum([ "renamed", "untracked", ]); - -export type GitFileStatus = z.infer; - export const changedFileSchema = z.object({ path: z.string(), status: gitFileStatusSchema, @@ -43,9 +40,6 @@ export const changedFileSchema = z.object({ staged: z.boolean().optional(), patch: z.string().optional(), }); - -export type ChangedFile = z.infer; - export const diffStatsSchema = z.object({ filesChanged: z.number(), linesAdded: z.number(), @@ -62,9 +56,6 @@ export const gitSyncStatusSchema = z.object({ currentBranch: z.string().nullable(), isFeatureBranch: z.boolean(), }); - -export type GitSyncStatus = z.infer; - export const gitCommitInfoSchema = z.object({ sha: z.string(), shortSha: z.string(), @@ -72,9 +63,6 @@ export const gitCommitInfoSchema = z.object({ author: z.string(), date: z.string(), }); - -export type GitCommitInfo = z.infer; - export const gitRepoInfoSchema = z.object({ organization: z.string(), repository: z.string(), @@ -82,9 +70,6 @@ export const gitRepoInfoSchema = z.object({ defaultBranch: z.string(), compareUrl: z.string().nullable(), }); - -export type GitRepoInfo = z.infer; - export const detectRepoInput = z.object({ directoryPath: z.string(), }); @@ -97,10 +82,6 @@ export const detectRepoOutput = z branch: z.string().optional(), }) .nullable(); - -export type DetectRepoInput = z.infer; -export type DetectRepoResult = z.infer; - export const validateRepoInput = z.object({ directoryPath: z.string(), }); @@ -193,8 +174,6 @@ export const discardFileChangesInput = z.object({ filePath: z.string(), fileStatus: gitFileStatusSchema, }); - -export const getGitSyncStatusInput = directoryPathInput; export const getGitSyncStatusOutput = gitSyncStatusSchema; export const getLatestCommitInput = directoryPathInput; @@ -209,17 +188,11 @@ export const pushInput = z.object({ branch: z.string().optional(), setUpstream: z.boolean().default(false), }); - -export type PushInput = z.infer; - export const pullInput = z.object({ directoryPath: z.string(), remote: z.string().default("origin"), branch: z.string().optional(), }); - -export type PullInput = z.infer; - export const commitInput = z.object({ directoryPath: z.string(), message: z.string(), @@ -228,16 +201,10 @@ export const commitInput = z.object({ stagedOnly: z.boolean().optional(), taskId: z.string().optional(), }); - -export type CommitInput = z.infer; - export const gitStatusOutput = z.object({ installed: z.boolean(), version: z.string().nullable(), }); - -export type GitStatusOutput = z.infer; - export const ghStatusOutput = z.object({ installed: z.boolean(), version: z.string().nullable(), @@ -245,17 +212,11 @@ export const ghStatusOutput = z.object({ username: z.string().nullable(), error: z.string().nullable(), }); - -export type GhStatusOutput = z.infer; - export const ghAuthTokenOutput = z.object({ success: z.boolean(), token: z.string().nullable(), error: z.string().nullable(), }); - -export type GhAuthTokenOutput = z.infer; - export const prStatusInput = directoryPathInput; export const prStatusOutput = z.object({ hasRemote: z.boolean(), @@ -270,19 +231,11 @@ export const prStatusOutput = z.object({ isDraft: z.boolean().nullable(), error: z.string().nullable(), }); - -export type PrStatusInput = z.infer; -export type PrStatusOutput = z.infer; - export const getPrUrlForBranchInput = z.object({ directoryPath: z.string(), branchName: z.string(), }); export const getPrUrlForBranchOutput = z.string().nullable(); - -export type GetPrUrlForBranchInput = z.infer; -export type GetPrUrlForBranchOutput = z.infer; - export const createPrInput = z.object({ directoryPath: z.string(), flowId: z.string(), @@ -304,33 +257,22 @@ export const openPrOutput = z.object({ message: z.string(), prUrl: z.string().nullable(), }); - -export type OpenPrInput = z.infer; export type OpenPrOutput = z.infer; export const publishInput = z.object({ directoryPath: z.string(), remote: z.string().default("origin"), }); - -export type PublishInput = z.infer; - export const syncInput = z.object({ directoryPath: z.string(), remote: z.string().default("origin"), }); - -export type SyncInput = z.infer; - export const getPrTemplateInput = directoryPathInput; export const getPrTemplateOutput = z.object({ template: z.string().nullable(), templatePath: z.string().nullable(), }); - -export type GetPrTemplateOutput = z.infer; - export const getCommitConventionsInput = z.object({ directoryPath: z.string(), sampleSize: z.number().default(20), @@ -341,11 +283,6 @@ export const getCommitConventionsOutput = z.object({ commonPrefixes: z.array(z.string()), sampleMessages: z.array(z.string()), }); - -export type GetCommitConventionsOutput = z.infer< - typeof getCommitConventionsOutput ->; - export const getPrChangedFilesInput = z.object({ prUrl: z.string(), }); @@ -376,8 +313,6 @@ export const getPrDetailsByUrlOutput = z.object({ merged: z.boolean(), draft: z.boolean(), }); -export type PrDetailsByUrlOutput = z.infer; - export { prActionTypeSchema, prReviewCommentSchema, @@ -400,10 +335,6 @@ export const resolveReviewThreadOutput = z.object({ success: z.boolean(), isResolved: z.boolean(), }); -export type ResolveReviewThreadOutput = z.infer< - typeof resolveReviewThreadOutput ->; - export const replyToPrCommentInput = z.object({ prUrl: z.string(), commentId: z.number(), @@ -413,8 +344,6 @@ export const replyToPrCommentOutput = z.object({ success: z.boolean(), comment: prReviewCommentSchema.nullable(), }); -export type ReplyToPrCommentOutput = z.infer; - export const updatePrByUrlInput = z.object({ prUrl: z.string(), action: prActionTypeSchema, @@ -423,8 +352,6 @@ export const updatePrByUrlOutput = z.object({ success: z.boolean(), message: z.string(), }); -export type UpdatePrByUrlOutput = z.infer; - export const getBranchChangedFilesInput = z.object({ repo: z.string(), branch: z.string(), @@ -490,9 +417,6 @@ export const pullOutput = z.object({ updatedFiles: z.number().optional(), state: gitStateSnapshotSchema.optional(), }); - -export type PullOutput = z.infer; - export const publishOutput = z.object({ success: z.boolean(), message: z.string(), @@ -536,9 +460,6 @@ export const discardFileChangesOutput = z.object({ success: z.boolean(), state: gitStateSnapshotSchema.optional(), }); - -export type DiscardFileChangesOutput = z.infer; - export { githubIssueSchema, githubIssueStateSchema, diff --git a/packages/core/src/home/prSnapshot.ts b/packages/core/src/home/prSnapshot.ts index a93c33fc62..ca921a5bb2 100644 --- a/packages/core/src/home/prSnapshot.ts +++ b/packages/core/src/home/prSnapshot.ts @@ -5,8 +5,6 @@ import { z } from "zod"; // (docs/workflow-architecture.md §5). export const prSnapshotState = z.enum(["open", "draft", "merged", "closed"]); -export type PrSnapshotState = z.infer; - export const prCiStatus = z.enum(["passing", "failing", "pending", "none"]); export type PrCiStatus = z.infer; @@ -15,8 +13,6 @@ export const prReviewDecision = z.enum([ "changes_requested", "review_required", ]); -export type PrReviewDecision = z.infer; - export const prSnapshot = z .object({ url: z.string(), diff --git a/packages/core/src/inbox/bulkActions.ts b/packages/core/src/inbox/bulkActions.ts index 0839bbd9c5..fa530e622e 100644 --- a/packages/core/src/inbox/bulkActions.ts +++ b/packages/core/src/inbox/bulkActions.ts @@ -1,133 +1,10 @@ import type { DismissalReasonOptionValue } from "@posthog/shared"; -import type { SignalReport } from "@posthog/shared/domain-types"; -import { inboxStatusLabel } from "./statusLabels"; - -export type BulkActionName = "suppress" | "snooze" | "delete" | "reingest"; export interface BulkActionResult { successCount: number; failureCount: number; } -/** Active workflow statuses for snooze and suppress. Terminal `suppressed` / `deleted` are excluded. */ -export const suppressibleStatuses = new Set([ - "potential", - "candidate", - "in_progress", - "pending_input", - "ready", - "failed", -]); - -/** Clause after "Disabled because …" (see `@components/ui/Button`). */ -export const DISABLED_NO_SELECTION = "you haven't selected a report"; - -/** Statuses that block suppression; labels match `inboxStatusLabel`. */ -export const SUPPRESS_BLOCKED_STATUS_PHRASE = ( - ["suppressed", "deleted"] as const satisfies readonly SignalReport["status"][] -) - .map((status) => inboxStatusLabel(status)) - .join(" or "); - -export interface SelectedReportEligibility { - selectedReports: SignalReport[]; - selectedIds: string[]; - selectedCount: number; - snoozeDisabledReason: string | null; - suppressDisabledReason: string | null; - deleteDisabledReason: string | null; - reingestDisabledReason: string | null; -} - -export function formatBulkActionSummary( - action: BulkActionName, - result: BulkActionResult, -): string { - const { successCount, failureCount } = result; - const pluralized = successCount === 1 ? "report" : "reports"; - const formulated = - action === "suppress" - ? `${pluralized} dismissed` - : action === "snooze" - ? `${pluralized} snoozed` - : action === "delete" - ? `${pluralized} deleted` - : `${pluralized} reingested`; - if (failureCount === 0) { - return `${successCount} ${formulated}`; - } - return `${successCount} ${formulated}, ${failureCount} failed`; -} - -export function getSnoozeOrSuppressDisabledReason( - selectedCount: number, - selectedReports: SignalReport[], -): string | null { - if (selectedCount === 0) { - return DISABLED_NO_SELECTION; - } - const ok = selectedReports.every((report) => - suppressibleStatuses.has(report.status), - ); - if (ok) { - return null; - } - return `every selected report must not already be ${SUPPRESS_BLOCKED_STATUS_PHRASE}`; -} - -export function getSelectedReportEligibility( - reports: SignalReport[], - selectedIds: string[], -): SelectedReportEligibility { - const selectedIdSet = new Set(selectedIds); - const selectedReports = reports.filter((report) => - selectedIdSet.has(report.id), - ); - const selectedCount = selectedReports.length; - - const snoozeOrSuppressDisabledReason = getSnoozeOrSuppressDisabledReason( - selectedCount, - selectedReports, - ); - - return { - selectedReports, - selectedIds: selectedReports.map((report) => report.id), - selectedCount, - snoozeDisabledReason: snoozeOrSuppressDisabledReason, - suppressDisabledReason: snoozeOrSuppressDisabledReason, - deleteDisabledReason: selectedCount === 0 ? DISABLED_NO_SELECTION : null, - reingestDisabledReason: selectedCount === 0 ? DISABLED_NO_SELECTION : null, - }; -} - -/** Toolbar: selected report ids. Dismiss dialog: that report's id, or null when closed. */ -export type InboxBulkSelection = string[] | string | null; - -const emptyBulkIds: string[] = []; - -export function effectiveBulkIdsFromSelection( - selection: InboxBulkSelection, -): string[] { - if (selection == null) { - return emptyBulkIds; - } - if (Array.isArray(selection)) { - return selection; - } - return [selection]; -} - -export function bulkSelectionKey(selection: InboxBulkSelection): string { - if (selection == null) { - return ""; - } - if (Array.isArray(selection)) { - return selection.join("\0"); - } - return selection; -} - export interface DismissReportInput { reason: DismissalReasonOptionValue; note: string; diff --git a/packages/core/src/inbox/engagement.ts b/packages/core/src/inbox/engagement.ts index 5e40498efb..d5b863b659 100644 --- a/packages/core/src/inbox/engagement.ts +++ b/packages/core/src/inbox/engagement.ts @@ -1,6 +1,3 @@ -import type { InboxReportActionProperties } from "@posthog/shared/analytics-events"; -import type { SignalReport } from "@posthog/shared/domain-types"; - /** Report age at fire time in hours, rounded to one decimal. Clamped at 0 to guard against clock skew. */ export function reportAgeHours(createdAt: string | null | undefined): number { if (!createdAt) return 0; @@ -8,77 +5,3 @@ export function reportAgeHours(createdAt: string | null | undefined): number { if (!Number.isFinite(ageMs)) return 0; return Math.max(0, Math.round((ageMs / 3_600_000) * 10) / 10); } - -/** Live tracker snapshot for the currently-open report. */ -export interface OpenReportSnapshot { - reportId: string; - rank: number; - reportPriority: string | null; - reportActionability: string | null; -} - -export type ResolvedActionProperties = Pick< - InboxReportActionProperties, - "rank" | "list_size" | "priority" | "actionability" ->; - -export interface ResolveActionPropertiesInput { - reportId: string; - rankOverride?: number; - listSizeOverride?: number; - priorityOverride?: string | null; - actionabilityOverride?: string | null; - openSnapshot: OpenReportSnapshot | null; - visibleReports: SignalReport[]; -} - -/** - * Resolve rank / list_size / priority / actionability for an INBOX_REPORT_ACTION event. - * - * Precedence: explicit override -> live open-info snapshot (current report only) -> - * a one-shot lookup in the visible list. Callers firing after an async mutation should - * pass pre-mutation overrides; by then the visible list has been re-queried without the - * affected report. - */ -export function resolveActionProperties( - input: ResolveActionPropertiesInput, -): ResolvedActionProperties { - const { - reportId, - rankOverride, - listSizeOverride, - priorityOverride, - actionabilityOverride, - openSnapshot, - visibleReports, - } = input; - - const currentInfo = - openSnapshot && openSnapshot.reportId === reportId ? openSnapshot : null; - const matchedReport = currentInfo - ? null - : (visibleReports.find((r) => r.id === reportId) ?? null); - - const rank = - rankOverride !== undefined - ? rankOverride - : currentInfo - ? currentInfo.rank - : visibleReports.findIndex((r) => r.id === reportId); - const listSize = - listSizeOverride !== undefined ? listSizeOverride : visibleReports.length; - const priority = - priorityOverride !== undefined - ? priorityOverride - : currentInfo - ? currentInfo.reportPriority - : (matchedReport?.priority ?? null); - const actionability = - actionabilityOverride !== undefined - ? actionabilityOverride - : currentInfo - ? currentInfo.reportActionability - : (matchedReport?.actionability ?? null); - - return { rank, list_size: listSize, priority, actionability }; -} diff --git a/packages/core/src/inbox/reportActionRules.ts b/packages/core/src/inbox/reportActionRules.ts index a272c1290a..0fdf5470f7 100644 --- a/packages/core/src/inbox/reportActionRules.ts +++ b/packages/core/src/inbox/reportActionRules.ts @@ -1,5 +1,4 @@ -import type { SignalReport, Task } from "@posthog/shared/domain-types"; -import { getTaskPrUrl } from "./reportTasks"; +import type { SignalReport } from "@posthog/shared/domain-types"; export function isReportAwaitingInput(report: SignalReport): boolean { return ( @@ -17,11 +16,3 @@ export function canCreateImplementationPr(report: SignalReport): boolean { report.already_addressed !== true) ); } - -export function resolveHeaderImplementationPrUrl( - report: SignalReport, - implementationTask: Task | null, -): string | null { - const fromTask = implementationTask ? getTaskPrUrl(implementationTask) : null; - return fromTask ?? report.implementation_pr_url ?? null; -} diff --git a/packages/core/src/inbox/reportArtefacts.ts b/packages/core/src/inbox/reportArtefacts.ts index 9373cca87a..e69de29bb2 100644 --- a/packages/core/src/inbox/reportArtefacts.ts +++ b/packages/core/src/inbox/reportArtefacts.ts @@ -1,60 +0,0 @@ -import type { - ActionabilityJudgmentArtefact, - ActionabilityJudgmentContent, - PriorityJudgmentArtefact, - SignalFindingArtefact, - SignalReportArtefactsResponse, - SuggestedReviewer, - SuggestedReviewersArtefact, -} from "@posthog/shared/domain-types"; - -type ReportArtefact = SignalReportArtefactsResponse["results"][number]; - -export function selectSuggestedReviewers( - artefacts: ReportArtefact[], - meUuid?: string, -): SuggestedReviewer[] { - const artefact = artefacts.find( - (a): a is SuggestedReviewersArtefact => a.type === "suggested_reviewers", - ); - const reviewers = artefact?.content ?? []; - if (!meUuid) return reviewers; - const meIndex = reviewers.findIndex((r) => r.user?.uuid === meUuid); - if (meIndex <= 0) return reviewers; - return [reviewers[meIndex], ...reviewers.filter((_, i) => i !== meIndex)]; -} - -export function buildSignalFindingMap( - artefacts: ReportArtefact[], -): Map { - const map = new Map(); - for (const a of artefacts) { - if (a.type === "signal_finding") { - const finding = a as SignalFindingArtefact; - map.set(finding.content.signal_id, finding.content); - } - } - return map; -} - -export function selectActionabilityJudgment( - artefacts: ReportArtefact[], -): ActionabilityJudgmentContent | null { - for (const a of artefacts) { - if (a.type === "actionability_judgment") { - return (a as ActionabilityJudgmentArtefact).content; - } - } - return null; -} - -export function selectPriorityExplanation( - artefacts: ReportArtefact[], -): string | null { - for (const a of artefacts) { - if (a.type === "priority_judgment") { - return (a as PriorityJudgmentArtefact).content.explanation || null; - } - } - return null; -} diff --git a/packages/core/src/inbox/reportFiltering.ts b/packages/core/src/inbox/reportFiltering.ts index 1df6db14c2..0b33953983 100644 --- a/packages/core/src/inbox/reportFiltering.ts +++ b/packages/core/src/inbox/reportFiltering.ts @@ -2,7 +2,6 @@ import type { SignalReport, SignalReportOrderingField, SignalReportPriority, - SignalReportStatus, } from "@posthog/shared/types"; /** @@ -49,13 +48,6 @@ export function filterReportsBySearch( ); } -/** - * Build a comma-separated status filter string for the API from an array of statuses. - */ -export function buildStatusFilterParam(statuses: SignalReportStatus[]): string { - return statuses.join(","); -} - /** * Comma-separated `ordering` for the signal report list API: * 1. Status rank (ready first – semantic server-side rank, always applied) diff --git a/packages/core/src/inbox/reportMembership.ts b/packages/core/src/inbox/reportMembership.ts index 6504b17267..8adfb37e39 100644 --- a/packages/core/src/inbox/reportMembership.ts +++ b/packages/core/src/inbox/reportMembership.ts @@ -36,15 +36,6 @@ export function isTeammateInboxScope( return parseTeammateInboxScope(scope) != null; } -export function inboxScopeTriggerLabel( - scope: InboxScope, - teammateName?: string | null, -): string { - if (scope === INBOX_SCOPE_FOR_YOU) return "For you"; - if (scope === INBOX_SCOPE_ENTIRE_PROJECT) return "Entire project"; - return teammateName?.trim() || "Teammate"; -} - export function matchesInboxScope( report: SignalReport, scope: InboxScope, diff --git a/packages/core/src/inbox/reportPresentation.ts b/packages/core/src/inbox/reportPresentation.ts index b2718396ba..9492fd8f40 100644 --- a/packages/core/src/inbox/reportPresentation.ts +++ b/packages/core/src/inbox/reportPresentation.ts @@ -69,25 +69,6 @@ export function inboxStatusLabel(status: SignalReportStatus): string { } } -export function inboxStatusAccentCss(status: SignalReportStatus): string { - switch (status) { - case "ready": - return "var(--green-9)"; - case "pending_input": - return "var(--violet-9)"; - case "in_progress": - return "var(--amber-9)"; - case "candidate": - return "var(--cyan-9)"; - case "potential": - return "var(--gray-9)"; - case "failed": - return "var(--red-9)"; - default: - return "var(--gray-8)"; - } -} - const SIGNAL_SUMMARY_SECTION_HEADERS = [ "What's happening", "Root cause", diff --git a/packages/core/src/inbox/reportRepository.ts b/packages/core/src/inbox/reportRepository.ts index 5fb7ebe276..e69de29bb2 100644 --- a/packages/core/src/inbox/reportRepository.ts +++ b/packages/core/src/inbox/reportRepository.ts @@ -1,23 +0,0 @@ -import type { SignalReportTask, Task } from "@posthog/shared/domain-types"; - -export const REPOSITORY_SOURCE_RELATIONSHIPS: SignalReportTask["relationship"][] = - ["repo_selection", "research", "implementation"]; - -export async function resolveReportRepository( - reportTasks: SignalReportTask[], - getTask: (taskId: string) => Promise, -): Promise { - for (const relationship of REPOSITORY_SOURCE_RELATIONSHIPS) { - const reportTask = reportTasks.find( - (task) => task.relationship === relationship, - ); - if (!reportTask) { - continue; - } - const task = await getTask(reportTask.task_id); - if (task?.repository) { - return task.repository.toLowerCase(); - } - } - return null; -} diff --git a/packages/core/src/inbox/reportSignals.ts b/packages/core/src/inbox/reportSignals.ts index ab50fee579..e69de29bb2 100644 --- a/packages/core/src/inbox/reportSignals.ts +++ b/packages/core/src/inbox/reportSignals.ts @@ -1,28 +0,0 @@ -import type { Signal } from "@posthog/shared/domain-types"; - -function isSessionProblemSignal(signal: Signal): boolean { - return ( - signal.source_product === "session_replay" && - signal.source_type === "session_problem" - ); -} - -export interface PartitionedSignals { - evidence: Signal[]; - signals: Signal[]; -} - -export function partitionSessionProblemSignals( - allSignals: Signal[], -): PartitionedSignals { - const evidence: Signal[] = []; - const signals: Signal[] = []; - for (const signal of allSignals) { - if (isSessionProblemSignal(signal)) { - evidence.push(signal); - } else { - signals.push(signal); - } - } - return { evidence, signals }; -} diff --git a/packages/core/src/inbox/reportTasks.ts b/packages/core/src/inbox/reportTasks.ts index 8f2d45fc9d..999f319d87 100644 --- a/packages/core/src/inbox/reportTasks.ts +++ b/packages/core/src/inbox/reportTasks.ts @@ -1,35 +1,4 @@ -import type { SignalReportTask, Task } from "@posthog/shared/domain-types"; - -export type ReportTaskRelationship = SignalReportTask["relationship"]; - -export const DISPLAYED_RELATIONSHIPS: ReportTaskRelationship[] = [ - "implementation", - "research", -]; - -export interface ReportTaskData { - task: Task; - relationship: ReportTaskRelationship; - startedAt: string; -} - -/** Keep only report-task relationships that the detail pane renders. */ -export function selectDisplayedReportTasks( - reportTasks: SignalReportTask[], -): SignalReportTask[] { - return reportTasks.filter((rt) => - DISPLAYED_RELATIONSHIPS.includes(rt.relationship), - ); -} - -/** Sort report tasks by their relationship's display rank. */ -export function sortByRelationship(tasks: ReportTaskData[]): ReportTaskData[] { - return [...tasks].sort( - (a, b) => - DISPLAYED_RELATIONSHIPS.indexOf(a.relationship) - - DISPLAYED_RELATIONSHIPS.indexOf(b.relationship), - ); -} +import type { Task } from "@posthog/shared/domain-types"; /** Extract the PR url from a task's latest run output, if present. */ export function getTaskPrUrl(task: Task): string | null { diff --git a/packages/core/src/integrations/schemas.ts b/packages/core/src/integrations/schemas.ts index f2d3220591..6eacc3a2b7 100644 --- a/packages/core/src/integrations/schemas.ts +++ b/packages/core/src/integrations/schemas.ts @@ -7,10 +7,6 @@ export const startIntegrationFlowInput = z.object({ region: cloudRegion, projectId: z.number(), }); -export type StartIntegrationFlowInput = z.infer< - typeof startIntegrationFlowInput ->; - export const startIntegrationFlowOutput = z.object({ success: z.boolean(), error: z.string().optional(), diff --git a/packages/core/src/llm-gateway/schemas.ts b/packages/core/src/llm-gateway/schemas.ts index 9b985139b9..ebf0ee50f1 100644 --- a/packages/core/src/llm-gateway/schemas.ts +++ b/packages/core/src/llm-gateway/schemas.ts @@ -13,9 +13,6 @@ export const promptInput = z.object({ maxTokens: z.number().optional(), model: z.string().optional(), }); - -export type PromptInput = z.infer; - export const promptOutput = z.object({ content: z.string(), model: z.string(), diff --git a/packages/core/src/onboarding/steps.ts b/packages/core/src/onboarding/steps.ts index 7685ed1721..d68d6a78be 100644 --- a/packages/core/src/onboarding/steps.ts +++ b/packages/core/src/onboarding/steps.ts @@ -36,13 +36,6 @@ export function computeActiveSteps( }); } -export function stepIndexOf( - activeSteps: OnboardingStep[], - step: OnboardingStep, -): number { - return activeSteps.indexOf(step); -} - export function isFirstStep(currentIndex: number): boolean { return currentIndex === 0; } diff --git a/packages/core/src/secure-store/identifiers.ts b/packages/core/src/secure-store/identifiers.ts index 24017161c9..e69de29bb2 100644 --- a/packages/core/src/secure-store/identifiers.ts +++ b/packages/core/src/secure-store/identifiers.ts @@ -1,24 +0,0 @@ -export interface SecureStoreBackend { - has(key: string): boolean; - get(key: string): unknown; - set(key: string, value: string): void; - delete(key: string): void; - clear(): void; -} - -export interface SecureStoreLogger { - info(message: string, ...args: unknown[]): void; - warn(message: string, ...args: unknown[]): void; - error(message: string, ...args: unknown[]): void; - debug(message: string, ...args: unknown[]): void; -} - -export const SECURE_STORE_BACKEND = Symbol.for( - "posthog.core.secureStoreBackend", -); - -export const SECURE_STORE_LOGGER = Symbol.for("posthog.core.secureStoreLogger"); - -export const SECURE_STORE_SERVICE = Symbol.for( - "posthog.core.secureStoreService", -); diff --git a/packages/core/src/secure-store/schemas.ts b/packages/core/src/secure-store/schemas.ts index 42f1811fe0..e69de29bb2 100644 --- a/packages/core/src/secure-store/schemas.ts +++ b/packages/core/src/secure-store/schemas.ts @@ -1,12 +0,0 @@ -import { z } from "zod"; - -export const secureStoreGetInput = z.object({ key: z.string() }); -export const secureStoreSetInput = z.object({ - key: z.string(), - value: z.string(), -}); -export const secureStoreRemoveInput = z.object({ key: z.string() }); - -export type SecureStoreGetInput = z.infer; -export type SecureStoreSetInput = z.infer; -export type SecureStoreRemoveInput = z.infer; diff --git a/packages/core/src/setup/prompts.ts b/packages/core/src/setup/prompts.ts index bfe4aad109..a5f050504d 100644 --- a/packages/core/src/setup/prompts.ts +++ b/packages/core/src/setup/prompts.ts @@ -1,11 +1,5 @@ import { BASE_CATEGORY_ENUM } from "@posthog/core/setup/types"; -export const WIZARD_PROMPT = `/instrument-integration - -After the integration is wired up, also instrument error tracking and session replay (run \`/instrument-error-tracking\`, then add session replay if the framework's posthog-js config supports it). - -Run autonomously with sensible defaults — do not ask the user questions. If the PostHog API key isn't already in the project's env files and you can't read it from the PostHog MCP server, leave a placeholder env var and note it in the PR body rather than blocking.`; - const DISCOVERY_PROMPT_BASE = `You are analyzing this codebase to find the highest-value first tasks for the developer. Scan the codebase for issues in two tiers. Tier 1 applies to every repo. Tier 2 only applies when PostHog is already installed (look for posthog-js, posthog-node, posthog-react-native or similar PostHog SDK imports). diff --git a/packages/core/src/task-detail/task-detail.module.ts b/packages/core/src/task-detail/task-detail.module.ts index 193d444269..e69de29bb2 100644 --- a/packages/core/src/task-detail/task-detail.module.ts +++ b/packages/core/src/task-detail/task-detail.module.ts @@ -1,9 +0,0 @@ -import { ContainerModule } from "inversify"; -import { TASK_SERVICE, WORKSPACE_SETUP_SAGA } from "./identifiers"; -import { TaskService } from "./taskService"; -import { WorkspaceSetupSaga } from "./workspaceSetupSaga"; - -export const taskDetailModule = new ContainerModule(({ bind }) => { - bind(TASK_SERVICE).to(TaskService).inSingletonScope(); - bind(WORKSPACE_SETUP_SAGA).to(WorkspaceSetupSaga).inSingletonScope(); -}); diff --git a/packages/core/src/tasks/tasks.module.ts b/packages/core/src/tasks/tasks.module.ts index a2f5451743..e69de29bb2 100644 --- a/packages/core/src/tasks/tasks.module.ts +++ b/packages/core/src/tasks/tasks.module.ts @@ -1,7 +0,0 @@ -import { ContainerModule } from "inversify"; -import { TASK_DELETION_SERVICE } from "./identifiers"; -import { TaskDeletionService } from "./taskDeletionService"; - -export const tasksModule = new ContainerModule(({ bind }) => { - bind(TASK_DELETION_SERVICE).to(TaskDeletionService).inSingletonScope(); -}); diff --git a/packages/core/src/updates/schemas.ts b/packages/core/src/updates/schemas.ts index b4dd973948..eaab77d2f6 100644 --- a/packages/core/src/updates/schemas.ts +++ b/packages/core/src/updates/schemas.ts @@ -5,8 +5,6 @@ export const isEnabledOutput = z.object({ }); export const checkErrorCode = z.enum(["already_checking", "disabled"]); -export type CheckErrorCode = z.infer; - export const checkForUpdatesOutput = z.object({ success: z.boolean(), errorMessage: z.string().optional(), @@ -26,9 +24,6 @@ export const updatesStatusOutput = z.object({ export const installUpdateOutput = z.object({ installed: z.boolean(), }); - -export type IsEnabledOutput = z.infer; - export type CheckForUpdatesOutput = z.infer; export type InstallUpdateOutput = z.infer; diff --git a/packages/core/src/updates/updateStore.ts b/packages/core/src/updates/updateStore.ts index fa3139141e..1fb8d18ac9 100644 --- a/packages/core/src/updates/updateStore.ts +++ b/packages/core/src/updates/updateStore.ts @@ -35,9 +35,6 @@ export const updateStore = createStore((set) => ({ })); export const getUpdateUiStatus = () => updateStore.getState().status; -export const getUpdateVersion = () => updateStore.getState().version; -export const getMenuCheckPending = () => - updateStore.getState().menuCheckPending; export interface UpdateStatusUpdate { status?: UpdateUiStatus; diff --git a/packages/core/src/usage/monitor-schemas.ts b/packages/core/src/usage/monitor-schemas.ts index abbdb0f8a4..4ea3442115 100644 --- a/packages/core/src/usage/monitor-schemas.ts +++ b/packages/core/src/usage/monitor-schemas.ts @@ -21,8 +21,6 @@ export const thresholdCrossedEvent = z.object({ export type ThresholdCrossedEvent = z.infer; export const usageSnapshotOutput = usageOutput.nullable(); -export type UsageSnapshot = UsageOutput | null; - export const UsageMonitorEvent = { ThresholdCrossed: "threshold-crossed", UsageUpdated: "usage-updated", diff --git a/packages/core/src/workspace/workspace.module.ts b/packages/core/src/workspace/workspace.module.ts index 99ebaecb19..e69de29bb2 100644 --- a/packages/core/src/workspace/workspace.module.ts +++ b/packages/core/src/workspace/workspace.module.ts @@ -1,7 +0,0 @@ -import { ContainerModule } from "inversify"; -import { WORKSPACE_SETUP_SERVICE } from "./identifiers"; -import { WorkspaceSetupService } from "./WorkspaceSetupService"; - -export const workspaceModule = new ContainerModule(({ bind }) => { - bind(WORKSPACE_SETUP_SERVICE).to(WorkspaceSetupService).inSingletonScope(); -}); diff --git a/packages/di/src/container.ts b/packages/di/src/container.ts index d471cef0d2..2108468d9d 100644 --- a/packages/di/src/container.ts +++ b/packages/di/src/container.ts @@ -18,16 +18,6 @@ export function setRootContainer(container: ServiceContainer): void { pendingBindings.length = 0; } -export function bindToContainer( - bind: (container: ServiceContainer) => void, -): void { - if (rootContainer) { - bind(rootContainer); - } else { - pendingBindings.push(bind); - } -} - export function resolveService(serviceIdentifier: ServiceIdentifier): T { if (!rootContainer) { throw new Error( diff --git a/packages/enricher/src/enriched-result.ts b/packages/enricher/src/enriched-result.ts index cebf484592..c1695024ce 100644 --- a/packages/enricher/src/enriched-result.ts +++ b/packages/enricher/src/enriched-result.ts @@ -103,7 +103,6 @@ export class EnrichedResult { toList(): EnrichedListItem[] { const baseList = this.parsed.toList(); - const _experiments = this.context.experiments ?? []; const flagLookup = new Map(); for (const f of this.flags) { diff --git a/packages/git/package.json b/packages/git/package.json index d37362c44c..cb23961350 100644 --- a/packages/git/package.json +++ b/packages/git/package.json @@ -17,7 +17,6 @@ "test": "vitest run" }, "devDependencies": { - "@types/tar": "^6.1.13", "typescript": "^5.5.0", "vitest": "^2.1.8" }, diff --git a/packages/git/src/operation-manager.ts b/packages/git/src/operation-manager.ts index 38cfa0b612..cae305b8c7 100644 --- a/packages/git/src/operation-manager.ts +++ b/packages/git/src/operation-manager.ts @@ -166,12 +166,3 @@ export function getGitOperationManager(): GitOperationManagerImpl { } return instance; } - -export function resetGitOperationManager(): void { - if (instance) { - instance.destroy(); - instance = null; - } -} - -export type GitOperationManager = GitOperationManagerImpl; diff --git a/packages/git/src/queries.ts b/packages/git/src/queries.ts index bc3a604884..b1b09cb643 100644 --- a/packages/git/src/queries.ts +++ b/packages/git/src/queries.ts @@ -12,22 +12,6 @@ export interface WorktreeListEntry { branch: string | null; } -export interface AheadBehind { - aheadOfRemote: number; - behind: number; -} - -export interface GitStatus { - isClean: boolean; - staged: string[]; - modified: string[]; - deleted: string[]; - untracked: string[]; - overflowedDirs?: string[]; - totalUntrackedSeen?: number; - totalUntrackedTruncated?: boolean; -} - type GitLike = { raw: (args: string[]) => Promise; revparse: (args: string[]) => Promise; @@ -141,25 +125,6 @@ export async function getRemoteUrl( ); } -export async function getStatus( - baseDir: string, - options?: CreateGitClientOptions, -): Promise { - const status = await streamGitStatus(baseDir, { - signal: options?.abortSignal, - }); - return { - isClean: status.isClean, - staged: status.staged, - modified: status.modified, - deleted: status.deleted, - untracked: status.untracked, - overflowedDirs: status.overflowedDirs, - totalUntrackedSeen: status.totalUntrackedSeen, - totalUntrackedTruncated: status.totalUntrackedTruncated, - }; -} - export async function hasChanges( baseDir: string, options?: CreateGitClientOptions, @@ -175,34 +140,6 @@ export async function hasChanges( ); } -export async function getAheadBehind( - baseDir: string, - options?: CreateGitClientOptions, -): Promise { - const manager = getGitOperationManager(); - return manager.executeRead( - baseDir, - async (git) => { - const branchOutput = await git.revparse(["--abbrev-ref", "HEAD"]); - const branch = branchOutput === "HEAD" ? null : branchOutput; - if (!branch) return null; - - try { - await git.raw(["rev-parse", "--abbrev-ref", `${branch}@{upstream}`]); - } catch { - return null; - } - - const status = await git.status(["--untracked-files=no"]); - return { - aheadOfRemote: status.ahead, - behind: status.behind, - }; - }, - { signal: options?.abortSignal }, - ); -} - export async function branchExists( baseDir: string, branchName: string, @@ -289,14 +226,6 @@ export async function getHeadSha( }); } -export async function isDetachedHead( - baseDir: string, - options?: CreateGitClientOptions, -): Promise { - const branch = await getCurrentBranch(baseDir, options); - return branch === null; -} - export async function isGitRepository( baseDir: string, options?: CreateGitClientOptions, @@ -1198,41 +1127,6 @@ export async function getDiffAgainstRemote( ); } -export async function isCommitOnRemote( - baseDir: string, - commit: string, - options?: CreateGitClientOptions, -): Promise { - const manager = getGitOperationManager(); - return manager.executeRead( - baseDir, - async (git) => { - try { - const output = await git.branch(["-r", "--contains", commit]); - return output.all.length > 0; - } catch { - return false; - } - }, - { signal: options?.abortSignal }, - ); -} - -export async function resolveGitDir( - baseDir: string, - options?: CreateGitClientOptions, -): Promise { - const manager = getGitOperationManager(); - return manager.executeRead( - baseDir, - async (git) => { - const gitDir = await git.revparse(["--git-dir"]); - return path.resolve(baseDir, gitDir); - }, - { signal: options?.abortSignal }, - ); -} - export async function addToLocalExclude( baseDir: string, pattern: string, diff --git a/packages/git/src/sagas/commit.ts b/packages/git/src/sagas/commit.ts index 4660d612f1..29f5cd6c7a 100644 --- a/packages/git/src/sagas/commit.ts +++ b/packages/git/src/sagas/commit.ts @@ -86,57 +86,3 @@ export class CommitSaga extends GitSaga { return { commitSha: commitResult.commit, branch }; } } - -export interface StageAndCommitInput extends GitSagaInput { - message: string; - paths: string[]; -} - -export interface StageAndCommitOutput { - commitSha: string; - branch: string; - filesStaged: number; -} - -export class StageAndCommitSaga extends GitSaga< - StageAndCommitInput, - StageAndCommitOutput -> { - readonly sagaName = "StageAndCommitSaga"; - - protected async executeGitOperations( - input: StageAndCommitInput, - ): Promise { - const { message, paths } = input; - - const originalHead = await this.readOnlyStep("get-original-head", () => - this.git.revparse(["HEAD"]), - ); - - const branch = await this.readOnlyStep("get-current-branch", () => - this.git.revparse(["--abbrev-ref", "HEAD"]), - ); - - await this.step({ - name: "stage-files", - execute: () => this.git.add(paths), - rollback: async () => { - await this.git.reset(paths); - }, - }); - - const commitResult = await this.step({ - name: "commit", - execute: () => this.git.commit(message), - rollback: async () => { - await this.git.reset(["--soft", originalHead]); - }, - }); - - return { - commitSha: commitResult.commit, - branch, - filesStaged: paths.length, - }; - } -} diff --git a/packages/git/src/sagas/publish.ts b/packages/git/src/sagas/publish.ts index 0b00dbd6a2..e69de29bb2 100644 --- a/packages/git/src/sagas/publish.ts +++ b/packages/git/src/sagas/publish.ts @@ -1,36 +0,0 @@ -import { GitSaga, type GitSagaInput } from "../git-saga"; - -export interface PublishInput extends GitSagaInput { - remote?: string; -} - -export interface PublishOutput { - branch: string; - remote: string; -} - -export class PublishSaga extends GitSaga { - readonly sagaName = "PublishSaga"; - - protected async executeGitOperations( - input: PublishInput, - ): Promise { - const { remote = "origin" } = input; - - const currentBranch = await this.readOnlyStep("get-current-branch", () => - this.git.revparse(["--abbrev-ref", "HEAD"]), - ); - - if (currentBranch === "HEAD") { - throw new Error("Cannot publish: HEAD is detached"); - } - - await this.step({ - name: "push-with-upstream", - execute: () => this.git.push(["-u", remote, currentBranch]), - rollback: async () => {}, - }); - - return { branch: currentBranch, remote }; - } -} diff --git a/packages/git/src/sagas/sync.ts b/packages/git/src/sagas/sync.ts index c5f280b2dd..e69de29bb2 100644 --- a/packages/git/src/sagas/sync.ts +++ b/packages/git/src/sagas/sync.ts @@ -1,103 +0,0 @@ -import { GitSaga, type GitSagaInput } from "../git-saga"; - -export interface SyncInput extends GitSagaInput { - remote?: string; - branch?: string; -} - -export interface SyncOutput { - pullSummary: { - changes: number; - insertions: number; - deletions: number; - }; - pushBranch: string; -} - -export class SyncSaga extends GitSaga { - readonly sagaName = "SyncSaga"; - private stashCreated = false; - - protected async executeGitOperations(input: SyncInput): Promise { - const { remote = "origin", branch } = input; - - const originalHead = await this.readOnlyStep("get-original-head", () => - this.git.revparse(["HEAD"]), - ); - - const hasChanges = await this.readOnlyStep("check-changes", async () => { - const status = await this.git.status(); - return !status.isClean(); - }); - - if (hasChanges) { - const stashCountBefore = await this.readOnlyStep( - "get-stash-count", - async () => { - const result = await this.git.stashList(); - return result.all.length; - }, - ); - - await this.step({ - name: "stash-changes", - execute: async () => { - await this.git.stash([ - "push", - "--include-untracked", - "-m", - "posthog-code-sync-backup", - ]); - const afterResult = await this.git.stashList(); - this.stashCreated = afterResult.all.length > stashCountBefore; - }, - rollback: async () => { - if (this.stashCreated) { - await this.git.stash(["pop"]).catch(() => {}); - } - }, - }); - } - - const currentBranch = - branch ?? (await this.git.revparse(["--abbrev-ref", "HEAD"])); - - const pullResult = await this.step({ - name: "pull", - execute: () => this.git.pull(remote, currentBranch), - rollback: async () => { - await this.git.reset(["--hard", originalHead]); - if (this.stashCreated) { - await this.git.stash(["pop"]).catch(() => {}); - this.stashCreated = false; - } - }, - }); - - await this.step({ - name: "push", - execute: () => this.git.push(remote, currentBranch), - rollback: async () => {}, - }); - - if (this.stashCreated) { - await this.step({ - name: "restore-stash", - execute: async () => { - await this.git.stash(["pop"]); - this.stashCreated = false; - }, - rollback: async () => {}, - }); - } - - return { - pullSummary: { - changes: pullResult.summary.changes, - insertions: pullResult.summary.insertions, - deletions: pullResult.summary.deletions, - }, - pushBranch: currentBranch, - }; - } -} diff --git a/packages/git/src/sagas/worktree.ts b/packages/git/src/sagas/worktree.ts index ed268a6182..e69de29bb2 100644 --- a/packages/git/src/sagas/worktree.ts +++ b/packages/git/src/sagas/worktree.ts @@ -1,313 +0,0 @@ -import * as fs from "node:fs/promises"; -import * as path from "node:path"; -import { GitSaga, type GitSagaInput } from "../git-saga"; -import { - addToLocalExclude, - branchExists, - fetchRef, - getDefaultBranch, - hasRef, -} from "../queries"; -import { forceRemove, safeSymlink } from "../utils"; -import { processWorktreeInclude, runPostCheckoutHook } from "../worktree"; - -export interface CreateWorktreeInput extends GitSagaInput { - worktreePath: string; - branchName: string; - baseBranch?: string; - /** Base the worktree on `origin/` after fetching; falls back to the local ref if the fetch fails. */ - fetchBeforeCreate?: boolean; -} - -export interface CreateWorktreeOutput { - worktreePath: string; - branchName: string; - baseBranch: string; -} - -export class CreateWorktreeSaga extends GitSaga< - CreateWorktreeInput, - CreateWorktreeOutput -> { - readonly sagaName = "CreateWorktreeSaga"; - - protected async executeGitOperations( - input: CreateWorktreeInput, - ): Promise { - const { - baseDir, - worktreePath, - branchName, - baseBranch, - fetchBeforeCreate, - signal, - } = input; - - const base = await this.readOnlyStep("get-base-branch", async () => { - if (baseBranch) return baseBranch; - return getDefaultBranch(baseDir, { abortSignal: signal }); - }); - - // Use `this.git` directly to avoid re-entering the write lock the saga already holds. - const baseRef = fetchBeforeCreate - ? await this.readOnlyStep("resolve-fresh-base-ref", async () => { - const remote = "origin"; - const remoteRef = `${remote}/${base}`; - const fetched = await fetchRef(this.git, remote, base); - if (!fetched) return base; - const exists = await hasRef(this.git, remoteRef); - return exists ? remoteRef : base; - }) - : base; - - await this.step({ - name: "create-worktree", - execute: () => - this.git.raw([ - "-c", - "core.hooksPath=/dev/null", - "worktree", - "add", - "-b", - branchName, - worktreePath, - baseRef, - ]), - rollback: async () => { - try { - await this.git.raw(["worktree", "remove", worktreePath, "--force"]); - } catch { - await forceRemove(worktreePath); - await this.git.raw(["worktree", "prune"]); - } - try { - await this.git.deleteLocalBranch(branchName, true); - } catch {} - }, - }); - - await this.step({ - name: "symlink-claude-config", - execute: async () => { - const sourceClaudeDir = path.join(baseDir, ".claude"); - const targetClaudeDir = path.join(worktreePath, ".claude"); - const linkedDir = await safeSymlink( - sourceClaudeDir, - targetClaudeDir, - "dir", - ); - if (linkedDir) { - await addToLocalExclude(worktreePath, ".claude", { - abortSignal: signal, - }); - } - - const sourceClaudeLocalMd = path.join(baseDir, "CLAUDE.local.md"); - const targetClaudeLocalMd = path.join(worktreePath, "CLAUDE.local.md"); - const linkedFile = await safeSymlink( - sourceClaudeLocalMd, - targetClaudeLocalMd, - "file", - ); - if (linkedFile) { - await addToLocalExclude(worktreePath, "CLAUDE.local.md", { - abortSignal: signal, - }); - } - }, - rollback: async () => { - const targetClaudeDir = path.join(worktreePath, ".claude"); - const targetClaudeLocalMd = path.join(worktreePath, "CLAUDE.local.md"); - await fs.rm(targetClaudeDir, { force: true }).catch(() => {}); - await fs.rm(targetClaudeLocalMd, { force: true }).catch(() => {}); - }, - }); - - await this.step({ - name: "process-worktree-include", - execute: () => processWorktreeInclude(baseDir, worktreePath), - rollback: async () => {}, - }); - - await this.step({ - name: "run-post-checkout-hook", - execute: () => runPostCheckoutHook(baseDir, worktreePath), - rollback: async () => {}, - }); - - return { worktreePath, branchName, baseBranch: base }; - } -} - -export interface CreateWorktreeForBranchInput extends GitSagaInput { - worktreePath: string; - branchName: string; -} - -export interface CreateWorktreeForBranchOutput { - worktreePath: string; - branchName: string; -} - -export class CreateWorktreeForBranchSaga extends GitSaga< - CreateWorktreeForBranchInput, - CreateWorktreeForBranchOutput -> { - readonly sagaName = "CreateWorktreeForBranchSaga"; - - protected async executeGitOperations( - input: CreateWorktreeForBranchInput, - ): Promise { - const { baseDir, worktreePath, branchName, signal } = input; - - await this.readOnlyStep("verify-branch-exists", async () => { - const exists = await branchExists(baseDir, branchName, { - abortSignal: signal, - }); - if (!exists) { - throw new Error(`Branch '${branchName}' does not exist`); - } - }); - - await this.step({ - name: "create-worktree", - execute: () => - this.git.raw([ - "-c", - "core.hooksPath=/dev/null", - "worktree", - "add", - worktreePath, - branchName, - ]), - rollback: async () => { - try { - await this.git.raw(["worktree", "remove", worktreePath, "--force"]); - } catch { - await forceRemove(worktreePath); - await this.git.raw(["worktree", "prune"]); - } - }, - }); - - await this.step({ - name: "symlink-claude-config", - execute: async () => { - const sourceClaudeDir = path.join(baseDir, ".claude"); - const targetClaudeDir = path.join(worktreePath, ".claude"); - const linkedDir = await safeSymlink( - sourceClaudeDir, - targetClaudeDir, - "dir", - ); - if (linkedDir) { - await addToLocalExclude(worktreePath, ".claude", { - abortSignal: signal, - }); - } - - const sourceClaudeLocalMd = path.join(baseDir, "CLAUDE.local.md"); - const targetClaudeLocalMd = path.join(worktreePath, "CLAUDE.local.md"); - const linkedFile = await safeSymlink( - sourceClaudeLocalMd, - targetClaudeLocalMd, - "file", - ); - if (linkedFile) { - await addToLocalExclude(worktreePath, "CLAUDE.local.md", { - abortSignal: signal, - }); - } - }, - rollback: async () => { - const targetClaudeDir = path.join(worktreePath, ".claude"); - const targetClaudeLocalMd = path.join(worktreePath, "CLAUDE.local.md"); - await fs.rm(targetClaudeDir, { force: true }).catch(() => {}); - await fs.rm(targetClaudeLocalMd, { force: true }).catch(() => {}); - }, - }); - - await this.step({ - name: "process-worktree-include", - execute: () => processWorktreeInclude(baseDir, worktreePath), - rollback: async () => {}, - }); - - await this.step({ - name: "run-post-checkout-hook", - execute: () => runPostCheckoutHook(baseDir, worktreePath), - rollback: async () => {}, - }); - - return { worktreePath, branchName }; - } -} - -export interface DeleteWorktreeInput extends GitSagaInput { - worktreePath: string; -} - -export interface DeleteWorktreeOutput { - deleted: boolean; -} - -export class DeleteWorktreeSaga extends GitSaga< - DeleteWorktreeInput, - DeleteWorktreeOutput -> { - readonly sagaName = "DeleteWorktreeSaga"; - - protected async executeGitOperations( - input: DeleteWorktreeInput, - ): Promise { - const { baseDir, worktreePath } = input; - - const resolvedWorktreePath = path.resolve(worktreePath); - const resolvedMainRepoPath = path.resolve(baseDir); - - await this.readOnlyStep("safety-checks", async () => { - if (resolvedWorktreePath === resolvedMainRepoPath) { - throw new Error("Cannot delete worktree: path matches main repo path"); - } - if ( - resolvedMainRepoPath.startsWith(resolvedWorktreePath) && - resolvedMainRepoPath !== resolvedWorktreePath - ) { - throw new Error( - "Cannot delete worktree: path is a parent of main repo path", - ); - } - try { - const gitPath = path.join(resolvedWorktreePath, ".git"); - const stat = await fs.stat(gitPath); - if (stat.isDirectory()) { - throw new Error( - "Cannot delete worktree: path appears to be a main repository", - ); - } - } catch (error) { - if ( - error instanceof Error && - error.message.includes("Cannot delete worktree") - ) { - throw error; - } - } - }); - - await this.step({ - name: "delete-worktree", - execute: async () => { - try { - await this.git.raw(["worktree", "remove", worktreePath, "--force"]); - } catch { - await forceRemove(worktreePath); - await this.git.raw(["worktree", "prune"]); - } - }, - rollback: async () => {}, - }); - - return { deleted: true }; - } -} diff --git a/packages/host-router/package.json b/packages/host-router/package.json index d00eca634c..8c8eb7c47a 100644 --- a/packages/host-router/package.json +++ b/packages/host-router/package.json @@ -24,7 +24,9 @@ "@posthog/shared": "workspace:*", "@posthog/workspace-client": "workspace:*", "@posthog/workspace-server": "workspace:*", - "@trpc/client": "catalog:" + "@trpc/client": "catalog:", + "inversify": "catalog:", + "zod": "^4.1.12" }, "peerDependencies": { "@tanstack/react-query": "catalog:", @@ -37,6 +39,7 @@ "@trpc/tanstack-react-query": "catalog:", "@types/react": "catalog:", "react": "catalog:", - "typescript": "catalog:" + "typescript": "catalog:", + "vitest": "^4.0.10" } } diff --git a/packages/host-trpc/src/trpc.ts b/packages/host-trpc/src/trpc.ts index d209a88580..905b0d96ee 100644 --- a/packages/host-trpc/src/trpc.ts +++ b/packages/host-trpc/src/trpc.ts @@ -8,4 +8,3 @@ const t = initTRPC.context().create({ export const router = t.router; export const publicProcedure = t.procedure; export const middleware = t.middleware; -export const mergeRouters = t.mergeRouters; diff --git a/packages/shared/src/domain-types.ts b/packages/shared/src/domain-types.ts index a616fa6346..c8b33785d5 100644 --- a/packages/shared/src/domain-types.ts +++ b/packages/shared/src/domain-types.ts @@ -1,19 +1,8 @@ import { z } from "zod"; import type { DismissalReasonOptionValue } from "./dismissal-reasons"; -import type { StoredLogEntry } from "./session-events"; - // Execution mode schema and type - shared between main and renderer -export const executionModeSchema = z.enum([ - "default", - "acceptEdits", - "plan", - "bypassPermissions", - "auto", - "read-only", - "full-access", -]); - import type { ExecutionMode } from "./exec-types"; +import type { StoredLogEntry } from "./session-events"; export type { ExecutionMode }; // Effort level schema and type - shared between main and renderer diff --git a/packages/ui/package.json b/packages/ui/package.json index d97408ae68..b3af000be2 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -82,6 +82,7 @@ "@xterm/addon-web-links": "^0.11.0", "@xterm/xterm": "^5.5.0", "canvas-confetti": "^1.9.4", + "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "framer-motion": "^12.26.2", @@ -107,6 +108,7 @@ "unified": "^11.0.5", "virtua": "^0.48.6", "vscode-icons-js": "^11.6.1", + "zod": "^4.1.12", "zustand": "^4.5.0" }, "peerDependencies": { diff --git a/packages/ui/src/features/auth/authQueries.ts b/packages/ui/src/features/auth/authQueries.ts index a8f7d5d475..4e58f16ba1 100644 --- a/packages/ui/src/features/auth/authQueries.ts +++ b/packages/ui/src/features/auth/authQueries.ts @@ -32,10 +32,6 @@ export async function fetchAuthState(): Promise { return await hostClient().auth.getState.query(); } -export function getCachedAuthState(): AuthState { - return useAuthStore.getState().authState; -} - export async function refreshAuthStateQuery(): Promise { const state = await fetchAuthState(); useAuthStore.getState().setAuthState(state); diff --git a/packages/ui/src/features/auth/useAuthMutations.ts b/packages/ui/src/features/auth/useAuthMutations.ts index ff40e70ca8..b2feecc82f 100644 --- a/packages/ui/src/features/auth/useAuthMutations.ts +++ b/packages/ui/src/features/auth/useAuthMutations.ts @@ -16,17 +16,6 @@ export function useLoginMutation() { }); } -export function useSignupMutation() { - const hostClient = useHostTRPCClient(); - const fx = useService(AUTH_SIDE_EFFECTS); - return useMutation({ - mutationFn: (region: CloudRegion) => - hostClient.auth.signup.mutate({ region }).then((r) => r.state), - onSuccess: (state, region) => - fx.onAuthSuccess(region, state.currentProjectId), - }); -} - export function useSelectProjectMutation() { const hostClient = useHostTRPCClient(); const fx = useService(AUTH_SIDE_EFFECTS); diff --git a/packages/ui/src/features/clone/cloneActions.ts b/packages/ui/src/features/clone/cloneActions.ts index a6c9e32bc1..e69de29bb2 100644 --- a/packages/ui/src/features/clone/cloneActions.ts +++ b/packages/ui/src/features/clone/cloneActions.ts @@ -1,29 +0,0 @@ -import { resolveService } from "@posthog/di/container"; -import { - HOST_TRPC_CLIENT, - type HostTrpcClient, -} from "@posthog/host-router/client"; -import { cloneStore } from "@posthog/ui/features/clone/cloneStore"; - -/** - * Start a clone operation. Registers it in the store and kicks off the host - * clone. Progress and terminal status (complete/error) arrive via the - * onCloneProgress subscription owned by CloneContribution, which also schedules - * removal once the operation finishes — this action never owns timers. - */ -export function startClone( - cloneId: string, - repository: string, - targetPath: string, -): void { - cloneStore.getState().beginClone(cloneId, repository, targetPath); - - resolveService(HOST_TRPC_CLIENT) - .git.cloneRepository.mutate({ repoUrl: repository, targetPath, cloneId }) - .catch((err: unknown) => { - const message = err instanceof Error ? err.message : "Clone failed"; - cloneStore - .getState() - .applyProgress({ cloneId, status: "error", message }); - }); -} diff --git a/packages/ui/src/features/home/components/WorkstreamBits.tsx b/packages/ui/src/features/home/components/WorkstreamBits.tsx index 618d5ec384..b46d38e9cf 100644 --- a/packages/ui/src/features/home/components/WorkstreamBits.tsx +++ b/packages/ui/src/features/home/components/WorkstreamBits.tsx @@ -45,16 +45,6 @@ export function StatusGlyph({ ); } -export function StatusDot({ sid }: { sid: SituationId }) { - const c = situationCss(SITUATION_VISUAL[sid].color); - return ( - - ); -} - /** Compact CI signal – icon-only by default, optional inline label. */ export function CiIndicator({ status, diff --git a/packages/ui/src/features/inbox/components/utils/AnimatedEllipsis.tsx b/packages/ui/src/features/inbox/components/utils/AnimatedEllipsis.tsx index 592081acd3..e69de29bb2 100644 --- a/packages/ui/src/features/inbox/components/utils/AnimatedEllipsis.tsx +++ b/packages/ui/src/features/inbox/components/utils/AnimatedEllipsis.tsx @@ -1,15 +0,0 @@ -/** - * Animated three-dot ellipsis used while the inbox is warming up. - * Requires the `inbox-ellipsis-dot` CSS class (defined in inbox styles). - */ -export function AnimatedEllipsis() { - return ( - - - . - . - . - - - ); -} diff --git a/packages/ui/src/features/inbox/hooks/useInboxBulkActions.ts b/packages/ui/src/features/inbox/hooks/useInboxBulkActions.ts index 0c280aab56..07232c331b 100644 --- a/packages/ui/src/features/inbox/hooks/useInboxBulkActions.ts +++ b/packages/ui/src/features/inbox/hooks/useInboxBulkActions.ts @@ -143,24 +143,6 @@ function effectiveBulkIdsFromSelection( return [selection]; } -/** Snooze disabled reason when `selectedIds` are treated as the bulk selection (matches toolbar logic). */ -export function inboxBulkSnoozeDisabledReason( - reports: SignalReport[], - selectedIds: string[], -): string | null { - return getSelectedReportEligibility(reports, selectedIds) - .snoozeDisabledReason; -} - -/** Suppress/dismiss disabled reason when `selectedIds` are treated as the bulk selection. */ -export function inboxBulkSuppressDisabledReason( - reports: SignalReport[], - selectedIds: string[], -): string | null { - return getSelectedReportEligibility(reports, selectedIds) - .suppressDisabledReason; -} - /** * Per-report suppress-disabled reason precomputed in one O(N) pass. * Cheaper than calling `inboxBulkSuppressDisabledReason(reports, [id])` per diff --git a/packages/ui/src/features/inbox/hooks/useInboxReports.ts b/packages/ui/src/features/inbox/hooks/useInboxReports.ts index 1b2edb11e2..147177baa0 100644 --- a/packages/ui/src/features/inbox/hooks/useInboxReports.ts +++ b/packages/ui/src/features/inbox/hooks/useInboxReports.ts @@ -4,7 +4,6 @@ import { } from "@posthog/core/inbox/inboxQuery"; import type { AvailableSuggestedReviewersResponse, - SignalProcessingStateResponse, SignalReport, SignalReportArtefactsResponse, SignalReportSignalsResponse, @@ -144,19 +143,6 @@ export function useInboxAvailableSuggestedReviewers(options?: { return query; } -export function useInboxSignalProcessingState(options?: { - enabled?: boolean; - refetchInterval?: number | false | (() => number | false | undefined); - refetchIntervalInBackground?: boolean; - staleTime?: number; -}) { - return useAuthenticatedQuery( - reportKeys.signalProcessingState, - (client) => client.getSignalProcessingState(), - options, - ); -} - export function useInboxReportById( reportId: string | null, options?: { diff --git a/packages/ui/src/features/inbox/hooks/useReportTasks.ts b/packages/ui/src/features/inbox/hooks/useReportTasks.ts index db4d4e37d0..5b0299f7df 100644 --- a/packages/ui/src/features/inbox/hooks/useReportTasks.ts +++ b/packages/ui/src/features/inbox/hooks/useReportTasks.ts @@ -54,8 +54,3 @@ export function useReportTasks( }, ); } - -export function getTaskPrUrl(task: Task): string | null { - const prUrl = task.latest_run?.output?.pr_url; - return typeof prUrl === "string" && prUrl.length > 0 ? prUrl : null; -} diff --git a/packages/ui/src/features/inbox/stores/inboxCloudTaskStore.ts b/packages/ui/src/features/inbox/stores/inboxCloudTaskStore.ts deleted file mode 100644 index 167e2c75eb..0000000000 --- a/packages/ui/src/features/inbox/stores/inboxCloudTaskStore.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { create } from "zustand"; - -interface InboxCloudTaskStoreState { - isRunning: boolean; - showConfirm: boolean; - selectedRepo: string | null; -} - -interface InboxCloudTaskStoreActions { - openConfirm: (defaultRepo: string | null) => void; - closeConfirm: () => void; - setSelectedRepo: (repo: string | null) => void; - setIsRunning: (isRunning: boolean) => void; -} - -type InboxCloudTaskStore = InboxCloudTaskStoreState & - InboxCloudTaskStoreActions; - -export const useInboxCloudTaskStore = create()((set) => ({ - isRunning: false, - showConfirm: false, - selectedRepo: null, - - openConfirm: (defaultRepo) => - set({ showConfirm: true, selectedRepo: defaultRepo }), - - closeConfirm: () => set({ showConfirm: false }), - - setSelectedRepo: (repo) => set({ selectedRepo: repo }), - - setIsRunning: (isRunning) => set({ isRunning }), -})); diff --git a/packages/ui/src/features/inbox/utils/inboxSort.ts b/packages/ui/src/features/inbox/utils/inboxSort.ts index fd1ca167fb..e69de29bb2 100644 --- a/packages/ui/src/features/inbox/utils/inboxSort.ts +++ b/packages/ui/src/features/inbox/utils/inboxSort.ts @@ -1,20 +0,0 @@ -import type { SignalReportStatus } from "@posthog/shared/domain-types"; - -export function inboxStatusAccentCss(status: SignalReportStatus): string { - switch (status) { - case "ready": - return "var(--green-9)"; - case "pending_input": - return "var(--violet-9)"; - case "in_progress": - return "var(--amber-9)"; - case "candidate": - return "var(--cyan-9)"; - case "potential": - return "var(--gray-9)"; - case "failed": - return "var(--red-9)"; - default: - return "var(--gray-8)"; - } -} diff --git a/packages/ui/src/features/message-editor/analytics.ts b/packages/ui/src/features/message-editor/analytics.ts index 0153821f2a..9a3c8c9104 100644 --- a/packages/ui/src/features/message-editor/analytics.ts +++ b/packages/ui/src/features/message-editor/analytics.ts @@ -1,7 +1,3 @@ -export interface PromptHistoryOpenedProperties { - entry_count: number; -} - export interface PromptHistorySelectedProperties { entry_count: number; entry_age_seconds: number | null; diff --git a/packages/ui/src/features/message-editor/tiptap/CommandGhostText.ts b/packages/ui/src/features/message-editor/tiptap/CommandGhostText.ts index 4bdc365d1c..1ed52429a2 100644 --- a/packages/ui/src/features/message-editor/tiptap/CommandGhostText.ts +++ b/packages/ui/src/features/message-editor/tiptap/CommandGhostText.ts @@ -1,8 +1,5 @@ -import { Extension } from "@tiptap/core"; -import type { EditorState, Transaction } from "@tiptap/pm/state"; -import { Plugin, PluginKey } from "@tiptap/pm/state"; -import { Decoration, DecorationSet } from "@tiptap/pm/view"; -import { getCommandSuggestions } from "../suggestions/getSuggestions"; +import type { EditorState } from "@tiptap/pm/state"; +import { PluginKey } from "@tiptap/pm/state"; import type { CommandSuggestionItem } from "../types"; interface GhostMatch { @@ -17,160 +14,8 @@ interface PluginState { dismissedAt: number | null; } -type GhostMeta = { type: "dismiss" } | { type: "reset" }; - const pluginKey = new PluginKey("commandGhostText"); -const SLASH_QUERY_REGEX = /(?:^|\s)\/([^\s/]+)$/; +const _SLASH_QUERY_REGEX = /(?:^|\s)\/([^\s/]+)$/; -const getGhost = (state: EditorState): GhostMatch | null => +const _getGhost = (state: EditorState): GhostMatch | null => pluginKey.getState(state)?.ghost ?? null; - -function computeGhost( - sessionId: string, - state: EditorState, -): GhostMatch | null { - if (!sessionId) return null; - const { selection } = state; - if (!selection.empty) return null; - - const $from = selection.$from; - const textBeforeCursor = $from.parent.textBetween( - 0, - $from.parentOffset, - "\n", - "\uFFFC", - ); - - const match = SLASH_QUERY_REGEX.exec(textBeforeCursor); - if (!match) return null; - - const query = match[1]; - const slashPos = - $from.start() + match.index + (match[0].length - query.length - 1); - - if (state.doc.resolve(slashPos).parentOffset === 0) return null; - - const top = getCommandSuggestions(sessionId, query)[0]; - if (!top) return null; - - const lowerLabel = top.label.toLowerCase(); - const lowerQuery = query.toLowerCase(); - if (!lowerLabel.startsWith(lowerQuery) || lowerLabel === lowerQuery) { - return null; - } - - return { slashPos, cursorPos: selection.from, query, item: top }; -} - -function createGhostWidget(text: string): HTMLElement { - const span = document.createElement("span"); - span.textContent = text; - span.className = "cli-command-ghost pointer-events-none text-[var(--gray-9)]"; - return span; -} - -function acceptGhost( - state: EditorState, - dispatch: (tr: Transaction) => void, -): boolean { - const ghost = getGhost(state); - if (!ghost) return false; - - const chipType = state.schema.nodes.mentionChip; - if (!chipType) return false; - - const chip = chipType.create({ - type: "command", - id: ghost.item.id, - label: ghost.item.label, - pastedText: false, - }); - const space = state.schema.text(" "); - - dispatch( - state.tr - .replaceWith(ghost.slashPos, ghost.cursorPos, [chip, space]) - .setMeta(pluginKey, { type: "reset" } satisfies GhostMeta), - ); - return true; -} - -export function createCommandGhostText(sessionId: string) { - return Extension.create({ - name: "commandGhostText", - - addProseMirrorPlugins() { - return [ - new Plugin({ - key: pluginKey, - state: { - init: () => ({ ghost: null, dismissedAt: null }), - apply: (tr, prev, _old, next) => { - const meta = tr.getMeta(pluginKey) as GhostMeta | undefined; - - if (meta?.type === "reset") { - return { ghost: null, dismissedAt: null }; - } - - const ghost = computeGhost(sessionId, next); - - if (meta?.type === "dismiss") { - return { ghost: null, dismissedAt: ghost?.slashPos ?? null }; - } - - const suppressed = - prev.dismissedAt !== null && - ghost?.slashPos === prev.dismissedAt; - - if (suppressed) { - return { ghost: null, dismissedAt: prev.dismissedAt }; - } - - return { ghost, dismissedAt: null }; - }, - }, - props: { - decorations(state) { - const ghost = getGhost(state); - if (!ghost) return null; - - const remainder = ghost.item.label.slice(ghost.query.length); - if (!remainder) return null; - - return DecorationSet.create(state.doc, [ - Decoration.widget( - ghost.cursorPos, - createGhostWidget(remainder), - { - side: 1, - key: "command-ghost", - }, - ), - ]); - }, - handleKeyDown(view, event) { - if (!getGhost(view.state)) return false; - - if (event.key === "Tab") { - event.preventDefault(); - return acceptGhost(view.state, view.dispatch); - } - - if (event.key === "Escape") { - event.preventDefault(); - view.dispatch( - view.state.tr.setMeta(pluginKey, { - type: "dismiss", - } satisfies GhostMeta), - ); - return true; - } - - return false; - }, - }, - }), - ]; - }, - }); -} diff --git a/packages/ui/src/features/message-editor/types.ts b/packages/ui/src/features/message-editor/types.ts index 8420137e3d..2552db47a9 100644 --- a/packages/ui/src/features/message-editor/types.ts +++ b/packages/ui/src/features/message-editor/types.ts @@ -5,8 +5,6 @@ import type { MentionChip, } from "@posthog/core/message-editor/content"; import type { GithubRefKind, GithubRefState } from "@posthog/shared"; - -export type GithubIssueState = GithubRefState; export type { GithubRefKind, GithubRefState }; export interface EditorHandle { @@ -54,10 +52,3 @@ export interface IssueSuggestionItem extends SuggestionItem { labels: string[]; isDraft?: boolean; } - -export type SuggestionLoadingState = "idle" | "loading" | "error" | "success"; - -export interface SuggestionPosition { - x: number; - y: number; -} diff --git a/packages/ui/src/features/message-editor/utils/persistFile.ts b/packages/ui/src/features/message-editor/utils/persistFile.ts index 5b88a499c1..7698982cc1 100644 --- a/packages/ui/src/features/message-editor/utils/persistFile.ts +++ b/packages/ui/src/features/message-editor/utils/persistFile.ts @@ -2,7 +2,6 @@ import type { FileAttachment } from "@posthog/core/message-editor/content"; import { type PersistedFile, persistBrowserFile as persistBrowserFileCore, - persistGenericFile as persistGenericFileCore, persistImageFile as persistImageFileCore, persistImageFilePath as persistImageFilePathCore, persistTextContent as persistTextContentCore, @@ -29,10 +28,6 @@ export function persistTextContent( return persistTextContentCore(host(), text, originalName); } -export function persistGenericFile(file: File): Promise { - return persistGenericFileCore(host(), file); -} - export function persistImageFilePath( filePath: string, ): Promise<{ id: string; label: string }> { diff --git a/packages/ui/src/features/onboarding/hooks/useProjectsWithIntegrations.ts b/packages/ui/src/features/onboarding/hooks/useProjectsWithIntegrations.ts index 8f0a13f02c..fee025d189 100644 --- a/packages/ui/src/features/onboarding/hooks/useProjectsWithIntegrations.ts +++ b/packages/ui/src/features/onboarding/hooks/useProjectsWithIntegrations.ts @@ -7,14 +7,6 @@ import { AUTH_SCOPED_QUERY_META } from "../../auth/useCurrentUser"; import type { Integration } from "../../integrations/store"; import { useProjects } from "../../projects/useProjects"; -export interface ProjectWithIntegrations { - id: number; - name: string; - organization: { id: string; name: string }; - integrations: Integration[]; - hasGithubIntegration: boolean; -} - export function useProjectsWithIntegrations() { const { projects } = useProjects(); const projectsLoading = !useAuthStateFetched(); diff --git a/packages/ui/src/features/panels/components/PanelTree.tsx b/packages/ui/src/features/panels/components/PanelTree.tsx index 410fd1adbd..e69de29bb2 100644 --- a/packages/ui/src/features/panels/components/PanelTree.tsx +++ b/packages/ui/src/features/panels/components/PanelTree.tsx @@ -1,47 +0,0 @@ -/** - * JSX-based panel tree builder. - * Use these components to declaratively define panel layouts. - * - * Example: - * - * - * {logsContent} - * - * {content} - * - */ - -export interface PanelGroupTreeProps { - direction: "horizontal" | "vertical"; - sizes?: number[]; - children: React.ReactNode; -} - -export interface PanelLeafProps { - showTabs?: boolean; - droppable?: boolean; - activeTabId?: string; - children: React.ReactNode; -} - -export interface PanelTabProps { - id?: string; - label?: string; - icon?: React.ReactNode; - closeable?: boolean; - onClose?: () => void; - onSelect?: () => void; - children: React.ReactNode; -} - -export const PanelGroupTree: React.FC = ({ children }) => { - return <>{children}; -}; - -export const PanelLeaf: React.FC = ({ children }) => { - return <>{children}; -}; - -export const PanelTab: React.FC = ({ children }) => { - return <>{children}; -}; diff --git a/packages/ui/src/features/panels/panelConstants.ts b/packages/ui/src/features/panels/panelConstants.ts index 86ea661812..b23d2960ba 100644 --- a/packages/ui/src/features/panels/panelConstants.ts +++ b/packages/ui/src/features/panels/panelConstants.ts @@ -3,9 +3,3 @@ export { DEFAULT_TAB_IDS, PANEL_SIZES, } from "@posthog/core/panels/panelConstants"; - -export const UI_SIZES = { - TAB_HEIGHT: 40, - TAB_LABEL_MAX_WIDTH: 200, - DROP_ZONE_SIZE: "20%", -} as const; diff --git a/packages/ui/src/features/panels/panelStoreHelpers.ts b/packages/ui/src/features/panels/panelStoreHelpers.ts index d450e912d6..0b0a3587c4 100644 --- a/packages/ui/src/features/panels/panelStoreHelpers.ts +++ b/packages/ui/src/features/panels/panelStoreHelpers.ts @@ -1,23 +1,13 @@ import * as core from "@posthog/core/panels/panelStoreHelpers"; import type { TaskLayout } from "./panelLayoutStore"; -import type { GroupPanel, LeafPanel, PanelNode, Tab } from "./panelTypes"; +import type { LeafPanel, PanelNode } from "./panelTypes"; export type { ParsedTabId, SplitConfig, TabType, } from "@posthog/core/panels/panelStoreHelpers"; - -export const DEFAULT_FALLBACK_TAB = core.DEFAULT_FALLBACK_TAB; - -export const createFileTabId = core.createFileTabId; export const parseTabId = core.parseTabId; -export const createTabLabel = core.createTabLabel; -export const generatePanelId = core.generatePanelId; -export const resetPanelIdCounter = core.resetPanelIdCounter; -export const getSplitConfig = core.getSplitConfig; -export const selectNextTabAfterClose = core.selectNextTabAfterClose; - export const findPanelById = core.findPanelById as ( node: PanelNode, panelId: string, @@ -27,41 +17,6 @@ export const getLeafPanel = core.getLeafPanel as ( tree: PanelNode, panelId: string, ) => LeafPanel | null; - -export const getGroupPanel = core.getGroupPanel as ( - tree: PanelNode, - panelId: string, -) => GroupPanel | null; - -export const createNewTab = core.createNewTab as ( - tabId: string, - closeable?: boolean, - isPreview?: boolean, -) => Tab; - -export const addNewTabToPanel = core.addNewTabToPanel as ( - panel: PanelNode, - tabId: string, - closeable?: boolean, - isPreview?: boolean, -) => PanelNode; - -export const updateMetadataForTab = core.updateMetadataForTab as ( - layout: TaskLayout, - tabId: string, - action: "add" | "remove", -) => Pick; - -export const applyCleanupWithFallback = core.applyCleanupWithFallback as ( - cleanedTree: PanelNode | null, - originalTree: PanelNode, -) => PanelNode; - -export const isTabActiveInTree = core.isTabActiveInTree as ( - tree: PanelNode, - tabId: string, -) => boolean; - export const isFileTabActiveInTree = core.isFileTabActiveInTree as ( tree: PanelNode, filePath: string, diff --git a/packages/ui/src/features/panels/panelTree.ts b/packages/ui/src/features/panels/panelTree.ts index 833e7271ec..84393bfcc5 100644 --- a/packages/ui/src/features/panels/panelTree.ts +++ b/packages/ui/src/features/panels/panelTree.ts @@ -1,50 +1,6 @@ import * as core from "@posthog/core/panels/panelTree"; import type { PanelNode, Tab } from "./panelTypes"; - -export const removeTabFromPanel = core.removeTabFromPanel as ( - node: PanelNode, - tabId: string, -) => PanelNode; - -export const addTabToPanel = core.addTabToPanel as ( - node: PanelNode, - tab: Tab, -) => PanelNode; - -export const setActiveTabInPanel = core.setActiveTabInPanel as ( - node: PanelNode, - tabId: string, -) => PanelNode; - -export const findTabInPanel = core.findTabInPanel as ( - panel: Extract, - tabId: string, -) => Tab | undefined; - export const findTabInTree = core.findTabInTree as ( node: PanelNode, tabId: string, ) => { panelId: string; tab: Tab } | null; - -export const updateTreeNode = core.updateTreeNode as ( - node: PanelNode, - targetId: string, - updateFn: (node: PanelNode) => PanelNode, -) => PanelNode; - -export const cleanupNode = core.cleanupNode as ( - node: PanelNode, -) => PanelNode | null; - -export const mergeTreeContent = core.mergeTreeContent as ( - existingTree: PanelNode, - newTree: PanelNode, -) => PanelNode; - -export const isLeaf = core.isLeaf as ( - node: PanelNode | null, -) => node is Extract; - -export const isGroup = core.isGroup as ( - node: PanelNode | null, -) => node is Extract; diff --git a/packages/ui/src/features/permissions/types.ts b/packages/ui/src/features/permissions/types.ts index 1505da5062..1513ee5f03 100644 --- a/packages/ui/src/features/permissions/types.ts +++ b/packages/ui/src/features/permissions/types.ts @@ -42,15 +42,8 @@ export { type DiffContent, findDiffContent, } from "@posthog/ui/features/sessions/components/session-update/toolCallUtils"; -export type TerminalContent = Extract; export type StandardContent = Extract; -export function findTerminalContent( - content: ToolCallContent[] | null | undefined, -): TerminalContent | undefined { - return content?.find((c): c is TerminalContent => c.type === "terminal"); -} - export function findTextContent( content: ToolCallContent[] | null | undefined, ): string | undefined { diff --git a/packages/ui/src/features/projects/useProjectQuery.ts b/packages/ui/src/features/projects/useProjectQuery.ts index 1c0023f3d1..e69de29bb2 100644 --- a/packages/ui/src/features/projects/useProjectQuery.ts +++ b/packages/ui/src/features/projects/useProjectQuery.ts @@ -1,21 +0,0 @@ -import { useAuthStateValue } from "@posthog/ui/features/auth/store"; -import { useAuthenticatedQuery } from "@posthog/ui/hooks/useAuthenticatedQuery"; - -export function useProjectQuery() { - const projectId = useAuthStateValue((state) => state.currentProjectId); - - return useAuthenticatedQuery( - ["project", projectId], - async (client) => { - if (!projectId) { - throw new Error("No project ID available"); - } - const data = await client.getProject(projectId); - return data; - }, - { - staleTime: 5 * 60 * 1000, - enabled: !!projectId, - }, - ); -} diff --git a/packages/ui/src/features/sessions/components/session-update/parseFileMentions.tsx b/packages/ui/src/features/sessions/components/session-update/parseFileMentions.tsx index f50e9bde9d..5c58a77be0 100644 --- a/packages/ui/src/features/sessions/components/session-update/parseFileMentions.tsx +++ b/packages/ui/src/features/sessions/components/session-update/parseFileMentions.tsx @@ -41,7 +41,7 @@ export const InlineMarkdown = memo(function InlineMarkdown({ ); }); -export function hasMentionTags(content: string): boolean { +function hasMentionTags(content: string): boolean { return MENTION_TAG_TEST.test(content) || SLASH_COMMAND_START.test(content); } @@ -88,7 +88,7 @@ export function MentionChip({ ); } -export function parseMentionTags(content: string): ReactNode[] { +function parseMentionTags(content: string): ReactNode[] { const parts: ReactNode[] = []; let lastIndex = 0; diff --git a/packages/ui/src/features/sessions/hooks/useAgentVersion.ts b/packages/ui/src/features/sessions/hooks/useAgentVersion.ts index 4d7dd94a07..e69de29bb2 100644 --- a/packages/ui/src/features/sessions/hooks/useAgentVersion.ts +++ b/packages/ui/src/features/sessions/hooks/useAgentVersion.ts @@ -1,34 +0,0 @@ -import { useSessionStore } from "@posthog/ui/features/sessions/sessionStore"; -import { isAgentVersion } from "@posthog/ui/utils/agentVersion"; - -/** - * Returns the connected agent's version for the given task, or `undefined` - * if no session is active or the agent hasn't reported a version yet. - */ -export function useAgentVersion( - taskId: string | undefined, -): string | undefined { - return useSessionStore((s) => { - if (!taskId) return undefined; - const taskRunId = s.taskIdIndex[taskId]; - if (!taskRunId) return undefined; - return s.sessions[taskRunId]?.agentVersion; - }); -} - -/** - * Returns true when the connected agent's version satisfies the given semver - * range. Fails closed when the version is unknown — feature gates stay off. - * - * Examples: - * useIsAgentVersion(taskId, ">=0.40.1") - * useIsAgentVersion(taskId, ">1.0.0") - * useIsAgentVersion(taskId, ">=0.40.0 <1.0.0") - */ -export function useIsAgentVersion( - taskId: string | undefined, - range: string, -): boolean { - const version = useAgentVersion(taskId); - return isAgentVersion(version, range); -} diff --git a/packages/ui/src/features/sessions/types.ts b/packages/ui/src/features/sessions/types.ts index 353d1abbc3..794247ee49 100644 --- a/packages/ui/src/features/sessions/types.ts +++ b/packages/ui/src/features/sessions/types.ts @@ -28,7 +28,3 @@ export interface ToolCall { } export type Plan = Extract; -export type ConfigOptionUpdate = Extract< - SessionUpdate, - { sessionUpdate: "config_option_update" } ->; diff --git a/packages/ui/src/features/settings/hooks/useOpenSettings.ts b/packages/ui/src/features/settings/hooks/useOpenSettings.ts index a1ecc51fcd..10bfbc5c77 100644 --- a/packages/ui/src/features/settings/hooks/useOpenSettings.ts +++ b/packages/ui/src/features/settings/hooks/useOpenSettings.ts @@ -2,7 +2,6 @@ import { useSettingsPageStore } from "@posthog/ui/features/settings/stores/setti import type { SettingsCategory } from "@posthog/ui/features/settings/types"; import * as nav from "@posthog/ui/router/navigationBridge"; import { useRouterState } from "@tanstack/react-router"; -import { useCallback } from "react"; interface SettingsContext { repoPath?: string; @@ -44,10 +43,6 @@ export function closeSettings(): void { } } -export function useCloseSettings(): typeof closeSettings { - return useCallback(closeSettings, []); -} - /** * True when the current route is anywhere under `/settings/*`. */ diff --git a/packages/ui/src/features/settings/sections/AccountSettings.tsx b/packages/ui/src/features/settings/sections/AccountSettings.tsx index 9d582049a9..e69de29bb2 100644 --- a/packages/ui/src/features/settings/sections/AccountSettings.tsx +++ b/packages/ui/src/features/settings/sections/AccountSettings.tsx @@ -1,88 +0,0 @@ -import { SignOut } from "@phosphor-icons/react"; -import { formatRegionBadge } from "@posthog/shared"; -import { useOptionalAuthenticatedClient } from "@posthog/ui/features/auth/authClient"; -import { useAuthStateValue } from "@posthog/ui/features/auth/store"; -import { useLogoutMutation } from "@posthog/ui/features/auth/useAuthMutations"; -import { useCurrentUser } from "@posthog/ui/features/auth/useCurrentUser"; -import { getUserInitials } from "@posthog/ui/features/auth/userInitials"; -import { useSeat } from "@posthog/ui/features/billing/useSeat"; -import { Avatar, Badge, Button, Flex, Spinner, Text } from "@radix-ui/themes"; - -export function AccountSettings() { - const isAuthenticated = useAuthStateValue( - (state) => state.status === "authenticated", - ); - const cloudRegion = useAuthStateValue((state) => state.cloudRegion); - const logoutMutation = useLogoutMutation(); - const client = useOptionalAuthenticatedClient(); - const { data: user, isLoading } = useCurrentUser({ - client, - enabled: isAuthenticated, - }); - const { seat, isPro, planLabel } = useSeat(); - - const handleLogout = () => { - logoutMutation.mutate(); - }; - - if (!isAuthenticated) { - return ( - - - You are not currently authenticated. Please sign in from the main - screen. - - - ); - } - - if (isLoading || !user) { - return ( - - - - ); - } - - const initials = getUserInitials(user); - - return ( - - - - - - {user.first_name && user.last_name - ? `${user.first_name} ${user.last_name}` - : user.email} - - - - {user.email} - - {cloudRegion && ( - - {formatRegionBadge(cloudRegion)} - - )} - {seat && ( - - {planLabel} - - )} - - - - - - ); -} diff --git a/packages/ui/src/features/sidebar/types.ts b/packages/ui/src/features/sidebar/types.ts index ef843a979c..05c154d5ad 100644 --- a/packages/ui/src/features/sidebar/types.ts +++ b/packages/ui/src/features/sidebar/types.ts @@ -1,7 +1,5 @@ import type { ReactNode } from "react"; -export type SortMode = "updated" | "created"; - export interface SidebarItemAction { icon: ReactNode; onClick: () => void; diff --git a/packages/ui/src/features/tasks/taskStore.ts b/packages/ui/src/features/tasks/taskStore.ts index ca9dc05a67..e69de29bb2 100644 --- a/packages/ui/src/features/tasks/taskStore.ts +++ b/packages/ui/src/features/tasks/taskStore.ts @@ -1,102 +0,0 @@ -import * as filters from "@posthog/core/tasks/filters"; -import { create } from "zustand"; -import { persist } from "zustand/middleware"; -import type { TaskState } from "./taskStore.types"; - -export const useTaskStore = create()( - persist( - (set) => ({ - selectedIndex: null, - hoveredIndex: null, - contextMenuIndex: null, - filter: "", - orderBy: "created_at", - orderDirection: "desc", - groupBy: "none", - expandedGroups: {}, - activeFilters: {}, - filterMatchMode: "all", - filterSearchQuery: "", - filterMenuSelectedIndex: -1, - isFilterDropdownOpen: false, - editingFilterBadgeKey: null, - - setSelectedIndex: (index) => set({ selectedIndex: index }), - setHoveredIndex: (index) => set({ hoveredIndex: index }), - setContextMenuIndex: (index) => set({ contextMenuIndex: index }), - - setFilter: (filter) => set({ filter }), - setOrderBy: (orderBy) => set({ orderBy }), - setOrderDirection: (orderDirection) => set({ orderDirection }), - setGroupBy: (groupBy) => set({ groupBy }), - - toggleGroupExpanded: (groupName) => - set((state) => ({ - expandedGroups: { - ...state.expandedGroups, - [groupName]: !(state.expandedGroups[groupName] ?? true), - }, - })), - - setActiveFilters: (activeFilters) => set({ activeFilters }), - clearActiveFilters: () => set({ activeFilters: {} }), - - toggleFilter: (category, value, operator) => - set((state) => ({ - activeFilters: filters.toggleFilter( - state.activeFilters, - category, - value, - operator, - ), - })), - - addFilter: (category, value, operator) => - set((state) => ({ - activeFilters: filters.addFilter( - state.activeFilters, - category, - value, - operator, - ), - })), - - updateFilter: (category, oldValue, newValue) => - set((state) => ({ - activeFilters: filters.updateFilter( - state.activeFilters, - category, - oldValue, - newValue, - ), - })), - - toggleFilterOperator: (category, value) => - set((state) => ({ - activeFilters: filters.toggleFilterOperator( - state.activeFilters, - category, - value, - ), - })), - - setFilterMatchMode: (mode) => set({ filterMatchMode: mode }), - setFilterSearchQuery: (query) => set({ filterSearchQuery: query }), - setFilterMenuSelectedIndex: (index) => - set({ filterMenuSelectedIndex: index }), - setIsFilterDropdownOpen: (open) => set({ isFilterDropdownOpen: open }), - setEditingFilterBadgeKey: (key) => set({ editingFilterBadgeKey: key }), - }), - { - name: "task-store", - partialize: (state) => ({ - orderBy: state.orderBy, - orderDirection: state.orderDirection, - groupBy: state.groupBy, - expandedGroups: state.expandedGroups, - activeFilters: state.activeFilters, - filterMatchMode: state.filterMatchMode, - }), - }, - ), -); diff --git a/packages/ui/src/features/workspace/useWorkspaceMutations.ts b/packages/ui/src/features/workspace/useWorkspaceMutations.ts index d8a385bc13..6fd87b21df 100644 --- a/packages/ui/src/features/workspace/useWorkspaceMutations.ts +++ b/packages/ui/src/features/workspace/useWorkspaceMutations.ts @@ -45,21 +45,6 @@ export function useCreateWorkspace(): { isPending: boolean } { return { isPending: mutation.isPending }; } -export function useDeleteWorkspace(): { isPending: boolean } { - const trpc = useHostTRPC(); - const invalidateCaches = useInvalidateWorkspaceCaches(); - - const mutation = useMutation( - trpc.workspace.delete.mutationOptions({ - onSuccess: (_data, variables) => { - void invalidateCaches(variables.mainRepoPath); - }, - }), - ); - - return { isPending: mutation.isPending }; -} - export function useEnsureWorkspace(): { ensureWorkspace: ( taskId: string, diff --git a/packages/ui/src/hooks/useAuthenticatedClient.ts b/packages/ui/src/hooks/useAuthenticatedClient.ts index 32bd6b1a3a..e69de29bb2 100644 --- a/packages/ui/src/hooks/useAuthenticatedClient.ts +++ b/packages/ui/src/hooks/useAuthenticatedClient.ts @@ -1,5 +0,0 @@ -import { useAuthenticatedClient as useClient } from "@posthog/ui/features/auth/authClient"; - -export function useAuthenticatedClient() { - return useClient(); -} diff --git a/packages/ui/src/primitives/CountBadge.tsx b/packages/ui/src/primitives/CountBadge.tsx index 68b145de0e..e69de29bb2 100644 --- a/packages/ui/src/primitives/CountBadge.tsx +++ b/packages/ui/src/primitives/CountBadge.tsx @@ -1,35 +0,0 @@ -import { cn } from "@posthog/quill"; - -interface CountBadgeProps { - count: number; - className?: string; - title?: string; -} - -function formatCount(count: number): string { - if (count > 99) return "99+"; - return String(count); -} - -function countBadgeSizeClass(label: string): string { - return label.length > 1 - ? "h-[18px] min-w-[18px] shrink-0 px-1" - : "h-[18px] w-[18px] shrink-0"; -} - -export function CountBadge({ count, className, title }: CountBadgeProps) { - const label = formatCount(count); - - return ( - - {label} - - ); -} diff --git a/packages/ui/src/primitives/KeyboardShortcutsSheet.tsx b/packages/ui/src/primitives/KeyboardShortcutsSheet.tsx index 3fc1521e84..09e3c38831 100644 --- a/packages/ui/src/primitives/KeyboardShortcutsSheet.tsx +++ b/packages/ui/src/primitives/KeyboardShortcutsSheet.tsx @@ -1,12 +1,6 @@ -import { Box, Dialog, Flex, Text } from "@radix-ui/themes"; -import { useMemo, useState } from "react"; -import { useHotkeys } from "react-hotkeys-hook"; -import { - CATEGORY_LABELS, - formatHotkeyParts, - getShortcutsByCategory, - type ShortcutCategory, -} from "../features/command/keyboard-shortcuts"; +import { Flex } from "@radix-ui/themes"; +import { useState } from "react"; +import { formatHotkeyParts } from "../features/command/keyboard-shortcuts"; function Keycap({ label, size = "md" }: { label: string; size?: "sm" | "md" }) { const [pressed, setPressed] = useState(false); @@ -44,129 +38,7 @@ function Keycap({ label, size = "md" }: { label: string; size?: "sm" | "md" }) { ); } -interface KeyboardShortcutsSheetProps { - open: boolean; - onOpenChange: (open: boolean) => void; -} - -export function KeyboardShortcutsSheet({ - open, - onOpenChange, -}: KeyboardShortcutsSheetProps) { - useHotkeys("escape", () => onOpenChange(false), { - enabled: open, - enableOnContentEditable: true, - enableOnFormTags: true, - preventDefault: true, - }); - - return ( - - e.preventDefault()} - className="max-h-[80vh] overflow-hidden" - > - - - - - - - - - - - ); -} - -function ShortcutsHeader() { - const triggerParts = formatHotkeyParts("mod+/"); - - return ( - - - - Keyboard Combos - - - {triggerParts.map((part) => ( - - ))} - - - - Your cheat codes for shipping faster - - - ); -} - -export function KeyboardShortcutsList() { - const shortcutsByCategory = useMemo(() => getShortcutsByCategory(), []); - - const categoryOrder: ShortcutCategory[] = [ - "general", - "navigation", - "panels", - "editor", - ]; - - return ( - - {categoryOrder.map((category) => { - const shortcuts = shortcutsByCategory[category]; - if (shortcuts.length === 0) return null; - - const uniqueShortcuts = shortcuts.reduce( - (acc, shortcut) => { - const existing = acc.find( - (s) => s.description === shortcut.description, - ); - if (!existing) { - acc.push(shortcut); - } - return acc; - }, - [] as typeof shortcuts, - ); - - return ( - - - {CATEGORY_LABELS[category]} - - - {uniqueShortcuts.map((shortcut) => ( - - {shortcut.description} - - - ))} - - - ); - })} - - ); -} - -function SingleShortcutKeys({ keys }: { keys: string }) { +function _SingleShortcutKeys({ keys }: { keys: string }) { const parts = formatHotkeyParts(keys); return ( @@ -177,25 +49,3 @@ function SingleShortcutKeys({ keys }: { keys: string }) { ); } - -function ShortcutKeys({ - keys, - alternateKeys, -}: { - keys: string; - alternateKeys?: string; -}) { - if (!alternateKeys) { - return ; - } - - return ( - - - - or - - - - ); -} diff --git a/packages/ui/src/primitives/ZenHedgehog.tsx b/packages/ui/src/primitives/ZenHedgehog.tsx index fd20f45816..e69de29bb2 100644 --- a/packages/ui/src/primitives/ZenHedgehog.tsx +++ b/packages/ui/src/primitives/ZenHedgehog.tsx @@ -1,73 +0,0 @@ -import { motion } from "framer-motion"; -import { useRef, useState } from "react"; -import roboZen from "../assets/images/robo-zen.png"; -import zenHedgehog from "../assets/images/zen.png"; - -const DELAY_MS = 400; // calm pause before shaking starts -const GROW_MS = 3500; // time to reach full intensity -const MAX_X = 15; // px -const MAX_ROTATE = 7; // deg -const MIN_FREQ = 8; // Hz at onset -const MAX_FREQ = 26; // Hz at peak - -export function ZenHedgehog() { - const [hovered, setHovered] = useState(false); - const imgRef = useRef(null); - const rafRef = useRef(null); - const enterTimeRef = useRef(null); - - const tick = (now: number) => { - if (!enterTimeRef.current) enterTimeRef.current = now; - const elapsed = now - enterTimeRef.current; - const t = Math.max(0, elapsed - DELAY_MS); - const progress = Math.min(t / GROW_MS, 1); - const amplitude = progress * progress; // quadratic ease-in - - if (amplitude > 0 && imgRef.current) { - const freq = MIN_FREQ + (MAX_FREQ - MIN_FREQ) * progress; - const phase = (now / 1000) * freq * 2 * Math.PI; - const x = Math.sin(phase) * MAX_X * amplitude; - const rotate = Math.sin(phase + 0.5) * MAX_ROTATE * amplitude; - const scale = 1 + Math.sin(phase * 1.7) * 0.03 * amplitude; - imgRef.current.style.transform = `translateX(${x}px) rotate(${rotate}deg) scale(${scale})`; - } - - rafRef.current = requestAnimationFrame(tick); - }; - - const handleMouseEnter = () => { - setHovered(true); - enterTimeRef.current = null; - rafRef.current = requestAnimationFrame(tick); - }; - - const handleMouseLeave = () => { - setHovered(false); - if (rafRef.current) { - cancelAnimationFrame(rafRef.current); - rafRef.current = null; - } - enterTimeRef.current = null; - if (imgRef.current) { - imgRef.current.style.transform = ""; - } - }; - - return ( - // biome-ignore lint/a11y/noStaticElementInteractions: decorative hover animation -
- -
- ); -} diff --git a/packages/ui/src/primitives/confetti.ts b/packages/ui/src/primitives/confetti.ts index 46c03bfab9..e257a1ddcf 100644 --- a/packages/ui/src/primitives/confetti.ts +++ b/packages/ui/src/primitives/confetti.ts @@ -41,21 +41,3 @@ export function shipIt(): void { }; fire(); } - -export function fireFrom( - element: HTMLElement, - options?: confetti.Options, -): void { - if (reducedMotion()) return; - const rect = element.getBoundingClientRect(); - const x = (rect.left + rect.width / 2) / window.innerWidth; - const y = (rect.top + rect.height / 2) / window.innerHeight; - confetti({ - particleCount: 40, - spread: 60, - startVelocity: 35, - origin: { x, y }, - colors: POSTHOG_COLORS, - ...options, - }); -} diff --git a/packages/ui/src/router/navigationBridge.ts b/packages/ui/src/router/navigationBridge.ts index b21b2083e9..b7101cb19e 100644 --- a/packages/ui/src/router/navigationBridge.ts +++ b/packages/ui/src/router/navigationBridge.ts @@ -127,13 +127,3 @@ export function goForwardInHistory(): void { export function getCurrentMatches() { return getRouterOrNull()?.state.matches ?? []; } - -export function getCurrentLocation() { - return getRouterOrNull()?.state.location ?? null; -} - -export function subscribeToRouterResolved(handler: () => void): () => void { - const router = getRouterOrNull(); - if (!router) return () => {}; - return router.subscribe("onResolved", handler); -} diff --git a/packages/ui/src/router/routerRef.ts b/packages/ui/src/router/routerRef.ts index b0796aa1a7..3ddda691fe 100644 --- a/packages/ui/src/router/routerRef.ts +++ b/packages/ui/src/router/routerRef.ts @@ -18,13 +18,6 @@ export function setRouter(instance: typeof RouterInstance): void { routerInstance = instance; } -export function getRouter(): typeof RouterInstance { - if (!routerInstance) { - throw new Error("Router accessed before initialization"); - } - return routerInstance; -} - // Nullable accessor for imperative navigation helpers that must not throw when // the router isn't mounted yet (early boot, unit tests). In the running app the // instance is always set before these fire; callers treat null as "no router, diff --git a/packages/ui/src/router/useOpenTask.ts b/packages/ui/src/router/useOpenTask.ts index 9bb7fc64e7..c306aa7e57 100644 --- a/packages/ui/src/router/useOpenTask.ts +++ b/packages/ui/src/router/useOpenTask.ts @@ -12,7 +12,6 @@ import { IMPERATIVE_QUERY_CLIENT, type ImperativeQueryClient, } from "@posthog/ui/shell/queryClient"; -import { useCallback } from "react"; import * as nav from "./navigationBridge"; /** @@ -43,11 +42,6 @@ export async function openTask(task: Task): Promise { } } -/** React hook wrapper returning a stable `openTask` callback. */ -export function useOpenTask(): (task: Task) => Promise { - return useCallback(openTask, []); -} - export interface TaskInputNavigationOptions { folderId?: string; initialPrompt?: string; @@ -92,7 +86,3 @@ export function openTaskInput( }); nav.navigateToCode(); } - -export function useOpenTaskInput(): typeof openTaskInput { - return useCallback(openTaskInput, []); -} diff --git a/packages/ui/src/shell/FullScreenLayout.tsx b/packages/ui/src/shell/FullScreenLayout.tsx deleted file mode 100644 index f91a471704..0000000000 --- a/packages/ui/src/shell/FullScreenLayout.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { EXTERNAL_LINKS } from "@posthog/shared"; -import { UpdateBanner } from "@posthog/ui/features/sidebar/components/UpdateBanner"; -import { FullScreenLayout as UiFullScreenLayout } from "@posthog/ui/primitives/FullScreenLayout"; -import { openExternalUrl } from "@posthog/ui/shell/openExternal"; -import type { ReactNode } from "react"; - -interface FullScreenLayoutProps { - children: ReactNode; - footerLeft?: ReactNode; - footerRight?: ReactNode; -} - -export function FullScreenLayout(props: FullScreenLayoutProps) { - return ( - } - onOpenSupport={() => openExternalUrl(EXTERNAL_LINKS.discord)} - /> - ); -} diff --git a/packages/ui/src/shell/themeStore.ts b/packages/ui/src/shell/themeStore.ts index 7b1c3031cb..d55f791a61 100644 --- a/packages/ui/src/shell/themeStore.ts +++ b/packages/ui/src/shell/themeStore.ts @@ -25,13 +25,6 @@ export function resolveIsDarkMode(theme: ThemePreference): boolean { } const THEME_CYCLE: ThemePreference[] = ["dark", "light", "system"]; - -export const THEME_CYCLE_LABELS: Record = { - dark: "Switch to light mode", - light: "Switch to system theme", - system: "Switch to dark mode", -}; - export const useThemeStore = create()( persist( (set) => ({ diff --git a/packages/ui/src/utils/posthogLinks.ts b/packages/ui/src/utils/posthogLinks.ts index 38852dee55..dc8a9b16a9 100644 --- a/packages/ui/src/utils/posthogLinks.ts +++ b/packages/ui/src/utils/posthogLinks.ts @@ -62,10 +62,6 @@ export function experimentUrl( ); } -export function featureFlagsIndexUrl(overrides?: LinkOverrides): string | null { - return withProjectId((pid) => `/project/${pid}/feature_flags`, overrides); -} - export function skillUrl( skillName: string, overrides?: LinkOverrides, diff --git a/packages/workspace-client/src/environment.ts b/packages/workspace-client/src/environment.ts index 5e870ce2e7..6e426a9161 100644 --- a/packages/workspace-client/src/environment.ts +++ b/packages/workspace-client/src/environment.ts @@ -1,7 +1,2 @@ -export type { - CreateEnvironmentInput, - Environment, - EnvironmentAction, - UpdateEnvironmentInput, -} from "@posthog/workspace-server/services/environment/schemas"; +export type { Environment } from "@posthog/workspace-server/services/environment/schemas"; export { slugifyEnvironmentName } from "@posthog/workspace-server/services/environment/schemas"; diff --git a/packages/workspace-client/src/trpc.tsx b/packages/workspace-client/src/trpc.tsx index 4d15959bd1..00b6bcbd3f 100644 --- a/packages/workspace-client/src/trpc.tsx +++ b/packages/workspace-client/src/trpc.tsx @@ -4,5 +4,4 @@ import { createTRPCContext } from "@trpc/tanstack-react-query"; export const { TRPCProvider: WorkspaceTRPCProvider, useTRPC: useWorkspaceTRPC, - useTRPCClient: useWorkspaceTRPCClient, } = createTRPCContext(); diff --git a/packages/workspace-client/src/types.ts b/packages/workspace-client/src/types.ts index 88832c933b..a24c028662 100644 --- a/packages/workspace-client/src/types.ts +++ b/packages/workspace-client/src/types.ts @@ -1,11 +1,7 @@ export type { FocusBranchRenamedEvent, - FocusForeignBranchCheckoutEvent, FocusResult, FocusSession, StashResult, } from "@posthog/workspace-server/services/focus/schemas"; -export type { - FileWatcherEvent, - FileWatcherEventKind, -} from "@posthog/workspace-server/services/watcher/schemas"; +export type { FileWatcherEvent } from "@posthog/workspace-server/services/watcher/schemas"; diff --git a/packages/workspace-server/package.json b/packages/workspace-server/package.json index bc599818bc..1365640c77 100644 --- a/packages/workspace-server/package.json +++ b/packages/workspace-server/package.json @@ -49,6 +49,8 @@ "@types/better-sqlite3": "^7.6.13", "@types/node": "catalog:", "drizzle-kit": "^0.31.9", + "memfs": "^4.56.10", + "tsup": "catalog:", "typescript": "catalog:", "vitest": "^4.0.10" } diff --git a/packages/workspace-server/src/services/agent/schemas.ts b/packages/workspace-server/src/services/agent/schemas.ts index af23b1a0b3..0305027f97 100644 --- a/packages/workspace-server/src/services/agent/schemas.ts +++ b/packages/workspace-server/src/services/agent/schemas.ts @@ -1,7 +1,4 @@ -import type { - RequestPermissionRequest, - PermissionOption as SdkPermissionOption, -} from "@agentclientprotocol/sdk"; +import type { RequestPermissionRequest } from "@agentclientprotocol/sdk"; import { effortLevelSchema } from "@posthog/shared/domain-types"; import { z } from "zod"; @@ -17,23 +14,6 @@ export const credentialsSchema = z.object({ export type Credentials = z.infer; // Session config schema -export const sessionConfigSchema = z.object({ - taskId: z.string(), - taskRunId: z.string(), - repoPath: z.string(), - credentials: credentialsSchema, - logUrl: z.string().optional(), - /** The agent's session ID (for resume - SDK session ID for Claude, Codex's session ID for Codex) */ - sessionId: z.string().optional(), - adapter: z.enum(["claude", "codex"]).optional(), - /** Additional directories Claude can access beyond cwd (for worktree support) */ - additionalDirectories: z.array(z.string()).optional(), - /** Permission mode to use for the session (e.g. "default", "acceptEdits", "plan", "bypassPermissions") */ - permissionMode: z.string().optional(), -}); - -export type SessionConfig = z.infer; - // Start session input/output export const startSessionInput = z.object({ @@ -73,9 +53,6 @@ export const modelOptionSchema = z.object({ description: z.string().nullish(), provider: z.string().optional(), }); - -export type ModelOption = z.infer; - const sessionConfigSelectOptionSchema = z.looseObject({ value: z.string(), name: z.string(), @@ -117,9 +94,6 @@ export const sessionConfigOptionSchema = z.union([ sessionConfigSelectSchema, sessionConfigBooleanSchema, ]); - -export type SessionConfigOption = z.infer; - export const sessionResponseSchema = z.object({ sessionId: z.string(), channel: z.string(), @@ -139,9 +113,6 @@ export const promptInput = z.object({ sessionId: z.string(), prompt: z.array(contentBlockSchema), }); - -export type PromptInput = z.infer; - export const promptOutput = z.object({ stopReason: z.string(), _meta: z @@ -224,7 +195,6 @@ export interface AgentSessionEventPayload { payload: unknown; } -export type PermissionOption = SdkPermissionOption; export type PermissionRequestPayload = Omit< RequestPermissionRequest, "sessionId" @@ -261,17 +231,11 @@ export const respondToPermissionInput = z.object({ // For multi-question flows: all answers keyed by question text answers: z.record(z.string(), z.string()).optional(), }); - -export type RespondToPermissionInput = z.infer; - // Permission cancellation input for tRPC export const cancelPermissionInput = z.object({ taskRunId: z.string(), toolCallId: z.string(), }); - -export type CancelPermissionInput = z.infer; - export const listSessionsInput = z.object({ taskId: z.string(), }); @@ -290,11 +254,6 @@ export const notifySessionContextInput = z.object({ sessionId: z.string(), context: sessionContextChangeSchema, }); - -export type NotifySessionContextInput = z.infer< - typeof notifySessionContextInput ->; - export const sessionInfoSchema = z.object({ taskRunId: z.string(), repoPath: z.string(), diff --git a/packages/workspace-server/src/services/archive/schemas.ts b/packages/workspace-server/src/services/archive/schemas.ts index b7447c9ef6..c52b5ccdef 100644 --- a/packages/workspace-server/src/services/archive/schemas.ts +++ b/packages/workspace-server/src/services/archive/schemas.ts @@ -22,9 +22,6 @@ export const unarchiveTaskInput = z.object({ taskId: z.string(), recreateBranch: z.boolean().optional(), }); - -export type UnarchiveTaskInput = z.infer; - export const archiveTaskOutput = archivedTaskSchema; export const unarchiveTaskOutput = z.object({ diff --git a/packages/workspace-server/src/services/environment/schemas.ts b/packages/workspace-server/src/services/environment/schemas.ts index b145c14c5f..a79e0470a9 100644 --- a/packages/workspace-server/src/services/environment/schemas.ts +++ b/packages/workspace-server/src/services/environment/schemas.ts @@ -47,7 +47,6 @@ export const updateEnvironmentInput = repoPathWithIdInput.extend({ }); export type Environment = z.infer; -export type EnvironmentAction = z.infer; export type CreateEnvironmentInput = z.infer; export type UpdateEnvironmentInput = z.infer; diff --git a/packages/workspace-server/src/services/external-apps/schemas.ts b/packages/workspace-server/src/services/external-apps/schemas.ts index 42f56cb84d..71fda8704f 100644 --- a/packages/workspace-server/src/services/external-apps/schemas.ts +++ b/packages/workspace-server/src/services/external-apps/schemas.ts @@ -37,11 +37,5 @@ export const openInAppOutput = z.object({ export const getLastUsedOutput = z.object({ lastUsedApp: z.string().optional(), }); - -export type OpenInAppInput = z.infer; -export type SetLastUsedInput = z.infer; -export type CopyPathInput = z.infer; export type DetectedApplication = z.infer; export type ExternalAppType = z.infer; -export type OpenInAppOutput = z.infer; -export type GetLastUsedOutput = z.infer; diff --git a/packages/workspace-server/src/services/external-apps/types.ts b/packages/workspace-server/src/services/external-apps/types.ts index 609e32c3b6..a24dfac694 100644 --- a/packages/workspace-server/src/services/external-apps/types.ts +++ b/packages/workspace-server/src/services/external-apps/types.ts @@ -9,7 +9,3 @@ export interface AppDefinition { export interface ExternalAppsPreferences { lastUsedApp?: string; } - -export interface ExternalAppsSchema { - externalAppsPrefs: ExternalAppsPreferences; -} diff --git a/packages/workspace-server/src/services/folders/schemas.ts b/packages/workspace-server/src/services/folders/schemas.ts index 06e2c1a168..35ffc120ef 100644 --- a/packages/workspace-server/src/services/folders/schemas.ts +++ b/packages/workspace-server/src/services/folders/schemas.ts @@ -31,14 +31,6 @@ export const updateFolderAccessedInput = z.object({ }); export type RegisteredFolder = z.infer; -export type GetFoldersOutput = z.infer; -export type AddFolderInput = z.infer; -export type AddFolderOutput = z.infer; -export type RemoveFolderInput = z.infer; -export type UpdateFolderAccessedInput = z.infer< - typeof updateFolderAccessedInput ->; - export const repositoryLookupResult = z .object({ id: z.string(), @@ -49,5 +41,3 @@ export const repositoryLookupResult = z export const getRepositoryByRemoteUrlInput = z.object({ remoteUrl: z.string(), }); - -export type RepositoryLookupResult = z.infer; diff --git a/packages/workspace-server/src/services/fs/schemas.ts b/packages/workspace-server/src/services/fs/schemas.ts index acbdea4197..d6047c02f9 100644 --- a/packages/workspace-server/src/services/fs/schemas.ts +++ b/packages/workspace-server/src/services/fs/schemas.ts @@ -72,11 +72,5 @@ const fileEntry = z.object({ export const listRepoFilesOutput = z.array(fileEntry); export const readRepoFileOutput = z.string().nullable(); export const readRepoFilesOutput = z.record(z.string(), readRepoFileOutput); - -export type ListRepoFilesInput = z.infer; -export type ReadRepoFileInput = z.infer; -export type ReadRepoFilesInput = z.infer; -export type WriteRepoFileInput = z.infer; export type FileEntry = z.infer; -export type FileEntryKind = z.infer; export type BoundedReadResult = z.infer; diff --git a/packages/workspace-server/src/services/git/schemas.ts b/packages/workspace-server/src/services/git/schemas.ts index 9b417616d6..0f5b4e662d 100644 --- a/packages/workspace-server/src/services/git/schemas.ts +++ b/packages/workspace-server/src/services/git/schemas.ts @@ -200,9 +200,6 @@ export const commitInput = z.object({ // resolved in the host process where AgentService runs and passed through. env: z.record(z.string(), z.string()).optional(), }); - -export type CommitInput = z.infer; - export const commitOutput = z.object({ success: z.boolean(), message: z.string(), diff --git a/packages/workspace-server/src/services/mcp-callback/schemas.ts b/packages/workspace-server/src/services/mcp-callback/schemas.ts index c216f6ef8a..348e9de303 100644 --- a/packages/workspace-server/src/services/mcp-callback/schemas.ts +++ b/packages/workspace-server/src/services/mcp-callback/schemas.ts @@ -15,8 +15,6 @@ export type GetCallbackUrlOutput = z.infer; export const openAndWaitInput = z.object({ redirectUrl: z.string(), }); -export type OpenAndWaitInput = z.infer; - export const openAndWaitOutput = z.object({ success: z.boolean(), installationId: z.string().optional(), diff --git a/packages/workspace-server/src/services/secure-store/schemas.ts b/packages/workspace-server/src/services/secure-store/schemas.ts index 42f1811fe0..17c2a81a19 100644 --- a/packages/workspace-server/src/services/secure-store/schemas.ts +++ b/packages/workspace-server/src/services/secure-store/schemas.ts @@ -6,7 +6,3 @@ export const secureStoreSetInput = z.object({ value: z.string(), }); export const secureStoreRemoveInput = z.object({ key: z.string() }); - -export type SecureStoreGetInput = z.infer; -export type SecureStoreSetInput = z.infer; -export type SecureStoreRemoveInput = z.infer; diff --git a/packages/workspace-server/src/services/shell/schemas.ts b/packages/workspace-server/src/services/shell/schemas.ts index 904a948ed9..a7974033c7 100644 --- a/packages/workspace-server/src/services/shell/schemas.ts +++ b/packages/workspace-server/src/services/shell/schemas.ts @@ -34,13 +34,6 @@ export const executeOutput = z.object({ stderr: z.string(), exitCode: z.number(), }); - -export type SessionIdInput = z.infer; -export type CreateInput = z.infer; -export type CreateCommandInput = z.infer; -export type WriteInput = z.infer; -export type ResizeInput = z.infer; -export type ExecuteInput = z.infer; export type ExecuteOutput = z.infer; export const ShellEvent = { diff --git a/packages/workspace-server/src/services/skills/schemas.ts b/packages/workspace-server/src/services/skills/schemas.ts index 3f038e1d57..a17dbf52e8 100644 --- a/packages/workspace-server/src/services/skills/schemas.ts +++ b/packages/workspace-server/src/services/skills/schemas.ts @@ -119,7 +119,6 @@ export type ExportedSkill = z.infer; export type InstallTeamSkillInput = z.infer; export type SkillInfo = z.infer; -export type SkillScope = z.infer; export type CreateSkillInput = z.infer; export type SkillSource = z.infer; export type SkillFileEntry = z.infer; diff --git a/packages/workspace-server/src/services/suspension/schemas.ts b/packages/workspace-server/src/services/suspension/schemas.ts index c67e7dcfb1..e96242af0f 100644 --- a/packages/workspace-server/src/services/suspension/schemas.ts +++ b/packages/workspace-server/src/services/suspension/schemas.ts @@ -5,9 +5,6 @@ export const suspensionReasonSchema = z.enum([ "inactivity", "manual", ]); - -export type SuspensionReason = z.infer; - export const suspendedTaskSchema = z.object({ taskId: z.string(), suspendedAt: z.string(), @@ -26,23 +23,14 @@ export const suspensionSettingsSchema = z.object({ maxActiveWorktrees: z.number().min(1), autoSuspendAfterDays: z.number().min(1), }); - -export type SuspensionSettings = z.infer; - export const suspendTaskInput = z.object({ taskId: z.string(), reason: suspensionReasonSchema.optional().default("manual"), }); - -export type SuspendTaskInput = z.infer; - export const restoreTaskInput = z.object({ taskId: z.string(), recreateBranch: z.boolean().optional(), }); - -export type RestoreTaskInput = z.infer; - export const suspendTaskOutput = suspendedTaskSchema; export const restoreTaskOutput = z.object({ diff --git a/packages/workspace-server/src/services/workspace/schemas.ts b/packages/workspace-server/src/services/workspace/schemas.ts index a4ac0ba963..429ade5ae4 100644 --- a/packages/workspace-server/src/services/workspace/schemas.ts +++ b/packages/workspace-server/src/services/workspace/schemas.ts @@ -104,43 +104,7 @@ export const linkBranchInput = z.object({ export const unlinkBranchInput = z.object({ taskId: z.string(), }); - -export const localBackgroundedPayload = z.object({ - mainRepoPath: z.string(), - localWorktreePath: z.string(), - branch: z.string(), -}); - -export const localForegroundedPayload = z.object({ - mainRepoPath: z.string(), -}); - // Input/output schemas for local workspace backgrounding -export const isLocalBackgroundedInput = z.object({ - mainRepoPath: z.string(), -}); - -export const isLocalBackgroundedOutput = z.boolean(); - -export const getLocalWorktreePathInput = z.object({ - mainRepoPath: z.string(), -}); - -export const getLocalWorktreePathOutput = z.string(); - -export const backgroundLocalWorkspaceInput = z.object({ - mainRepoPath: z.string(), - branch: z.string(), -}); - -export const backgroundLocalWorkspaceOutput = z.string().nullable(); - -export const foregroundLocalWorkspaceInput = z.object({ - mainRepoPath: z.string(), -}); - -export const foregroundLocalWorkspaceOutput = z.boolean(); - export const getLocalTasksInput = z.object({ mainRepoPath: z.string(), }); @@ -252,11 +216,8 @@ export const taskPrStatusOutput = z.object({ prState: sidebarPrStateSchema, hasDiff: z.boolean(), }); - -export type TaskPrStatusInput = z.infer; export type SidebarPrState = z.infer; export type TaskPrStatus = z.infer; -export type CachedPrUrlInput = z.infer; export type CachedPrUrlOutput = z.infer; // Type exports @@ -268,18 +229,9 @@ export type { } from "@posthog/shared"; export type CreateWorkspaceInput = z.infer; -export type ReconcileCloudWorkspacesInput = z.infer< - typeof reconcileCloudWorkspacesInput ->; export type ReconcileCloudWorkspacesOutput = z.infer< typeof reconcileCloudWorkspacesOutput >; -export type DeleteWorkspaceInput = z.infer; -export type VerifyWorkspaceInput = z.infer; -export type GetWorkspaceInfoInput = z.infer; -export type ListGitWorktreesInput = z.infer; -export type GetWorktreeSizeInput = z.infer; -export type DeleteWorktreeInput = z.infer; export type WorkspaceErrorPayload = z.infer; export type WorkspaceWarningPayload = z.infer; export type WorkspacePromotedPayload = z.infer; @@ -288,11 +240,3 @@ export type LinkedBranchChangedPayload = z.infer< typeof linkedBranchChangedPayload >; export type TaskPrInfoChangedPayload = z.infer; -export type LinkBranchInput = z.infer; -export type UnlinkBranchInput = z.infer; -export type LocalBackgroundedPayload = z.infer; -export type LocalForegroundedPayload = z.infer; -export type IsLocalBackgroundedInput = z.infer; -export type GetLocalWorktreePathInput = z.infer< - typeof getLocalWorktreePathInput ->; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7cc77acba8..b4d19640b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,15 +127,6 @@ importers: '@inversifyjs/strongly-typed': specifier: 2.2.0 version: 2.2.0(inversify@7.11.0(reflect-metadata@0.2.2)) - '@json-render/core': - specifier: ^0.19.0 - version: 0.19.0(zod@4.3.6) - '@modelcontextprotocol/sdk': - specifier: ^1.12.1 - version: 1.27.1(zod@4.3.6) - '@opentelemetry/api-logs': - specifier: ^0.208.0 - version: 0.208.0 '@opentelemetry/exporter-logs-otlp-http': specifier: ^0.208.0 version: 0.208.0(@opentelemetry/api@1.9.0) @@ -253,9 +244,6 @@ importers: file-icon: specifier: ^6.0.0 version: 6.0.0 - fzf: - specifier: ^0.5.2 - version: 0.5.2 ignore: specifier: ^7.0.5 version: 7.0.5 @@ -295,28 +283,13 @@ importers: reflect-metadata: specifier: ^0.2.2 version: 0.2.2 - semver: - specifier: ^7.6.0 - version: 7.7.3 - shadcn: - specifier: ^4.1.2 - version: 4.1.2(@types/node@24.12.0)(typescript@5.9.3) - smol-toml: - specifier: ^1.6.0 - version: 1.6.0 tailwindcss-scroll-mask: specifier: ^0.0.3 version: 0.0.3(tailwindcss@4.2.2) - tw-animate-css: - specifier: ^1.4.0 - version: 1.4.0 zod: specifier: 4.3.6 version: 4.3.6 devDependencies: - '@biomejs/biome': - specifier: 2.2.4 - version: 2.2.4 '@electron-forge/cli': specifier: ^7.11.1 version: 7.11.1(encoding@0.1.13)(esbuild@0.27.2) @@ -368,21 +341,15 @@ importers: '@tanstack/devtools-vite': specifier: ^0.7.0 version: 0.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@tanstack/react-router': + specifier: 'catalog:' + version: 1.170.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 '@testing-library/react': specifier: ^16.3.0 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@testing-library/user-event': - specifier: ^14.6.1 - version: 14.6.1(@testing-library/dom@10.4.1) - '@types/better-sqlite3': - specifier: ^7.6.13 - version: 7.6.13 - '@types/canvas-confetti': - specifier: ^1.9.0 - version: 1.9.0 '@types/node': specifier: ^24.0.0 version: 24.12.0 @@ -392,9 +359,6 @@ importers: '@types/react-dom': specifier: ^19.1.0 version: 19.2.3(@types/react@19.2.11) - '@types/semver': - specifier: ^7.7.1 - version: 7.7.1 '@vitejs/plugin-react': specifier: ^4.2.1 version: 4.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) @@ -419,9 +383,6 @@ importers: lint-staged: specifier: ^15.5.2 version: 15.5.2 - memfs: - specifier: ^4.56.10 - version: 4.56.10(tslib@2.8.1) postcss: specifier: ^8.4.33 version: 8.5.6 @@ -431,6 +392,9 @@ importers: tailwindcss: specifier: ^4.2.2 version: 4.2.2 + tar: + specifier: ^7.5.0 + version: 7.5.7 tsx: specifier: ^4.20.6 version: 4.21.0 @@ -642,27 +606,18 @@ importers: '@inversifyjs/strongly-typed': specifier: 2.2.0 version: 2.2.0(inversify@7.11.0(reflect-metadata@0.2.2)) - '@posthog/core': - specifier: workspace:* - version: link:../../packages/core '@posthog/di': specifier: workspace:* version: link:../../packages/di '@posthog/host-router': specifier: workspace:* version: link:../../packages/host-router - '@posthog/platform': - specifier: workspace:* - version: link:../../packages/platform '@posthog/shared': specifier: workspace:* version: link:../../packages/shared '@posthog/ui': specifier: workspace:* version: link:../../packages/ui - '@posthog/workspace-client': - specifier: workspace:* - version: link:../../packages/workspace-client '@tanstack/react-query': specifier: ^5.90.2 version: 5.90.20(react@19.1.0) @@ -681,6 +636,9 @@ importers: react-dom: specifier: 19.1.0 version: 19.1.0(react@19.1.0) + react-hotkeys-hook: + specifier: ^4.4.4 + version: 4.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) reflect-metadata: specifier: ^0.2.2 version: 0.2.2 @@ -819,6 +777,9 @@ importers: packages/core: dependencies: + '@agentclientprotocol/sdk': + specifier: 0.22.1 + version: 0.22.1(zod@4.3.6) '@modelcontextprotocol/ext-apps': specifier: ^1.1.2 version: 1.2.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod@4.3.6) @@ -843,6 +804,9 @@ importers: '@posthog/workspace-client': specifier: workspace:* version: link:../workspace-client + '@tanstack/react-query': + specifier: 'catalog:' + version: 5.90.20(react@19.1.0) fuse.js: specifier: ^7.1.0 version: 7.1.0 @@ -961,9 +925,6 @@ importers: specifier: ^3.30.0 version: 3.30.0 devDependencies: - '@types/tar': - specifier: ^6.1.13 - version: 6.1.13 typescript: specifier: ^5.5.0 version: 5.9.3 @@ -975,10 +936,10 @@ importers: dependencies: '@agentclientprotocol/sdk': specifier: 0.22.1 - version: 0.22.1(zod@4.4.3) + version: 0.22.1(zod@4.3.6) '@json-render/core': specifier: ^0.19.0 - version: 0.19.0(zod@4.4.3) + version: 0.19.0(zod@4.3.6) '@posthog/core': specifier: workspace:* version: link:../core @@ -1003,6 +964,12 @@ importers: '@trpc/client': specifier: 'catalog:' version: 11.12.0(@trpc/server@11.12.0(typescript@5.9.3))(typescript@5.9.3) + inversify: + specifier: 'catalog:' + version: 7.11.0(reflect-metadata@0.2.2) + zod: + specifier: 4.3.6 + version: 4.3.6 devDependencies: '@posthog/tsconfig': specifier: workspace:* @@ -1022,6 +989,9 @@ importers: typescript: specifier: 'catalog:' version: 5.9.3 + vitest: + specifier: ^4.0.10 + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.2.0)(jsdom@26.1.0)(msw@2.12.8(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) packages/host-trpc: dependencies: @@ -1071,7 +1041,7 @@ importers: dependencies: '@agentclientprotocol/sdk': specifier: 0.22.1 - version: 0.22.1(zod@4.4.3) + version: 0.22.1(zod@4.3.6) '@base-ui/react': specifier: ^1.3.0 version: 1.3.0(@types/react@19.2.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -1158,10 +1128,10 @@ importers: version: 1.0.67 '@json-render/core': specifier: ^0.19.0 - version: 0.19.0(zod@4.4.3) + version: 0.19.0(zod@4.3.6) '@json-render/react': specifier: ^0.19.0 - version: 0.19.0(react@19.1.0)(zod@4.4.3) + version: 0.19.0(react@19.1.0)(zod@4.3.6) '@lezer/common': specifier: ^1.5.1 version: 1.5.1 @@ -1170,10 +1140,10 @@ importers: version: 1.2.3 '@modelcontextprotocol/ext-apps': specifier: ^1.1.2 - version: 1.2.2(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod@4.4.3) + version: 1.2.2(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod@4.3.6) '@modelcontextprotocol/sdk': specifier: ^1.12.1 - version: 1.29.0(zod@4.4.3) + version: 1.29.0(zod@4.3.6) '@pierre/diffs': specifier: ^1.1.21 version: 1.1.21(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -1264,6 +1234,9 @@ importers: canvas-confetti: specifier: ^1.9.4 version: 1.9.4 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -1339,6 +1312,9 @@ importers: vscode-icons-js: specifier: ^11.6.1 version: 11.6.1 + zod: + specifier: 4.3.6 + version: 4.3.6 zustand: specifier: ^4.5.0 version: 4.5.7(@types/react@19.2.11)(immer@11.1.3)(react@19.1.0) @@ -1522,6 +1498,12 @@ importers: drizzle-kit: specifier: ^0.31.9 version: 0.31.9 + memfs: + specifier: ^4.56.10 + version: 4.56.10(tslib@2.8.1) + tsup: + specifier: 'catalog:' + version: 8.5.1(jiti@2.7.0)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: 'catalog:' version: 5.9.3 @@ -2462,19 +2444,9 @@ packages: '@dnd-kit/state@0.1.21': resolution: {integrity: sha512-pdhntEPvn/QttcF295bOJpWiLsRqA/Iczh1ODOJUxGiR+E4GkYVz9VapNNm9gDq6ST0tr/e1Q2xBztUHlJqQgA==} - '@dotenvx/dotenvx@1.60.1': - resolution: {integrity: sha512-pPKqhE/HiaPDfbSf6doJnxeqzLszWP4eLICB89wRDZGaBaLzGpa3RgahVYIauBonaEWT8oxqAyacWKHtD+n3hQ==} - hasBin: true - '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@ecies/ciphers@0.2.6': - resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} - engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} - peerDependencies: - '@noble/ciphers': ^1.0.0 - '@electron-forge/cli@7.11.1': resolution: {integrity: sha512-pk8AoLsr7t7LBAt0cFD06XFA6uxtPdvtLx06xeal7O9o7GHGCbj29WGwFoJ8Br/ENM0Ho868S3PrAn1PtBXt5g==} engines: {node: '>= 16.4.0'} @@ -3940,16 +3912,6 @@ packages: react-dom: optional: true - '@modelcontextprotocol/sdk@1.27.1': - resolution: {integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: 4.3.6 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - '@modelcontextprotocol/sdk@1.29.0': resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} engines: {node: '>=18'} @@ -3967,18 +3929,6 @@ packages: '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} - '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -5603,9 +5553,6 @@ packages: cpu: [x64] os: [win32] - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} @@ -5646,10 +5593,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -6320,9 +6263,6 @@ packages: react: '>=18.2.0' typescript: '>=5.7.2' - '@ts-morph/common@0.27.0': - resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} - '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -6503,9 +6443,6 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@types/validate-npm-package-name@4.0.2': - resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} @@ -7378,9 +7315,6 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} @@ -7539,15 +7473,6 @@ packages: typescript: optional: true - cosmiconfig@9.0.1: - resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -7614,10 +7539,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -7671,14 +7592,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -7932,10 +7845,6 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - eciesjs@0.4.18: - resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} - engines: {bun: '>=1', deno: '>=2', node: '>=16'} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -8184,18 +8093,10 @@ packages: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} - exif-parser@0.1.12: resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} @@ -8551,20 +8452,12 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - file-icon@6.0.0: resolution: {integrity: sha512-cNWEJlqKoqcCt8v9ybKL1k69oHqbmEdNSHKUI2o/RmrCiBnG+yJXThfIeljiqfEs/PW1HeazJj2/SJABhtaawQ==} engines: {node: '>=20'} @@ -8657,10 +8550,6 @@ packages: engines: {node: '>=18.3.0'} hasBin: true - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -8750,9 +8639,6 @@ packages: resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} - fuzzysort@3.1.0: - resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} - fzf@0.5.2: resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} @@ -8798,10 +8684,6 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-own-enumerable-keys@1.0.0: - resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} - engines: {node: '>=14.16'} - get-package-info@1.0.0: resolution: {integrity: sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==} engines: {node: '>= 4.0'} @@ -8822,18 +8704,10 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-tsconfig@4.13.1: resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} @@ -9063,18 +8937,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - human-signals@8.0.1: - resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} - engines: {node: '>=18.18.0'} - humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -9261,10 +9127,6 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-in-ssh@1.0.0: - resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} - engines: {node: '>=20'} - is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -9274,10 +9136,6 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} @@ -9298,10 +9156,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -9323,10 +9177,6 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - is-ssh@1.4.1: resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} @@ -9334,18 +9184,10 @@ packages: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -9354,14 +9196,6 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - is-what@5.5.0: resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} engines: {node: '>=18'} @@ -9582,10 +9416,6 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - knip@5.83.0: resolution: {integrity: sha512-FfmaHMntpZB13B1oJQMSs1hTOZxd0TOn+FYB3oWEI02XlxTW3RH4H7d8z5Us3g0ziHCYyl7z0B1xi8ENP3QEKA==} engines: {node: '>=18.18.0'} @@ -9916,10 +9746,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - log-update@5.0.1: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -10383,10 +10209,6 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -10518,11 +10340,6 @@ packages: node-api-version@0.2.1: resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -10532,10 +10349,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.3.3: resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} engines: {node: '>= 6.13.0'} @@ -10586,18 +10399,10 @@ packages: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -10631,10 +10436,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -10686,10 +10487,6 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - open@11.0.0: - resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} - engines: {node: '>=20'} - open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -10712,10 +10509,6 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} - orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} @@ -10826,10 +10619,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - parse-path@7.1.0: resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} @@ -10863,9 +10652,6 @@ packages: xstate: optional: true - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-dirname@1.0.2: resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} @@ -11062,10 +10848,6 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -11134,10 +10916,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - powershell-utils@0.1.0: - resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} - engines: {node: '>=20'} - preact@10.28.3: resolution: {integrity: sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==} @@ -11178,10 +10956,6 @@ packages: resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} - proc-log@2.0.1: resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -11924,10 +11698,6 @@ packages: resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==} engines: {node: '>=10'} - shadcn@4.1.2: - resolution: {integrity: sha512-qNQcCavkbYsgBj+X09tF2bTcwRd8abR880bsFkDU2kMqceMCLAm5c+cLg7kWDhfh1H9g08knpQ5ZEf6y/co16g==} - hasBin: true - shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -12145,10 +11915,6 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - storybook@10.2.0: resolution: {integrity: sha512-fIQnFtpksRRgHR1CO1onGX3djaog4qsW/c5U8arqYTkUEr2TaWpn05mIJDOBoPJFlOdqFrB4Ttv0PZJxV7avhw==} hasBin: true @@ -12191,10 +11957,6 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - stringify-object@5.0.0: - resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} - engines: {node: '>=14.16'} - strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} @@ -12215,18 +11977,10 @@ packages: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -12326,9 +12080,6 @@ packages: tailwind-merge@2.6.1: resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} - tailwindcss-scroll-mask@0.0.3: resolution: {integrity: sha512-vPuacFs5yHJRZ8MFP/qqKKRbnWlVDPAJ5VfRzOwrmtEJQ4pHm5K1xw/dXdF4v6Sx1QdbtCWJuGs9ucSTc+YanQ==} peerDependencies: @@ -12575,9 +12326,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-morph@26.0.0: - resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} - ts-pattern@5.9.0: resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} @@ -12670,9 +12418,6 @@ packages: resolution: {integrity: sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==} engines: {node: '>=18', npm: '>=9'} - tw-animate-css@1.4.0: - resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} - type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -12767,10 +12512,6 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -12916,10 +12657,6 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - validate-npm-package-name@7.0.2: - resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} - engines: {node: ^20.17.0 || >=22.9.0} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -13176,10 +12913,6 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - web-tree-sitter@0.24.7: resolution: {integrity: sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==} @@ -13253,11 +12986,6 @@ packages: engines: {node: '>= 8'} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - which@5.0.0: resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -13337,10 +13065,6 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} - wsl-utils@0.3.1: - resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} - engines: {node: '>=20'} - xcode@3.0.1: resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} engines: {node: '>=10.0.0'} @@ -13417,18 +13141,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-spinner@1.1.0: - resolution: {integrity: sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA==} - engines: {node: '>=18.19'} - yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} - yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} @@ -13482,10 +13198,6 @@ snapshots: dependencies: zod: 4.3.6 - '@agentclientprotocol/sdk@0.22.1(zod@4.4.3)': - dependencies: - zod: 4.4.3 - '@agentclientprotocol/sdk@0.25.0(zod@4.3.6)': dependencies: zod: 4.3.6 @@ -14609,25 +14321,8 @@ snapshots: '@preact/signals-core': 1.13.0 tslib: 2.8.1 - '@dotenvx/dotenvx@1.60.1': - dependencies: - commander: 11.1.0 - dotenv: 17.2.3 - eciesjs: 0.4.18 - execa: 5.1.1 - fdir: 6.5.0(picomatch@4.0.3) - ignore: 5.3.2 - object-treeify: 1.1.33 - picomatch: 4.0.3 - which: 4.0.0 - yocto-spinner: 1.1.0 - '@drizzle-team/brocli@0.10.2': {} - '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': - dependencies: - '@noble/ciphers': 1.3.0 - '@electron-forge/cli@7.11.1(encoding@0.1.13)(esbuild@0.27.2)': dependencies: '@electron-forge/core': 7.11.1(encoding@0.1.13)(esbuild@0.27.2) @@ -15761,6 +15456,7 @@ snapshots: '@inquirer/type': 3.0.10(@types/node@24.12.0) optionalDependencies: '@types/node': 24.12.0 + optional: true '@inquirer/confirm@5.1.21(@types/node@25.2.0)': dependencies: @@ -15795,6 +15491,7 @@ snapshots: yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 24.12.0 + optional: true '@inquirer/core@10.3.2(@types/node@25.2.0)': dependencies: @@ -15904,6 +15601,7 @@ snapshots: '@inquirer/type@3.0.10(@types/node@24.12.0)': optionalDependencies: '@types/node': 24.12.0 + optional: true '@inquirer/type@3.0.10(@types/node@25.2.0)': optionalDependencies: @@ -15958,7 +15656,7 @@ snapshots: '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 '@isaacs/ttlcache@1.4.1': {} @@ -16262,13 +15960,9 @@ snapshots: dependencies: zod: 4.3.6 - '@json-render/core@0.19.0(zod@4.4.3)': - dependencies: - zod: 4.4.3 - - '@json-render/react@0.19.0(react@19.1.0)(zod@4.4.3)': + '@json-render/react@0.19.0(react@19.1.0)(zod@4.3.6)': dependencies: - '@json-render/core': 0.19.0(zod@4.4.3) + '@json-render/core': 0.19.0(zod@4.3.6) react: 19.1.0 transitivePeerDependencies: - zod @@ -16541,28 +16235,6 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@modelcontextprotocol/sdk@1.27.1(zod@4.3.6)': - dependencies: - '@hono/node-server': 1.19.9(hono@4.11.7) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 8.3.1(express@5.2.1) - hono: 4.11.7 - jose: 6.2.1 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) - transitivePeerDependencies: - - supports-color - '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': dependencies: '@hono/node-server': 1.19.9(hono@4.11.7) @@ -16623,14 +16295,6 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@noble/ciphers@1.3.0': {} - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -18206,8 +17870,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -18260,8 +17922,6 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@sindresorhus/merge-streams@4.0.0': {} - '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -19001,12 +18661,6 @@ snapshots: react: 19.1.0 typescript: 5.9.3 - '@ts-morph/common@0.27.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 10.1.2 - path-browserify: 1.0.1 - '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -19211,8 +18865,6 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@types/validate-npm-package-name@4.0.2': {} - '@types/wrap-ansi@3.0.0': {} '@types/yargs-parser@21.0.3': {} @@ -20108,7 +19760,7 @@ snapshots: fs-minipass: 3.0.3 glob: 10.5.0 lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -20322,8 +19974,6 @@ snapshots: - '@types/react' - '@types/react-dom' - code-block-writer@13.0.3: {} - color-convert@0.5.3: optional: true @@ -20470,15 +20120,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - cosmiconfig@9.0.1(typescript@5.9.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.9.3 - crelt@1.0.6: {} cross-dirname@0.1.0: {} @@ -20551,8 +20192,6 @@ snapshots: csstype@3.2.3: {} - data-uri-to-buffer@4.0.1: {} - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -20590,8 +20229,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.7.2: {} - deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -20749,13 +20386,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - eciesjs@0.4.18: - dependencies: - '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - ee-first@1.1.1: {} electron-installer-common@0.10.4: @@ -21095,18 +20725,6 @@ snapshots: signal-exit: 3.0.7 strip-eof: 1.0.0 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -21119,21 +20737,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.6.1: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.1 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.3.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 - exif-parser@0.1.12: {} expand-template@2.0.3: {} @@ -21576,19 +21179,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - fflate@0.4.8: {} fflate@0.8.2: {} - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 - file-icon@6.0.0: dependencies: p-map: 7.0.4 @@ -21699,10 +21293,6 @@ snapshots: dependencies: fd-package-json: 2.0.0 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - forwarded@0.2.0: {} framer-motion@12.31.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -21760,7 +21350,7 @@ snapshots: fs-minipass@3.0.3: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 fs-temp@1.2.1: dependencies: @@ -21782,8 +21372,6 @@ snapshots: fuse.js@7.1.0: {} - fuzzysort@3.1.0: {} - fzf@0.5.2: {} galactus@1.0.0: @@ -21836,8 +21424,6 @@ snapshots: get-nonce@1.0.1: {} - get-own-enumerable-keys@1.0.0: {} - get-package-info@1.0.0: dependencies: bluebird: 3.7.2 @@ -21862,15 +21448,8 @@ snapshots: dependencies: pump: 3.0.3 - get-stream@6.0.1: {} - get-stream@8.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-tsconfig@4.13.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -21916,7 +21495,7 @@ snapshots: foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 - minipass: 7.1.2 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -21925,14 +21504,14 @@ snapshots: foreground-child: 3.3.1 jackspeak: 4.1.1 minimatch: 10.1.2 - minipass: 7.1.2 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 2.0.1 glob@13.0.1: dependencies: minimatch: 10.1.2 - minipass: 7.1.2 + minipass: 7.1.3 path-scurry: 2.0.1 glob@13.0.6: @@ -22199,12 +21778,8 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} - human-signals@5.0.0: {} - human-signals@8.0.1: {} - humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -22356,16 +21931,12 @@ snapshots: is-hexadecimal@2.0.1: {} - is-in-ssh@1.0.0: {} - is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 is-interactive@1.0.0: {} - is-interactive@2.0.0: {} - is-lambda@1.0.1: {} is-my-ip-valid@1.0.1: @@ -22389,8 +21960,6 @@ snapshots: is-number@7.0.0: {} - is-obj@3.0.0: {} - is-plain-obj@2.1.0: {} is-plain-obj@4.1.0: {} @@ -22409,30 +21978,20 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - is-regexp@3.1.0: {} - is-ssh@1.4.1: dependencies: protocols: 2.0.2 is-stream@1.1.0: {} - is-stream@2.0.1: {} - is-stream@3.0.0: {} - is-stream@4.0.1: {} - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.20 is-unicode-supported@0.1.0: {} - is-unicode-supported@1.3.0: {} - - is-unicode-supported@2.1.0: {} - is-what@5.5.0: {} is-wsl@2.2.0: @@ -22737,8 +22296,6 @@ snapshots: kleur@3.0.3: {} - kleur@4.1.5: {} - knip@5.83.0(@types/node@25.2.0)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 @@ -23013,11 +22570,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-symbols@6.0.0: - dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 - log-update@5.0.1: dependencies: ansi-escapes: 5.0.0 @@ -23112,7 +22664,7 @@ snapshots: '@npmcli/agent': 3.0.0 cacache: 19.0.1 http-cache-semantics: 4.2.0 - minipass: 7.1.2 + minipass: 7.1.3 minipass-fetch: 4.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -23782,7 +23334,7 @@ snapshots: minipass-collect@2.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass-fetch@2.1.2: dependencies: @@ -23794,7 +23346,7 @@ snapshots: minipass-fetch@4.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 minipass-sized: 1.0.3 minizlib: 3.1.0 optionalDependencies: @@ -23824,8 +23376,6 @@ snapshots: minipass@5.0.0: {} - minipass@7.1.2: {} - minipass@7.1.3: {} minizlib@2.1.2: @@ -23835,7 +23385,7 @@ snapshots: minizlib@3.1.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mkdirp-classic@0.5.3: {} @@ -23917,6 +23467,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - '@types/node' + optional: true msw@2.12.8(@types/node@25.2.0)(typescript@5.9.3): dependencies: @@ -24014,20 +23565,12 @@ snapshots: dependencies: semver: 7.7.3 - node-domexception@1.0.0: {} - node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-forge@1.3.3: {} node-gyp@11.5.0: @@ -24085,19 +23628,10 @@ snapshots: dependencies: path-key: 2.0.1 - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -24123,8 +23657,6 @@ snapshots: object-keys@1.1.1: {} - object-treeify@1.1.33: {} - object.assign@4.1.7: dependencies: call-bind: 1.0.9 @@ -24183,15 +23715,6 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - open@11.0.0: - dependencies: - default-browser: 5.5.0 - define-lazy-prop: 3.0.0 - is-in-ssh: 1.0.0 - is-inside-container: 1.0.0 - powershell-utils: 0.1.0 - wsl-utils: 0.3.1 - open@7.4.2: dependencies: is-docker: 2.2.1 @@ -24230,18 +23753,6 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - ora@8.2.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.2 - orderedmap@2.1.1: {} os-tmpdir@1.0.2: {} @@ -24385,8 +23896,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-ms@4.0.0: {} - parse-path@7.1.0: dependencies: protocols: 2.0.2 @@ -24418,8 +23927,6 @@ snapshots: transitivePeerDependencies: - supports-color - path-browserify@1.0.1: {} - path-dirname@1.0.2: {} path-exists@3.0.0: {} @@ -24444,7 +23951,7 @@ snapshots: path-scurry@2.0.1: dependencies: lru-cache: 11.2.5 - minipass: 7.1.2 + minipass: 7.1.3 path-scurry@2.0.2: dependencies: @@ -24580,11 +24087,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} postcss@8.4.49: @@ -24642,8 +24144,6 @@ snapshots: dependencies: commander: 9.5.0 - powershell-utils@0.1.0: {} - preact@10.28.3: {} prebuild-install@7.1.3: @@ -24688,10 +24188,6 @@ snapshots: react-is-18: react-is@18.3.1 react-is-19: react-is@19.2.6 - pretty-ms@9.3.0: - dependencies: - parse-ms: 4.0.0 - proc-log@2.0.1: {} proc-log@4.2.0: {} @@ -25689,49 +25185,6 @@ snapshots: sf-symbols-typescript@2.2.0: {} - shadcn@4.1.2(@types/node@24.12.0)(typescript@5.9.3): - dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@dotenvx/dotenvx': 1.60.1 - '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) - '@types/validate-npm-package-name': 4.0.2 - browserslist: 4.28.1 - commander: 14.0.3 - cosmiconfig: 9.0.1(typescript@5.9.3) - dedent: 1.7.2 - deepmerge: 4.3.1 - diff: 8.0.3 - execa: 9.6.1 - fast-glob: 3.3.3 - fs-extra: 11.3.3 - fuzzysort: 3.1.0 - https-proxy-agent: 7.0.6 - kleur: 4.1.5 - msw: 2.12.8(@types/node@24.12.0)(typescript@5.9.3) - node-fetch: 3.3.2 - open: 11.0.0 - ora: 8.2.0 - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 - prompts: 2.4.2 - recast: 0.23.11 - stringify-object: 5.0.0 - tailwind-merge: 3.5.0 - ts-morph: 26.0.0 - tsconfig-paths: 4.2.0 - validate-npm-package-name: 7.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) - transitivePeerDependencies: - - '@cfworker/json-schema' - - '@types/node' - - babel-plugin-macros - - supports-color - - typescript - shallowequal@1.1.0: {} shebang-command@1.2.0: @@ -25929,7 +25382,7 @@ snapshots: ssri@12.0.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 ssri@9.0.1: dependencies: @@ -25960,8 +25413,6 @@ snapshots: std-env@4.1.0: {} - stdin-discarder@0.2.2: {} - storybook@10.2.0(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@storybook/global': 5.0.0 @@ -26020,12 +25471,6 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - stringify-object@5.0.0: - dependencies: - get-own-enumerable-keys: 1.0.0 - is-obj: 3.0.0 - is-regexp: 3.1.0 - strip-ansi@5.2.0: dependencies: ansi-regex: 4.1.1 @@ -26042,12 +25487,8 @@ snapshots: strip-eof@1.0.0: {} - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} - strip-final-newline@4.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -26146,8 +25587,6 @@ snapshots: tailwind-merge@2.6.1: {} - tailwind-merge@3.5.0: {} - tailwindcss-scroll-mask@0.0.3(tailwindcss@4.2.2): dependencies: tailwindcss: 4.2.2 @@ -26212,7 +25651,7 @@ snapshots: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.1.0 yallist: 5.0.0 @@ -26388,11 +25827,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-morph@26.0.0: - dependencies: - '@ts-morph/common': 0.27.0 - code-block-writer: 13.0.3 - ts-pattern@5.9.0: {} ts-toolbelt@9.6.0: {} @@ -26481,8 +25915,6 @@ snapshots: dependencies: '@mixmark-io/domino': 2.2.0 - tw-animate-css@1.4.0: {} - type-detect@4.0.8: {} type-fest@0.13.1: @@ -26558,8 +25990,6 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} - unicorn-magic@0.3.0: {} - unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -26708,8 +26138,6 @@ snapshots: validate-npm-package-name@5.0.1: {} - validate-npm-package-name@7.0.2: {} - vary@1.1.2: {} vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -27109,8 +26537,6 @@ snapshots: web-namespaces@2.0.1: {} - web-streams-polyfill@3.3.3: {} - web-tree-sitter@0.24.7: {} web-vitals@5.1.0: {} @@ -27201,10 +26627,6 @@ snapshots: dependencies: isexe: 2.0.0 - which@4.0.0: - dependencies: - isexe: 3.1.1 - which@5.0.0: dependencies: isexe: 3.1.1 @@ -27262,11 +26684,6 @@ snapshots: dependencies: is-wsl: 3.1.0 - wsl-utils@0.3.1: - dependencies: - is-wsl: 3.1.0 - powershell-utils: 0.1.0 - xcode@3.0.1: dependencies: simple-plist: 1.3.1 @@ -27338,14 +26755,8 @@ snapshots: yocto-queue@0.1.0: {} - yocto-spinner@1.1.0: - dependencies: - yoctocolors: 2.1.2 - yoctocolors-cjs@2.1.3: {} - yoctocolors@2.1.2: {} - yoga-wasm-web@0.3.3: {} zod-to-json-schema@3.25.1(zod@4.3.6):