]> git.99rst.org Git - sgasser-llm-shield.git/commitdiff
Move privacy helpers into domain modules (#125)
authorStefan Gasser <redacted>
Sun, 28 Jun 2026 18:59:54 +0000 (20:59 +0200)
committerGitHub <redacted>
Sun, 28 Jun 2026 18:59:54 +0000 (20:59 +0200)
19 files changed:
AGENTS.md
src/index.ts
src/logging/log-content.test.ts [moved from src/services/log-content.test.ts with 100% similarity]
src/logging/log-content.ts [moved from src/services/log-content.ts with 100% similarity]
src/logging/logger.test.ts [moved from src/services/logger.test.ts with 100% similarity]
src/logging/logger.ts [moved from src/services/logger.ts with 100% similarity]
src/pii/request.ts [moved from src/services/pii.ts with 84% similarity]
src/privacy/pipeline.test.ts [moved from src/services/privacy-pipeline.test.ts with 97% similarity]
src/privacy/pipeline.ts [moved from src/services/privacy-pipeline.ts with 91% similarity]
src/routes/anthropic.ts
src/routes/api.test.ts
src/routes/api.ts
src/routes/codex.test.ts
src/routes/codex.ts
src/routes/dashboard.tsx
src/routes/health.ts
src/routes/openai.ts
src/routes/utils.ts
src/secrets/request.ts [moved from src/services/secrets.ts with 94% similarity]

index de4775198d368ddea03a5da0ae04910c0287ba37..dea3b5293aaee54ce69426908db2ad804919eab1 100644 (file)
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -48,5 +48,5 @@ Primary endpoints:
 - `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.
index 27be078225142909e5b965a308066e2308d40491..9614309df01bc477c65d994897a69a46c2e663e2 100644 (file)
@@ -4,6 +4,7 @@ import { createMiddleware } from "hono/factory";
 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";
@@ -12,7 +13,6 @@ import { dashboardRoutes } from "./routes/dashboard";
 import { healthRoutes } from "./routes/health";
 import { infoRoutes } from "./routes/info";
 import { openaiRoutes } from "./routes/openai";
-import { getLogger } from "./services/logger";
 
 type Variables = {
   requestId: string;
similarity index 100%
rename from src/services/logger.ts
rename to src/logging/logger.ts
similarity index 84%
rename from src/services/pii.ts
rename to src/pii/request.ts
index d042e55a970e08a5fca0e2fa036a654fe1309f51..a93e6209a3933d8f2074804a619b6f1e490141fe 100644 (file)
@@ -1,11 +1,11 @@
 /**
- * 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;
@@ -60,8 +60,8 @@ export function maskPII<TRequest, TResponse>(
 }
 
 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
similarity index 97%
rename from src/services/privacy-pipeline.test.ts
rename to src/privacy/pipeline.test.ts
index 6b9ee1bddb6ca210fe063d48da81a3d27f9db318..5fb19964cb98cb0bc5ce63ab126d0f771848d31d 100644 (file)
@@ -2,7 +2,7 @@ import { afterEach, describe, expect, mock, test } from "bun:test";
 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";
 
@@ -29,9 +29,7 @@ mock.module("../pii/detect", () => ({
   }),
 }));
 
-const { PrivacyPipelineDetectionError, processPrivacyPipeline } = await import(
-  "./privacy-pipeline"
-);
+const { PrivacyPipelineDetectionError, processPrivacyPipeline } = await import("./pipeline");
 
 const baseConfig: PrivacyPipelineConfig = {
   mode: "mask",
similarity index 91%
rename from src/services/privacy-pipeline.ts
rename to src/privacy/pipeline.ts
index 2b469ec669ff44b62a3f4ec6a687ce826b59dc61..5aaddf8a4d6957b5773d8ed69bb4f305c01f7dd3 100644 (file)
@@ -1,8 +1,12 @@
 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">;
 
index 580a57529a4c6f93b8d5b4224364f45a38b1600c..19853f32a0ef17debc3c92642fc2904c14bed5b5 100644 (file)
@@ -2,9 +2,17 @@ import { zValidator } from "@hono/zod-validator";
 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 {
@@ -13,15 +21,7 @@ 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,
index f9e3199441d0abf348fb52c64d97967e99e16af8..b291e247229d08c047676e4e79ea9a3a28198f9d 100644 (file)
@@ -20,7 +20,7 @@ mock.module("../pii/detect", () => ({
 }));
 
 // 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,
index 7df4291499a90ae4da7cac21ec75c979121d42a8..9610f8cb3977f446960965270d8b0648a536d048 100644 (file)
@@ -8,6 +8,7 @@
 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,
@@ -18,7 +19,6 @@ import {
 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();
index 39c3833108e58b648b1cb3e7ddf9ef6ff4ad1fd6..1f5d4282c342faf55360063d34c3ad94ed1de79e 100644 (file)
@@ -23,7 +23,7 @@ mock.module("../pii/detect", () => ({
   }),
 }));
 
-mock.module("../services/logger", () => ({
+mock.module("../logging/logger", () => ({
   logRequest: mockLogRequest,
 }));
 
index 336928e9da2448a7cded2a153e699b3a8b866d93..b7bb4dcaf15b1cb9319575e1964aacb3abd9e625 100644 (file)
@@ -4,6 +4,8 @@ import { Hono } from "hono";
 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,
@@ -11,17 +13,15 @@ import {
   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,
index d36daaa7a2248670d35cbf198041204a5f6be0ef..3b197bdc28ba8d1a39833cb76259c8938f972a7a 100644 (file)
@@ -4,7 +4,7 @@ import { basicAuth } from "hono/basic-auth";
 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({
index b888e6e2f55d7b024c31d6e74451719601c70beb..5b4f39c5791f2ee2e35e0d6ac4d0243691bd1542 100644 (file)
@@ -1,7 +1,7 @@
 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();
 
index 48269ad9f4b7d3fcfb246190977f7ac5029430ed..becfb030362d69c245f938fd13b2f366b8817d9f 100644 (file)
@@ -3,9 +3,17 @@ import type { Context } from "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";
@@ -14,15 +22,7 @@ import {
   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,
index 2b1616e8fb2ec5a0e96b9f4395fa88ce28f26491..4e08f34cfebcb0b5d90c9e4995811b0201c32aa1 100644 (file)
@@ -1,10 +1,10 @@
 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
similarity index 94%
rename from src/services/secrets.ts
rename to src/secrets/request.ts
index 6b0fa2df8a5d40f9de33e29f047dec13c12348e8..23646c98940c17453145c5d2ba2e2764a446e13d 100644 (file)
@@ -1,12 +1,12 @@
 /**
- * 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;
git clone https://git.99rst.org/PROJECT