sdlc-agent-4-enterprise-server 1.46.2 → 1.47.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.
- package/.dockerignore +8 -0
- package/Dockerfile +99 -29
- package/README.md +3 -2
- package/dist/admin/db/core.js +8 -0
- package/dist/admin/db/core.js.map +1 -1
- package/dist/admin/db/jwt.d.ts +42 -0
- package/dist/admin/db/jwt.js +97 -0
- package/dist/admin/db/jwt.js.map +1 -0
- package/dist/admin/db/refresh-tokens.d.ts +41 -0
- package/dist/admin/db/refresh-tokens.js +54 -0
- package/dist/admin/db/refresh-tokens.js.map +1 -0
- package/dist/admin/db/schema.js +21 -0
- package/dist/admin/db/schema.js.map +1 -1
- package/dist/admin/db/session-cache.d.ts +22 -0
- package/dist/admin/db/session-cache.js +34 -0
- package/dist/admin/db/session-cache.js.map +1 -0
- package/dist/admin/db/session-issue.d.ts +12 -0
- package/dist/admin/db/session-issue.js +43 -0
- package/dist/admin/db/session-issue.js.map +1 -0
- package/dist/admin/db/session-lifecycle.d.ts +19 -0
- package/dist/admin/db/session-lifecycle.js +83 -0
- package/dist/admin/db/session-lifecycle.js.map +1 -0
- package/dist/admin/db/session-types.d.ts +55 -0
- package/dist/admin/db/session-types.js +50 -0
- package/dist/admin/db/session-types.js.map +1 -0
- package/dist/admin/db/sessions.d.ts +14 -29
- package/dist/admin/db/sessions.js +34 -79
- package/dist/admin/db/sessions.js.map +1 -1
- package/dist/config/index.js +11 -15
- package/dist/config/index.js.map +1 -1
- package/dist/database/config/seedEngineFromEnv.d.ts +34 -0
- package/dist/database/config/seedEngineFromEnv.js +123 -0
- package/dist/database/config/seedEngineFromEnv.js.map +1 -0
- package/dist/database/migration/pg-modules-schema.d.ts +17 -0
- package/dist/database/migration/pg-modules-schema.js +41 -0
- package/dist/database/migration/pg-modules-schema.js.map +1 -0
- package/dist/database/migration/pg-schema-ensure.js +2 -0
- package/dist/database/migration/pg-schema-ensure.js.map +1 -1
- package/dist/database/schema-registry/ensure-postgres-memory.d.ts +29 -0
- package/dist/database/schema-registry/ensure-postgres-memory.js +64 -0
- package/dist/database/schema-registry/ensure-postgres-memory.js.map +1 -0
- package/dist/database/schema-registry/ensure-postgres-schema.d.ts +15 -0
- package/dist/database/schema-registry/ensure-postgres-schema.js +48 -0
- package/dist/database/schema-registry/ensure-postgres-schema.js.map +1 -0
- package/dist/database/schema-registry/ensure-sa4e-237.d.ts +11 -1
- package/dist/database/schema-registry/ensure-sa4e-237.js +3 -3
- package/dist/database/schema-registry/ensure-sa4e-237.js.map +1 -1
- package/dist/database/schema-registry/ensure-sa4e-276.d.ts +7 -1
- package/dist/database/schema-registry/ensure-sa4e-276.js +7 -16
- package/dist/database/schema-registry/ensure-sa4e-276.js.map +1 -1
- package/dist/engine/db/migration-steps.d.ts +24 -0
- package/dist/engine/db/migration-steps.js +177 -0
- package/dist/engine/db/migration-steps.js.map +1 -0
- package/dist/engine/db/migrations.d.ts +22 -0
- package/dist/engine/db/migrations.js +66 -159
- package/dist/engine/db/migrations.js.map +1 -1
- package/dist/engine/db/schema.d.ts +1 -1
- package/dist/engine/db/schema.js +3 -0
- package/dist/engine/db/schema.js.map +1 -1
- package/dist/engine/graph/graph-schema-ddl.d.ts +17 -0
- package/dist/engine/graph/graph-schema-ddl.js +183 -0
- package/dist/engine/graph/graph-schema-ddl.js.map +1 -0
- package/dist/engine/graph/migrator.d.ts +1 -0
- package/dist/engine/graph/migrator.js +2 -174
- package/dist/engine/graph/migrator.js.map +1 -1
- package/dist/engine/indexer/async-file-scanner.js +16 -6
- package/dist/engine/indexer/async-file-scanner.js.map +1 -1
- package/dist/engine/indexer/file-scanner.js +2 -1
- package/dist/engine/indexer/file-scanner.js.map +1 -1
- package/dist/engine/indexer/index-operation-manager.js +1 -0
- package/dist/engine/indexer/index-operation-manager.js.map +1 -1
- package/dist/engine/indexer/indexing-engine.d.ts +12 -2
- package/dist/engine/indexer/indexing-engine.js +22 -7
- package/dist/engine/indexer/indexing-engine.js.map +1 -1
- package/dist/engine/indexer/module-helper.js +32 -2
- package/dist/engine/indexer/module-helper.js.map +1 -1
- package/dist/engine/indexer/path-safety.d.ts +19 -1
- package/dist/engine/indexer/path-safety.js +42 -12
- package/dist/engine/indexer/path-safety.js.map +1 -1
- package/dist/engine/indexer/project-type/models.d.ts +6 -6
- package/dist/engine/indexer/startup-interrupt-detector.d.ts +15 -1
- package/dist/engine/indexer/startup-interrupt-detector.js +45 -2
- package/dist/engine/indexer/startup-interrupt-detector.js.map +1 -1
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/memory/IsolationLayer.d.ts +15 -0
- package/dist/modules/memory/IsolationLayer.js +23 -0
- package/dist/modules/memory/IsolationLayer.js.map +1 -1
- package/dist/modules/memory/dispatchers/crud.js +57 -37
- package/dist/modules/memory/dispatchers/crud.js.map +1 -1
- package/dist/modules/memory/dispatchers/search.js +7 -6
- package/dist/modules/memory/dispatchers/search.js.map +1 -1
- package/dist/modules/memory/llm/LLMInitializer.js +21 -4
- package/dist/modules/memory/llm/LLMInitializer.js.map +1 -1
- package/dist/modules/memory/llm/llm-error.d.ts +24 -0
- package/dist/modules/memory/llm/llm-error.js +77 -0
- package/dist/modules/memory/llm/llm-error.js.map +1 -0
- package/dist/modules/memory/task-queue/PendingTaskRepository.d.ts +15 -0
- package/dist/modules/memory/task-queue/PendingTaskRepository.js +27 -0
- package/dist/modules/memory/task-queue/PendingTaskRepository.js.map +1 -1
- package/dist/modules/pega/PegaSymbolSync.js +7 -0
- package/dist/modules/pega/PegaSymbolSync.js.map +1 -1
- package/dist/modules/security/gateguard/GateGuardService.js +8 -0
- package/dist/modules/security/gateguard/GateGuardService.js.map +1 -1
- package/dist/server/HttpServer.js +51 -2
- package/dist/server/HttpServer.js.map +1 -1
- package/dist/server/middleware/jwt-auth.d.ts +2 -2
- package/dist/server/middleware/jwt-auth.js +16 -15
- package/dist/server/middleware/jwt-auth.js.map +1 -1
- package/dist/server/routes/admin/context.d.ts +2 -0
- package/dist/server/routes/admin/context.js +31 -0
- package/dist/server/routes/admin/context.js.map +1 -1
- package/dist/server/routes/admin/index.js +69 -2
- package/dist/server/routes/admin/index.js.map +1 -1
- package/dist/server/routes/admin/users.js +1 -0
- package/dist/server/routes/admin/users.js.map +1 -1
- package/dist/server/routes/api-index-decoupled.d.ts +7 -3
- package/dist/server/routes/api-index-decoupled.js +57 -14
- package/dist/server/routes/api-index-decoupled.js.map +1 -1
- package/dist/server/routes/api-index.js +9 -2
- package/dist/server/routes/api-index.js.map +1 -1
- package/dist/server/routes/auth/login-routes.d.ts +13 -0
- package/dist/server/routes/auth/login-routes.js +124 -0
- package/dist/server/routes/auth/login-routes.js.map +1 -0
- package/dist/server/routes/auth/one-time-codes.d.ts +10 -0
- package/dist/server/routes/auth/one-time-codes.js +38 -0
- package/dist/server/routes/auth/one-time-codes.js.map +1 -0
- package/dist/server/routes/auth/sso-http-helpers.d.ts +13 -7
- package/dist/server/routes/auth/sso-http-helpers.js +16 -18
- package/dist/server/routes/auth/sso-http-helpers.js.map +1 -1
- package/dist/server/routes/auth/token-routes.d.ts +10 -0
- package/dist/server/routes/auth/token-routes.js +60 -0
- package/dist/server/routes/auth/token-routes.js.map +1 -0
- package/dist/server/routes/auth/unified.d.ts +6 -0
- package/dist/server/routes/auth/unified.js +13 -131
- package/dist/server/routes/auth/unified.js.map +1 -1
- package/dist/server/routes/enrichment-status-routes.js +26 -0
- package/dist/server/routes/enrichment-status-routes.js.map +1 -1
- package/dist/server/routes/schemas/index-schemas.d.ts +2 -2
- package/dist/server/services/SessionService.d.ts +3 -12
- package/dist/viewer/admin/index.html +81 -13
- package/docker-compose.embeddings.yml +24 -0
- package/docker-compose.test.yml +14 -3
- package/docker-compose.yml +119 -16
- package/models/onnx-runtime/generate-identity-model.py +16 -0
- package/models/onnx-runtime/identity.onnx +11 -0
- package/package.json +8 -2
- package/scripts/db/backup-postgres.mjs +200 -0
- package/scripts/db/test-compose.mjs +114 -0
- package/secrets/database_url.example +4 -0
- package/secrets/postgres_password.example +4 -0
- package/src/admin/db/__tests__/dual-token.test.ts +143 -0
- package/src/admin/db/__tests__/jwt.test.ts +104 -0
- package/src/admin/db/core.ts +8 -0
- package/src/admin/db/jwt.ts +123 -0
- package/src/admin/db/refresh-tokens.ts +100 -0
- package/src/admin/db/schema.ts +20 -0
- package/src/admin/db/session-cache.ts +44 -0
- package/src/admin/db/session-issue.ts +60 -0
- package/src/admin/db/session-lifecycle.ts +117 -0
- package/src/admin/db/session-types.ts +97 -0
- package/src/admin/db/sessions.ts +48 -133
- package/src/config/index.ts +11 -12
- package/src/database/config/__tests__/seedEngineFromEnv.test.ts +109 -0
- package/src/database/config/seedEngineFromEnv.ts +114 -0
- package/src/database/migration/__tests__/pg-modules-schema.test.ts +54 -0
- package/src/database/migration/pg-modules-schema.ts +43 -0
- package/src/database/migration/pg-schema-ensure.ts +2 -0
- package/src/database/schema-registry/__tests__/ensure-postgres-memory.test.ts +95 -0
- package/src/database/schema-registry/__tests__/ensure-postgres-schema.test.ts +60 -0
- package/src/database/schema-registry/__tests__/orphaned-ensures.test.ts +53 -0
- package/src/database/schema-registry/ensure-postgres-memory.ts +69 -0
- package/src/database/schema-registry/ensure-postgres-schema.ts +50 -0
- package/src/database/schema-registry/ensure-sa4e-237.ts +12 -3
- package/src/database/schema-registry/ensure-sa4e-276.ts +7 -17
- package/src/engine/db/__tests__/migration-body-embeddings-upsert.test.ts +178 -0
- package/src/engine/db/__tests__/migration-files-provenance.test.ts +81 -0
- package/src/engine/db/migration-steps.ts +199 -0
- package/src/engine/db/migrations.ts +74 -173
- package/src/engine/db/schema.ts +3 -0
- package/src/engine/graph/graph-schema-ddl.ts +196 -0
- package/src/engine/graph/migrator.ts +10 -180
- package/src/engine/indexer/__tests__/indexing-engine-register.test.ts +120 -0
- package/src/engine/indexer/__tests__/module-helper.test.ts +102 -37
- package/src/engine/indexer/__tests__/path-safety.test.ts +5 -3
- package/src/engine/indexer/__tests__/startup-interrupt-detector.test.ts +60 -2
- package/src/engine/indexer/async-file-scanner.ts +20 -6
- package/src/engine/indexer/file-scanner.ts +2 -1
- package/src/engine/indexer/index-operation-manager.ts +1 -0
- package/src/engine/indexer/indexing-engine.ts +22 -7
- package/src/engine/indexer/module-helper.ts +38 -2
- package/src/engine/indexer/path-safety.ts +40 -11
- package/src/engine/indexer/startup-interrupt-detector.ts +54 -2
- package/src/index.ts +27 -0
- package/src/modules/memory/IsolationLayer.ts +27 -0
- package/src/modules/memory/__tests__/IsolationLayer.test.ts +45 -0
- package/src/modules/memory/__tests__/ProjectIsolation.test.ts +32 -15
- package/src/modules/memory/__tests__/SA4E-331-CrossProjectIsolation.test.ts +32 -0
- package/src/modules/memory/__tests__/e2e/ingest-file-structured-map.e2e.test.ts +20 -16
- package/src/modules/memory/dispatchers/crud.ts +50 -36
- package/src/modules/memory/dispatchers/search.ts +7 -6
- package/src/modules/memory/ingest/__tests__/ingest-file-single-row.it.test.ts +144 -0
- package/src/modules/memory/llm/LLMInitializer.ts +21 -4
- package/src/modules/memory/llm/__tests__/llm-error.test.ts +70 -0
- package/src/modules/memory/llm/llm-error.ts +83 -0
- package/src/modules/memory/task-queue/PendingTaskRepository.ts +33 -0
- package/src/modules/pega/PegaSymbolSync.ts +2 -0
- package/src/modules/pega/__tests__/pega-indexing.e2e.test.ts +4 -0
- package/src/modules/security/gateguard/GateGuardService.ts +8 -0
- package/src/modules/security/gateguard/__tests__/GateGuardService.test.ts +36 -0
- package/src/server/HttpServer.ts +58 -2
- package/src/server/middleware/jwt-auth.ts +14 -13
- package/src/server/routes/__tests__/enrichment-status-routes.test.ts +35 -0
- package/src/server/routes/admin/__tests__/projects-register.test.ts +133 -0
- package/src/server/routes/admin/context.ts +34 -0
- package/src/server/routes/admin/index.ts +51 -3
- package/src/server/routes/admin/users.ts +1 -0
- package/src/server/routes/api-index-decoupled.ts +55 -14
- package/src/server/routes/api-index.ts +9 -2
- package/src/server/routes/auth/__tests__/one-time-codes.test.ts +49 -0
- package/src/server/routes/auth/login-routes.ts +132 -0
- package/src/server/routes/auth/one-time-codes.ts +46 -0
- package/src/server/routes/auth/sso-http-helpers.ts +28 -11
- package/src/server/routes/auth/token-routes.ts +62 -0
- package/src/server/routes/auth/unified.ts +27 -130
- package/src/server/routes/enrichment-status-routes.ts +26 -0
- package/src/viewer/admin/index.html +81 -13
- package/tests/integration/auth.test.ts +68 -2
package/.dockerignore
CHANGED
|
@@ -16,3 +16,11 @@ test*.ts
|
|
|
16
16
|
coverage
|
|
17
17
|
.env
|
|
18
18
|
.env.*
|
|
19
|
+
# SA4E-335 DEF-001: the `test` stage COPYs tests/ and .env.test (Dockerfile
|
|
20
|
+
# L127-128) — re-include exactly those so `docker build --target test` works.
|
|
21
|
+
# Last matching pattern wins, so the negations must follow the exclusions.
|
|
22
|
+
# Everything else (.env, .env.production, *.md, *.log) stays excluded.
|
|
23
|
+
!tests
|
|
24
|
+
!.env.test
|
|
25
|
+
# SEC-01: credentials never enter the build context (nor any image layer).
|
|
26
|
+
secrets
|
package/Dockerfile
CHANGED
|
@@ -1,43 +1,111 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# SA4E-335 Backend Dockerfile — Node.js 22 + Hono Code Intelligence MCP Server
|
|
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.
|
|
8
|
+
#
|
|
9
|
+
# Design decisions (TDD §3.2 / Security Review):
|
|
10
|
+
# - AD-1 : base = node:22-slim (Debian/glibc) so native modules such as
|
|
11
|
+
# onnxruntime-node link against glibc (musl/alpine is incompatible).
|
|
12
|
+
# - SEC-02 (Critical): base image pinned by immutable sha256 DIGEST, not only
|
|
13
|
+
# the mutable tag, to keep the build hermetic/reproducible. The human
|
|
14
|
+
# readable tag is kept as a comment; update the digest via Dependabot/
|
|
15
|
+
# Renovate (see documents/SA4E-335/BUILD-AND-REGISTRY.md).
|
|
16
|
+
# - SEC-05 (High): `git` and the compiler toolchain live ONLY in build-time
|
|
17
|
+
# stages (base/build). The runtime `production` stage installs the
|
|
18
|
+
# minimal runtime surface — no git, no compilers.
|
|
19
|
+
# - BR-05 : non-root user `sa4e` (uid/gid 1001) in production/development/test.
|
|
20
|
+
# - AD-6 : SA4E-44 capability items (draw.io CLI/Electron/xvfb, model pre-cache,
|
|
21
|
+
# SERVER_WORKSPACES_ROOT) are guarded behind build args and DEFAULT OFF
|
|
22
|
+
# (SEC-08) — a bare `docker build --target production .` must succeed.
|
|
23
|
+
# =============================================================================
|
|
24
|
+
|
|
25
|
+
# --- Build-time arguments (NO secrets — build args must never carry credentials, BR-17) ---
|
|
26
|
+
ARG NODE_VERSION=22
|
|
27
|
+
# node:22-slim — pin by digest for a reproducible supply chain (SEC-02).
|
|
28
|
+
# Tag kept for readability; the digest is the authoritative pin.
|
|
29
|
+
ARG NODE_BASE_DIGEST=sha256:43ac6c60b8f89723f746e8a92ce91abd5017e627ce1ddfe4238355d3a30b772c
|
|
4
30
|
|
|
31
|
+
# -----------------------------------------------------------------------------
|
|
32
|
+
# base — shared workdir + build toolchain (glibc). Build-time only.
|
|
33
|
+
# -----------------------------------------------------------------------------
|
|
34
|
+
FROM node:${NODE_VERSION}-slim@${NODE_BASE_DIGEST} AS base
|
|
5
35
|
WORKDIR /app
|
|
36
|
+
# Native-module build toolchain (python3/make/g++) + git for build-time fetches.
|
|
37
|
+
# Single layer with apt cleanup to keep intermediate layers lean. These packages
|
|
38
|
+
# are discarded from the runtime image (they exist only in base/build).
|
|
39
|
+
RUN apt-get update \
|
|
40
|
+
&& apt-get install -y --no-install-recommends python3 make g++ git \
|
|
41
|
+
&& apt-get clean \
|
|
42
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
6
43
|
|
|
7
|
-
#
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
# --- Dependencies stage ---
|
|
44
|
+
# -----------------------------------------------------------------------------
|
|
45
|
+
# deps — production (runtime) dependencies only.
|
|
46
|
+
# -----------------------------------------------------------------------------
|
|
11
47
|
FROM base AS deps
|
|
12
48
|
COPY package.json package-lock.json ./
|
|
49
|
+
# `npm ci` is hermetic: it installs exactly the locked versions (BR-03).
|
|
13
50
|
RUN npm ci --omit=dev
|
|
14
51
|
|
|
15
|
-
#
|
|
52
|
+
# -----------------------------------------------------------------------------
|
|
53
|
+
# build — compile TypeScript -> dist/. Full (dev) dependency set.
|
|
54
|
+
# -----------------------------------------------------------------------------
|
|
16
55
|
FROM base AS build
|
|
17
56
|
COPY package.json package-lock.json ./
|
|
18
57
|
RUN npm ci
|
|
19
58
|
COPY tsconfig.json ./
|
|
20
59
|
COPY src/ ./src/
|
|
21
60
|
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.
|
|
22
64
|
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
|
|
65
|
+
# -----------------------------------------------------------------------------
|
|
66
|
+
# production ★ — runtime image. SOLE CI push target. Minimal surface, non-root.
|
|
67
|
+
# No git, no compilers (SEC-05). node:22-slim pinned by digest (SEC-02).
|
|
68
|
+
# -----------------------------------------------------------------------------
|
|
69
|
+
FROM node:${NODE_VERSION}-slim@${NODE_BASE_DIGEST} AS production
|
|
26
70
|
WORKDIR /app
|
|
27
71
|
|
|
28
|
-
#
|
|
29
|
-
|
|
30
|
-
|
|
72
|
+
# SA4E-335 DEF-004 — CI Trivy gate (CRITICAL,HIGH + ignore-unfixed) counts the
|
|
73
|
+
# npm CLI that the base image bundles under /usr/local/lib/node_modules/npm.
|
|
74
|
+
# Those copies (pacote, sigstore, brace-expansion, picomatch, ip-address,
|
|
75
|
+
# undici) are NOT reachable from backend/package-lock.json, and the pinned
|
|
76
|
+
# node:22-slim digest is already the latest — so the fix is to bump the CLI
|
|
77
|
+
# itself (10.9.9 → NPM_VERSION: pacote/sigstore majors land on patched lines)
|
|
78
|
+
# and refresh the two packages upstream has not re-released yet, using
|
|
79
|
+
# same-major PATCH releases only (5.0.9→5.0.12, 6.28.0→6.28.1).
|
|
80
|
+
# npm/npx stay installed: the sandbox module's local-mode fallback (UC-06)
|
|
81
|
+
# shells out to them at runtime, so removing the CLI would be a regression.
|
|
82
|
+
# Build stages keep the base npm for `npm ci` — only the runtime CLI moves.
|
|
83
|
+
# The trailing probes fail the build if either patch broke module resolution
|
|
84
|
+
# or the CLI itself.
|
|
85
|
+
ARG NPM_VERSION=11.21.0
|
|
86
|
+
RUN npm install -g npm@${NPM_VERSION} --no-audit --no-fund --loglevel=error \
|
|
87
|
+
&& NM=/usr/local/lib/node_modules/npm/node_modules \
|
|
88
|
+
&& for entry in "brace-expansion 5.0.12" "undici 6.28.1"; do \
|
|
89
|
+
name=$(echo "$entry" | cut -d' ' -f1); ver=$(echo "$entry" | cut -d' ' -f2); \
|
|
90
|
+
tgz=$(npm pack "${name}@${ver}" --pack-destination /tmp --silent); \
|
|
91
|
+
rm -rf "${NM}/${name}"; mkdir -p "${NM}/${name}"; \
|
|
92
|
+
tar -xzf "/tmp/${tgz}" -C "${NM}/${name}" --strip-components=1; \
|
|
93
|
+
done \
|
|
94
|
+
&& rm -rf /tmp/*.tgz \
|
|
95
|
+
&& node -e "require('${NM}/brace-expansion'); require('${NM}/undici')" \
|
|
96
|
+
&& npm --version
|
|
97
|
+
|
|
98
|
+
# Runtime copies the pruned production node_modules + compiled dist only.
|
|
31
99
|
COPY --from=deps /app/node_modules ./node_modules
|
|
32
100
|
COPY --from=build /app/dist ./dist
|
|
33
101
|
COPY --from=build /app/package.json ./
|
|
34
102
|
|
|
35
|
-
#
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
103
|
+
# Non-root runtime user (BR-05). Debian uses groupadd/useradd (not alpine addgroup).
|
|
104
|
+
# `-r` = system account, `nologin` shell = no interactive login.
|
|
105
|
+
RUN groupadd -g 1001 sa4e \
|
|
106
|
+
&& useradd -u 1001 -g sa4e -r -s /usr/sbin/nologin sa4e \
|
|
107
|
+
&& mkdir -p /app/.code-intel \
|
|
108
|
+
&& chown -R sa4e:sa4e /app
|
|
41
109
|
USER sa4e
|
|
42
110
|
|
|
43
111
|
ENV NODE_ENV=production
|
|
@@ -45,13 +113,15 @@ ENV PORT=48721
|
|
|
45
113
|
|
|
46
114
|
EXPOSE 48721
|
|
47
115
|
|
|
116
|
+
# Dependency-free health probe (SEC-12): node:22-slim does not ship `wget`, so a
|
|
117
|
+
# wget-based probe would silently fail. Use node's built-in http client instead.
|
|
48
118
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
49
|
-
CMD
|
|
119
|
+
CMD node -e "require('http').get('http://localhost:'+(process.env.PORT||48721)+'/health',r=>process.exit(r.statusCode===200?0:1)).on('error',()=>process.exit(1))"
|
|
50
120
|
|
|
51
121
|
CMD ["node", "dist/index.js"]
|
|
52
122
|
|
|
53
123
|
# -----------------------------------------------------------------------------
|
|
54
|
-
#
|
|
124
|
+
# development — hot reload (tsx watch) for local dev. Non-root user.
|
|
55
125
|
# Build: docker compose -f docker-compose.yml -f docker-compose.dev.yml up
|
|
56
126
|
# -----------------------------------------------------------------------------
|
|
57
127
|
FROM base AS development
|
|
@@ -61,15 +131,15 @@ COPY package.json package-lock.json ./
|
|
|
61
131
|
RUN npm ci
|
|
62
132
|
COPY tsconfig.json ./
|
|
63
133
|
COPY src/ ./src/
|
|
64
|
-
RUN
|
|
65
|
-
|
|
66
|
-
|
|
134
|
+
RUN groupadd -g 1001 sa4e \
|
|
135
|
+
&& useradd -u 1001 -g sa4e -r -s /usr/sbin/nologin sa4e \
|
|
136
|
+
&& chown -R sa4e:sa4e /app
|
|
67
137
|
USER sa4e
|
|
68
138
|
EXPOSE 48721
|
|
69
139
|
CMD ["npx", "tsx", "watch", "--ignore", ".code-intel/**", "src/index.ts"]
|
|
70
140
|
|
|
71
141
|
# -----------------------------------------------------------------------------
|
|
72
|
-
#
|
|
142
|
+
# test — runs the vitest unit suite inside the container (non-root).
|
|
73
143
|
# Build: docker build --target test -t sa4e-backend-test .
|
|
74
144
|
# Run: docker run --rm sa4e-backend-test
|
|
75
145
|
# -----------------------------------------------------------------------------
|
|
@@ -82,8 +152,8 @@ COPY tsconfig.json ./
|
|
|
82
152
|
COPY src/ ./src/
|
|
83
153
|
COPY tests/ ./tests/
|
|
84
154
|
COPY .env.test ./
|
|
85
|
-
RUN
|
|
86
|
-
|
|
87
|
-
|
|
155
|
+
RUN groupadd -g 1001 sa4e \
|
|
156
|
+
&& useradd -u 1001 -g sa4e -r -s /usr/sbin/nologin sa4e \
|
|
157
|
+
&& chown -R sa4e:sa4e /app
|
|
88
158
|
USER sa4e
|
|
89
159
|
CMD ["npx", "vitest", "run"]
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
|
-
<img src="https://img.shields.io/badge/version-1.
|
|
9
|
+
<img src="https://img.shields.io/badge/version-1.47.0-blue?style=for-the-badge" alt="Version">
|
|
10
10
|
<img src="https://img.shields.io/badge/tools-66+-teal?style=for-the-badge" alt="Tools">
|
|
11
11
|
<img src="https://img.shields.io/badge/node-%3E%3D18-green?style=for-the-badge" alt="Node">
|
|
12
12
|
</p>
|
|
@@ -38,7 +38,7 @@ Server starts at **http://localhost:48721**. Verify it's running:
|
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
curl http://localhost:48721/health
|
|
41
|
-
# → {"status":"healthy","version":"1.
|
|
41
|
+
# → {"status":"healthy","version":"1.47.0","uptime":5,"tools_loaded":52}
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
### Development Mode (auto-reload)
|
|
@@ -233,6 +233,7 @@ The embedding model is expected at `.code-intel/models/model.onnx`. Download it:
|
|
|
233
233
|
|
|
234
234
|
| Version | Date | Ticket | Changes |
|
|
235
235
|
|---------|------|--------|---------|
|
|
236
|
+
| 1.47.0 | 2026-10-02 | — | New endpoint `GET /api/v1/enrichment/failures?limit=N` (clamp 1–1000, default 200) returns full FAILED enrichment task list from `pending_tasks` with resolved source, error, retry count, timestamp (`PendingTaskRepository.listFailedDetailed`). Surfaces ingest failures to the extension beyond the 10-item status tooltip. |
|
|
236
237
|
| 1.46.2 | 2026-09-28 | — | Version sync (no backend code changes; packaging fix lives in `extension`: missing direct `yargs` dep for vendored devtools barrel). |
|
|
237
238
|
| 1.46.1 | 2026-09-28 | — | Version sync patch: align `root`/`backend`/`extension` to 1.46.1; README badges + health example + changelogs updated. No runtime code changes since 1.46.0. |
|
|
238
239
|
| 1.46.0 | 2026-09-27 | SA4E-289/324..332 | SA4E-289 epic (Option C): LangGraph decommission + Pi SDK cutover, shared kernel `extension/src/mcp/`. SA4E-324..330 small-model wave (`LlmProvider.countTokens()`, budget gate REJECT >95%/WARN >85%, compression, routing, compaction). Security: 4 High + 17 Medium fixed, 0 Critical. 20 test.todo implemented; suites green. |
|
package/dist/admin/db/core.js
CHANGED
|
@@ -15,6 +15,8 @@ import { hashPassword, verifyPassword, generateToken } from './password.js';
|
|
|
15
15
|
import { SqliteWasmAdapter } from '../../database/adapters/wasm/SqliteWasmAdapter.js';
|
|
16
16
|
import { DatabaseAdapterFactory } from '../../database/factory/DatabaseAdapterFactory.js';
|
|
17
17
|
import { DatabaseConfigService } from '../../database/config/DatabaseConfigService.js';
|
|
18
|
+
import { seedEngineFromEnv } from '../../database/config/seedEngineFromEnv.js';
|
|
19
|
+
import { ensurePostgresSchema } from '../../database/schema-registry/ensure-postgres-schema.js';
|
|
18
20
|
export { hashPassword, verifyPassword, generateToken };
|
|
19
21
|
export const logger = pino({ name: 'admin-db' });
|
|
20
22
|
const config = loadConfig();
|
|
@@ -140,6 +142,9 @@ export function getDbAdapter() {
|
|
|
140
142
|
* @throws Error if connection fails (server should not start)
|
|
141
143
|
*/
|
|
142
144
|
export async function initAdapters() {
|
|
145
|
+
// SA4E-335 DEF-002: a DATABASE_URL(_FILE) handed out by compose secrets wins
|
|
146
|
+
// over database.json — seed the engine before resolving it (no-op without env).
|
|
147
|
+
seedEngineFromEnv(DATA_DIR);
|
|
143
148
|
const engine = getActiveEngine();
|
|
144
149
|
if (engine === 'sqlite') {
|
|
145
150
|
// Create instance + await wasm connect + schema init/seed (shared promise).
|
|
@@ -157,6 +162,9 @@ export async function initAdapters() {
|
|
|
157
162
|
try {
|
|
158
163
|
await initSchema(adapter);
|
|
159
164
|
await seedDefaults(adapter);
|
|
165
|
+
// SA4E-335 DEF-002: initSchema covers admin/graph tables only — also ensure
|
|
166
|
+
// the engine-specific index + memory (KB) tables (idempotent; no-op off PG).
|
|
167
|
+
await ensurePostgresSchema(adapter);
|
|
160
168
|
}
|
|
161
169
|
catch (err) {
|
|
162
170
|
logger.error({ err }, '[admin] Failed to init schema/seed defaults');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/admin/db/core.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/admin/db/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* admin/db/jwt.ts — Access-token JWT issue/verify (HS256).
|
|
3
|
+
* Dual-token auth (SA4E-321): short-lived access JWT (Bearer) + long-lived
|
|
4
|
+
* opaque refresh token. Byte-compatible with LocalHS256Verifier /
|
|
5
|
+
* jwt-auth verifyHs256 so one secret signs everything.
|
|
6
|
+
*/
|
|
7
|
+
/** Access-token lifetime: 15 minutes. */
|
|
8
|
+
export declare const ACCESS_TTL_SEC: number;
|
|
9
|
+
/** Claims carried by every access JWT. sid is mandatory (revocation key). */
|
|
10
|
+
export interface AccessClaims {
|
|
11
|
+
/** User id. */
|
|
12
|
+
sub: string;
|
|
13
|
+
/** Session id — logout/revocation lookup key. */
|
|
14
|
+
sid: string;
|
|
15
|
+
/** Default project id. */
|
|
16
|
+
pid?: string;
|
|
17
|
+
/** Workspace id. */
|
|
18
|
+
wid?: string;
|
|
19
|
+
/** Issued-at (epoch seconds). */
|
|
20
|
+
iat?: number;
|
|
21
|
+
/** Expiry (epoch seconds). */
|
|
22
|
+
exp?: number;
|
|
23
|
+
}
|
|
24
|
+
export type VerifyResult = {
|
|
25
|
+
ok: true;
|
|
26
|
+
claims: AccessClaims;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
reason: 'malformed' | 'bad_signature' | 'bad_payload' | 'expired' | 'no_session';
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the HS256 signing secret: KB_TOKEN_SECRET env (operator-managed),
|
|
33
|
+
* else provisioned <dataDir>/.jwt-secret (survives restarts), else an
|
|
34
|
+
* ephemeral per-process secret (read-only FS / test sandbox).
|
|
35
|
+
*/
|
|
36
|
+
export declare function getJwtSecret(): string;
|
|
37
|
+
/** Sign a short-lived access JWT. */
|
|
38
|
+
export declare function signAccessJwt(claims: AccessClaims): string;
|
|
39
|
+
/** Verify an access JWT. Rejects anything that is not a 3-part signed, live token. */
|
|
40
|
+
export declare function verifyAccessJwt(token: string): VerifyResult;
|
|
41
|
+
/** True when the credential has JWT shape (3 dot-separated parts). */
|
|
42
|
+
export declare function looksLikeJwt(token: string): boolean;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* admin/db/jwt.ts — Access-token JWT issue/verify (HS256).
|
|
3
|
+
* Dual-token auth (SA4E-321): short-lived access JWT (Bearer) + long-lived
|
|
4
|
+
* opaque refresh token. Byte-compatible with LocalHS256Verifier /
|
|
5
|
+
* jwt-auth verifyHs256 so one secret signs everything.
|
|
6
|
+
*/
|
|
7
|
+
import { createHmac, randomBytes, timingSafeEqual } from 'crypto';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { getWorkspacePath, loadConfig } from '../../config/index.js';
|
|
11
|
+
/** Access-token lifetime: 15 minutes. */
|
|
12
|
+
export const ACCESS_TTL_SEC = 15 * 60;
|
|
13
|
+
let provisionedSecret = null;
|
|
14
|
+
function secretFilePath() {
|
|
15
|
+
const cfg = loadConfig();
|
|
16
|
+
const dir = path.isAbsolute(cfg.dataDir) ? cfg.dataDir : path.resolve(getWorkspacePath(), cfg.dataDir);
|
|
17
|
+
return path.join(dir, '.jwt-secret');
|
|
18
|
+
}
|
|
19
|
+
function b64url(input) {
|
|
20
|
+
return Buffer.from(input).toString('base64url');
|
|
21
|
+
}
|
|
22
|
+
function hmac(data, secret) {
|
|
23
|
+
return createHmac('sha256', secret).update(data).digest('base64url');
|
|
24
|
+
}
|
|
25
|
+
function constantTimeEqual(a, b) {
|
|
26
|
+
const bufA = Buffer.from(a, 'utf8');
|
|
27
|
+
const bufB = Buffer.from(b, 'utf8');
|
|
28
|
+
if (bufA.length !== bufB.length)
|
|
29
|
+
return false;
|
|
30
|
+
return timingSafeEqual(bufA, bufB);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the HS256 signing secret: KB_TOKEN_SECRET env (operator-managed),
|
|
34
|
+
* else provisioned <dataDir>/.jwt-secret (survives restarts), else an
|
|
35
|
+
* ephemeral per-process secret (read-only FS / test sandbox).
|
|
36
|
+
*/
|
|
37
|
+
export function getJwtSecret() {
|
|
38
|
+
const envSecret = (process.env.KB_TOKEN_SECRET || '').trim();
|
|
39
|
+
if (envSecret)
|
|
40
|
+
return envSecret;
|
|
41
|
+
if (provisionedSecret)
|
|
42
|
+
return provisionedSecret;
|
|
43
|
+
const file = secretFilePath();
|
|
44
|
+
try {
|
|
45
|
+
const existing = fs.existsSync(file) ? fs.readFileSync(file, 'utf8').trim() : '';
|
|
46
|
+
if (existing) {
|
|
47
|
+
provisionedSecret = existing;
|
|
48
|
+
return existing;
|
|
49
|
+
}
|
|
50
|
+
const generated = randomBytes(48).toString('hex');
|
|
51
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
52
|
+
fs.writeFileSync(file, generated, { mode: 0o600 });
|
|
53
|
+
provisionedSecret = generated;
|
|
54
|
+
return generated;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
const generated = randomBytes(48).toString('hex');
|
|
58
|
+
provisionedSecret = generated;
|
|
59
|
+
return generated;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Sign a short-lived access JWT. */
|
|
63
|
+
export function signAccessJwt(claims) {
|
|
64
|
+
const now = Math.floor(Date.now() / 1000);
|
|
65
|
+
const header = b64url(JSON.stringify({ alg: 'HS256', typ: 'JWT' }));
|
|
66
|
+
const payload = b64url(JSON.stringify({ ...claims, iat: now, exp: now + ACCESS_TTL_SEC }));
|
|
67
|
+
return `${header}.${payload}.${hmac(`${header}.${payload}`, getJwtSecret())}`;
|
|
68
|
+
}
|
|
69
|
+
/** Verify an access JWT. Rejects anything that is not a 3-part signed, live token. */
|
|
70
|
+
export function verifyAccessJwt(token) {
|
|
71
|
+
const parts = token.split('.');
|
|
72
|
+
if (parts.length !== 3 || !parts[0] || !parts[1] || !parts[2]) {
|
|
73
|
+
return { ok: false, reason: 'malformed' };
|
|
74
|
+
}
|
|
75
|
+
if (!constantTimeEqual(parts[2], hmac(`${parts[0]}.${parts[1]}`, getJwtSecret()))) {
|
|
76
|
+
return { ok: false, reason: 'bad_signature' };
|
|
77
|
+
}
|
|
78
|
+
let payload;
|
|
79
|
+
try {
|
|
80
|
+
payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return { ok: false, reason: 'bad_payload' };
|
|
84
|
+
}
|
|
85
|
+
if (typeof payload['exp'] !== 'number' || Date.now() >= payload['exp'] * 1000) {
|
|
86
|
+
return { ok: false, reason: 'expired' };
|
|
87
|
+
}
|
|
88
|
+
if (typeof payload['sid'] !== 'string' || !payload['sid'] || typeof payload['sub'] !== 'string' || !payload['sub']) {
|
|
89
|
+
return { ok: false, reason: 'no_session' };
|
|
90
|
+
}
|
|
91
|
+
return { ok: true, claims: payload };
|
|
92
|
+
}
|
|
93
|
+
/** True when the credential has JWT shape (3 dot-separated parts). */
|
|
94
|
+
export function looksLikeJwt(token) {
|
|
95
|
+
return token.split('.').length === 3;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../../src/admin/db/jwt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* admin/db/refresh-tokens.ts — Opaque refresh-token storage (hashed at rest).
|
|
3
|
+
* SA4E-321: tokens are stored as SHA-256; a DB leak yields no usable credential.
|
|
4
|
+
* Rotation keeps every live token of a family valid so two clients refreshing
|
|
5
|
+
* concurrently do not lock each other out; reuse of a token older than the
|
|
6
|
+
* grace window revokes the whole family (stolen-token detection).
|
|
7
|
+
*/
|
|
8
|
+
/** Absolute refresh-token lifetime: 7 days from first login. */
|
|
9
|
+
export declare const REFRESH_TTL_SEC: number;
|
|
10
|
+
/** How long a superseded token stays usable for concurrent refreshes. */
|
|
11
|
+
export declare const REFRESH_GRACE_SEC = 60;
|
|
12
|
+
/** refresh_tokens row shape. */
|
|
13
|
+
export interface RefreshTokenRow {
|
|
14
|
+
token_hash: string;
|
|
15
|
+
session_id: string;
|
|
16
|
+
user_id: string;
|
|
17
|
+
family_id: string;
|
|
18
|
+
used_at: string | null;
|
|
19
|
+
revoked_at: string | null;
|
|
20
|
+
expires_at: string;
|
|
21
|
+
created_at: string;
|
|
22
|
+
}
|
|
23
|
+
/** SHA-256 of the opaque refresh token — the value stored in the DB. */
|
|
24
|
+
export declare function hashRefreshToken(token: string): string;
|
|
25
|
+
/** Mint a refresh token for a session and persist its hash. */
|
|
26
|
+
export declare function issueRefreshToken(sessionId: string, userId: string, familyId: string, absoluteExpiresAt: string): Promise<{
|
|
27
|
+
token: string;
|
|
28
|
+
expiresAt: string;
|
|
29
|
+
}>;
|
|
30
|
+
/** Look up a refresh token by its plaintext value. */
|
|
31
|
+
export declare function findRefreshToken(token: string): Promise<RefreshTokenRow | null>;
|
|
32
|
+
/** Mark a token as consumed (starts its grace window). */
|
|
33
|
+
export declare function markRefreshTokenUsed(tokenHash: string): Promise<void>;
|
|
34
|
+
/** Revoke every token in a rotation family (reuse detected). */
|
|
35
|
+
export declare function revokeRefreshFamily(familyId: string): Promise<void>;
|
|
36
|
+
/** Revoke every refresh token of a session (logout). */
|
|
37
|
+
export declare function revokeSessionRefreshTokens(sessionId: string): Promise<void>;
|
|
38
|
+
/** Revoke every refresh token of a user (force-logout / disable). */
|
|
39
|
+
export declare function revokeUserRefreshTokens(userId: string): Promise<void>;
|
|
40
|
+
/** True when the presented token is still inside its post-rotation grace window. */
|
|
41
|
+
export declare function isWithinGrace(row: RefreshTokenRow): boolean;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* admin/db/refresh-tokens.ts — Opaque refresh-token storage (hashed at rest).
|
|
3
|
+
* SA4E-321: tokens are stored as SHA-256; a DB leak yields no usable credential.
|
|
4
|
+
* Rotation keeps every live token of a family valid so two clients refreshing
|
|
5
|
+
* concurrently do not lock each other out; reuse of a token older than the
|
|
6
|
+
* grace window revokes the whole family (stolen-token detection).
|
|
7
|
+
*/
|
|
8
|
+
import * as crypto from 'crypto';
|
|
9
|
+
import { getDbAdapter } from './core.js';
|
|
10
|
+
import { generateToken } from './password.js';
|
|
11
|
+
/** Absolute refresh-token lifetime: 7 days from first login. */
|
|
12
|
+
export const REFRESH_TTL_SEC = 7 * 24 * 60 * 60;
|
|
13
|
+
/** How long a superseded token stays usable for concurrent refreshes. */
|
|
14
|
+
export const REFRESH_GRACE_SEC = 60;
|
|
15
|
+
/** SHA-256 of the opaque refresh token — the value stored in the DB. */
|
|
16
|
+
export function hashRefreshToken(token) {
|
|
17
|
+
return crypto.createHash('sha256').update(token).digest('hex');
|
|
18
|
+
}
|
|
19
|
+
/** Mint a refresh token for a session and persist its hash. */
|
|
20
|
+
export async function issueRefreshToken(sessionId, userId, familyId, absoluteExpiresAt) {
|
|
21
|
+
const token = generateToken();
|
|
22
|
+
const expiresAt = new Date(Math.min(new Date(absoluteExpiresAt).getTime(), Date.now() + REFRESH_TTL_SEC * 1000)).toISOString();
|
|
23
|
+
await getDbAdapter().runAsync(`INSERT INTO refresh_tokens (token_hash, session_id, user_id, family_id, used_at, revoked_at, expires_at, created_at)
|
|
24
|
+
VALUES (?, ?, ?, ?, NULL, NULL, ?, ?)`, [hashRefreshToken(token), sessionId, userId, familyId, expiresAt, new Date().toISOString()]);
|
|
25
|
+
return { token, expiresAt };
|
|
26
|
+
}
|
|
27
|
+
/** Look up a refresh token by its plaintext value. */
|
|
28
|
+
export async function findRefreshToken(token) {
|
|
29
|
+
const row = await getDbAdapter().getAsync('SELECT * FROM refresh_tokens WHERE token_hash = ?', [hashRefreshToken(token)]);
|
|
30
|
+
return row ?? null;
|
|
31
|
+
}
|
|
32
|
+
/** Mark a token as consumed (starts its grace window). */
|
|
33
|
+
export async function markRefreshTokenUsed(tokenHash) {
|
|
34
|
+
await getDbAdapter().runAsync('UPDATE refresh_tokens SET used_at = ? WHERE token_hash = ? AND used_at IS NULL', [new Date().toISOString(), tokenHash]);
|
|
35
|
+
}
|
|
36
|
+
/** Revoke every token in a rotation family (reuse detected). */
|
|
37
|
+
export async function revokeRefreshFamily(familyId) {
|
|
38
|
+
await getDbAdapter().runAsync('UPDATE refresh_tokens SET revoked_at = ? WHERE family_id = ? AND revoked_at IS NULL', [new Date().toISOString(), familyId]);
|
|
39
|
+
}
|
|
40
|
+
/** Revoke every refresh token of a session (logout). */
|
|
41
|
+
export async function revokeSessionRefreshTokens(sessionId) {
|
|
42
|
+
await getDbAdapter().runAsync('UPDATE refresh_tokens SET revoked_at = ? WHERE session_id = ? AND revoked_at IS NULL', [new Date().toISOString(), sessionId]);
|
|
43
|
+
}
|
|
44
|
+
/** Revoke every refresh token of a user (force-logout / disable). */
|
|
45
|
+
export async function revokeUserRefreshTokens(userId) {
|
|
46
|
+
await getDbAdapter().runAsync('UPDATE refresh_tokens SET revoked_at = ? WHERE user_id = ? AND revoked_at IS NULL', [new Date().toISOString(), userId]);
|
|
47
|
+
}
|
|
48
|
+
/** True when the presented token is still inside its post-rotation grace window. */
|
|
49
|
+
export function isWithinGrace(row) {
|
|
50
|
+
if (!row.used_at)
|
|
51
|
+
return false;
|
|
52
|
+
return Date.now() - new Date(row.used_at).getTime() <= REFRESH_GRACE_SEC * 1000;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=refresh-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-tokens.js","sourceRoot":"","sources":["../../../src/admin/db/refresh-tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/db/schema.js
CHANGED
|
@@ -196,6 +196,15 @@ export async function initSchema(db) {
|
|
|
196
196
|
catch (err) {
|
|
197
197
|
console.debug('[schema] sessions.user_agent_hash already exists :', err.message);
|
|
198
198
|
}
|
|
199
|
+
// SA4E-321 migration: absolute session deadline (7d hard cap) for dual-token auth
|
|
200
|
+
try {
|
|
201
|
+
await db.execAsync(`ALTER TABLE sessions ADD COLUMN absolute_expires_at TEXT DEFAULT ''`);
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
console.debug('[schema] sessions.absolute_expires_at already exists :', err.message);
|
|
205
|
+
}
|
|
206
|
+
await db.execAsync(`CREATE INDEX IF NOT EXISTS idx_refresh_tokens_family ON refresh_tokens(family_id)`);
|
|
207
|
+
await db.execAsync(`CREATE INDEX IF NOT EXISTS idx_refresh_tokens_session ON refresh_tokens(session_id)`);
|
|
199
208
|
// Idempotent migration: add project_id to graph_nodes for existing DBs
|
|
200
209
|
try {
|
|
201
210
|
await db.execAsync(`ALTER TABLE graph_nodes ADD COLUMN project_id TEXT NOT NULL DEFAULT ''`);
|
|
@@ -367,6 +376,18 @@ function schemaSql(engine) {
|
|
|
367
376
|
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
|
|
368
377
|
);
|
|
369
378
|
|
|
379
|
+
CREATE TABLE IF NOT EXISTS refresh_tokens (
|
|
380
|
+
token_hash TEXT PRIMARY KEY,
|
|
381
|
+
session_id TEXT NOT NULL,
|
|
382
|
+
user_id TEXT NOT NULL,
|
|
383
|
+
family_id TEXT NOT NULL,
|
|
384
|
+
used_at TEXT,
|
|
385
|
+
revoked_at TEXT,
|
|
386
|
+
expires_at TEXT NOT NULL,
|
|
387
|
+
created_at TEXT NOT NULL,
|
|
388
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
|
|
389
|
+
);
|
|
390
|
+
|
|
370
391
|
CREATE TABLE IF NOT EXISTS audit_log (
|
|
371
392
|
audit_id TEXT PRIMARY KEY,
|
|
372
393
|
user_id TEXT NOT NULL,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/admin/db/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/admin/db/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* admin/db/session-cache.ts — 30s revocation cache for session lookups.
|
|
3
|
+
* Access JWTs verify statelessly; this cache is the only place a logged-out
|
|
4
|
+
* session is noticed before the JWT's own 15-minute expiry.
|
|
5
|
+
*/
|
|
6
|
+
/** Cache entry lifetime — bounded staleness for a revoked session. */
|
|
7
|
+
export declare const REVOCATION_TTL_MS = 30000;
|
|
8
|
+
interface CacheEntry {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
expires: number;
|
|
11
|
+
/** Cached session identity (shape owned by sessions.ts). */
|
|
12
|
+
value?: unknown;
|
|
13
|
+
}
|
|
14
|
+
/** Read a cached session verdict; undefined when absent or stale. */
|
|
15
|
+
export declare function sessionCacheGet(key: string): CacheEntry | undefined;
|
|
16
|
+
/** Store a session verdict for REVOCATION_TTL_MS. */
|
|
17
|
+
export declare function sessionCacheSet(key: string, valid: boolean, value?: unknown): void;
|
|
18
|
+
/** Drop one session from the cache (logout / password change). */
|
|
19
|
+
export declare function sessionCacheInvalidate(key: string): void;
|
|
20
|
+
/** Drop every cached session (force-logout of a user). */
|
|
21
|
+
export declare function sessionCacheClear(): void;
|
|
22
|
+
export {};
|