sdlc-agent-4-enterprise-server 1.48.0 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/Dockerfile +112 -6
  2. package/dist/config/index.d.ts +9 -0
  3. package/dist/config/index.js +14 -0
  4. package/dist/config/index.js.map +1 -1
  5. package/dist/engine/parsers/embedding/EmbeddingBackend.d.ts +21 -0
  6. package/dist/engine/parsers/embedding/EmbeddingBackend.js +13 -0
  7. package/dist/engine/parsers/embedding/EmbeddingBackend.js.map +1 -0
  8. package/dist/engine/parsers/embedding/EmbeddingService.d.ts +39 -4
  9. package/dist/engine/parsers/embedding/EmbeddingService.js +74 -20
  10. package/dist/engine/parsers/embedding/EmbeddingService.js.map +1 -1
  11. package/dist/engine/parsers/embedding/HashEmbeddingBackend.d.ts +14 -0
  12. package/dist/engine/parsers/embedding/HashEmbeddingBackend.js +34 -0
  13. package/dist/engine/parsers/embedding/HashEmbeddingBackend.js.map +1 -0
  14. package/dist/engine/parsers/embedding/OnnxEmbeddingBackend.d.ts +29 -0
  15. package/dist/engine/parsers/embedding/OnnxEmbeddingBackend.js +50 -0
  16. package/dist/engine/parsers/embedding/OnnxEmbeddingBackend.js.map +1 -0
  17. package/dist/engine/parsers/signature-extractor.js +5 -3
  18. package/dist/engine/parsers/signature-extractor.js.map +1 -1
  19. package/dist/engine/query/query-layer.d.ts +25 -0
  20. package/dist/engine/query/query-layer.js +68 -3
  21. package/dist/engine/query/query-layer.js.map +1 -1
  22. package/dist/engine/tools/code-extract.d.ts +46 -0
  23. package/dist/engine/tools/code-extract.js +149 -0
  24. package/dist/engine/tools/code-extract.js.map +1 -0
  25. package/dist/engine/tools/code-intel-handlers.js +8 -2
  26. package/dist/engine/tools/code-intel-handlers.js.map +1 -1
  27. package/dist/engine/tools/code-locate.d.ts +43 -0
  28. package/dist/engine/tools/code-locate.js +44 -0
  29. package/dist/engine/tools/code-locate.js.map +1 -0
  30. package/dist/engine/tools/drawio-tool.js +21 -3
  31. package/dist/engine/tools/drawio-tool.js.map +1 -1
  32. package/dist/engine/tools/register-tools.d.ts +56 -0
  33. package/dist/engine/tools/register-tools.js +6 -0
  34. package/dist/engine/tools/register-tools.js.map +1 -1
  35. package/dist/modules/memory/MemoryModule.d.ts +2 -2
  36. package/dist/modules/memory/MemoryModule.js +13 -5
  37. package/dist/modules/memory/MemoryModule.js.map +1 -1
  38. package/dist/server/HttpServer.js +17 -11
  39. package/dist/server/HttpServer.js.map +1 -1
  40. package/dist/server/routes/admin/config.js +34 -1
  41. package/dist/server/routes/admin/config.js.map +1 -1
  42. package/dist/server/routes/api-index.d.ts +12 -0
  43. package/dist/server/routes/api-index.js +90 -15
  44. package/dist/server/routes/api-index.js.map +1 -1
  45. package/dist/shared/EventBus.d.ts +6 -0
  46. package/dist/shared/EventBus.js +6 -0
  47. package/dist/shared/EventBus.js.map +1 -1
  48. package/docker-compose.yml +4 -0
  49. package/package.json +2 -2
  50. package/scripts/precache-embedding-model.mjs +27 -0
  51. package/src/admin/middleware/rbac.middleware.ts +11 -0
  52. package/src/config/index.ts +14 -0
  53. package/src/engine/parsers/embedding/EmbeddingBackend.ts +24 -0
  54. package/src/engine/parsers/embedding/EmbeddingService.ts +81 -21
  55. package/src/engine/parsers/embedding/HashEmbeddingBackend.ts +35 -0
  56. package/src/engine/parsers/embedding/OnnxEmbeddingBackend.ts +92 -0
  57. package/src/engine/parsers/embedding/__tests__/EmbeddingService.test.ts +101 -0
  58. package/src/engine/parsers/signature-extractor.ts +5 -3
  59. package/src/engine/query/__tests__/list-class-methods.test.ts +165 -0
  60. package/src/engine/query/query-layer.ts +92 -4
  61. package/src/engine/tools/__tests__/code-extract.test.ts +162 -0
  62. package/src/engine/tools/__tests__/code-locate-tool.test.ts +77 -0
  63. package/src/engine/tools/__tests__/code-locate.test.ts +134 -0
  64. package/src/engine/tools/__tests__/drawio-tool.test.ts +41 -0
  65. package/src/engine/tools/code-extract.ts +162 -0
  66. package/src/engine/tools/code-intel-handlers.ts +7 -1
  67. package/src/engine/tools/code-locate.ts +67 -0
  68. package/src/engine/tools/drawio-tool.ts +23 -2
  69. package/src/engine/tools/register-tools.ts +6 -0
  70. package/src/modules/memory/MemoryModule.ts +12 -5
  71. package/src/server/HttpServer.ts +20 -14
  72. package/src/server/routes/__tests__/admin.test.ts +4 -1
  73. package/src/server/routes/__tests__/api-index-errors.test.ts +31 -0
  74. package/src/server/routes/admin/config.ts +31 -1
  75. package/src/server/routes/api-index.ts +96 -15
  76. package/src/shared/EventBus.ts +6 -0
  77. package/tests/e2e/sa4e-360-tools.e2e.test.ts +175 -0
package/Dockerfile CHANGED
@@ -2,9 +2,9 @@
2
2
  # =============================================================================
3
3
  # SA4E-335 Backend Dockerfile — Node.js 22 + Hono Code Intelligence MCP Server
4
4
  # -----------------------------------------------------------------------------
5
- # Multi-stage build (6 stages): base, deps, build, production, development, test.
6
- # `production` is the SOLE CI push target (TDD AD-2). Build-only tooling never
7
- # reaches the runtime image.
5
+ # Multi-stage build (7 stages): base, deps, build, mcp-python, production,
6
+ # development, test. `production` is the SOLE CI push target (TDD AD-2).
7
+ # Build-only tooling never reaches the runtime image.
8
8
  #
9
9
  # Design decisions (TDD §3.2 / Security Review):
10
10
  # - AD-1 : base = node:22-slim (Debian/glibc) so native modules such as
@@ -20,6 +20,12 @@
20
20
  # - AD-6 : SA4E-44 capability items (draw.io CLI/Electron/xvfb, model pre-cache,
21
21
  # SERVER_WORKSPACES_ROOT) are guarded behind build args and DEFAULT OFF
22
22
  # (SEC-08) — a bare `docker build --target production .` must succeed.
23
+ # - MCP-1 : two stdio MCP child servers (markitdown-mcp, markdown-exporter-
24
+ # mcp-local) are built into isolated /opt venvs in `mcp-python` and
25
+ # shipped read-only on PATH, so the orchestration module spawns them
26
+ # by bare command name. The runtime gains ONLY the python3
27
+ # interpreter — no pip, no git, no pandoc (SEC-05; pypandoc-binary
28
+ # bundles its own pandoc, onnxruntime ships as a manylinux wheel).
23
29
  # =============================================================================
24
30
 
25
31
  # --- Build-time arguments (NO secrets — build args must never carry credentials, BR-17) ---
@@ -57,10 +63,68 @@ COPY package.json package-lock.json ./
57
63
  RUN npm ci
58
64
  COPY tsconfig.json ./
59
65
  COPY src/ ./src/
66
+ COPY scripts/ ./scripts/
60
67
  RUN npm run build
61
- # (AD-6, conditional) Pre-download embedding model into TRANSFORMERS_CACHE here
62
- # and strip tree-sitter-jsp to keep the build hermetic. DEFAULT OFF (SEC-08):
63
- # enable only when the runtime genuinely needs local embeddings / diagram export.
68
+ # (AD-6, SA4E-44 — now IMPLEMENTED) Pre-download the ONNX embedding model into
69
+ # TRANSFORMERS_CACHE so the runtime serves real semantic embeddings fully
70
+ # offline. EmbeddingService/OnnxEmbeddingBackend read the same cache dir at
71
+ # runtime (config embeddingCacheDir <- env TRANSFORMERS_CACHE). DEFAULT ON —
72
+ # semantic search is a core capability; set --build-arg BAKE_EMBEDDING_MODEL=false
73
+ # for slim builds (the runtime then logs an error and degrades to the sin-hash
74
+ # fallback unless a cache volume is mounted at /app/models-cache). `mkdir -p`
75
+ # guarantees the production COPY succeeds even when the download is skipped.
76
+ # Fail-fast: the precache script exits non-zero on download/inference errors.
77
+ ARG BAKE_EMBEDDING_MODEL=true
78
+ RUN mkdir -p /app/models-cache \
79
+ && if [ "$BAKE_EMBEDDING_MODEL" = "true" ]; then \
80
+ TRANSFORMERS_CACHE=/app/models-cache node scripts/precache-embedding-model.mjs; \
81
+ fi
82
+
83
+ # -----------------------------------------------------------------------------
84
+ # mcp-python — builds the two stdio MCP child servers into isolated /opt venvs.
85
+ # The orchestration module (McpClientManager → TransportFactory) spawns stdio
86
+ # children by bare `command` name resolved on the PATH inherited by the backend
87
+ # process (documents/MCP-DB-CONFIG-REQUEST.md §9), so each server ships as a
88
+ # venv console script that production/development put on PATH:
89
+ # /opt/markitdown-venv/bin/markitdown-mcp (Microsoft MarkItDown)
90
+ # /opt/markdown-exporter-venv/bin/markdown-exporter-mcp-local
91
+ # Both servers are Python — markdown-exporter-mcp-local is NOT published to
92
+ # npm or PyPI (GitHub source only), so npm packaging is impossible by design.
93
+ # This stage derives from the SAME pinned node base as the runtime, so venv
94
+ # interpreters and native manylinux wheels (onnxruntime via markitdown[all]/
95
+ # magika, PyMuPDF, pillow, pandas; pypandoc-binary bundles pandoc → no apt
96
+ # pandoc needed) match the runtime ABI. `git` exists only here (SEC-05).
97
+ # -----------------------------------------------------------------------------
98
+ FROM base AS mcp-python
99
+ ARG MARKITDOWN_MCP_VERSION=0.0.1a7
100
+ # markdown-exporter-mcp-local has no PyPI release — pin the exact upstream
101
+ # commit (main @ 2026-04-07) for a hermetic build (git-source analogue of SEC-02).
102
+ ARG MARKDOWN_EXPORTER_MCP_REF=1429b6a94767a709f7f5119219ca5951042d9d3c
103
+ # `python3` already exists in base (build toolchain); only the venv/ensurepip
104
+ # support is missing. One venv per server: independent dependency trees that
105
+ # are pinned, upgraded and Trivy-scanned separately.
106
+ RUN apt-get update \
107
+ && apt-get install -y --no-install-recommends python3-venv \
108
+ && rm -rf /var/lib/apt/lists/*
109
+ RUN python3 -m venv /opt/markitdown-venv \
110
+ && /opt/markitdown-venv/bin/pip install --no-cache-dir \
111
+ "markitdown-mcp==${MARKITDOWN_MCP_VERSION}" \
112
+ && test -x /opt/markitdown-venv/bin/markitdown-mcp \
113
+ && /opt/markitdown-venv/bin/python -c "import markitdown_mcp" \
114
+ && /opt/markitdown-venv/bin/python -m pip uninstall -y pip
115
+ # `mcp<2` constraint: upstream declares `mcp>=1.27.0` (unbounded) but its code
116
+ # imports `mcp.server.fastmcp` — an API REMOVED in mcp 2.x (FastMCP → MCPServer).
117
+ # The import probe below fails the build on exactly this class of drift
118
+ # (verified: unconstrained pip resolved mcp 2.3.0 → ModuleNotFoundError).
119
+ RUN python3 -m venv /opt/markdown-exporter-venv \
120
+ && /opt/markdown-exporter-venv/bin/pip install --no-cache-dir \
121
+ "markdown-exporter-mcp-local @ git+https://github.com/Zac-Chen-2001/markdown-exporter-mcp-local@${MARKDOWN_EXPORTER_MCP_REF}" \
122
+ "mcp>=1.27.0,<2.0.0" \
123
+ && test -x /opt/markdown-exporter-venv/bin/markdown-exporter-mcp-local \
124
+ && /opt/markdown-exporter-venv/bin/python -c "import markdown_exporter_mcp.server, md_exporter" \
125
+ && /opt/markdown-exporter-venv/bin/python -m pip uninstall -y pip
126
+ # Both venvs are copied root-owned READ-ONLY; stripping their bundled pip keeps
127
+ # the runtime image free of ANY package manager (SEC-05) and out of Trivy scans.
64
128
 
65
129
  # -----------------------------------------------------------------------------
66
130
  # production ★ — runtime image. SOLE CI push target. Minimal surface, non-root.
@@ -108,6 +172,31 @@ COPY --from=deps /app/node_modules ./node_modules
108
172
  COPY --from=build /app/dist ./dist
109
173
  COPY --from=build /app/package.json ./
110
174
 
175
+ # (AD-6, SA4E-44) Baked ONNX embedding model cache from the `build` stage.
176
+ # Read-only at runtime (read_only rootfs in compose) — a cache hit needs no
177
+ # writes; with BAKE_EMBEDDING_MODEL=false the dir is empty and the runtime
178
+ # degrades to the logged hash fallback (mount a volume here to allow download).
179
+ COPY --from=build /app/models-cache ./models-cache
180
+ ENV TRANSFORMERS_CACHE=/app/models-cache
181
+
182
+ # --- Stdio MCP child servers (spawned by orchestration via bare command) ----
183
+ # Python runtime only — pip/venv tooling and git stay out of the image (SEC-05).
184
+ # The venv trees built in `mcp-python` are copied root-owned read-only
185
+ # (world-executable: the non-root backend can execute but not modify its own
186
+ # child servers). In-container `mcp_servers` DB rows can use bare commands:
187
+ # { "command": "markitdown-mcp", "args": [] }
188
+ # { "command": "markdown-exporter-mcp-local", "args": [] }
189
+ RUN apt-get update \
190
+ && apt-get install -y --no-install-recommends python3 \
191
+ && apt-get clean \
192
+ && rm -rf /var/lib/apt/lists/*
193
+ COPY --from=mcp-python /opt/markitdown-venv /opt/markitdown-venv
194
+ COPY --from=mcp-python /opt/markdown-exporter-venv /opt/markdown-exporter-venv
195
+ # Console scripts resolve on the PATH inherited by the backend process and its
196
+ # stdio children; PYTHONUNBUFFERED keeps stderr logs streaming (no MCP breakage).
197
+ ENV PATH="/opt/markitdown-venv/bin:/opt/markdown-exporter-venv/bin:${PATH}"
198
+ ENV PYTHONUNBUFFERED=1
199
+
111
200
  # Non-root runtime user (BR-05). Debian uses groupadd/useradd (not alpine addgroup).
112
201
  # `-r` = system account, `nologin` shell = no interactive login.
113
202
  RUN groupadd -g 1001 sa4e \
@@ -119,6 +208,13 @@ USER sa4e
119
208
  ENV NODE_ENV=production
120
209
  ENV PORT=48721
121
210
 
211
+ # SA4E-99 backpressure — max concurrent /api/index/source upload requests.
212
+ # Startup default only: hot-reloadable at runtime via the admin UI
213
+ # (Configuration → indexLimit.maxConcurrent — persisted, applied instantly via
214
+ # EventBus), and overridable per container with `docker run -e INDEX_CONCURRENCY_LIMIT=N`.
215
+ # 8 absorbs cloud DB/disk latency (local default stays 3) without unbounded flood.
216
+ ENV INDEX_CONCURRENCY_LIMIT=8
217
+
122
218
  EXPOSE 48721
123
219
 
124
220
  # Dependency-free health probe (SEC-12): node:22-slim does not ship `wget`, so a
@@ -139,6 +235,16 @@ COPY package.json package-lock.json ./
139
235
  RUN npm ci
140
236
  COPY tsconfig.json ./
141
237
  COPY src/ ./src/
238
+ # (AD-6) Same baked embedding-model cache as production — dev containers embed
239
+ # with the real ONNX model instead of the sin-hash fallback.
240
+ COPY --from=build /app/models-cache ./models-cache
241
+ ENV TRANSFORMERS_CACHE=/app/models-cache
242
+ # Stdio MCP child servers — same venvs as production (see mcp-python stage);
243
+ # `base` already carries python3, so only the venv copies + PATH are needed.
244
+ COPY --from=mcp-python /opt/markitdown-venv /opt/markitdown-venv
245
+ COPY --from=mcp-python /opt/markdown-exporter-venv /opt/markdown-exporter-venv
246
+ ENV PATH="/opt/markitdown-venv/bin:/opt/markdown-exporter-venv/bin:${PATH}"
247
+ ENV PYTHONUNBUFFERED=1
142
248
  RUN groupadd -g 1001 sa4e \
143
249
  && useradd -u 1001 -g sa4e -r -s /usr/sbin/nologin sa4e \
144
250
  && chown -R sa4e:sa4e /app
@@ -5,6 +5,9 @@ declare const UnifiedConfigSchema: z.ZodObject<{
5
5
  port: z.ZodDefault<z.ZodNumber>;
6
6
  host: z.ZodDefault<z.ZodString>;
7
7
  onnxModelPath: z.ZodDefault<z.ZodString>;
8
+ embeddingModelId: z.ZodDefault<z.ZodString>;
9
+ embeddingCacheDir: z.ZodString;
10
+ embeddingQuantized: z.ZodDefault<z.ZodBoolean>;
8
11
  logLevel: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
9
12
  viewerPort: z.ZodDefault<z.ZodNumber>;
10
13
  watchEnabled: z.ZodDefault<z.ZodBoolean>;
@@ -93,6 +96,9 @@ declare const UnifiedConfigSchema: z.ZodObject<{
93
96
  host: string;
94
97
  port: number;
95
98
  onnxModelPath: string;
99
+ embeddingModelId: string;
100
+ embeddingCacheDir: string;
101
+ embeddingQuantized: boolean;
96
102
  logLevel: "error" | "warn" | "info" | "debug";
97
103
  viewerPort: number;
98
104
  watchEnabled: boolean;
@@ -130,6 +136,7 @@ declare const UnifiedConfigSchema: z.ZodObject<{
130
136
  dockerSocket?: string | undefined;
131
137
  };
132
138
  }, {
139
+ embeddingCacheDir: string;
133
140
  workspace: string;
134
141
  indexTempDir: string;
135
142
  dbPath: string;
@@ -162,6 +169,8 @@ declare const UnifiedConfigSchema: z.ZodObject<{
162
169
  host?: string | undefined;
163
170
  port?: number | undefined;
164
171
  onnxModelPath?: string | undefined;
172
+ embeddingModelId?: string | undefined;
173
+ embeddingQuantized?: boolean | undefined;
165
174
  logLevel?: "error" | "warn" | "info" | "debug" | undefined;
166
175
  viewerPort?: number | undefined;
167
176
  watchEnabled?: boolean | undefined;
@@ -42,7 +42,13 @@ export const DEFAULT_EXTENSIONS = [
42
42
  const UnifiedConfigSchema = z.object({
43
43
  port: z.number().min(1024).max(65535).default(48721),
44
44
  host: z.string().default('0.0.0.0'),
45
+ // Legacy/deprecated — nothing loads a bare .onnx file anymore; kept for
46
+ // backward-compatible admin config output. See embeddingModelId below.
45
47
  onnxModelPath: z.string().default('models/model.onnx'),
48
+ // SA4E-44 / AD-6 — real ONNX embeddings via transformers.js (EmbeddingService).
49
+ embeddingModelId: z.string().default('Xenova/paraphrase-multilingual-MiniLM-L12-v2'),
50
+ embeddingCacheDir: z.string(),
51
+ embeddingQuantized: z.boolean().default(true),
46
52
  logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
47
53
  viewerPort: z.number().default(3202),
48
54
  watchEnabled: z.boolean().default(true),
@@ -158,6 +164,14 @@ export function loadConfig(overrides) {
158
164
  port: resolvePort(),
159
165
  host: process.env.CODE_INTEL_HOST || '0.0.0.0',
160
166
  onnxModelPath: process.env.CODE_INTEL_ONNX_MODEL || 'models/model.onnx',
167
+ // SA4E-44 / AD-6 — ONNX embedding config (EmbeddingService/OnnxEmbeddingBackend).
168
+ // TRANSFORMERS_CACHE is the HF-standard env var; the Dockerfile bakes the
169
+ // model there at build time so the runtime image works fully offline.
170
+ embeddingModelId: process.env.CODE_INTEL_EMBEDDING_MODEL
171
+ || 'Xenova/paraphrase-multilingual-MiniLM-L12-v2',
172
+ embeddingCacheDir: process.env.TRANSFORMERS_CACHE
173
+ || path.join(codeIntelDir, 'models-cache'),
174
+ embeddingQuantized: envBool('CODE_INTEL_EMBEDDING_QUANTIZED', true),
161
175
  logLevel: (process.env.CODE_INTEL_LOG_LEVEL || 'info'),
162
176
  viewerPort: resolveViewerPort(),
163
177
  watchEnabled: envBool('CODE_INTEL_WATCH', fileConfig.watchEnabled ?? true),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * EmbeddingBackend.ts — strategy interface for embedding vector generation.
3
+ *
4
+ * SA4E-44 / AD-6: the service previously shipped ONLY a sin-hash pseudo-
5
+ * embedding fallback (deterministic but semantically meaningless). Real
6
+ * inference is provided by OnnxEmbeddingBackend (transformers.js on
7
+ * onnxruntime-node, CPU); the hash backend remains an explicitly-logged
8
+ * degraded fallback so indexing/search pipelines never crash when the model
9
+ * is unavailable.
10
+ */
11
+ /** Canonical vector size — pgvector schema and DB blobs assume this dimension. */
12
+ export declare const EMBEDDING_DIMENSIONS = 384;
13
+ export type EmbeddingBackendKind = 'onnx' | 'hash';
14
+ export interface EmbeddingBackend {
15
+ /** Backend identifier — surfaced via admin config (`embedding.backend`). */
16
+ readonly kind: EmbeddingBackendKind;
17
+ /** Model identifier actually in use (sentinel name for the hash backend). */
18
+ readonly modelId: string;
19
+ /** Generate an EMBEDDING_DIMENSIONS-sized, L2-normalized vector for `text`. */
20
+ generate(text: string): Promise<number[]>;
21
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * EmbeddingBackend.ts — strategy interface for embedding vector generation.
3
+ *
4
+ * SA4E-44 / AD-6: the service previously shipped ONLY a sin-hash pseudo-
5
+ * embedding fallback (deterministic but semantically meaningless). Real
6
+ * inference is provided by OnnxEmbeddingBackend (transformers.js on
7
+ * onnxruntime-node, CPU); the hash backend remains an explicitly-logged
8
+ * degraded fallback so indexing/search pipelines never crash when the model
9
+ * is unavailable.
10
+ */
11
+ /** Canonical vector size — pgvector schema and DB blobs assume this dimension. */
12
+ export const EMBEDDING_DIMENSIONS = 384;
13
+ //# sourceMappingURL=EmbeddingBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingBackend.js","sourceRoot":"","sources":["../../../../src/engine/parsers/embedding/EmbeddingBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC"}
@@ -1,15 +1,50 @@
1
+ import type { EmbeddingBackend, EmbeddingBackendKind } from './EmbeddingBackend.js';
2
+ /**
3
+ * EmbeddingService — facade over pluggable EmbeddingBackend strategies.
4
+ *
5
+ * SA4E-44 / AD-6: the previous implementation was ONLY the sin-hash fallback
6
+ * (no semantic quality). It now defaults to real ONNX inference
7
+ * (Xenova/paraphrase-multilingual-MiniLM-L12-v2, 384 dims, q8) via
8
+ * transformers.js and degrades to the hash backend ONLY when model loading or
9
+ * inference fails — logged loudly once, never silently. Call sites
10
+ * (TaskWorker, MemoryToolSearchService, ReindexService, LLMInitializer,
11
+ * index.ts tool ingestion) keep the original API.
12
+ *
13
+ * IMPORTANT: vectors from the two backends are NOT comparable. Switching
14
+ * backends invalidates stored vectors — run a full reindex so old (hash) and
15
+ * new (onnx) vectors are never mixed in similarity comparisons. The active
16
+ * backend is exposed to operators via admin config (`embedding.backend`).
17
+ */
1
18
  export declare class EmbeddingService {
2
19
  private static instance;
20
+ private readonly hash;
21
+ private readonly logger;
22
+ private injectedBackend?;
23
+ private onnxBackend?;
24
+ private onnxFailed;
3
25
  private constructor();
4
26
  static getInstance(): EmbeddingService;
5
27
  /**
6
- * Generates a deterministic pseudo-embedding for the given text using a sin-hash approach.
7
- * This is a fallback implementation to avoid native dependencies on Windows.
8
- * Vector size: 384
28
+ * Test/DI seam — replaces backend resolution entirely. An injected backend
29
+ * of kind 'onnx' still participates in the fail-over path (see generate).
30
+ */
31
+ setBackend(backend: EmbeddingBackend): void;
32
+ /** Reset singleton state between unit tests (cheap, non-circular). */
33
+ static resetForTests(): void;
34
+ /** Active backend kind without triggering model loading. */
35
+ getBackendKind(): EmbeddingBackendKind;
36
+ /**
37
+ * Generate an embedding vector for `text`. On ONNX failure, permanently
38
+ * degrades to the hash fallback for this process lifetime (restart to retry)
39
+ * so indexing/search pipelines never crash — the degradation is logged at
40
+ * error level exactly once.
9
41
  */
10
42
  generateEmbedding(text: string): Promise<number[]>;
11
43
  /**
12
- * Calculates cosine similarity between two vectors.
44
+ * Cosine similarity between two equal-length vectors.
45
+ * Throws on dimension mismatch rather than returning a wrong score.
13
46
  */
14
47
  cosineSimilarity(a: number[], b: number[]): number;
48
+ /** Resolution order: failed→hash, injected, lazy ONNX (config-driven). */
49
+ private resolveBackend;
15
50
  }
@@ -1,5 +1,30 @@
1
+ import pino from 'pino';
2
+ import { loadConfig } from '../../../config/index.js';
3
+ import { HashEmbeddingBackend } from './HashEmbeddingBackend.js';
4
+ import { OnnxEmbeddingBackend } from './OnnxEmbeddingBackend.js';
5
+ /**
6
+ * EmbeddingService — facade over pluggable EmbeddingBackend strategies.
7
+ *
8
+ * SA4E-44 / AD-6: the previous implementation was ONLY the sin-hash fallback
9
+ * (no semantic quality). It now defaults to real ONNX inference
10
+ * (Xenova/paraphrase-multilingual-MiniLM-L12-v2, 384 dims, q8) via
11
+ * transformers.js and degrades to the hash backend ONLY when model loading or
12
+ * inference fails — logged loudly once, never silently. Call sites
13
+ * (TaskWorker, MemoryToolSearchService, ReindexService, LLMInitializer,
14
+ * index.ts tool ingestion) keep the original API.
15
+ *
16
+ * IMPORTANT: vectors from the two backends are NOT comparable. Switching
17
+ * backends invalidates stored vectors — run a full reindex so old (hash) and
18
+ * new (onnx) vectors are never mixed in similarity comparisons. The active
19
+ * backend is exposed to operators via admin config (`embedding.backend`).
20
+ */
1
21
  export class EmbeddingService {
2
22
  static instance;
23
+ hash = new HashEmbeddingBackend();
24
+ logger = pino({ name: 'embedding-service' });
25
+ injectedBackend;
26
+ onnxBackend;
27
+ onnxFailed = false;
3
28
  constructor() { }
4
29
  static getInstance() {
5
30
  if (!EmbeddingService.instance) {
@@ -8,33 +33,45 @@ export class EmbeddingService {
8
33
  return EmbeddingService.instance;
9
34
  }
10
35
  /**
11
- * Generates a deterministic pseudo-embedding for the given text using a sin-hash approach.
12
- * This is a fallback implementation to avoid native dependencies on Windows.
13
- * Vector size: 384
36
+ * Test/DI seam — replaces backend resolution entirely. An injected backend
37
+ * of kind 'onnx' still participates in the fail-over path (see generate).
38
+ */
39
+ setBackend(backend) {
40
+ this.injectedBackend = backend;
41
+ }
42
+ /** Reset singleton state between unit tests (cheap, non-circular). */
43
+ static resetForTests() {
44
+ EmbeddingService.instance = new EmbeddingService();
45
+ }
46
+ /** Active backend kind without triggering model loading. */
47
+ getBackendKind() {
48
+ if (this.onnxFailed)
49
+ return 'hash';
50
+ return this.injectedBackend?.kind ?? 'onnx';
51
+ }
52
+ /**
53
+ * Generate an embedding vector for `text`. On ONNX failure, permanently
54
+ * degrades to the hash fallback for this process lifetime (restart to retry)
55
+ * so indexing/search pipelines never crash — the degradation is logged at
56
+ * error level exactly once.
14
57
  */
15
58
  async generateEmbedding(text) {
16
- const vectorSize = 384;
17
- const vector = new Array(vectorSize).fill(0);
18
- let hash = 0;
19
- for (let i = 0; i < text.length; i++) {
20
- hash = ((hash << 5) - hash + text.charCodeAt(i)) | 0;
21
- }
22
- const seed = Math.abs(hash);
23
- for (let i = 0; i < vectorSize; i++) {
24
- const x = Math.sin(seed + i * 12.9898) * 43758.5453;
25
- vector[i] = x - Math.floor(x);
59
+ const backend = this.resolveBackend();
60
+ try {
61
+ return await backend.generate(text);
26
62
  }
27
- // Normalize
28
- const norm = Math.sqrt(vector.reduce((s, v) => s + v * v, 0));
29
- if (norm > 0) {
30
- for (let i = 0; i < vector.length; i++) {
31
- vector[i] /= norm;
63
+ catch (err) {
64
+ if (backend.kind === 'onnx') {
65
+ this.onnxFailed = true;
66
+ this.logger.error({ err, modelId: backend.modelId }, 'ONNX embedding backend failed — degrading to sin-hash pseudo-embeddings (semantic quality lost) until restart. Check TRANSFORMERS_CACHE / model availability.');
67
+ return this.hash.generate(text);
32
68
  }
69
+ throw err;
33
70
  }
34
- return vector;
35
71
  }
36
72
  /**
37
- * Calculates cosine similarity between two vectors.
73
+ * Cosine similarity between two equal-length vectors.
74
+ * Throws on dimension mismatch rather than returning a wrong score.
38
75
  */
39
76
  cosineSimilarity(a, b) {
40
77
  if (a.length !== b.length)
@@ -51,5 +88,22 @@ export class EmbeddingService {
51
88
  return 0;
52
89
  return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
53
90
  }
91
+ /** Resolution order: failed→hash, injected, lazy ONNX (config-driven). */
92
+ resolveBackend() {
93
+ if (this.onnxFailed)
94
+ return this.hash;
95
+ if (this.injectedBackend)
96
+ return this.injectedBackend;
97
+ if (!this.onnxBackend) {
98
+ const cfg = loadConfig();
99
+ this.onnxBackend = new OnnxEmbeddingBackend({
100
+ modelId: cfg.embeddingModelId,
101
+ cacheDir: cfg.embeddingCacheDir,
102
+ quantized: cfg.embeddingQuantized,
103
+ logger: this.logger,
104
+ });
105
+ }
106
+ return this.onnxBackend;
107
+ }
54
108
  }
55
109
  //# sourceMappingURL=EmbeddingService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddingService.js","sourceRoot":"","sources":["../../../../src/engine/parsers/embedding/EmbeddingService.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAC,QAAQ,CAAmB;IAE1C,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;YAC/B,gBAAgB,CAAC,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,iBAAiB,CAAC,IAAY;QACzC,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC;YACpD,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,YAAY;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,CAAW,EAAE,CAAW;QAC9C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACxE,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACzC,OAAO,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF"}
1
+ {"version":3,"file":"EmbeddingService.js","sourceRoot":"","sources":["../../../../src/engine/parsers/embedding/EmbeddingService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type EmbeddingBackend } from './EmbeddingBackend.js';
2
+ /**
3
+ * HashEmbeddingBackend — deterministic sin-hash pseudo-embedding (fallback).
4
+ *
5
+ * NOT semantically meaningful: similar texts do NOT get similar vectors.
6
+ * Retained as a degraded mode so indexing/search pipelines keep working when
7
+ * the ONNX model cannot be loaded; every activation is logged as an error by
8
+ * EmbeddingService (never silent). Vector size: EMBEDDING_DIMENSIONS.
9
+ */
10
+ export declare class HashEmbeddingBackend implements EmbeddingBackend {
11
+ readonly kind: "hash";
12
+ readonly modelId = "sin-hash-fallback";
13
+ generate(text: string): Promise<number[]>;
14
+ }
@@ -0,0 +1,34 @@
1
+ import { EMBEDDING_DIMENSIONS } from './EmbeddingBackend.js';
2
+ /**
3
+ * HashEmbeddingBackend — deterministic sin-hash pseudo-embedding (fallback).
4
+ *
5
+ * NOT semantically meaningful: similar texts do NOT get similar vectors.
6
+ * Retained as a degraded mode so indexing/search pipelines keep working when
7
+ * the ONNX model cannot be loaded; every activation is logged as an error by
8
+ * EmbeddingService (never silent). Vector size: EMBEDDING_DIMENSIONS.
9
+ */
10
+ export class HashEmbeddingBackend {
11
+ kind = 'hash';
12
+ modelId = 'sin-hash-fallback';
13
+ async generate(text) {
14
+ const vector = new Array(EMBEDDING_DIMENSIONS).fill(0);
15
+ let hash = 0;
16
+ for (let i = 0; i < text.length; i++) {
17
+ hash = ((hash << 5) - hash + text.charCodeAt(i)) | 0;
18
+ }
19
+ const seed = Math.abs(hash);
20
+ for (let i = 0; i < EMBEDDING_DIMENSIONS; i++) {
21
+ const x = Math.sin(seed + i * 12.9898) * 43758.5453;
22
+ vector[i] = x - Math.floor(x);
23
+ }
24
+ // Normalize (unit length) so cosine similarity stays well-defined.
25
+ const norm = Math.sqrt(vector.reduce((s, v) => s + v * v, 0));
26
+ if (norm > 0) {
27
+ for (let i = 0; i < vector.length; i++) {
28
+ vector[i] /= norm;
29
+ }
30
+ }
31
+ return vector;
32
+ }
33
+ }
34
+ //# sourceMappingURL=HashEmbeddingBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashEmbeddingBackend.js","sourceRoot":"","sources":["../../../../src/engine/parsers/embedding/HashEmbeddingBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,uBAAuB,CAAC;AAEpF;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,MAAe,CAAC;IACvB,OAAO,GAAG,mBAAmB,CAAC;IAEhC,KAAK,CAAC,QAAQ,CAAC,IAAY;QAChC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC;YACpD,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,mEAAmE;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import type { Logger } from 'pino';
2
+ import { type EmbeddingBackend } from './EmbeddingBackend.js';
3
+ export interface OnnxEmbeddingOptions {
4
+ /** HF hub model id — must export EMBEDDING_DIMENSIONS-sized vectors. */
5
+ modelId: string;
6
+ /** Filesystem cache dir (baked image cache or on-first-use download target). */
7
+ cacheDir: string;
8
+ /** Quantized (q8) ONNX weights — ~3x smaller, near-identical quality. */
9
+ quantized: boolean;
10
+ logger: Logger;
11
+ }
12
+ /**
13
+ * OnnxEmbeddingBackend — real semantic embeddings via transformers.js
14
+ * (onnxruntime-node, CPU, mean pooling + L2 normalization). Initialization is
15
+ * memoized; concurrent callers share a single pipeline promise.
16
+ */
17
+ export declare class OnnxEmbeddingBackend implements EmbeddingBackend {
18
+ readonly kind: "onnx";
19
+ readonly modelId: string;
20
+ private readonly cacheDir;
21
+ private readonly quantized;
22
+ private readonly logger;
23
+ private initPromise?;
24
+ constructor(options: OnnxEmbeddingOptions);
25
+ generate(text: string): Promise<number[]>;
26
+ /** Memoized one-time pipeline load (cache-first: no network on cache hit). */
27
+ private loadOnce;
28
+ private initialize;
29
+ }
@@ -0,0 +1,50 @@
1
+ import { EMBEDDING_DIMENSIONS } from './EmbeddingBackend.js';
2
+ /**
3
+ * OnnxEmbeddingBackend — real semantic embeddings via transformers.js
4
+ * (onnxruntime-node, CPU, mean pooling + L2 normalization). Initialization is
5
+ * memoized; concurrent callers share a single pipeline promise.
6
+ */
7
+ export class OnnxEmbeddingBackend {
8
+ kind = 'onnx';
9
+ modelId;
10
+ cacheDir;
11
+ quantized;
12
+ logger;
13
+ initPromise;
14
+ constructor(options) {
15
+ this.modelId = options.modelId;
16
+ this.cacheDir = options.cacheDir;
17
+ this.quantized = options.quantized;
18
+ this.logger = options.logger;
19
+ }
20
+ async generate(text) {
21
+ const extractor = await this.loadOnce();
22
+ const output = await extractor(text, { pooling: 'mean', normalize: true });
23
+ const vector = Array.from(output.data);
24
+ if (vector.length !== EMBEDDING_DIMENSIONS) {
25
+ throw new Error(`Embedding dimension mismatch: model ${this.modelId} returned ${vector.length}, expected ${EMBEDDING_DIMENSIONS}`);
26
+ }
27
+ return vector;
28
+ }
29
+ /** Memoized one-time pipeline load (cache-first: no network on cache hit). */
30
+ loadOnce() {
31
+ if (!this.initPromise) {
32
+ this.initPromise = this.initialize();
33
+ }
34
+ return this.initPromise;
35
+ }
36
+ async initialize() {
37
+ // Library boundary cast — see TransformersModule doc comment.
38
+ const mod = (await import('@huggingface/transformers'));
39
+ mod.env.cacheDir = this.cacheDir;
40
+ // Never resolve from the workspace ./models/ dir — the cache (baked into
41
+ // the image or downloaded on first use) is the single source of truth.
42
+ mod.env.allowLocalModels = false;
43
+ this.logger.info({ modelId: this.modelId, cacheDir: this.cacheDir, dtype: this.quantized ? 'q8' : 'fp32' }, 'Loading ONNX embedding model');
44
+ return mod.pipeline('feature-extraction', this.modelId, {
45
+ dtype: this.quantized ? 'q8' : 'fp32',
46
+ device: 'cpu',
47
+ });
48
+ }
49
+ }
50
+ //# sourceMappingURL=OnnxEmbeddingBackend.js.map