- `src/routes/` contains HTTP route handlers.
- `src/providers/` contains provider clients and stream transformers.
- `src/masking/extractors/` contains provider-specific text extraction and insertion.
-- `src/services/logger.ts` owns SQLite dashboard logging.
+- `src/logging/logger.ts` owns SQLite dashboard logging.
- `docs/mint.json` registers API reference docs.
import { HTTPException } from "hono/http-exception";
import { logger } from "hono/logger";
import { getConfig } from "./config";
+import { getLogger } from "./logging/logger";
import { getPIIDetector } from "./pii/detect";
import { anthropicRoutes } from "./routes/anthropic";
import { apiRoutes } from "./routes/api";
import { healthRoutes } from "./routes/health";
import { infoRoutes } from "./routes/info";
import { openaiRoutes } from "./routes/openai";
-import { getLogger } from "./services/logger";
type Variables = {
requestId: string;
/**
- * PII Service - detect and mask PII in requests
+ * PII request helpers - detect and mask PII in requests
*/
import type { PlaceholderContext } from "../masking/context";
import type { RequestExtractor } from "../masking/types";
-import { getPIIDetector, type PIIDetectionResult } from "../pii/detect";
-import { createMaskingContext, maskRequest } from "../pii/mask";
+import { getPIIDetector, type PIIDetectionResult } from "./detect";
+import { createMaskingContext, maskRequest } from "./mask";
export interface PIIDetectResult {
detection: PIIDetectionResult;
}
export type { PlaceholderContext } from "../masking/context";
-export type { PIIDetectionResult, PIIEntity } from "../pii/detect";
-export { createMaskingContext } from "../pii/mask";
+export type { PIIDetectionResult, PIIEntity } from "./detect";
+export { createMaskingContext } from "./mask";
/**
* Check if the detector is healthy
import { openaiExtractor } from "../masking/extractors/openai";
import type { PIIDetectionResult } from "../pii/detect";
import type { OpenAIRequest } from "../providers/openai/types";
-import type { PrivacyPipelineConfig } from "./privacy-pipeline";
+import type { PrivacyPipelineConfig } from "./pipeline";
const sampleSecret = "sk-proj-abc123def456ghi789jkl012mno345pqr678stu901vwx";
}),
}));
-const { PrivacyPipelineDetectionError, processPrivacyPipeline } = await import(
- "./privacy-pipeline"
-);
+const { PrivacyPipelineDetectionError, processPrivacyPipeline } = await import("./pipeline");
const baseConfig: PrivacyPipelineConfig = {
mode: "mask",
import type { Config } from "../config";
import type { PlaceholderContext } from "../masking/context";
import type { RequestExtractor } from "../masking/types";
-import { detectPII, maskPII, type PIIDetectResult } from "./pii";
-import { processSecretsRequest, type SecretsProcessResult, secretPlaceholders } from "./secrets";
+import { detectPII, maskPII, type PIIDetectResult } from "../pii/request";
+import {
+ processSecretsRequest,
+ type SecretsProcessResult,
+ secretPlaceholders,
+} from "../secrets/request";
export type PrivacyPipelineConfig = Pick<Config, "mode" | "secrets_detection">;
import type { Context } from "hono";
import { Hono } from "hono";
import { getConfig } from "../config";
+import { formatMaskedRequestForLog } from "../logging/log-content";
+import { logRequest } from "../logging/logger";
import type { PlaceholderContext } from "../masking/context";
import { anthropicExtractor } from "../masking/extractors/anthropic";
import { restoreResponse } from "../masking/restorer";
+import type { PIIDetectResult } from "../pii/request";
+import {
+ PrivacyPipelineDetectionError,
+ type PrivacyPipelineResult,
+ processPrivacyPipeline,
+} from "../privacy/pipeline";
import { callAnthropic } from "../providers/anthropic/client";
import { createAnthropicUnmaskingStream } from "../providers/anthropic/stream-transformer";
import {
type AnthropicResponse,
} from "../providers/anthropic/types";
import { callLocalAnthropic } from "../providers/local";
-import { formatMaskedRequestForLog } from "../services/log-content";
-import { logRequest } from "../services/logger";
-import type { PIIDetectResult } from "../services/pii";
-import {
- PrivacyPipelineDetectionError,
- type PrivacyPipelineResult,
- processPrivacyPipeline,
-} from "../services/privacy-pipeline";
-import type { SecretsProcessResult } from "../services/secrets";
+import type { SecretsProcessResult } from "../secrets/request";
import {
createLogData,
errorFormats,
}));
// Mock the logger to avoid database operations
-mock.module("../services/logger", () => ({
+mock.module("../logging/logger", () => ({
logRequest: mock(() => {}),
normalizeRequestSource: mock((provider: string, sourceHeader?: string | null) =>
provider === "api" && sourceHeader === "browser-extension" ? "browser_extension" : provider,
import { Hono } from "hono";
import { z } from "zod";
import { getConfig, type SecretsDetectionConfig } from "../config";
+import { logRequest, normalizeRequestSource } from "../logging/logger";
import { createPlaceholderContext, type PlaceholderContext } from "../masking/context";
import {
filterAllowlistedEntities,
import { mask as maskPII } from "../pii/mask";
import { detectSecrets } from "../secrets/detect";
import { maskSecrets } from "../secrets/mask";
-import { logRequest, normalizeRequestSource } from "../services/logger";
import { createLogData } from "./utils";
export const apiRoutes = new Hono();
}),
}));
-mock.module("../services/logger", () => ({
+mock.module("../logging/logger", () => ({
logRequest: mockLogRequest,
}));
import { proxy } from "hono/proxy";
import { z } from "zod";
import { getConfig } from "../config";
+import { formatMaskedRequestForLog } from "../logging/log-content";
+import { logRequest } from "../logging/logger";
import type { PlaceholderContext } from "../masking/context";
import {
type CodexResponsesRequest,
codexExtractor,
} from "../masking/extractors/codex";
import { restoreResponse } from "../masking/restorer";
-import { createCodexUnmaskingStream } from "../providers/codex/stream-transformer";
-import { ProviderError } from "../providers/errors";
-import { formatMaskedRequestForLog } from "../services/log-content";
-import { logRequest } from "../services/logger";
-import type { PIIDetectResult } from "../services/pii";
+import type { PIIDetectResult } from "../pii/request";
import {
PrivacyPipelineDetectionError,
type PrivacyPipelineResult,
processPrivacyPipeline,
-} from "../services/privacy-pipeline";
-import type { SecretsProcessResult } from "../services/secrets";
+} from "../privacy/pipeline";
+import { createCodexUnmaskingStream } from "../providers/codex/stream-transformer";
+import { ProviderError } from "../providers/errors";
+import type { SecretsProcessResult } from "../secrets/request";
import {
createLogData,
errorFormats,
import { tailwind } from "hono-tailwind";
import { z } from "zod";
import { getConfig } from "../config";
-import { getLogger } from "../services/logger";
+import { getLogger } from "../logging/logger";
import DashboardPage from "../views/dashboard/page";
const LogsQuerySchema = z.object({
import { Hono } from "hono";
import { getConfig } from "../config";
+import { healthCheck as checkDetector } from "../pii/request";
import { checkLocalHealth } from "../providers/local";
-import { healthCheck as checkDetector } from "../services/pii";
export const healthRoutes = new Hono();
import { Hono } from "hono";
import { proxy } from "hono/proxy";
import { getConfig, type MaskingConfig } from "../config";
+import { formatMaskedRequestForLog } from "../logging/log-content";
+import { logRequest } from "../logging/logger";
import type { PlaceholderContext } from "../masking/context";
import { openaiExtractor } from "../masking/extractors/openai";
import { restoreResponse } from "../masking/restorer";
+import type { PIIDetectResult } from "../pii/request";
+import {
+ PrivacyPipelineDetectionError,
+ type PrivacyPipelineResult,
+ processPrivacyPipeline,
+} from "../privacy/pipeline";
import { callLocal } from "../providers/local";
import { callOpenAI, getOpenAIInfo, type ProviderResult } from "../providers/openai/client";
import { createUnmaskingStream } from "../providers/openai/stream-transformer";
OpenAIRequestSchema,
type OpenAIResponse,
} from "../providers/openai/types";
-import { formatMaskedRequestForLog } from "../services/log-content";
-import { logRequest } from "../services/logger";
-import type { PIIDetectResult } from "../services/pii";
-import {
- PrivacyPipelineDetectionError,
- type PrivacyPipelineResult,
- processPrivacyPipeline,
-} from "../services/privacy-pipeline";
-import type { SecretsProcessResult } from "../services/secrets";
+import type { SecretsProcessResult } from "../secrets/request";
import {
createLogData,
errorFormats,
import type { Context } from "hono";
import { getConfig } from "../config";
+import type { RequestLogData, RequestSource } from "../logging/logger";
+import { logRequest } from "../logging/logger";
+import type { PIIDetectResult } from "../pii/request";
import { ProviderError } from "../providers/errors";
-import type { RequestLogData, RequestSource } from "../services/logger";
-import { logRequest } from "../services/logger";
-import type { PIIDetectResult } from "../services/pii";
-import type { SecretsProcessResult } from "../services/secrets";
+import type { SecretsProcessResult } from "../secrets/request";
// ============================================================================
// Error Response Types & Formatting
/**
- * Secrets Service - detect and mask secrets in requests
+ * Secrets request helpers - detect and mask secrets in requests
*/
import type { SecretsDetectionConfig } from "../config";
import type { PlaceholderContext } from "../masking/context";
import type { RequestExtractor } from "../masking/types";
-import { detectSecretsInRequest, type MessageSecretsResult } from "../secrets/detect";
-import { maskRequest } from "../secrets/mask";
+import { detectSecretsInRequest, type MessageSecretsResult } from "./detect";
+import { maskRequest } from "./mask";
export interface SecretsProcessResult<TRequest> {
blocked: boolean;