@nxuss/lemma 1.17.0 → 1.18.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/bin/init.js +97 -11
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +19 -11
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/cloud/TenantCache.d.ts.map +1 -1
- package/dist/cjs/cloud/TenantCache.js +0 -4
- package/dist/cjs/cloud/TenantCache.js.map +1 -1
- package/dist/cjs/cloud/identity/ApiKey.d.ts +32 -0
- package/dist/cjs/cloud/identity/ApiKey.d.ts.map +1 -0
- package/dist/cjs/cloud/identity/ApiKey.js +59 -0
- package/dist/cjs/cloud/identity/ApiKey.js.map +1 -0
- package/dist/cjs/cloud/identity/PlanPolicy.d.ts +79 -0
- package/dist/cjs/cloud/identity/PlanPolicy.d.ts.map +1 -0
- package/dist/cjs/cloud/identity/PlanPolicy.js +135 -0
- package/dist/cjs/cloud/identity/PlanPolicy.js.map +1 -0
- package/dist/cjs/cloud/identity/RateLimiter.d.ts +49 -0
- package/dist/cjs/cloud/identity/RateLimiter.d.ts.map +1 -0
- package/dist/cjs/cloud/identity/RateLimiter.js +75 -0
- package/dist/cjs/cloud/identity/RateLimiter.js.map +1 -0
- package/dist/cjs/cloud/identity/TenantResolver.d.ts +19 -0
- package/dist/cjs/cloud/identity/TenantResolver.d.ts.map +1 -0
- package/dist/cjs/cloud/identity/TenantResolver.js +40 -0
- package/dist/cjs/cloud/identity/TenantResolver.js.map +1 -0
- package/dist/cjs/cloud/identity/authenticateV2.d.ts +48 -0
- package/dist/cjs/cloud/identity/authenticateV2.d.ts.map +1 -0
- package/dist/cjs/cloud/identity/authenticateV2.js +66 -0
- package/dist/cjs/cloud/identity/authenticateV2.js.map +1 -0
- package/dist/cjs/cloud/identity/identityStore.d.ts +56 -0
- package/dist/cjs/cloud/identity/identityStore.d.ts.map +1 -0
- package/dist/cjs/cloud/identity/identityStore.js +99 -0
- package/dist/cjs/cloud/identity/identityStore.js.map +1 -0
- package/dist/cjs/cloud/identity/index.d.ts +14 -0
- package/dist/cjs/cloud/identity/index.d.ts.map +1 -0
- package/dist/cjs/cloud/identity/index.js +30 -0
- package/dist/cjs/cloud/identity/index.js.map +1 -0
- package/dist/cjs/cloud/metering/TokenCounter.d.ts +26 -0
- package/dist/cjs/cloud/metering/TokenCounter.d.ts.map +1 -0
- package/dist/cjs/cloud/metering/TokenCounter.js +80 -0
- package/dist/cjs/cloud/metering/TokenCounter.js.map +1 -0
- package/dist/cjs/cloud/metering/UsageLedger.d.ts +68 -0
- package/dist/cjs/cloud/metering/UsageLedger.d.ts.map +1 -0
- package/dist/cjs/cloud/metering/UsageLedger.js +106 -0
- package/dist/cjs/cloud/metering/UsageLedger.js.map +1 -0
- package/dist/cjs/cloud/metering/index.d.ts +12 -0
- package/dist/cjs/cloud/metering/index.d.ts.map +1 -0
- package/dist/cjs/cloud/metering/index.js +28 -0
- package/dist/cjs/cloud/metering/index.js.map +1 -0
- package/dist/cjs/cloud/scrub/StatelessScrubber.d.ts +53 -0
- package/dist/cjs/cloud/scrub/StatelessScrubber.d.ts.map +1 -0
- package/dist/cjs/cloud/scrub/StatelessScrubber.js +203 -0
- package/dist/cjs/cloud/scrub/StatelessScrubber.js.map +1 -0
- package/dist/cjs/cloud/scrub/index.d.ts +5 -0
- package/dist/cjs/cloud/scrub/index.d.ts.map +1 -0
- package/dist/cjs/cloud/scrub/index.js +21 -0
- package/dist/cjs/cloud/scrub/index.js.map +1 -0
- package/dist/cjs/cloud/store/FileBrainStore.d.ts +26 -0
- package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -0
- package/dist/cjs/cloud/store/FileBrainStore.js +219 -0
- package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -0
- package/dist/cjs/cloud/store/PostgresBrainStore.d.ts +50 -0
- package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -0
- package/dist/cjs/cloud/store/PostgresBrainStore.js +181 -0
- package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -0
- package/dist/cjs/cloud/store/index.d.ts +6 -0
- package/dist/cjs/cloud/store/index.d.ts.map +1 -0
- package/dist/cjs/cloud/store/index.js +22 -0
- package/dist/cjs/cloud/store/index.js.map +1 -0
- package/dist/cjs/cloud/types.d.ts +0 -4
- package/dist/cjs/cloud/types.d.ts.map +1 -1
- package/dist/cjs/cloud/types.js +1 -3
- package/dist/cjs/cloud/types.js.map +1 -1
- package/dist/cjs/cloud/v2/app.d.ts +15 -0
- package/dist/cjs/cloud/v2/app.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/app.js +63 -0
- package/dist/cjs/cloud/v2/app.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/index.d.ts +24 -0
- package/dist/cjs/cloud/v2/routes/index.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/index.js +35 -0
- package/dist/cjs/cloud/v2/routes/index.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/memories.d.ts +83 -0
- package/dist/cjs/cloud/v2/routes/memories.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/memories.js +249 -0
- package/dist/cjs/cloud/v2/routes/memories.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/recall.d.ts +33 -0
- package/dist/cjs/cloud/v2/routes/recall.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/recall.js +51 -0
- package/dist/cjs/cloud/v2/routes/recall.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/scrub.d.ts +13 -0
- package/dist/cjs/cloud/v2/routes/scrub.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/scrub.js +82 -0
- package/dist/cjs/cloud/v2/routes/scrub.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/usage.d.ts +18 -0
- package/dist/cjs/cloud/v2/routes/usage.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/usage.js +18 -0
- package/dist/cjs/cloud/v2/routes/usage.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/verify.d.ts +35 -0
- package/dist/cjs/cloud/v2/routes/verify.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/verify.js +43 -0
- package/dist/cjs/cloud/v2/routes/verify.js.map +1 -0
- package/dist/cjs/cloud/v2/server.d.ts +27 -0
- package/dist/cjs/cloud/v2/server.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/server.js +47 -0
- package/dist/cjs/cloud/v2/server.js.map +1 -0
- package/dist/cjs/contracts/api-v2.types.d.ts +103 -0
- package/dist/cjs/contracts/api-v2.types.d.ts.map +1 -0
- package/dist/cjs/contracts/api-v2.types.js +3 -0
- package/dist/cjs/contracts/api-v2.types.js.map +1 -0
- package/dist/cjs/contracts/errors.d.ts +40 -0
- package/dist/cjs/contracts/errors.d.ts.map +1 -0
- package/dist/cjs/contracts/errors.js +50 -0
- package/dist/cjs/contracts/errors.js.map +1 -0
- package/dist/cjs/contracts/evidence.d.ts +49 -0
- package/dist/cjs/contracts/evidence.d.ts.map +1 -0
- package/dist/cjs/contracts/evidence.js +12 -0
- package/dist/cjs/contracts/evidence.js.map +1 -0
- package/dist/cjs/contracts/index.d.ts +10 -0
- package/dist/cjs/contracts/index.d.ts.map +1 -0
- package/dist/cjs/contracts/index.js +26 -0
- package/dist/cjs/contracts/index.js.map +1 -0
- package/dist/cjs/contracts/store.d.ts +30 -0
- package/dist/cjs/contracts/store.d.ts.map +1 -0
- package/dist/cjs/contracts/store.js +3 -0
- package/dist/cjs/contracts/store.js.map +1 -0
- package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
- package/dist/cjs/mcp/tool-profiles.js +46 -1
- package/dist/cjs/mcp/tool-profiles.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts +2 -0
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +40 -21
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.d.ts +43 -7
- package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.js +86 -57
- package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
- package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts +16 -0
- package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -0
- package/dist/cjs/subconscious/freshness/LocalFsResolver.js +74 -0
- package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -0
- package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.d.ts +23 -0
- package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.d.ts.map +1 -0
- package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.js +24 -0
- package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.js.map +1 -0
- package/dist/cjs/subconscious/freshness/index.d.ts +10 -0
- package/dist/cjs/subconscious/freshness/index.d.ts.map +1 -0
- package/dist/cjs/subconscious/freshness/index.js +26 -0
- package/dist/cjs/subconscious/freshness/index.js.map +1 -0
- package/dist/cjs/utils/ProjectIdentity.d.ts +12 -0
- package/dist/cjs/utils/ProjectIdentity.d.ts.map +1 -0
- package/dist/cjs/utils/ProjectIdentity.js +44 -0
- package/dist/cjs/utils/ProjectIdentity.js.map +1 -0
- package/dist/cjs/utils/PromptPatternCache.d.ts.map +1 -1
- package/dist/cjs/utils/PromptPatternCache.js +12 -2
- package/dist/cjs/utils/PromptPatternCache.js.map +1 -1
- package/dist/cjs/utils/RepeatGuard.d.ts.map +1 -1
- package/dist/cjs/utils/RepeatGuard.js +10 -2
- package/dist/cjs/utils/RepeatGuard.js.map +1 -1
- package/dist/cjs/utils/StateHashCache.d.ts +5 -0
- package/dist/cjs/utils/StateHashCache.d.ts.map +1 -1
- package/dist/cjs/utils/StateHashCache.js +40 -16
- package/dist/cjs/utils/StateHashCache.js.map +1 -1
- package/dist/esm/api/dashboardRoutes.d.ts +3 -3
- package/dist/esm/api/dashboardRoutes.js +1 -1
- package/dist/esm/api/server.d.ts +4 -4
- package/dist/esm/api/server.js +3 -3
- package/dist/esm/autopilot/AutopilotWatcher.js +3 -3
- package/dist/esm/autopilot/Notifier.d.ts +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +33 -25
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/cli/stack.d.ts +4 -4
- package/dist/esm/cli/stack.js +5 -5
- package/dist/esm/cloud/KeyManager.d.ts +1 -1
- package/dist/esm/cloud/KeyManager.js +1 -1
- package/dist/esm/cloud/TenantCache.d.ts +1 -1
- package/dist/esm/cloud/TenantCache.d.ts.map +1 -1
- package/dist/esm/cloud/TenantCache.js +0 -4
- package/dist/esm/cloud/TenantCache.js.map +1 -1
- package/dist/esm/cloud/identity/ApiKey.d.ts +32 -0
- package/dist/esm/cloud/identity/ApiKey.d.ts.map +1 -0
- package/dist/esm/cloud/identity/ApiKey.js +49 -0
- package/dist/esm/cloud/identity/ApiKey.js.map +1 -0
- package/dist/esm/cloud/identity/PlanPolicy.d.ts +79 -0
- package/dist/esm/cloud/identity/PlanPolicy.d.ts.map +1 -0
- package/dist/esm/cloud/identity/PlanPolicy.js +129 -0
- package/dist/esm/cloud/identity/PlanPolicy.js.map +1 -0
- package/dist/esm/cloud/identity/RateLimiter.d.ts +49 -0
- package/dist/esm/cloud/identity/RateLimiter.d.ts.map +1 -0
- package/dist/esm/cloud/identity/RateLimiter.js +69 -0
- package/dist/esm/cloud/identity/RateLimiter.js.map +1 -0
- package/dist/esm/cloud/identity/TenantResolver.d.ts +19 -0
- package/dist/esm/cloud/identity/TenantResolver.d.ts.map +1 -0
- package/dist/esm/cloud/identity/TenantResolver.js +36 -0
- package/dist/esm/cloud/identity/TenantResolver.js.map +1 -0
- package/dist/esm/cloud/identity/authenticateV2.d.ts +48 -0
- package/dist/esm/cloud/identity/authenticateV2.d.ts.map +1 -0
- package/dist/esm/cloud/identity/authenticateV2.js +62 -0
- package/dist/esm/cloud/identity/authenticateV2.js.map +1 -0
- package/dist/esm/cloud/identity/identityStore.d.ts +56 -0
- package/dist/esm/cloud/identity/identityStore.d.ts.map +1 -0
- package/dist/esm/cloud/identity/identityStore.js +94 -0
- package/dist/esm/cloud/identity/identityStore.js.map +1 -0
- package/dist/esm/cloud/identity/index.d.ts +14 -0
- package/dist/esm/cloud/identity/index.d.ts.map +1 -0
- package/dist/esm/cloud/identity/index.js +14 -0
- package/dist/esm/cloud/identity/index.js.map +1 -0
- package/dist/esm/cloud/index.d.ts +3 -3
- package/dist/esm/cloud/index.js +3 -3
- package/dist/esm/cloud/metering/TokenCounter.d.ts +26 -0
- package/dist/esm/cloud/metering/TokenCounter.d.ts.map +1 -0
- package/dist/esm/cloud/metering/TokenCounter.js +76 -0
- package/dist/esm/cloud/metering/TokenCounter.js.map +1 -0
- package/dist/esm/cloud/metering/UsageLedger.d.ts +68 -0
- package/dist/esm/cloud/metering/UsageLedger.d.ts.map +1 -0
- package/dist/esm/cloud/metering/UsageLedger.js +98 -0
- package/dist/esm/cloud/metering/UsageLedger.js.map +1 -0
- package/dist/esm/cloud/metering/index.d.ts +12 -0
- package/dist/esm/cloud/metering/index.d.ts.map +1 -0
- package/dist/esm/cloud/metering/index.js +12 -0
- package/dist/esm/cloud/metering/index.js.map +1 -0
- package/dist/esm/cloud/scrub/StatelessScrubber.d.ts +53 -0
- package/dist/esm/cloud/scrub/StatelessScrubber.d.ts.map +1 -0
- package/dist/esm/cloud/scrub/StatelessScrubber.js +199 -0
- package/dist/esm/cloud/scrub/StatelessScrubber.js.map +1 -0
- package/dist/esm/cloud/scrub/index.d.ts +5 -0
- package/dist/esm/cloud/scrub/index.d.ts.map +1 -0
- package/dist/esm/cloud/scrub/index.js +5 -0
- package/dist/esm/cloud/scrub/index.js.map +1 -0
- package/dist/esm/cloud/server.d.ts +3 -3
- package/dist/esm/cloud/server.js +5 -5
- package/dist/esm/cloud/store/FileBrainStore.d.ts +26 -0
- package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -0
- package/dist/esm/cloud/store/FileBrainStore.js +212 -0
- package/dist/esm/cloud/store/FileBrainStore.js.map +1 -0
- package/dist/esm/cloud/store/PostgresBrainStore.d.ts +50 -0
- package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -0
- package/dist/esm/cloud/store/PostgresBrainStore.js +176 -0
- package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -0
- package/dist/esm/cloud/store/index.d.ts +6 -0
- package/dist/esm/cloud/store/index.d.ts.map +1 -0
- package/dist/esm/cloud/store/index.js +6 -0
- package/dist/esm/cloud/store/index.js.map +1 -0
- package/dist/esm/cloud/types.d.ts +0 -4
- package/dist/esm/cloud/types.d.ts.map +1 -1
- package/dist/esm/cloud/types.js +0 -2
- package/dist/esm/cloud/types.js.map +1 -1
- package/dist/esm/cloud/v2/app.d.ts +15 -0
- package/dist/esm/cloud/v2/app.d.ts.map +1 -0
- package/dist/esm/cloud/v2/app.js +57 -0
- package/dist/esm/cloud/v2/app.js.map +1 -0
- package/dist/esm/cloud/v2/routes/index.d.ts +24 -0
- package/dist/esm/cloud/v2/routes/index.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/index.js +32 -0
- package/dist/esm/cloud/v2/routes/index.js.map +1 -0
- package/dist/esm/cloud/v2/routes/memories.d.ts +83 -0
- package/dist/esm/cloud/v2/routes/memories.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/memories.js +238 -0
- package/dist/esm/cloud/v2/routes/memories.js.map +1 -0
- package/dist/esm/cloud/v2/routes/recall.d.ts +33 -0
- package/dist/esm/cloud/v2/routes/recall.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/recall.js +47 -0
- package/dist/esm/cloud/v2/routes/recall.js.map +1 -0
- package/dist/esm/cloud/v2/routes/scrub.d.ts +13 -0
- package/dist/esm/cloud/v2/routes/scrub.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/scrub.js +79 -0
- package/dist/esm/cloud/v2/routes/scrub.js.map +1 -0
- package/dist/esm/cloud/v2/routes/usage.d.ts +18 -0
- package/dist/esm/cloud/v2/routes/usage.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/usage.js +15 -0
- package/dist/esm/cloud/v2/routes/usage.js.map +1 -0
- package/dist/esm/cloud/v2/routes/verify.d.ts +35 -0
- package/dist/esm/cloud/v2/routes/verify.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/verify.js +39 -0
- package/dist/esm/cloud/v2/routes/verify.js.map +1 -0
- package/dist/esm/cloud/v2/server.d.ts +27 -0
- package/dist/esm/cloud/v2/server.d.ts.map +1 -0
- package/dist/esm/cloud/v2/server.js +44 -0
- package/dist/esm/cloud/v2/server.js.map +1 -0
- package/dist/esm/config/index.d.ts +1 -1
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/consensus/index.d.ts +2 -2
- package/dist/esm/consensus/index.js +2 -2
- package/dist/esm/contracts/api-v2.types.d.ts +103 -0
- package/dist/esm/contracts/api-v2.types.d.ts.map +1 -0
- package/dist/esm/contracts/api-v2.types.js +2 -0
- package/dist/esm/contracts/api-v2.types.js.map +1 -0
- package/dist/esm/contracts/errors.d.ts +40 -0
- package/dist/esm/contracts/errors.d.ts.map +1 -0
- package/dist/esm/contracts/errors.js +45 -0
- package/dist/esm/contracts/errors.js.map +1 -0
- package/dist/esm/contracts/evidence.d.ts +49 -0
- package/dist/esm/contracts/evidence.d.ts.map +1 -0
- package/dist/esm/contracts/evidence.js +11 -0
- package/dist/esm/contracts/evidence.js.map +1 -0
- package/dist/esm/contracts/index.d.ts +10 -0
- package/dist/esm/contracts/index.d.ts.map +1 -0
- package/dist/esm/contracts/index.js +10 -0
- package/dist/esm/contracts/index.js.map +1 -0
- package/dist/esm/contracts/store.d.ts +30 -0
- package/dist/esm/contracts/store.d.ts.map +1 -0
- package/dist/esm/contracts/store.js +2 -0
- package/dist/esm/contracts/store.js.map +1 -0
- package/dist/esm/core/AgentRegistry.d.ts +1 -1
- package/dist/esm/core/AgentRegistry.js +1 -1
- package/dist/esm/core/DashboardBroadcaster.d.ts +3 -3
- package/dist/esm/core/DashboardBroadcaster.js +2 -2
- package/dist/esm/core/DashboardWebSocketServer.d.ts +1 -1
- package/dist/esm/core/DashboardWebSocketServer.js +1 -1
- package/dist/esm/core/GhostAlchemist.js +1 -1
- package/dist/esm/core/GhostListener.js +2 -2
- package/dist/esm/core/OrchestrationEngine.d.ts +3 -3
- package/dist/esm/core/OrchestrationEngine.js +2 -2
- package/dist/esm/core/SubconsciousEngine.d.ts +1 -1
- package/dist/esm/core/SubconsciousEngine.js +2 -2
- package/dist/esm/core/WebSocketServer.d.ts +2 -2
- package/dist/esm/core/WebSocketServer.js +1 -1
- package/dist/esm/core/index.d.ts +6 -6
- package/dist/esm/core/index.js +6 -6
- package/dist/esm/core/router.d.ts +3 -3
- package/dist/esm/core/router.js +1 -1
- package/dist/esm/db/database.js +1 -1
- package/dist/esm/embed.d.ts +2 -2
- package/dist/esm/embed.js +2 -2
- package/dist/esm/examples/basic-usage.js +1 -1
- package/dist/esm/index.d.ts +14 -14
- package/dist/esm/index.js +14 -14
- package/dist/esm/infra/analyzers/DriftDetector.d.ts +1 -1
- package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +1 -1
- package/dist/esm/infra/analyzers/MonolithAnalyzer.d.ts +1 -1
- package/dist/esm/infra/analyzers/index.d.ts +3 -3
- package/dist/esm/infra/analyzers/index.js +3 -3
- package/dist/esm/infra/cli.js +2 -2
- package/dist/esm/infra/config.d.ts +1 -1
- package/dist/esm/infra/index.d.ts +5 -5
- package/dist/esm/infra/index.js +5 -5
- package/dist/esm/infra/mcp-tools.js +5 -5
- package/dist/esm/infra/providers/InfraProvider.d.ts +1 -1
- package/dist/esm/infra/providers/JenkinsProvider.d.ts +2 -2
- package/dist/esm/infra/providers/OKDProvider.d.ts +2 -2
- package/dist/esm/infra/providers/TerraformProvider.d.ts +2 -2
- package/dist/esm/infra/providers/index.d.ts +5 -5
- package/dist/esm/infra/providers/index.js +3 -3
- package/dist/esm/mcp/index.js +5 -5
- package/dist/esm/mcp/prompts.js +1 -1
- package/dist/esm/mcp/resources.js +2 -2
- package/dist/esm/mcp/tasks.js +1 -1
- package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
- package/dist/esm/mcp/tool-profiles.js +47 -2
- package/dist/esm/mcp/tool-profiles.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts +2 -0
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +87 -69
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/observability/IdeContextSync.d.ts +1 -1
- package/dist/esm/observability/IdeContextSync.js +5 -5
- package/dist/esm/pr-review/PRReviewEngine.d.ts +1 -1
- package/dist/esm/pr-review/PRReviewEngine.js +4 -4
- package/dist/esm/pr-review/ReviewStore.d.ts +1 -1
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +2 -2
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +1 -1
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +2 -2
- package/dist/esm/pr-review/adapters/GitHubAdapter.js +1 -1
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +2 -2
- package/dist/esm/pr-review/adapters/GitLabAdapter.js +1 -1
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts +1 -1
- package/dist/esm/pr-review/adapters/index.d.ts +4 -4
- package/dist/esm/pr-review/adapters/index.js +3 -3
- package/dist/esm/pr-review/analyzers/QualityGrader.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/index.d.ts +8 -8
- package/dist/esm/pr-review/analyzers/index.js +4 -4
- package/dist/esm/pr-review/bridge/BrainBridge.d.ts +1 -1
- package/dist/esm/pr-review/bridge/BrainBridge.js +1 -1
- package/dist/esm/pr-review/bridge/index.d.ts +1 -1
- package/dist/esm/pr-review/bridge/index.js +1 -1
- package/dist/esm/pr-review/index.d.ts +4 -4
- package/dist/esm/pr-review/index.js +2 -2
- package/dist/esm/pr-review/reviewRunner.d.ts +2 -2
- package/dist/esm/pr-review/reviewRunner.js +6 -6
- package/dist/esm/pr-review/webhook/WebhookServer.js +1 -1
- package/dist/esm/pr-review/webhook/index.d.ts +1 -1
- package/dist/esm/pr-review/webhook/index.js +1 -1
- package/dist/esm/protocol/flows.d.ts +1 -1
- package/dist/esm/protocol/flows.js +1 -1
- package/dist/esm/protocol/index.d.ts +4 -4
- package/dist/esm/protocol/index.js +4 -4
- package/dist/esm/protocol/utils.d.ts +1 -1
- package/dist/esm/protocol/utils.js +2 -2
- package/dist/esm/protocol/validators.d.ts +1 -1
- package/dist/esm/protocol/validators.js +1 -1
- package/dist/esm/proxy/ContextInjector.d.ts +1 -1
- package/dist/esm/proxy/Gatekeeper.d.ts +1 -1
- package/dist/esm/security/SecurityMiddleware.d.ts +1 -1
- package/dist/esm/security/SecurityMiddleware.js +3 -3
- package/dist/esm/security/index.d.ts +4 -4
- package/dist/esm/security/index.js +4 -4
- package/dist/esm/speculative/SpeculativeCache.d.ts +2 -2
- package/dist/esm/speculative/SpeculativeEngine.d.ts +2 -2
- package/dist/esm/speculative/SpeculativeEngine.js +3 -3
- package/dist/esm/speculative/WorkerPool.d.ts +1 -1
- package/dist/esm/speculative/index.d.ts +4 -4
- package/dist/esm/speculative/index.js +4 -4
- package/dist/esm/subconscious/GitIngest.d.ts +1 -1
- package/dist/esm/subconscious/GitIngest.js +1 -1
- package/dist/esm/subconscious/SemanticCache.d.ts +2 -2
- package/dist/esm/subconscious/SemanticCache.js +2 -2
- package/dist/esm/subconscious/SubconsciousEngine.d.ts +1 -1
- package/dist/esm/subconscious/SubconsciousEngine.js +3 -3
- package/dist/esm/subconscious/TheBrainV2.d.ts +43 -7
- package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.js +87 -58
- package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
- package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts +16 -0
- package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -0
- package/dist/esm/subconscious/freshness/LocalFsResolver.js +67 -0
- package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -0
- package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.d.ts +23 -0
- package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.d.ts.map +1 -0
- package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.js +20 -0
- package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.js.map +1 -0
- package/dist/esm/subconscious/freshness/index.d.ts +10 -0
- package/dist/esm/subconscious/freshness/index.d.ts.map +1 -0
- package/dist/esm/subconscious/freshness/index.js +10 -0
- package/dist/esm/subconscious/freshness/index.js.map +1 -0
- package/dist/esm/subconscious/index.d.ts +4 -4
- package/dist/esm/subconscious/index.js +4 -4
- package/dist/esm/utils/AffectedTests.js +1 -1
- package/dist/esm/utils/AutoContextBundle.d.ts +1 -1
- package/dist/esm/utils/AutoContextBundle.js +4 -4
- package/dist/esm/utils/BulkFileDigest.js +2 -2
- package/dist/esm/utils/ClipboardWatcher.js +2 -2
- package/dist/esm/utils/ContextCollapser.js +1 -1
- package/dist/esm/utils/ConversationCheckpoint.js +1 -1
- package/dist/esm/utils/ExecutiveReport.js +1 -1
- package/dist/esm/utils/OutputLedger.js +2 -2
- package/dist/esm/utils/ProjectIdentity.d.ts +12 -0
- package/dist/esm/utils/ProjectIdentity.d.ts.map +1 -0
- package/dist/esm/utils/ProjectIdentity.js +37 -0
- package/dist/esm/utils/ProjectIdentity.js.map +1 -0
- package/dist/esm/utils/PromptPatternCache.d.ts.map +1 -1
- package/dist/esm/utils/PromptPatternCache.js +12 -2
- package/dist/esm/utils/PromptPatternCache.js.map +1 -1
- package/dist/esm/utils/ReadWorkspaceCache.js +1 -1
- package/dist/esm/utils/RepeatGuard.d.ts.map +1 -1
- package/dist/esm/utils/RepeatGuard.js +10 -2
- package/dist/esm/utils/RepeatGuard.js.map +1 -1
- package/dist/esm/utils/SpeculativeWarmer.d.ts +1 -1
- package/dist/esm/utils/SpeculativeWarmer.js +2 -2
- package/dist/esm/utils/StateHashCache.d.ts +5 -0
- package/dist/esm/utils/StateHashCache.d.ts.map +1 -1
- package/dist/esm/utils/StateHashCache.js +40 -16
- package/dist/esm/utils/StateHashCache.js.map +1 -1
- package/dist/esm/utils/StructuralSearch.d.ts +1 -1
- package/dist/esm/utils/SurgicalASTInsert.js +1 -1
- package/dist/esm/utils/SymbolSurgicalContext.js +1 -1
- package/dist/esm/utils/TestAutofixInterceptor.js +1 -1
- package/dist/esm/utils/WorkspaceSearch.js +0 -0
- package/dist/esm/utils/logger.js +1 -1
- package/dist/esm/utils/reportSavings.js +1 -1
- package/package.json +1 -1
- package/sdks/crewai/README.md +25 -0
- package/dist/cjs/package.json +0 -3
- package/dist/esm/package.json +0 -3
- package/sdks/crewai/dist/index.d.ts +0 -130
- package/sdks/crewai/dist/index.js +0 -308
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — POST /v2/memories, DELETE /v2/memories/:id (Lane C)
|
|
3
|
+
*
|
|
4
|
+
* Stores a memory with claims[] + evidence (hashes the client already computed —
|
|
5
|
+
* the server has no client filesystem, see plan §0). Also owns the freshness-state
|
|
6
|
+
* helpers shared with routes/recall.ts and routes/verify.ts, and the zod request
|
|
7
|
+
* validation shared across all /v2 routes.
|
|
8
|
+
*
|
|
9
|
+
* Ownership: Lane C. Reads (never edits): src/contracts/**, src/cloud/store/**,
|
|
10
|
+
* src/cloud/identity/**, src/subconscious/freshness/** (Lane A's SuppliedEvidenceResolver).
|
|
11
|
+
*/
|
|
12
|
+
import crypto from 'crypto';
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { LemmaApiError } from '../../../contracts/errors';
|
|
15
|
+
import { SuppliedEvidenceResolver } from '../../../subconscious/freshness/SuppliedEvidenceResolver';
|
|
16
|
+
// ─── Limits (plan §"LANE C" entregable 4) ─────────────────────────────────────
|
|
17
|
+
export const MAX_CLAIMS = 50;
|
|
18
|
+
export const MAX_VERIFY_IDS = 200;
|
|
19
|
+
export const MAX_BODY_BYTES = 1000000; // 1 MB, enforced by app.ts's body parser
|
|
20
|
+
// ─── Shared zod validation ─────────────────────────────────────────────────────
|
|
21
|
+
export const EvidenceSchema = z.object({
|
|
22
|
+
files: z.record(z.string(), z.string()),
|
|
23
|
+
symbols: z.record(z.string(), z.string()),
|
|
24
|
+
symbolsNormalized: z.record(z.string(), z.string()),
|
|
25
|
+
branch: z.string().optional(),
|
|
26
|
+
commit: z.string().optional(),
|
|
27
|
+
});
|
|
28
|
+
export const CreateMemoryRequestSchema = z.object({
|
|
29
|
+
claims: z
|
|
30
|
+
.array(z.object({
|
|
31
|
+
text: z.string().min(1),
|
|
32
|
+
filePaths: z.array(z.string()).optional(),
|
|
33
|
+
symbols: z.array(z.object({ filePath: z.string(), symbolName: z.string() })).optional(),
|
|
34
|
+
}))
|
|
35
|
+
.min(1)
|
|
36
|
+
.max(MAX_CLAIMS),
|
|
37
|
+
evidence: EvidenceSchema,
|
|
38
|
+
derivedFrom: z.array(z.string()).optional(),
|
|
39
|
+
});
|
|
40
|
+
/** Turns the first zod issue into the API's stable invalid_request shape — never a raw zod dump. */
|
|
41
|
+
export function zodToApiError(error) {
|
|
42
|
+
const issue = error.issues[0];
|
|
43
|
+
const field = issue?.path?.length ? issue.path.join('.') : undefined;
|
|
44
|
+
return new LemmaApiError({
|
|
45
|
+
code: 'invalid_request',
|
|
46
|
+
status: 400,
|
|
47
|
+
message: issue ? (field ? `${field}: ${issue.message}` : issue.message) : 'invalid request',
|
|
48
|
+
field,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function isStoredMemory(v) {
|
|
52
|
+
return (typeof v === 'object' &&
|
|
53
|
+
v !== null &&
|
|
54
|
+
Array.isArray(v.claims));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Builds the persisted claims from the request: each claim only tracks the
|
|
58
|
+
* files/symbols it explicitly declared, hashed from the top-level `evidence`
|
|
59
|
+
* bundle the client supplied. A declared path/symbol with no matching hash in
|
|
60
|
+
* `evidence` is a malformed request (the client can't establish a baseline it
|
|
61
|
+
* never sent) — this throws `invalid_request` naming the missing field, it never
|
|
62
|
+
* silently stores an untracked claim.
|
|
63
|
+
*/
|
|
64
|
+
export function buildClaims(body) {
|
|
65
|
+
return body.claims.map((c) => {
|
|
66
|
+
const fileHashes = {};
|
|
67
|
+
const symbolHashes = {};
|
|
68
|
+
const symbolNormalizedHashes = {};
|
|
69
|
+
for (const p of c.filePaths ?? []) {
|
|
70
|
+
const hash = body.evidence.files[p];
|
|
71
|
+
if (hash === undefined) {
|
|
72
|
+
throw new LemmaApiError({
|
|
73
|
+
code: 'invalid_request',
|
|
74
|
+
status: 400,
|
|
75
|
+
message: `claim declares filePaths "${p}" but evidence.files has no hash for it`,
|
|
76
|
+
field: 'evidence.files',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
fileHashes[p] = hash;
|
|
80
|
+
}
|
|
81
|
+
for (const s of c.symbols ?? []) {
|
|
82
|
+
const key = `${s.filePath}::${s.symbolName}`;
|
|
83
|
+
const hash = body.evidence.symbols[key];
|
|
84
|
+
if (hash === undefined) {
|
|
85
|
+
throw new LemmaApiError({
|
|
86
|
+
code: 'invalid_request',
|
|
87
|
+
status: 400,
|
|
88
|
+
message: `claim declares symbol "${key}" but evidence.symbols has no hash for it`,
|
|
89
|
+
field: 'evidence.symbols',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
symbolHashes[key] = hash;
|
|
93
|
+
const normalized = body.evidence.symbolsNormalized[key];
|
|
94
|
+
if (normalized !== undefined)
|
|
95
|
+
symbolNormalizedHashes[key] = normalized;
|
|
96
|
+
}
|
|
97
|
+
const claim = {
|
|
98
|
+
id: crypto.createHash('sha1').update(c.text.trim().toLowerCase()).digest('hex').substring(0, 10),
|
|
99
|
+
text: c.text.trim(),
|
|
100
|
+
};
|
|
101
|
+
if (Object.keys(fileHashes).length > 0)
|
|
102
|
+
claim.fileHashes = fileHashes;
|
|
103
|
+
if (Object.keys(symbolHashes).length > 0)
|
|
104
|
+
claim.symbolHashes = symbolHashes;
|
|
105
|
+
if (Object.keys(symbolNormalizedHashes).length > 0)
|
|
106
|
+
claim.symbolNormalizedHashes = symbolNormalizedHashes;
|
|
107
|
+
return claim;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Same hash-compare invariant as `TheBrainV2.checkClaimFreshness`, reimplemented
|
|
112
|
+
* for the wire `Evidence` shape: keys here are already the exact path/`path::symbol`
|
|
113
|
+
* strings the client uses (see contracts/evidence.ts), so — unlike the local Brain —
|
|
114
|
+
* there is no `path.relative(process.cwd(), abs)` to do. Fail-closed: a resolver
|
|
115
|
+
* `null` (tracked path the client omitted) always maps to `unverified`, never `fresh`.
|
|
116
|
+
*/
|
|
117
|
+
function claimState(claim, resolver) {
|
|
118
|
+
const staleFiles = [];
|
|
119
|
+
const cosmeticChanges = [];
|
|
120
|
+
const unverified = [];
|
|
121
|
+
const symbolCoveredPaths = new Set(Object.keys(claim.symbolHashes || {}).map((key) => key.substring(0, key.lastIndexOf('::'))));
|
|
122
|
+
for (const [p, storedHash] of Object.entries(claim.fileHashes || {})) {
|
|
123
|
+
if (symbolCoveredPaths.has(p))
|
|
124
|
+
continue;
|
|
125
|
+
const current = resolver.hashFile(p);
|
|
126
|
+
if (current === null) {
|
|
127
|
+
unverified.push(p);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (current !== storedHash)
|
|
131
|
+
staleFiles.push(p);
|
|
132
|
+
}
|
|
133
|
+
for (const [key, storedHash] of Object.entries(claim.symbolHashes || {})) {
|
|
134
|
+
const sep = key.lastIndexOf('::');
|
|
135
|
+
const p = key.substring(0, sep);
|
|
136
|
+
const symbolName = key.substring(sep + 2);
|
|
137
|
+
const current = resolver.hashSymbol(p, symbolName);
|
|
138
|
+
if (current === null) {
|
|
139
|
+
unverified.push(key);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (current.raw === storedHash)
|
|
143
|
+
continue;
|
|
144
|
+
const storedNormalized = claim.symbolNormalizedHashes?.[key];
|
|
145
|
+
if (storedNormalized && current.normalized === storedNormalized) {
|
|
146
|
+
cosmeticChanges.push(key);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
staleFiles.push(key);
|
|
150
|
+
}
|
|
151
|
+
const state = unverified.length > 0 ? 'unverified' : staleFiles.length > 0 ? 'stale' : 'fresh';
|
|
152
|
+
return { state, staleFiles, cosmeticChanges };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Aggregates a memory's claims into one `MemoryState`. Precedence is worst-case
|
|
156
|
+
* fail-closed: any claim `unverified` ⇒ the memory is `unverified` (even if other
|
|
157
|
+
* claims are provably stale); otherwise any claim `stale` ⇒ `stale`; otherwise
|
|
158
|
+
* `fresh`. A memory whose claims track nothing is always `fresh` (nothing to go
|
|
159
|
+
* stale) — same as `TheBrainV2.checkClaimFreshness` for an evidence-less claim.
|
|
160
|
+
*
|
|
161
|
+
* `contradicted` is not produced here: detecting two stored claims about the same
|
|
162
|
+
* subject diverging is not part of this lane's acceptance criteria (see plan §3,
|
|
163
|
+
* Lane C) — noted under lane-notes/C.md ## decisions.
|
|
164
|
+
*/
|
|
165
|
+
export function computeMemoryState(claims, currentEvidence) {
|
|
166
|
+
const resolver = new SuppliedEvidenceResolver(currentEvidence ?? { files: {}, symbols: {}, symbolsNormalized: {} });
|
|
167
|
+
const staleFiles = new Set();
|
|
168
|
+
const cosmeticChanges = new Set();
|
|
169
|
+
let anyUnverified = false;
|
|
170
|
+
let anyStale = false;
|
|
171
|
+
for (const claim of claims) {
|
|
172
|
+
const result = claimState(claim, resolver);
|
|
173
|
+
result.staleFiles.forEach((f) => staleFiles.add(f));
|
|
174
|
+
result.cosmeticChanges.forEach((f) => cosmeticChanges.add(f));
|
|
175
|
+
if (result.state === 'unverified')
|
|
176
|
+
anyUnverified = true;
|
|
177
|
+
else if (result.state === 'stale')
|
|
178
|
+
anyStale = true;
|
|
179
|
+
}
|
|
180
|
+
const state = anyUnverified ? 'unverified' : anyStale ? 'stale' : 'fresh';
|
|
181
|
+
return { state, staleFiles: [...staleFiles], cosmeticChanges: [...cosmeticChanges] };
|
|
182
|
+
}
|
|
183
|
+
/** POST /v2/memories */
|
|
184
|
+
export function createMemoryHandler(deps) {
|
|
185
|
+
return async (req, res, next) => {
|
|
186
|
+
try {
|
|
187
|
+
const parsed = CreateMemoryRequestSchema.safeParse(req.body);
|
|
188
|
+
if (!parsed.success)
|
|
189
|
+
throw zodToApiError(parsed.error);
|
|
190
|
+
const body = parsed.data;
|
|
191
|
+
const claims = buildClaims(body);
|
|
192
|
+
const tenant = req.tenant;
|
|
193
|
+
const queryText = body.claims.map((c) => c.text).join(' ');
|
|
194
|
+
const stored = {
|
|
195
|
+
claims,
|
|
196
|
+
...(body.derivedFrom ? { derivedFrom: body.derivedFrom } : {}),
|
|
197
|
+
query: queryText,
|
|
198
|
+
response: queryText,
|
|
199
|
+
createdAt: Date.now(),
|
|
200
|
+
};
|
|
201
|
+
const id = await deps.store.put(tenant.id, stored);
|
|
202
|
+
// Wire response is {id, claims: [{id, text}]} per openapi.yaml — the hashes in
|
|
203
|
+
// `claims` are the server's internal freshness state, never echoed back.
|
|
204
|
+
const response = {
|
|
205
|
+
id,
|
|
206
|
+
claims: claims.map((c) => ({ id: c.id, text: c.text })),
|
|
207
|
+
};
|
|
208
|
+
res.status(201).json(response);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
next(err);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** DELETE /v2/memories/:id */
|
|
216
|
+
export function forgetMemoryHandler(deps) {
|
|
217
|
+
return async (req, res, next) => {
|
|
218
|
+
try {
|
|
219
|
+
const tenant = req.tenant;
|
|
220
|
+
const id = req.params.id;
|
|
221
|
+
const existing = await deps.store.get(tenant.id, id);
|
|
222
|
+
if (!existing) {
|
|
223
|
+
// Same 404 whether the id never existed or belongs to another tenant —
|
|
224
|
+
// never reveal existence across tenant boundaries.
|
|
225
|
+
throw new LemmaApiError({ code: 'not_found', status: 404, message: 'memory not found' });
|
|
226
|
+
}
|
|
227
|
+
await deps.store.delete(tenant.id, id);
|
|
228
|
+
const response = { forged: [id] };
|
|
229
|
+
res.json(response);
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
next(err);
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
export { isStoredMemory };
|
|
237
|
+
export default createMemoryHandler;
|
|
238
|
+
//# sourceMappingURL=memories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/memories.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,CAAC,EAAiB,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAC;AAGpG,iFAAiF;AAEjF,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAS,CAAC,CAAC,yCAAyC;AAElF,kFAAkF;AAElF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACzC,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IACnD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAA+B,CAAC;AAEjC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,CAAC;SACN,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACzC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;KACxF,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE,cAAc;IACxB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,oGAAoG;AACpG,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,OAAO,IAAI,aAAa,CAAC;QACvB,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB;QAC3F,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAeD,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,KAAK,CAAC,OAAO,CAAE,CAAkB,CAAC,MAAM,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAyB;IACnD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,MAAM,sBAAsB,GAA2B,EAAE,CAAC;QAE1D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,aAAa,CAAC;oBACtB,IAAI,EAAE,iBAAiB;oBACvB,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,6BAA6B,CAAC,yCAAyC;oBAChF,KAAK,EAAE,gBAAgB;iBACxB,CAAC,CAAC;YACL,CAAC;YACD,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,aAAa,CAAC;oBACtB,IAAI,EAAE,iBAAiB;oBACvB,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,0BAA0B,GAAG,2CAA2C;oBACjF,KAAK,EAAE,kBAAkB;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACzB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,UAAU,KAAK,SAAS;gBAAE,sBAAsB,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;QACzE,CAAC;QAED,MAAM,KAAK,GAAgB;YACzB,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;YAChG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SACpB,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QACtE,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;QAC5E,IAAI,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;QAC1G,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAQD;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,KAAkB,EAAE,QAAkC;IACxE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5F,CAAC;IAEF,KAAK,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,UAAU;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,KAAK,UAAU;YAAE,SAAS;QACzC,MAAM,gBAAgB,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,gBAAgB,IAAI,OAAO,CAAC,UAAU,KAAK,gBAAgB,EAAE,CAAC;YAChE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,KAAK,GACT,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACnF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AAChD,CAAC;AAQD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB,EAAE,eAAqC;IAC7F,MAAM,QAAQ,GAAG,IAAI,wBAAwB,CAC3C,eAAe,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CACrE,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY;YAAE,aAAa,GAAG,IAAI,CAAC;aACnD,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;YAAE,QAAQ,GAAG,IAAI,CAAC;IACrD,CAAC;IAED,MAAM,KAAK,GAAgB,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACvF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC;AACvF,CAAC;AAQD,wBAAwB;AACxB,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAA2B,CAAC;YAEhD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAiB;gBAC3B,MAAM;gBACN,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACnD,+EAA+E;YAC/E,yEAAyE;YACzE,MAAM,QAAQ,GAAyB;gBACrC,EAAE;gBACF,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aACxD,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;YACpD,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,uEAAuE;gBACvE,mDAAmD;gBACnD,MAAM,IAAI,aAAa,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3F,CAAC;YAED,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAmB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — POST /v2/recall (Lane C)
|
|
3
|
+
*
|
|
4
|
+
* Search returning per-result freshness state. `searchCandidates` does the
|
|
5
|
+
* ranking (Lane B's BM25 store); this route only resolves each candidate's
|
|
6
|
+
* freshness against the client's `currentEvidence`, reusing the same
|
|
7
|
+
* fail-closed comparator as /v2/verify (see routes/memories.ts).
|
|
8
|
+
*
|
|
9
|
+
* Ownership: Lane C.
|
|
10
|
+
*/
|
|
11
|
+
import type { RequestHandler } from 'express';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import type { BrainStore } from '../../../contracts/store';
|
|
14
|
+
export declare const DEFAULT_RECALL_LIMIT = 10;
|
|
15
|
+
export declare const MAX_RECALL_LIMIT = 100;
|
|
16
|
+
export declare const RecallRequestSchema: z.ZodObject<{
|
|
17
|
+
query: z.ZodString;
|
|
18
|
+
currentEvidence: z.ZodOptional<z.ZodObject<{
|
|
19
|
+
files: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
20
|
+
symbols: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
21
|
+
symbolsNormalized: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
22
|
+
branch: z.ZodOptional<z.ZodString>;
|
|
23
|
+
commit: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>>;
|
|
25
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
export interface RecallDeps {
|
|
28
|
+
store: Pick<BrainStore, 'searchCandidates' | 'listByIds'>;
|
|
29
|
+
}
|
|
30
|
+
/** POST /v2/recall */
|
|
31
|
+
export declare function recallHandler(deps: RecallDeps): RequestHandler;
|
|
32
|
+
export default recallHandler;
|
|
33
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAI3D,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,eAAO,MAAM,mBAAmB;;;;;;;;;;iBAI9B,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,kBAAkB,GAAG,WAAW,CAAC,CAAC;CAC3D;AAED,sBAAsB;AACtB,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CA2C9D;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { computeMemoryState, EvidenceSchema, isStoredMemory, zodToApiError } from './memories';
|
|
3
|
+
export const DEFAULT_RECALL_LIMIT = 10;
|
|
4
|
+
export const MAX_RECALL_LIMIT = 100;
|
|
5
|
+
export const RecallRequestSchema = z.object({
|
|
6
|
+
query: z.string().min(1),
|
|
7
|
+
currentEvidence: EvidenceSchema.optional(),
|
|
8
|
+
limit: z.number().int().positive().max(MAX_RECALL_LIMIT).optional(),
|
|
9
|
+
});
|
|
10
|
+
/** POST /v2/recall */
|
|
11
|
+
export function recallHandler(deps) {
|
|
12
|
+
return async (req, res, next) => {
|
|
13
|
+
try {
|
|
14
|
+
const parsed = RecallRequestSchema.safeParse(req.body);
|
|
15
|
+
if (!parsed.success)
|
|
16
|
+
throw zodToApiError(parsed.error);
|
|
17
|
+
const body = parsed.data;
|
|
18
|
+
const tenant = req.tenant;
|
|
19
|
+
const limit = body.limit ?? DEFAULT_RECALL_LIMIT;
|
|
20
|
+
const candidates = await deps.store.searchCandidates(tenant.id, body.query, limit);
|
|
21
|
+
const memories = await deps.store.listByIds(tenant.id, candidates.map((c) => c.id));
|
|
22
|
+
const results = [];
|
|
23
|
+
for (const candidate of candidates) {
|
|
24
|
+
const memory = memories.get(candidate.id);
|
|
25
|
+
// Scoped to the same tenant that searchCandidates just scoped to; a miss
|
|
26
|
+
// here means it was deleted between the two calls — skip it rather than
|
|
27
|
+
// invent a state for an id that no longer resolves.
|
|
28
|
+
if (!isStoredMemory(memory))
|
|
29
|
+
continue;
|
|
30
|
+
const { state, staleFiles, cosmeticChanges } = computeMemoryState(memory.claims, body.currentEvidence);
|
|
31
|
+
results.push({
|
|
32
|
+
id: candidate.id,
|
|
33
|
+
state,
|
|
34
|
+
...(staleFiles.length > 0 ? { staleFiles } : {}),
|
|
35
|
+
...(cosmeticChanges.length > 0 ? { cosmeticChanges } : {}),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const response = { results, query: body.query };
|
|
39
|
+
res.json(response);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
next(err);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export default recallHandler;
|
|
47
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ScrubRequest, ScrubResponse } from "../../../contracts/api-v2.types";
|
|
2
|
+
import { StatelessScrubber } from "../../scrub";
|
|
3
|
+
export interface ScrubRouter {
|
|
4
|
+
method: "POST";
|
|
5
|
+
path: "/v2/scrub";
|
|
6
|
+
/** Process a parsed request body. Throws LemmaApiError on invalid requests. */
|
|
7
|
+
handle(body: ScrubRequest): ScrubResponse;
|
|
8
|
+
/** Fully self-contained scrub adapter (exposed for direct use and tests). */
|
|
9
|
+
scrubber: StatelessScrubber;
|
|
10
|
+
}
|
|
11
|
+
export declare function scrubRouter(): ScrubRouter;
|
|
12
|
+
export default scrubRouter;
|
|
13
|
+
//# sourceMappingURL=scrub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/scrub.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC;IAC1C,6EAA6E;IAC7E,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,wBAAgB,WAAW,IAAI,WAAW,CAgEzC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — POST /v2/scrub (Lane F)
|
|
3
|
+
*
|
|
4
|
+
* Stateless privacy firewall endpoint: text (or serialized agent tool-call JSON)
|
|
5
|
+
* in → scrubbed text out + an inventory of `{ type, offset, length }` findings.
|
|
6
|
+
*
|
|
7
|
+
* - mode="mask" (default) rewrites the payload, redacting secrets.
|
|
8
|
+
* - mode="detect" returns the payload untouched and only reports findings.
|
|
9
|
+
*
|
|
10
|
+
* ZERO persistence of the payload; the body and any detected secret value never
|
|
11
|
+
* appear in responses or logs.
|
|
12
|
+
*
|
|
13
|
+
* Framework coupling: the /v2 HTTP layer is owned by Lane C (mountRoutes). This
|
|
14
|
+
* router is framework-agnostic on purpose — Lane C wires the parsed JSON body
|
|
15
|
+
* into `handle(body)` and maps throws to HTTP. See lane-notes/F.md ## handoff.
|
|
16
|
+
*
|
|
17
|
+
* Ownership: Lane F.
|
|
18
|
+
*/
|
|
19
|
+
import { LemmaApiError } from "../../../contracts/errors";
|
|
20
|
+
import { StatelessScrubber } from "../../scrub";
|
|
21
|
+
export function scrubRouter() {
|
|
22
|
+
const scrubber = new StatelessScrubber();
|
|
23
|
+
const handle = (body) => {
|
|
24
|
+
if (body === null || typeof body !== "object" || Array.isArray(body)) {
|
|
25
|
+
throw new LemmaApiError({
|
|
26
|
+
code: "invalid_request",
|
|
27
|
+
status: 400,
|
|
28
|
+
message: "request body must be a JSON object",
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const mode = body.mode ?? "mask";
|
|
32
|
+
if (mode !== "mask" && mode !== "detect") {
|
|
33
|
+
throw new LemmaApiError({
|
|
34
|
+
code: "invalid_request",
|
|
35
|
+
status: 400,
|
|
36
|
+
message: `mode must be "mask" or "detect", got: ${String(mode)}`,
|
|
37
|
+
field: "mode",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const hasText = typeof body.text === "string";
|
|
41
|
+
const hasJson = typeof body.toolCallJson === "string";
|
|
42
|
+
if (!hasText && !hasJson) {
|
|
43
|
+
throw new LemmaApiError({
|
|
44
|
+
code: "invalid_request",
|
|
45
|
+
status: 400,
|
|
46
|
+
message: 'provide at least one of "text" or "toolCallJson"',
|
|
47
|
+
field: "text",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const findings = [];
|
|
51
|
+
const res = { findings };
|
|
52
|
+
if (hasText) {
|
|
53
|
+
const out = scrubber.scrub(body.text, mode);
|
|
54
|
+
res.text = out.text;
|
|
55
|
+
findings.push(...out.findings);
|
|
56
|
+
}
|
|
57
|
+
if (hasJson) {
|
|
58
|
+
const raw = body.toolCallJson;
|
|
59
|
+
let out;
|
|
60
|
+
try {
|
|
61
|
+
out = scrubber.scrubToolCallJson(raw, mode);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new LemmaApiError({
|
|
65
|
+
code: "invalid_request",
|
|
66
|
+
status: 400,
|
|
67
|
+
message: "toolCallJson is not valid JSON",
|
|
68
|
+
field: "toolCallJson",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
res.toolCallJson = out.toolCallJson;
|
|
72
|
+
findings.push(...out.findings);
|
|
73
|
+
}
|
|
74
|
+
return res;
|
|
75
|
+
};
|
|
76
|
+
return { method: "POST", path: "/v2/scrub", handle, scrubber };
|
|
77
|
+
}
|
|
78
|
+
export default scrubRouter;
|
|
79
|
+
//# sourceMappingURL=scrub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.js","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/scrub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAWhD,MAAM,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,CAAC,IAAkB,EAAiB,EAAE;QACnD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,aAAa,CAAC;gBACtB,IAAI,EAAE,iBAAiB;gBACvB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,oCAAoC;aAC9C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;QACjC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI,aAAa,CAAC;gBACtB,IAAI,EAAE,iBAAiB;gBACvB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,yCAAyC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAChE,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC9C,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC;QAEtD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,aAAa,CAAC;gBACtB,IAAI,EAAE,iBAAiB;gBACvB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,kDAAkD;gBAC3D,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAA8B,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAkB,EAAE,QAAQ,EAAE,CAAC;QAExC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAe,EAAE,IAAI,CAAC,CAAC;YACvD,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,YAAuB,CAAC;YACzC,IAAI,GAAG,CAAC;YACR,IAAI,CAAC;gBACH,GAAG,GAAG,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,aAAa,CAAC;oBACtB,IAAI,EAAE,iBAAiB;oBACvB,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,gCAAgC;oBACzC,KAAK,EAAE,cAAc;iBACtB,CAAC,CAAC;YACL,CAAC;YACD,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — GET /v2/usage (Lane C)
|
|
3
|
+
*
|
|
4
|
+
* Real metering: Lane E owns the ledger and its `computeUsage` math, this route
|
|
5
|
+
* only scopes the query to the authenticated tenant and reports it verbatim.
|
|
6
|
+
* Never adds, estimates or rounds a number here.
|
|
7
|
+
*
|
|
8
|
+
* Ownership: Lane C.
|
|
9
|
+
*/
|
|
10
|
+
import type { RequestHandler } from 'express';
|
|
11
|
+
import type { UsageLedger } from '../../metering';
|
|
12
|
+
export interface UsageDeps {
|
|
13
|
+
usageLedger: Pick<UsageLedger, 'computeUsage'>;
|
|
14
|
+
}
|
|
15
|
+
/** GET /v2/usage */
|
|
16
|
+
export declare function usageHandler(deps: UsageDeps): RequestHandler;
|
|
17
|
+
export default usageHandler;
|
|
18
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;CAChD;AAED,oBAAoB;AACpB,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,CAU5D;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** GET /v2/usage */
|
|
2
|
+
export function usageHandler(deps) {
|
|
3
|
+
return async (req, res, next) => {
|
|
4
|
+
try {
|
|
5
|
+
const tenant = req.tenant;
|
|
6
|
+
const report = await deps.usageLedger.computeUsage({ tenantId: tenant.id });
|
|
7
|
+
res.json(report);
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
next(err);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export default usageHandler;
|
|
15
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/usage.ts"],"names":[],"mappings":"AAkBA,oBAAoB;AACpB,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;YACpD,MAAM,MAAM,GAAkB,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3F,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — POST /v2/verify (Lane C)
|
|
3
|
+
*
|
|
4
|
+
* Batch ids + currentEvidence → per-id state, no search round trip. `currentEvidence`
|
|
5
|
+
* is required by the frozen contract (docs/api/openapi.yaml VerifyRequest) — unlike
|
|
6
|
+
* /v2/recall there is no "no evidence supplied" case to default.
|
|
7
|
+
*
|
|
8
|
+
* An id that doesn't resolve (unknown, or owned by another tenant — `listByIds` is
|
|
9
|
+
* tenant-scoped so both look identical) maps to `unverified`. `MemoryState` (frozen
|
|
10
|
+
* in src/contracts/api-v2.types.ts) has no `unknown` member, so this is the
|
|
11
|
+
* fail-closed answer within the actual contract, and it never reveals whether the
|
|
12
|
+
* id exists under a different tenant.
|
|
13
|
+
*
|
|
14
|
+
* Ownership: Lane C.
|
|
15
|
+
*/
|
|
16
|
+
import type { RequestHandler } from 'express';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import type { BrainStore } from '../../../contracts/store';
|
|
19
|
+
export declare const VerifyRequestSchema: z.ZodObject<{
|
|
20
|
+
ids: z.ZodArray<z.ZodString>;
|
|
21
|
+
currentEvidence: z.ZodObject<{
|
|
22
|
+
files: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
23
|
+
symbols: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
24
|
+
symbolsNormalized: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
25
|
+
branch: z.ZodOptional<z.ZodString>;
|
|
26
|
+
commit: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export interface VerifyDeps {
|
|
30
|
+
store: Pick<BrainStore, 'listByIds'>;
|
|
31
|
+
}
|
|
32
|
+
/** POST /v2/verify */
|
|
33
|
+
export declare function verifyHandler(deps: VerifyDeps): RequestHandler;
|
|
34
|
+
export default verifyHandler;
|
|
35
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAI3D,eAAO,MAAM,mBAAmB;;;;;;;;;iBAG9B,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;CACtC;AAED,sBAAsB;AACtB,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAmC9D;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { computeMemoryState, EvidenceSchema, isStoredMemory, MAX_VERIFY_IDS, zodToApiError } from './memories';
|
|
3
|
+
export const VerifyRequestSchema = z.object({
|
|
4
|
+
ids: z.array(z.string().min(1)).min(1).max(MAX_VERIFY_IDS),
|
|
5
|
+
currentEvidence: EvidenceSchema,
|
|
6
|
+
});
|
|
7
|
+
/** POST /v2/verify */
|
|
8
|
+
export function verifyHandler(deps) {
|
|
9
|
+
return async (req, res, next) => {
|
|
10
|
+
try {
|
|
11
|
+
const parsed = VerifyRequestSchema.safeParse(req.body);
|
|
12
|
+
if (!parsed.success)
|
|
13
|
+
throw zodToApiError(parsed.error);
|
|
14
|
+
const body = parsed.data;
|
|
15
|
+
const tenant = req.tenant;
|
|
16
|
+
const memories = await deps.store.listByIds(tenant.id, body.ids);
|
|
17
|
+
const results = body.ids.map((id) => {
|
|
18
|
+
const memory = memories.get(id);
|
|
19
|
+
if (!isStoredMemory(memory)) {
|
|
20
|
+
return { id, state: 'unverified' };
|
|
21
|
+
}
|
|
22
|
+
const { state, staleFiles, cosmeticChanges } = computeMemoryState(memory.claims, body.currentEvidence);
|
|
23
|
+
return {
|
|
24
|
+
id,
|
|
25
|
+
state,
|
|
26
|
+
...(staleFiles.length > 0 ? { staleFiles } : {}),
|
|
27
|
+
...(cosmeticChanges.length > 0 ? { cosmeticChanges } : {}),
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
const response = { results };
|
|
31
|
+
res.json(response);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
next(err);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export default verifyHandler;
|
|
39
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/verify.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAElI,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1D,eAAe,EAAE,cAAc;CAChC,CAAC,CAAC;AAMH,sBAAsB;AACtB,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAqB,CAAC;YAE1C,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAEjE,MAAM,OAAO,GAAqB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBACrC,CAAC;gBAED,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAC9D,MAAuB,CAAC,MAAM,EAC/B,IAAI,CAAC,eAAe,CACrB,CAAC;gBAEF,OAAO;oBACL,EAAE;oBACF,KAAK;oBACL,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChD,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC3D,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAmB,EAAE,OAAO,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — HTTP server (Lane C)
|
|
3
|
+
*
|
|
4
|
+
* Boots the /v2 app alongside, and without touching, the intact v1 server
|
|
5
|
+
* (src/cloud/server.ts:42 listens on LEMMA_CLOUD_PORT/3100 — untouched). v2
|
|
6
|
+
* listens on its own port so both can run side by side during the swarm cutover.
|
|
7
|
+
*
|
|
8
|
+
* Wiring: DATABASE_URL present ⇒ Postgres-backed store/identity/rate-limiter
|
|
9
|
+
* (Lane B / Lane D); absent ⇒ local file-backed store + in-memory identity/rate
|
|
10
|
+
* limiter, so `startV2Server()` also works with zero external services for dev.
|
|
11
|
+
*
|
|
12
|
+
* KNOWN GAP (see lane-notes/C.md ## handoff): UsageLedger has no durable backend
|
|
13
|
+
* yet (Lane E ships only `InMemoryLedgerStore`) — usage counters reset on
|
|
14
|
+
* restart until a Postgres-backed `AppendOnlyStore` lands.
|
|
15
|
+
*
|
|
16
|
+
* Ownership: Lane C.
|
|
17
|
+
*/
|
|
18
|
+
import type { Server } from 'http';
|
|
19
|
+
export interface StartV2ServerOptions {
|
|
20
|
+
port?: number;
|
|
21
|
+
/** Overrides the DATABASE_URL-presence check — pass explicitly in tests. */
|
|
22
|
+
databaseUrl?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Starts the /v2 HTTP server. Resolves with the underlying `http.Server` once listening. */
|
|
25
|
+
export declare function startV2Server(options?: StartV2ServerOptions): Promise<Server>;
|
|
26
|
+
export default startV2Server;
|
|
27
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/cloud/v2/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAcnC,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA6BD,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYjF;AAED,eAAe,aAAa,CAAC"}
|