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.
Files changed (228) hide show
  1. package/.dockerignore +8 -0
  2. package/Dockerfile +99 -29
  3. package/README.md +3 -2
  4. package/dist/admin/db/core.js +8 -0
  5. package/dist/admin/db/core.js.map +1 -1
  6. package/dist/admin/db/jwt.d.ts +42 -0
  7. package/dist/admin/db/jwt.js +97 -0
  8. package/dist/admin/db/jwt.js.map +1 -0
  9. package/dist/admin/db/refresh-tokens.d.ts +41 -0
  10. package/dist/admin/db/refresh-tokens.js +54 -0
  11. package/dist/admin/db/refresh-tokens.js.map +1 -0
  12. package/dist/admin/db/schema.js +21 -0
  13. package/dist/admin/db/schema.js.map +1 -1
  14. package/dist/admin/db/session-cache.d.ts +22 -0
  15. package/dist/admin/db/session-cache.js +34 -0
  16. package/dist/admin/db/session-cache.js.map +1 -0
  17. package/dist/admin/db/session-issue.d.ts +12 -0
  18. package/dist/admin/db/session-issue.js +43 -0
  19. package/dist/admin/db/session-issue.js.map +1 -0
  20. package/dist/admin/db/session-lifecycle.d.ts +19 -0
  21. package/dist/admin/db/session-lifecycle.js +83 -0
  22. package/dist/admin/db/session-lifecycle.js.map +1 -0
  23. package/dist/admin/db/session-types.d.ts +55 -0
  24. package/dist/admin/db/session-types.js +50 -0
  25. package/dist/admin/db/session-types.js.map +1 -0
  26. package/dist/admin/db/sessions.d.ts +14 -29
  27. package/dist/admin/db/sessions.js +34 -79
  28. package/dist/admin/db/sessions.js.map +1 -1
  29. package/dist/config/index.js +11 -15
  30. package/dist/config/index.js.map +1 -1
  31. package/dist/database/config/seedEngineFromEnv.d.ts +34 -0
  32. package/dist/database/config/seedEngineFromEnv.js +123 -0
  33. package/dist/database/config/seedEngineFromEnv.js.map +1 -0
  34. package/dist/database/migration/pg-modules-schema.d.ts +17 -0
  35. package/dist/database/migration/pg-modules-schema.js +41 -0
  36. package/dist/database/migration/pg-modules-schema.js.map +1 -0
  37. package/dist/database/migration/pg-schema-ensure.js +2 -0
  38. package/dist/database/migration/pg-schema-ensure.js.map +1 -1
  39. package/dist/database/schema-registry/ensure-postgres-memory.d.ts +29 -0
  40. package/dist/database/schema-registry/ensure-postgres-memory.js +64 -0
  41. package/dist/database/schema-registry/ensure-postgres-memory.js.map +1 -0
  42. package/dist/database/schema-registry/ensure-postgres-schema.d.ts +15 -0
  43. package/dist/database/schema-registry/ensure-postgres-schema.js +48 -0
  44. package/dist/database/schema-registry/ensure-postgres-schema.js.map +1 -0
  45. package/dist/database/schema-registry/ensure-sa4e-237.d.ts +11 -1
  46. package/dist/database/schema-registry/ensure-sa4e-237.js +3 -3
  47. package/dist/database/schema-registry/ensure-sa4e-237.js.map +1 -1
  48. package/dist/database/schema-registry/ensure-sa4e-276.d.ts +7 -1
  49. package/dist/database/schema-registry/ensure-sa4e-276.js +7 -16
  50. package/dist/database/schema-registry/ensure-sa4e-276.js.map +1 -1
  51. package/dist/engine/db/migration-steps.d.ts +24 -0
  52. package/dist/engine/db/migration-steps.js +177 -0
  53. package/dist/engine/db/migration-steps.js.map +1 -0
  54. package/dist/engine/db/migrations.d.ts +22 -0
  55. package/dist/engine/db/migrations.js +66 -159
  56. package/dist/engine/db/migrations.js.map +1 -1
  57. package/dist/engine/db/schema.d.ts +1 -1
  58. package/dist/engine/db/schema.js +3 -0
  59. package/dist/engine/db/schema.js.map +1 -1
  60. package/dist/engine/graph/graph-schema-ddl.d.ts +17 -0
  61. package/dist/engine/graph/graph-schema-ddl.js +183 -0
  62. package/dist/engine/graph/graph-schema-ddl.js.map +1 -0
  63. package/dist/engine/graph/migrator.d.ts +1 -0
  64. package/dist/engine/graph/migrator.js +2 -174
  65. package/dist/engine/graph/migrator.js.map +1 -1
  66. package/dist/engine/indexer/async-file-scanner.js +16 -6
  67. package/dist/engine/indexer/async-file-scanner.js.map +1 -1
  68. package/dist/engine/indexer/file-scanner.js +2 -1
  69. package/dist/engine/indexer/file-scanner.js.map +1 -1
  70. package/dist/engine/indexer/index-operation-manager.js +1 -0
  71. package/dist/engine/indexer/index-operation-manager.js.map +1 -1
  72. package/dist/engine/indexer/indexing-engine.d.ts +12 -2
  73. package/dist/engine/indexer/indexing-engine.js +22 -7
  74. package/dist/engine/indexer/indexing-engine.js.map +1 -1
  75. package/dist/engine/indexer/module-helper.js +32 -2
  76. package/dist/engine/indexer/module-helper.js.map +1 -1
  77. package/dist/engine/indexer/path-safety.d.ts +19 -1
  78. package/dist/engine/indexer/path-safety.js +42 -12
  79. package/dist/engine/indexer/path-safety.js.map +1 -1
  80. package/dist/engine/indexer/project-type/models.d.ts +6 -6
  81. package/dist/engine/indexer/startup-interrupt-detector.d.ts +15 -1
  82. package/dist/engine/indexer/startup-interrupt-detector.js +45 -2
  83. package/dist/engine/indexer/startup-interrupt-detector.js.map +1 -1
  84. package/dist/index.js +28 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/modules/memory/IsolationLayer.d.ts +15 -0
  87. package/dist/modules/memory/IsolationLayer.js +23 -0
  88. package/dist/modules/memory/IsolationLayer.js.map +1 -1
  89. package/dist/modules/memory/dispatchers/crud.js +57 -37
  90. package/dist/modules/memory/dispatchers/crud.js.map +1 -1
  91. package/dist/modules/memory/dispatchers/search.js +7 -6
  92. package/dist/modules/memory/dispatchers/search.js.map +1 -1
  93. package/dist/modules/memory/llm/LLMInitializer.js +21 -4
  94. package/dist/modules/memory/llm/LLMInitializer.js.map +1 -1
  95. package/dist/modules/memory/llm/llm-error.d.ts +24 -0
  96. package/dist/modules/memory/llm/llm-error.js +77 -0
  97. package/dist/modules/memory/llm/llm-error.js.map +1 -0
  98. package/dist/modules/memory/task-queue/PendingTaskRepository.d.ts +15 -0
  99. package/dist/modules/memory/task-queue/PendingTaskRepository.js +27 -0
  100. package/dist/modules/memory/task-queue/PendingTaskRepository.js.map +1 -1
  101. package/dist/modules/pega/PegaSymbolSync.js +7 -0
  102. package/dist/modules/pega/PegaSymbolSync.js.map +1 -1
  103. package/dist/modules/security/gateguard/GateGuardService.js +8 -0
  104. package/dist/modules/security/gateguard/GateGuardService.js.map +1 -1
  105. package/dist/server/HttpServer.js +51 -2
  106. package/dist/server/HttpServer.js.map +1 -1
  107. package/dist/server/middleware/jwt-auth.d.ts +2 -2
  108. package/dist/server/middleware/jwt-auth.js +16 -15
  109. package/dist/server/middleware/jwt-auth.js.map +1 -1
  110. package/dist/server/routes/admin/context.d.ts +2 -0
  111. package/dist/server/routes/admin/context.js +31 -0
  112. package/dist/server/routes/admin/context.js.map +1 -1
  113. package/dist/server/routes/admin/index.js +69 -2
  114. package/dist/server/routes/admin/index.js.map +1 -1
  115. package/dist/server/routes/admin/users.js +1 -0
  116. package/dist/server/routes/admin/users.js.map +1 -1
  117. package/dist/server/routes/api-index-decoupled.d.ts +7 -3
  118. package/dist/server/routes/api-index-decoupled.js +57 -14
  119. package/dist/server/routes/api-index-decoupled.js.map +1 -1
  120. package/dist/server/routes/api-index.js +9 -2
  121. package/dist/server/routes/api-index.js.map +1 -1
  122. package/dist/server/routes/auth/login-routes.d.ts +13 -0
  123. package/dist/server/routes/auth/login-routes.js +124 -0
  124. package/dist/server/routes/auth/login-routes.js.map +1 -0
  125. package/dist/server/routes/auth/one-time-codes.d.ts +10 -0
  126. package/dist/server/routes/auth/one-time-codes.js +38 -0
  127. package/dist/server/routes/auth/one-time-codes.js.map +1 -0
  128. package/dist/server/routes/auth/sso-http-helpers.d.ts +13 -7
  129. package/dist/server/routes/auth/sso-http-helpers.js +16 -18
  130. package/dist/server/routes/auth/sso-http-helpers.js.map +1 -1
  131. package/dist/server/routes/auth/token-routes.d.ts +10 -0
  132. package/dist/server/routes/auth/token-routes.js +60 -0
  133. package/dist/server/routes/auth/token-routes.js.map +1 -0
  134. package/dist/server/routes/auth/unified.d.ts +6 -0
  135. package/dist/server/routes/auth/unified.js +13 -131
  136. package/dist/server/routes/auth/unified.js.map +1 -1
  137. package/dist/server/routes/enrichment-status-routes.js +26 -0
  138. package/dist/server/routes/enrichment-status-routes.js.map +1 -1
  139. package/dist/server/routes/schemas/index-schemas.d.ts +2 -2
  140. package/dist/server/services/SessionService.d.ts +3 -12
  141. package/dist/viewer/admin/index.html +81 -13
  142. package/docker-compose.embeddings.yml +24 -0
  143. package/docker-compose.test.yml +14 -3
  144. package/docker-compose.yml +119 -16
  145. package/models/onnx-runtime/generate-identity-model.py +16 -0
  146. package/models/onnx-runtime/identity.onnx +11 -0
  147. package/package.json +8 -2
  148. package/scripts/db/backup-postgres.mjs +200 -0
  149. package/scripts/db/test-compose.mjs +114 -0
  150. package/secrets/database_url.example +4 -0
  151. package/secrets/postgres_password.example +4 -0
  152. package/src/admin/db/__tests__/dual-token.test.ts +143 -0
  153. package/src/admin/db/__tests__/jwt.test.ts +104 -0
  154. package/src/admin/db/core.ts +8 -0
  155. package/src/admin/db/jwt.ts +123 -0
  156. package/src/admin/db/refresh-tokens.ts +100 -0
  157. package/src/admin/db/schema.ts +20 -0
  158. package/src/admin/db/session-cache.ts +44 -0
  159. package/src/admin/db/session-issue.ts +60 -0
  160. package/src/admin/db/session-lifecycle.ts +117 -0
  161. package/src/admin/db/session-types.ts +97 -0
  162. package/src/admin/db/sessions.ts +48 -133
  163. package/src/config/index.ts +11 -12
  164. package/src/database/config/__tests__/seedEngineFromEnv.test.ts +109 -0
  165. package/src/database/config/seedEngineFromEnv.ts +114 -0
  166. package/src/database/migration/__tests__/pg-modules-schema.test.ts +54 -0
  167. package/src/database/migration/pg-modules-schema.ts +43 -0
  168. package/src/database/migration/pg-schema-ensure.ts +2 -0
  169. package/src/database/schema-registry/__tests__/ensure-postgres-memory.test.ts +95 -0
  170. package/src/database/schema-registry/__tests__/ensure-postgres-schema.test.ts +60 -0
  171. package/src/database/schema-registry/__tests__/orphaned-ensures.test.ts +53 -0
  172. package/src/database/schema-registry/ensure-postgres-memory.ts +69 -0
  173. package/src/database/schema-registry/ensure-postgres-schema.ts +50 -0
  174. package/src/database/schema-registry/ensure-sa4e-237.ts +12 -3
  175. package/src/database/schema-registry/ensure-sa4e-276.ts +7 -17
  176. package/src/engine/db/__tests__/migration-body-embeddings-upsert.test.ts +178 -0
  177. package/src/engine/db/__tests__/migration-files-provenance.test.ts +81 -0
  178. package/src/engine/db/migration-steps.ts +199 -0
  179. package/src/engine/db/migrations.ts +74 -173
  180. package/src/engine/db/schema.ts +3 -0
  181. package/src/engine/graph/graph-schema-ddl.ts +196 -0
  182. package/src/engine/graph/migrator.ts +10 -180
  183. package/src/engine/indexer/__tests__/indexing-engine-register.test.ts +120 -0
  184. package/src/engine/indexer/__tests__/module-helper.test.ts +102 -37
  185. package/src/engine/indexer/__tests__/path-safety.test.ts +5 -3
  186. package/src/engine/indexer/__tests__/startup-interrupt-detector.test.ts +60 -2
  187. package/src/engine/indexer/async-file-scanner.ts +20 -6
  188. package/src/engine/indexer/file-scanner.ts +2 -1
  189. package/src/engine/indexer/index-operation-manager.ts +1 -0
  190. package/src/engine/indexer/indexing-engine.ts +22 -7
  191. package/src/engine/indexer/module-helper.ts +38 -2
  192. package/src/engine/indexer/path-safety.ts +40 -11
  193. package/src/engine/indexer/startup-interrupt-detector.ts +54 -2
  194. package/src/index.ts +27 -0
  195. package/src/modules/memory/IsolationLayer.ts +27 -0
  196. package/src/modules/memory/__tests__/IsolationLayer.test.ts +45 -0
  197. package/src/modules/memory/__tests__/ProjectIsolation.test.ts +32 -15
  198. package/src/modules/memory/__tests__/SA4E-331-CrossProjectIsolation.test.ts +32 -0
  199. package/src/modules/memory/__tests__/e2e/ingest-file-structured-map.e2e.test.ts +20 -16
  200. package/src/modules/memory/dispatchers/crud.ts +50 -36
  201. package/src/modules/memory/dispatchers/search.ts +7 -6
  202. package/src/modules/memory/ingest/__tests__/ingest-file-single-row.it.test.ts +144 -0
  203. package/src/modules/memory/llm/LLMInitializer.ts +21 -4
  204. package/src/modules/memory/llm/__tests__/llm-error.test.ts +70 -0
  205. package/src/modules/memory/llm/llm-error.ts +83 -0
  206. package/src/modules/memory/task-queue/PendingTaskRepository.ts +33 -0
  207. package/src/modules/pega/PegaSymbolSync.ts +2 -0
  208. package/src/modules/pega/__tests__/pega-indexing.e2e.test.ts +4 -0
  209. package/src/modules/security/gateguard/GateGuardService.ts +8 -0
  210. package/src/modules/security/gateguard/__tests__/GateGuardService.test.ts +36 -0
  211. package/src/server/HttpServer.ts +58 -2
  212. package/src/server/middleware/jwt-auth.ts +14 -13
  213. package/src/server/routes/__tests__/enrichment-status-routes.test.ts +35 -0
  214. package/src/server/routes/admin/__tests__/projects-register.test.ts +133 -0
  215. package/src/server/routes/admin/context.ts +34 -0
  216. package/src/server/routes/admin/index.ts +51 -3
  217. package/src/server/routes/admin/users.ts +1 -0
  218. package/src/server/routes/api-index-decoupled.ts +55 -14
  219. package/src/server/routes/api-index.ts +9 -2
  220. package/src/server/routes/auth/__tests__/one-time-codes.test.ts +49 -0
  221. package/src/server/routes/auth/login-routes.ts +132 -0
  222. package/src/server/routes/auth/one-time-codes.ts +46 -0
  223. package/src/server/routes/auth/sso-http-helpers.ts +28 -11
  224. package/src/server/routes/auth/token-routes.ts +62 -0
  225. package/src/server/routes/auth/unified.ts +27 -130
  226. package/src/server/routes/enrichment-status-routes.ts +26 -0
  227. package/src/viewer/admin/index.html +81 -13
  228. 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
- # SA4E-44 Backend Dockerfile
2
- # Node.js 22 + Hono backend for Code Intelligence MCP Server
3
- FROM node:22-alpine AS base
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
- # Install dependencies for native modules (onnxruntime-node)
8
- RUN apk add --no-cache python3 make g++ git
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
- # --- Build stage ---
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
- # --- Production stage ---
24
- FROM node:22-alpine AS production
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
- # Runtime dependencies only
29
- RUN apk add --no-cache git
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
- # Create non-root user
36
- RUN addgroup -g 1001 -S sa4e && \
37
- adduser -S sa4e -u 1001 -G sa4e && \
38
- mkdir -p /app/.code-intel && \
39
- chown -R sa4e:sa4e /app
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 wget --no-verbose --tries=1 --spider http://localhost:48721/health || exit 1
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
- # Development stage — hot reload (tsx watch) for local dev. Non-root user.
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 addgroup -g 1001 -S sa4e && \
65
- adduser -S sa4e -u 1001 -G sa4e && \
66
- chown -R sa4e:sa4e /app
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
- # Test stage — runs the vitest unit suite inside the container (non-root).
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 addgroup -g 1001 -S sa4e && \
86
- adduser -S sa4e -u 1001 -G sa4e && \
87
- chown -R sa4e:sa4e /app
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.46.2-blue?style=for-the-badge" alt="Version">
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.46.2","uptime":5,"tools_loaded":52}
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. |
@@ -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":"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"}
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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"}
@@ -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 {};