@nxuss/lemma 1.43.0 → 1.45.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/README.md +26 -8
- package/bin/brain-ingest.js +48 -13
- package/bin/cloud.js +228 -0
- package/dist/cjs/cli/hostHooks.d.ts +44 -7
- package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
- package/dist/cjs/cli/hostHooks.js +201 -11
- package/dist/cjs/cli/hostHooks.js.map +1 -1
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +13 -16
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/cloud/CloudBrainClient.d.ts +52 -0
- package/dist/cjs/cloud/CloudBrainClient.d.ts.map +1 -0
- package/dist/cjs/cloud/CloudBrainClient.js +161 -0
- package/dist/cjs/cloud/CloudBrainClient.js.map +1 -0
- package/dist/cjs/cloud/CloudConfig.d.ts +41 -0
- package/dist/cjs/cloud/CloudConfig.d.ts.map +1 -0
- package/dist/cjs/cloud/CloudConfig.js +133 -0
- package/dist/cjs/cloud/CloudConfig.js.map +1 -0
- package/dist/cjs/cloud/CloudEntitlement.d.ts +55 -0
- package/dist/cjs/cloud/CloudEntitlement.d.ts.map +1 -0
- package/dist/cjs/cloud/CloudEntitlement.js +174 -0
- package/dist/cjs/cloud/CloudEntitlement.js.map +1 -0
- package/dist/cjs/cloud/billing/stripeApi.d.ts +43 -0
- package/dist/cjs/cloud/billing/stripeApi.d.ts.map +1 -0
- package/dist/cjs/cloud/billing/stripeApi.js +116 -0
- package/dist/cjs/cloud/billing/stripeApi.js.map +1 -0
- package/dist/cjs/cloud/billing/stripeWebhook.d.ts +35 -0
- package/dist/cjs/cloud/billing/stripeWebhook.d.ts.map +1 -0
- package/dist/cjs/cloud/billing/stripeWebhook.js +190 -0
- package/dist/cjs/cloud/billing/stripeWebhook.js.map +1 -0
- package/dist/cjs/cloud/console/ConsoleStore.d.ts +111 -0
- package/dist/cjs/cloud/console/ConsoleStore.d.ts.map +1 -0
- package/dist/cjs/cloud/console/ConsoleStore.js +172 -0
- package/dist/cjs/cloud/console/ConsoleStore.js.map +1 -0
- package/dist/cjs/cloud/console/consoleRouter.d.ts +68 -0
- package/dist/cjs/cloud/console/consoleRouter.d.ts.map +1 -0
- package/dist/cjs/cloud/console/consoleRouter.js +301 -0
- package/dist/cjs/cloud/console/consoleRouter.js.map +1 -0
- package/dist/cjs/cloud/console/mailer.d.ts +22 -0
- package/dist/cjs/cloud/console/mailer.d.ts.map +1 -0
- package/dist/cjs/cloud/console/mailer.js +35 -0
- package/dist/cjs/cloud/console/mailer.js.map +1 -0
- package/dist/cjs/cloud/identity/PlanPolicy.d.ts +42 -6
- package/dist/cjs/cloud/identity/PlanPolicy.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/PlanPolicy.js +102 -22
- package/dist/cjs/cloud/identity/PlanPolicy.js.map +1 -1
- package/dist/cjs/cloud/identity/RateLimiter.d.ts +21 -1
- package/dist/cjs/cloud/identity/RateLimiter.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/RateLimiter.js +59 -2
- package/dist/cjs/cloud/identity/RateLimiter.js.map +1 -1
- package/dist/cjs/cloud/identity/TenantResolver.d.ts +6 -1
- package/dist/cjs/cloud/identity/TenantResolver.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/TenantResolver.js +1 -1
- package/dist/cjs/cloud/identity/TenantResolver.js.map +1 -1
- package/dist/cjs/cloud/identity/authenticateV2.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/authenticateV2.js +7 -4
- package/dist/cjs/cloud/identity/authenticateV2.js.map +1 -1
- package/dist/cjs/cloud/identity/identityStore.d.ts +96 -10
- package/dist/cjs/cloud/identity/identityStore.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/identityStore.js +203 -4
- package/dist/cjs/cloud/identity/identityStore.js.map +1 -1
- package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts +18 -0
- package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts.map +1 -0
- package/dist/cjs/cloud/metering/PostgresLedgerStore.js +56 -0
- package/dist/cjs/cloud/metering/PostgresLedgerStore.js.map +1 -0
- package/dist/cjs/cloud/metering/UsageLedger.d.ts +74 -0
- package/dist/cjs/cloud/metering/UsageLedger.d.ts.map +1 -1
- package/dist/cjs/cloud/metering/UsageLedger.js +122 -17
- package/dist/cjs/cloud/metering/UsageLedger.js.map +1 -1
- package/dist/cjs/cloud/metering/index.d.ts +1 -0
- package/dist/cjs/cloud/metering/index.d.ts.map +1 -1
- package/dist/cjs/cloud/metering/index.js +1 -0
- package/dist/cjs/cloud/metering/index.js.map +1 -1
- package/dist/cjs/cloud/store/FileBrainStore.d.ts +6 -1
- package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -1
- package/dist/cjs/cloud/store/FileBrainStore.js +8 -0
- package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.d.ts +11 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.js +32 -0
- package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -1
- package/dist/cjs/cloud/store/memorySummary.d.ts +29 -0
- package/dist/cjs/cloud/store/memorySummary.d.ts.map +1 -0
- package/dist/cjs/cloud/store/memorySummary.js +66 -0
- package/dist/cjs/cloud/store/memorySummary.js.map +1 -0
- package/dist/cjs/cloud/v2/app.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/app.js +6 -0
- package/dist/cjs/cloud/v2/app.js.map +1 -1
- package/dist/cjs/cloud/v2/inputGuard.d.ts +23 -0
- package/dist/cjs/cloud/v2/inputGuard.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/inputGuard.js +71 -0
- package/dist/cjs/cloud/v2/inputGuard.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/admin.d.ts +24 -0
- package/dist/cjs/cloud/v2/routes/admin.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/admin.js +344 -0
- package/dist/cjs/cloud/v2/routes/admin.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/entitlement.d.ts +13 -0
- package/dist/cjs/cloud/v2/routes/entitlement.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/entitlement.js +24 -0
- package/dist/cjs/cloud/v2/routes/entitlement.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/index.d.ts +14 -1
- package/dist/cjs/cloud/v2/routes/index.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/index.js +36 -0
- package/dist/cjs/cloud/v2/routes/index.js.map +1 -1
- package/dist/cjs/cloud/v2/routes/memories.d.ts +21 -2
- package/dist/cjs/cloud/v2/routes/memories.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/memories.js +77 -0
- package/dist/cjs/cloud/v2/routes/memories.js.map +1 -1
- package/dist/cjs/cloud/v2/routes/recall.d.ts +1 -0
- package/dist/cjs/cloud/v2/routes/recall.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/recall.js +4 -0
- package/dist/cjs/cloud/v2/routes/recall.js.map +1 -1
- package/dist/cjs/cloud/v2/routes/tenant.d.ts +36 -0
- package/dist/cjs/cloud/v2/routes/tenant.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/tenant.js +65 -0
- package/dist/cjs/cloud/v2/routes/tenant.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/usage.d.ts +1 -1
- package/dist/cjs/cloud/v2/routes/usage.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/verify.d.ts +1 -0
- package/dist/cjs/cloud/v2/routes/verify.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/verify.js +4 -0
- package/dist/cjs/cloud/v2/routes/verify.js.map +1 -1
- package/dist/cjs/cloud/v2/server.d.ts +9 -3
- package/dist/cjs/cloud/v2/server.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/server.js +36 -2
- package/dist/cjs/cloud/v2/server.js.map +1 -1
- package/dist/cjs/cloud/v2/usageRecorder.d.ts +19 -0
- package/dist/cjs/cloud/v2/usageRecorder.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/usageRecorder.js +42 -0
- package/dist/cjs/cloud/v2/usageRecorder.js.map +1 -0
- package/dist/cjs/contracts/api-v2.types.d.ts +92 -2
- package/dist/cjs/contracts/api-v2.types.d.ts.map +1 -1
- package/dist/cjs/contracts/store.d.ts +37 -0
- package/dist/cjs/contracts/store.d.ts.map +1 -1
- package/dist/cjs/mcp/index.js +7 -1
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/memory.js +74 -4
- package/dist/cjs/mcp/tools/memory.js.map +1 -1
- package/dist/cjs/mcp/tools/misc.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/misc.js +2 -1
- package/dist/cjs/mcp/tools/misc.js.map +1 -1
- package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/workspace.js +4 -1
- package/dist/cjs/mcp/tools/workspace.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts +10 -0
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +47 -12
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/proxy/KeyManager.d.ts.map +1 -1
- package/dist/cjs/proxy/KeyManager.js +5 -0
- package/dist/cjs/proxy/KeyManager.js.map +1 -1
- package/dist/cjs/subconscious/CloudBrain.d.ts +77 -0
- package/dist/cjs/subconscious/CloudBrain.d.ts.map +1 -0
- package/dist/cjs/subconscious/CloudBrain.js +347 -0
- package/dist/cjs/subconscious/CloudBrain.js.map +1 -0
- package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/cjs/subconscious/HostRecall.js +11 -4
- package/dist/cjs/subconscious/HostRecall.js.map +1 -1
- package/dist/cjs/subconscious/ProjectIdentity.d.ts +9 -0
- package/dist/cjs/subconscious/ProjectIdentity.d.ts.map +1 -0
- package/dist/cjs/subconscious/ProjectIdentity.js +63 -0
- package/dist/cjs/subconscious/ProjectIdentity.js.map +1 -0
- package/dist/cjs/subconscious/TeamBrain.d.ts +9 -3
- package/dist/cjs/subconscious/TeamBrain.d.ts.map +1 -1
- package/dist/cjs/subconscious/TeamBrain.js +39 -5
- package/dist/cjs/subconscious/TeamBrain.js.map +1 -1
- package/dist/cjs/utils/FixCapture.d.ts +7 -5
- package/dist/cjs/utils/FixCapture.d.ts.map +1 -1
- package/dist/cjs/utils/FixCapture.js +64 -32
- package/dist/cjs/utils/FixCapture.js.map +1 -1
- package/dist/cjs/utils/NoTerminal.d.ts +27 -0
- package/dist/cjs/utils/NoTerminal.d.ts.map +1 -0
- package/dist/cjs/utils/NoTerminal.js +37 -0
- package/dist/cjs/utils/NoTerminal.js.map +1 -0
- package/dist/cjs/utils/OpenCodeSession.d.ts +70 -0
- package/dist/cjs/utils/OpenCodeSession.d.ts.map +1 -0
- package/dist/cjs/utils/OpenCodeSession.js +154 -0
- package/dist/cjs/utils/OpenCodeSession.js.map +1 -0
- package/dist/cjs/utils/ProLicense.d.ts.map +1 -1
- package/dist/cjs/utils/ProLicense.js +11 -3
- package/dist/cjs/utils/ProLicense.js.map +1 -1
- package/dist/cjs/utils/SessionCapture.d.ts +31 -7
- package/dist/cjs/utils/SessionCapture.d.ts.map +1 -1
- package/dist/cjs/utils/SessionCapture.js +185 -32
- package/dist/cjs/utils/SessionCapture.js.map +1 -1
- package/dist/cjs/utils/StopNudge.d.ts +8 -0
- package/dist/cjs/utils/StopNudge.d.ts.map +1 -0
- package/dist/cjs/utils/StopNudge.js +93 -0
- package/dist/cjs/utils/StopNudge.js.map +1 -0
- package/dist/cjs/utils/TestAutofixInterceptor.d.ts.map +1 -1
- package/dist/cjs/utils/TestAutofixInterceptor.js +2 -0
- package/dist/cjs/utils/TestAutofixInterceptor.js.map +1 -1
- package/dist/esm/cli/hostHooks.d.ts +44 -7
- package/dist/esm/cli/hostHooks.d.ts.map +1 -1
- package/dist/esm/cli/hostHooks.js +199 -10
- package/dist/esm/cli/hostHooks.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +14 -17
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/cloud/CloudBrainClient.d.ts +52 -0
- package/dist/esm/cloud/CloudBrainClient.d.ts.map +1 -0
- package/dist/esm/cloud/CloudBrainClient.js +153 -0
- package/dist/esm/cloud/CloudBrainClient.js.map +1 -0
- package/dist/esm/cloud/CloudConfig.d.ts +41 -0
- package/dist/esm/cloud/CloudConfig.d.ts.map +1 -0
- package/dist/esm/cloud/CloudConfig.js +118 -0
- package/dist/esm/cloud/CloudConfig.js.map +1 -0
- package/dist/esm/cloud/CloudEntitlement.d.ts +55 -0
- package/dist/esm/cloud/CloudEntitlement.d.ts.map +1 -0
- package/dist/esm/cloud/CloudEntitlement.js +159 -0
- package/dist/esm/cloud/CloudEntitlement.js.map +1 -0
- package/dist/esm/cloud/billing/stripeApi.d.ts +43 -0
- package/dist/esm/cloud/billing/stripeApi.d.ts.map +1 -0
- package/dist/esm/cloud/billing/stripeApi.js +108 -0
- package/dist/esm/cloud/billing/stripeApi.js.map +1 -0
- package/dist/esm/cloud/billing/stripeWebhook.d.ts +35 -0
- package/dist/esm/cloud/billing/stripeWebhook.d.ts.map +1 -0
- package/dist/esm/cloud/billing/stripeWebhook.js +181 -0
- package/dist/esm/cloud/billing/stripeWebhook.js.map +1 -0
- package/dist/esm/cloud/console/ConsoleStore.d.ts +111 -0
- package/dist/esm/cloud/console/ConsoleStore.d.ts.map +1 -0
- package/dist/esm/cloud/console/ConsoleStore.js +161 -0
- package/dist/esm/cloud/console/ConsoleStore.js.map +1 -0
- package/dist/esm/cloud/console/consoleRouter.d.ts +68 -0
- package/dist/esm/cloud/console/consoleRouter.d.ts.map +1 -0
- package/dist/esm/cloud/console/consoleRouter.js +290 -0
- package/dist/esm/cloud/console/consoleRouter.js.map +1 -0
- package/dist/esm/cloud/console/mailer.d.ts +22 -0
- package/dist/esm/cloud/console/mailer.d.ts.map +1 -0
- package/dist/esm/cloud/console/mailer.js +30 -0
- package/dist/esm/cloud/console/mailer.js.map +1 -0
- package/dist/esm/cloud/identity/PlanPolicy.d.ts +42 -6
- package/dist/esm/cloud/identity/PlanPolicy.d.ts.map +1 -1
- package/dist/esm/cloud/identity/PlanPolicy.js +100 -21
- package/dist/esm/cloud/identity/PlanPolicy.js.map +1 -1
- package/dist/esm/cloud/identity/RateLimiter.d.ts +21 -1
- package/dist/esm/cloud/identity/RateLimiter.d.ts.map +1 -1
- package/dist/esm/cloud/identity/RateLimiter.js +57 -2
- package/dist/esm/cloud/identity/RateLimiter.js.map +1 -1
- package/dist/esm/cloud/identity/TenantResolver.d.ts +6 -1
- package/dist/esm/cloud/identity/TenantResolver.d.ts.map +1 -1
- package/dist/esm/cloud/identity/TenantResolver.js +1 -1
- package/dist/esm/cloud/identity/TenantResolver.js.map +1 -1
- package/dist/esm/cloud/identity/authenticateV2.d.ts.map +1 -1
- package/dist/esm/cloud/identity/authenticateV2.js +7 -4
- package/dist/esm/cloud/identity/authenticateV2.js.map +1 -1
- package/dist/esm/cloud/identity/identityStore.d.ts +96 -10
- package/dist/esm/cloud/identity/identityStore.d.ts.map +1 -1
- package/dist/esm/cloud/identity/identityStore.js +199 -3
- package/dist/esm/cloud/identity/identityStore.js.map +1 -1
- package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts +18 -0
- package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts.map +1 -0
- package/dist/esm/cloud/metering/PostgresLedgerStore.js +52 -0
- package/dist/esm/cloud/metering/PostgresLedgerStore.js.map +1 -0
- package/dist/esm/cloud/metering/UsageLedger.d.ts +74 -0
- package/dist/esm/cloud/metering/UsageLedger.d.ts.map +1 -1
- package/dist/esm/cloud/metering/UsageLedger.js +119 -16
- package/dist/esm/cloud/metering/UsageLedger.js.map +1 -1
- package/dist/esm/cloud/metering/index.d.ts +1 -0
- package/dist/esm/cloud/metering/index.d.ts.map +1 -1
- package/dist/esm/cloud/metering/index.js +1 -0
- package/dist/esm/cloud/metering/index.js.map +1 -1
- package/dist/esm/cloud/store/FileBrainStore.d.ts +6 -1
- package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -1
- package/dist/esm/cloud/store/FileBrainStore.js +8 -0
- package/dist/esm/cloud/store/FileBrainStore.js.map +1 -1
- package/dist/esm/cloud/store/PostgresBrainStore.d.ts +11 -1
- package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -1
- package/dist/esm/cloud/store/PostgresBrainStore.js +32 -0
- package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -1
- package/dist/esm/cloud/store/memorySummary.d.ts +29 -0
- package/dist/esm/cloud/store/memorySummary.d.ts.map +1 -0
- package/dist/esm/cloud/store/memorySummary.js +60 -0
- package/dist/esm/cloud/store/memorySummary.js.map +1 -0
- package/dist/esm/cloud/v2/app.d.ts.map +1 -1
- package/dist/esm/cloud/v2/app.js +6 -0
- package/dist/esm/cloud/v2/app.js.map +1 -1
- package/dist/esm/cloud/v2/inputGuard.d.ts +23 -0
- package/dist/esm/cloud/v2/inputGuard.d.ts.map +1 -0
- package/dist/esm/cloud/v2/inputGuard.js +63 -0
- package/dist/esm/cloud/v2/inputGuard.js.map +1 -0
- package/dist/esm/cloud/v2/routes/admin.d.ts +24 -0
- package/dist/esm/cloud/v2/routes/admin.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/admin.js +337 -0
- package/dist/esm/cloud/v2/routes/admin.js.map +1 -0
- package/dist/esm/cloud/v2/routes/entitlement.d.ts +13 -0
- package/dist/esm/cloud/v2/routes/entitlement.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/entitlement.js +21 -0
- package/dist/esm/cloud/v2/routes/entitlement.js.map +1 -0
- package/dist/esm/cloud/v2/routes/index.d.ts +14 -1
- package/dist/esm/cloud/v2/routes/index.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/index.js +37 -1
- package/dist/esm/cloud/v2/routes/index.js.map +1 -1
- package/dist/esm/cloud/v2/routes/memories.d.ts +21 -2
- package/dist/esm/cloud/v2/routes/memories.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/memories.js +75 -0
- package/dist/esm/cloud/v2/routes/memories.js.map +1 -1
- package/dist/esm/cloud/v2/routes/recall.d.ts +1 -0
- package/dist/esm/cloud/v2/routes/recall.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/recall.js +5 -1
- package/dist/esm/cloud/v2/routes/recall.js.map +1 -1
- package/dist/esm/cloud/v2/routes/tenant.d.ts +36 -0
- package/dist/esm/cloud/v2/routes/tenant.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/tenant.js +61 -0
- package/dist/esm/cloud/v2/routes/tenant.js.map +1 -0
- package/dist/esm/cloud/v2/routes/usage.d.ts +1 -1
- package/dist/esm/cloud/v2/routes/usage.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/verify.d.ts +1 -0
- package/dist/esm/cloud/v2/routes/verify.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/verify.js +5 -1
- package/dist/esm/cloud/v2/routes/verify.js.map +1 -1
- package/dist/esm/cloud/v2/server.d.ts +9 -3
- package/dist/esm/cloud/v2/server.d.ts.map +1 -1
- package/dist/esm/cloud/v2/server.js +36 -3
- package/dist/esm/cloud/v2/server.js.map +1 -1
- package/dist/esm/cloud/v2/usageRecorder.d.ts +19 -0
- package/dist/esm/cloud/v2/usageRecorder.d.ts.map +1 -0
- package/dist/esm/cloud/v2/usageRecorder.js +37 -0
- package/dist/esm/cloud/v2/usageRecorder.js.map +1 -0
- package/dist/esm/contracts/api-v2.types.d.ts +92 -2
- package/dist/esm/contracts/api-v2.types.d.ts.map +1 -1
- package/dist/esm/contracts/store.d.ts +37 -0
- package/dist/esm/contracts/store.d.ts.map +1 -1
- package/dist/esm/mcp/index.js +8 -2
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
- package/dist/esm/mcp/tools/memory.js +74 -4
- package/dist/esm/mcp/tools/memory.js.map +1 -1
- package/dist/esm/mcp/tools/misc.d.ts.map +1 -1
- package/dist/esm/mcp/tools/misc.js +2 -1
- package/dist/esm/mcp/tools/misc.js.map +1 -1
- package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/esm/mcp/tools/workspace.js +4 -1
- package/dist/esm/mcp/tools/workspace.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts +10 -0
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +46 -12
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/proxy/KeyManager.d.ts.map +1 -1
- package/dist/esm/proxy/KeyManager.js +5 -0
- package/dist/esm/proxy/KeyManager.js.map +1 -1
- package/dist/esm/subconscious/CloudBrain.d.ts +77 -0
- package/dist/esm/subconscious/CloudBrain.d.ts.map +1 -0
- package/dist/esm/subconscious/CloudBrain.js +330 -0
- package/dist/esm/subconscious/CloudBrain.js.map +1 -0
- package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
- package/dist/esm/subconscious/HostRecall.js +11 -4
- package/dist/esm/subconscious/HostRecall.js.map +1 -1
- package/dist/esm/subconscious/ProjectIdentity.d.ts +9 -0
- package/dist/esm/subconscious/ProjectIdentity.d.ts.map +1 -0
- package/dist/esm/subconscious/ProjectIdentity.js +56 -0
- package/dist/esm/subconscious/ProjectIdentity.js.map +1 -0
- package/dist/esm/subconscious/TeamBrain.d.ts +9 -3
- package/dist/esm/subconscious/TeamBrain.d.ts.map +1 -1
- package/dist/esm/subconscious/TeamBrain.js +39 -7
- package/dist/esm/subconscious/TeamBrain.js.map +1 -1
- package/dist/esm/utils/FixCapture.d.ts +7 -5
- package/dist/esm/utils/FixCapture.d.ts.map +1 -1
- package/dist/esm/utils/FixCapture.js +64 -33
- package/dist/esm/utils/FixCapture.js.map +1 -1
- package/dist/esm/utils/NoTerminal.d.ts +27 -0
- package/dist/esm/utils/NoTerminal.d.ts.map +1 -0
- package/dist/esm/utils/NoTerminal.js +33 -0
- package/dist/esm/utils/NoTerminal.js.map +1 -0
- package/dist/esm/utils/OpenCodeSession.d.ts +70 -0
- package/dist/esm/utils/OpenCodeSession.d.ts.map +1 -0
- package/dist/esm/utils/OpenCodeSession.js +146 -0
- package/dist/esm/utils/OpenCodeSession.js.map +1 -0
- package/dist/esm/utils/ProLicense.d.ts.map +1 -1
- package/dist/esm/utils/ProLicense.js +11 -3
- package/dist/esm/utils/ProLicense.js.map +1 -1
- package/dist/esm/utils/SessionCapture.d.ts +31 -7
- package/dist/esm/utils/SessionCapture.d.ts.map +1 -1
- package/dist/esm/utils/SessionCapture.js +185 -32
- package/dist/esm/utils/SessionCapture.js.map +1 -1
- package/dist/esm/utils/StopNudge.d.ts +8 -0
- package/dist/esm/utils/StopNudge.d.ts.map +1 -0
- package/dist/esm/utils/StopNudge.js +86 -0
- package/dist/esm/utils/StopNudge.js.map +1 -0
- package/dist/esm/utils/TestAutofixInterceptor.d.ts.map +1 -1
- package/dist/esm/utils/TestAutofixInterceptor.js +2 -0
- package/dist/esm/utils/TestAutofixInterceptor.js.map +1 -1
- package/lemma-proxy.cjs +5 -0
- package/package.json +2 -1
- package/sdks/crewai/dist/ts/src/client.d.ts +5 -1
- package/sdks/crewai/dist/ts/src/client.js +8 -0
- package/sdks/crewai/dist/ts/src/types.d.ts +32 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/cloud/v2/app.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/cloud/v2/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — input guard
|
|
3
|
+
*
|
|
4
|
+
* Postgres cannot store `\u0000` in text or jsonb, nor a lone UTF-16 surrogate in
|
|
5
|
+
* jsonb: either one makes the driver throw, which the error handler turns into a
|
|
6
|
+
* 500. The file-backed store accepts both, so this only shows up against the real
|
|
7
|
+
* database. A client must never be able to provoke a 500 with its own bytes, so the
|
|
8
|
+
* edge rejects these inputs, before any store sees them, with the stable 4xx shape.
|
|
9
|
+
*/
|
|
10
|
+
import type { NextFunction, Request, Response, RequestHandler } from 'express';
|
|
11
|
+
/** Longest id any store here generates is far below this. */
|
|
12
|
+
export declare const MAX_ID_LENGTH = 200;
|
|
13
|
+
export declare function isUnsafeText(s: string): boolean;
|
|
14
|
+
export declare function hasControlChars(s: string): boolean;
|
|
15
|
+
export declare function isSafeId(id: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Walks the parsed JSON body (keys and string values) and answers 400 on the first
|
|
18
|
+
* unsafe string. Iterative: a hostile deeply nested body must not overflow the stack.
|
|
19
|
+
*/
|
|
20
|
+
export declare function rejectUnsafeBody(): RequestHandler;
|
|
21
|
+
/** app.param('id') handler: an id that cannot exist is the same 404 as one that does not. */
|
|
22
|
+
export declare function rejectUnsafeIdParam(_req: Request, _res: Response, next: NextFunction, id: string): void;
|
|
23
|
+
//# sourceMappingURL=inputGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputGuard.d.ts","sourceRoot":"","sources":["../../../../src/cloud/v2/inputGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAa/E,6DAA6D;AAC7D,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAkBjD;AAUD,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAKvG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_ID_LENGTH = void 0;
|
|
4
|
+
exports.isUnsafeText = isUnsafeText;
|
|
5
|
+
exports.hasControlChars = hasControlChars;
|
|
6
|
+
exports.isSafeId = isSafeId;
|
|
7
|
+
exports.rejectUnsafeBody = rejectUnsafeBody;
|
|
8
|
+
exports.rejectUnsafeIdParam = rejectUnsafeIdParam;
|
|
9
|
+
const errors_1 = require("../../contracts/errors");
|
|
10
|
+
// Detecting control characters is the whole point of this file, so no-control-regex is switched off
|
|
11
|
+
// for the two patterns below, and only for them.
|
|
12
|
+
/** NUL, or a surrogate half with no partner (an invalid UTF-16 string). */
|
|
13
|
+
// eslint-disable-next-line no-control-regex
|
|
14
|
+
const UNSAFE_TEXT = /\u0000|[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]/;
|
|
15
|
+
/** Control characters (C0, DEL) never appear in a real memory id or a key name. */
|
|
16
|
+
// eslint-disable-next-line no-control-regex
|
|
17
|
+
const CONTROL_CHARS = /[\u0000-\u001f\u007f]/;
|
|
18
|
+
/** Longest id any store here generates is far below this. */
|
|
19
|
+
exports.MAX_ID_LENGTH = 200;
|
|
20
|
+
function isUnsafeText(s) {
|
|
21
|
+
return UNSAFE_TEXT.test(s);
|
|
22
|
+
}
|
|
23
|
+
function hasControlChars(s) {
|
|
24
|
+
return CONTROL_CHARS.test(s);
|
|
25
|
+
}
|
|
26
|
+
function isSafeId(id) {
|
|
27
|
+
return id.length > 0 && id.length <= exports.MAX_ID_LENGTH && !CONTROL_CHARS.test(id) && !UNSAFE_TEXT.test(id);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Walks the parsed JSON body (keys and string values) and answers 400 on the first
|
|
31
|
+
* unsafe string. Iterative: a hostile deeply nested body must not overflow the stack.
|
|
32
|
+
*/
|
|
33
|
+
function rejectUnsafeBody() {
|
|
34
|
+
return (req, _res, next) => {
|
|
35
|
+
const stack = [req.body];
|
|
36
|
+
while (stack.length > 0) {
|
|
37
|
+
const v = stack.pop();
|
|
38
|
+
if (typeof v === 'string') {
|
|
39
|
+
if (UNSAFE_TEXT.test(v))
|
|
40
|
+
return next(unsafeBodyError());
|
|
41
|
+
}
|
|
42
|
+
else if (Array.isArray(v)) {
|
|
43
|
+
for (const item of v)
|
|
44
|
+
stack.push(item);
|
|
45
|
+
}
|
|
46
|
+
else if (typeof v === 'object' && v !== null) {
|
|
47
|
+
for (const [k, item] of Object.entries(v)) {
|
|
48
|
+
if (UNSAFE_TEXT.test(k))
|
|
49
|
+
return next(unsafeBodyError());
|
|
50
|
+
stack.push(item);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
next();
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function unsafeBodyError() {
|
|
58
|
+
return new errors_1.LemmaApiError({
|
|
59
|
+
code: 'invalid_request',
|
|
60
|
+
status: 400,
|
|
61
|
+
message: 'request contains a NUL character or invalid Unicode',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** app.param('id') handler: an id that cannot exist is the same 404 as one that does not. */
|
|
65
|
+
function rejectUnsafeIdParam(_req, _res, next, id) {
|
|
66
|
+
if (!isSafeId(id)) {
|
|
67
|
+
return next(new errors_1.LemmaApiError({ code: 'not_found', status: 404, message: 'memory not found' }));
|
|
68
|
+
}
|
|
69
|
+
next();
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=inputGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputGuard.js","sourceRoot":"","sources":["../../../../src/cloud/v2/inputGuard.ts"],"names":[],"mappings":";;;AAyBA,oCAEC;AAED,0CAEC;AAED,4BAEC;AAMD,4CAkBC;AAWD,kDAKC;AAjED,mDAAuD;AAEvD,oGAAoG;AACpG,iDAAiD;AACjD,2EAA2E;AAC3E,4CAA4C;AAC5C,MAAM,WAAW,GAAG,+EAA+E,CAAC;AAEpG,mFAAmF;AACnF,4CAA4C;AAC5C,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAE9C,6DAA6D;AAChD,QAAA,aAAa,GAAG,GAAG,CAAC;AAEjC,SAAgB,YAAY,CAAC,CAAS;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,eAAe,CAAC,CAAS;IACvC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,QAAQ,CAAC,EAAU;IACjC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,qBAAa,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzG,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB;IAC9B,OAAO,CAAC,GAAY,EAAE,IAAc,EAAE,IAAkB,EAAE,EAAE;QAC1D,MAAM,KAAK,GAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5B,KAAK,MAAM,IAAI,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/C,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1C,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;wBAAE,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;oBACxD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,sBAAa,CAAC;QACvB,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,qDAAqD;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,6FAA6F;AAC7F,SAAgB,mBAAmB,CAAC,IAAa,EAAE,IAAc,EAAE,IAAkB,EAAE,EAAU;IAC/F,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,IAAI,sBAAa,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Router } from 'express';
|
|
2
|
+
import type { IdentityStore } from '../../identity/identityStore';
|
|
3
|
+
import { PlanPolicy } from '../../identity/PlanPolicy';
|
|
4
|
+
import type { UsageLedger } from '../../metering';
|
|
5
|
+
import { type StripeApi } from '../../billing/stripeApi';
|
|
6
|
+
import { type ConsoleStore } from '../../console/ConsoleStore';
|
|
7
|
+
export declare const MIN_ADMIN_TOKEN_LENGTH = 32;
|
|
8
|
+
export interface AdminDeps {
|
|
9
|
+
/** The operator secret. Absent or shorter than MIN_ADMIN_TOKEN_LENGTH => admin routes are not mounted. */
|
|
10
|
+
adminToken?: string;
|
|
11
|
+
identityStore?: IdentityStore;
|
|
12
|
+
policy?: PlanPolicy;
|
|
13
|
+
usageLedger?: Pick<UsageLedger, 'computeUsage' | 'computeKeyActivity'>;
|
|
14
|
+
/** Present only when STRIPE_SECRET_KEY is configured: enables the checkout and portal routes. */
|
|
15
|
+
stripeApi?: Pick<StripeApi, 'createCheckout' | 'createPortal'>;
|
|
16
|
+
/** Present when the console is enabled: turns on the member routes. */
|
|
17
|
+
consoleStore?: ConsoleStore;
|
|
18
|
+
/** Where the console is reachable, for the sign-in links this router hands out. */
|
|
19
|
+
publicBaseUrl?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Returns null when the operator secret is missing or too weak: the caller must not mount anything. */
|
|
22
|
+
export declare function adminRouter(deps: AdminDeps): Router | null;
|
|
23
|
+
export default adminRouter;
|
|
24
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/admin.ts"],"names":[],"mappings":"AA8BA,OAAgB,EAAuE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAIpH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAY,UAAU,EAAe,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI7E,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAIzC,MAAM,WAAW,SAAS;IACxB,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,GAAG,oBAAoB,CAAC,CAAC;IACvE,iGAAiG;IACjG,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,cAAc,CAAC,CAAC;IAC/D,uEAAuE;IACvE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoED,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAgR1D;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MIN_ADMIN_TOKEN_LENGTH = void 0;
|
|
7
|
+
exports.adminRouter = adminRouter;
|
|
8
|
+
/**
|
|
9
|
+
* Lemma API v2 — operator routes: tenants, seats and keys.
|
|
10
|
+
*
|
|
11
|
+
* Not part of the public openapi.yaml contract (customers never call these; the
|
|
12
|
+
* operator does, from the CLI or a dashboard). Guarded by one operator secret,
|
|
13
|
+
* `LEMMA_ADMIN_TOKEN`, which is NOT an API key and resolves to no tenant. With the
|
|
14
|
+
* secret unset the router is simply not mounted, so there is nothing to probe.
|
|
15
|
+
*
|
|
16
|
+
* POST /v2/admin/tenants {id, name?, plan?, founder?} create a company
|
|
17
|
+
* GET /v2/admin/tenants/:id plan, seats used/limit, keys
|
|
18
|
+
* PATCH /v2/admin/tenants/:id {plan} change plan (never below seats in use)
|
|
19
|
+
* POST /v2/admin/tenants/:id/founder {founder} mark a founder team (keeps the founder limits)
|
|
20
|
+
* POST /v2/admin/tenants/:id/keys {name} issue a key (shown once)
|
|
21
|
+
* DELETE /v2/admin/tenants/:id/keys/:keyId revoke (the dev left)
|
|
22
|
+
* GET /v2/admin/tenants/:id/usage?since=<epoch ms> usage by operation and by dev
|
|
23
|
+
* POST /v2/admin/tenants/:id/checkout {plan, interval, founder?, email?} Stripe Checkout link to send the customer
|
|
24
|
+
* POST /v2/admin/tenants/:id/portal Stripe billing-portal link for a paying tenant
|
|
25
|
+
*
|
|
26
|
+
* POST /v2/admin/tenants/:id/members {email, role?} let a person sign in to the console (owner | admin | member)
|
|
27
|
+
* GET /v2/admin/tenants/:id/members who can sign in
|
|
28
|
+
* DELETE /v2/admin/tenants/:id/members/:email remove them (their sessions end at once)
|
|
29
|
+
* POST /v2/admin/tenants/:id/members/:email/login-link a one-time sign-in link, to hand over by hand
|
|
30
|
+
*
|
|
31
|
+
* The checkout and portal routes exist only when STRIPE_SECRET_KEY is set; the member routes only with a console store. The checkout link carries the tenant id, so paying
|
|
32
|
+
* is what links the Stripe customer to the tenant; the webhook then sets the plan.
|
|
33
|
+
*
|
|
34
|
+
* A seat is one active, unexpired key. Issuing past the plan's seat ceiling is a 429
|
|
35
|
+
* `quota_exceeded`; the check and the insert are atomic in the store.
|
|
36
|
+
*/
|
|
37
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
38
|
+
const express_1 = __importDefault(require("express"));
|
|
39
|
+
const zod_1 = require("zod");
|
|
40
|
+
const errors_1 = require("../../../contracts/errors");
|
|
41
|
+
const ApiKey_1 = require("../../identity/ApiKey");
|
|
42
|
+
const PlanPolicy_1 = require("../../identity/PlanPolicy");
|
|
43
|
+
const inputGuard_1 = require("../inputGuard");
|
|
44
|
+
const stripeApi_1 = require("../../billing/stripeApi");
|
|
45
|
+
const ConsoleStore_1 = require("../../console/ConsoleStore");
|
|
46
|
+
const consoleRouter_1 = require("../../console/consoleRouter");
|
|
47
|
+
const memories_1 = require("./memories");
|
|
48
|
+
exports.MIN_ADMIN_TOKEN_LENGTH = 32;
|
|
49
|
+
const TENANT_ID = /^[a-z0-9][a-z0-9_-]{1,62}$/;
|
|
50
|
+
const KEY_ID = /^key_[0-9a-f]{12}$/;
|
|
51
|
+
const PlanSchema = zod_1.z.enum(PlanPolicy_1.PLAN_IDS);
|
|
52
|
+
const CreateTenantSchema = zod_1.z.object({
|
|
53
|
+
id: zod_1.z.string().regex(TENANT_ID, 'id must be 2-63 chars: a-z, 0-9, "_" or "-", starting with a letter or digit'),
|
|
54
|
+
name: zod_1.z.string().max(200).optional(),
|
|
55
|
+
plan: PlanSchema.optional(),
|
|
56
|
+
/** A founder team created by hand: it keeps the founder limits (PlanPolicy FOUNDER_LIMITS). */
|
|
57
|
+
founder: zod_1.z.boolean().optional(),
|
|
58
|
+
});
|
|
59
|
+
const FounderSchema = zod_1.z.object({ founder: zod_1.z.boolean() }).strict();
|
|
60
|
+
const PatchTenantSchema = zod_1.z.object({ plan: PlanSchema });
|
|
61
|
+
const AddMemberSchema = zod_1.z.object({
|
|
62
|
+
email: zod_1.z.string().trim().email().max(254),
|
|
63
|
+
role: zod_1.z.enum(ConsoleStore_1.MEMBER_ROLES).optional(),
|
|
64
|
+
});
|
|
65
|
+
const CheckoutSchema = zod_1.z.object({
|
|
66
|
+
plan: zod_1.z.enum(stripeApi_1.SELLABLE_PLANS),
|
|
67
|
+
interval: zod_1.z.enum(['month', 'year']),
|
|
68
|
+
/** The founder discount: first teams only, monthly billing only (a coupon on a yearly price would take 20 or 70 off once). */
|
|
69
|
+
founder: zod_1.z.boolean().optional(),
|
|
70
|
+
email: zod_1.z.string().trim().email().max(254).optional(),
|
|
71
|
+
});
|
|
72
|
+
const CreateKeySchema = zod_1.z.object({
|
|
73
|
+
name: zod_1.z
|
|
74
|
+
.string()
|
|
75
|
+
.trim()
|
|
76
|
+
.min(1)
|
|
77
|
+
.max(100)
|
|
78
|
+
.refine((n) => !(0, inputGuard_1.hasControlChars)(n), 'name must not contain control characters'),
|
|
79
|
+
});
|
|
80
|
+
const sha = (s) => crypto_1.default.createHash('sha256').update(s).digest();
|
|
81
|
+
function bearer(req) {
|
|
82
|
+
const m = /^Bearer\s+(.+)$/i.exec((req.headers.authorization ?? '').trim());
|
|
83
|
+
return m ? m[1].trim() : null;
|
|
84
|
+
}
|
|
85
|
+
function requireAdmin(token) {
|
|
86
|
+
const expected = sha(token);
|
|
87
|
+
return (req, res, next) => {
|
|
88
|
+
const given = bearer(req);
|
|
89
|
+
// Hash both sides first so the compare is constant-time regardless of the given length.
|
|
90
|
+
if (given && crypto_1.default.timingSafeEqual(sha(given), expected))
|
|
91
|
+
return next();
|
|
92
|
+
res.status(401).set('WWW-Authenticate', 'Bearer').json(new errors_1.LemmaApiError({ code: 'unauthenticated', status: 401, message: 'missing or invalid operator token' }).toJSON());
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const notFound = (what) => new errors_1.LemmaApiError({ code: 'not_found', status: 404, message: `${what} not found` });
|
|
96
|
+
const publicKey = (k) => ({
|
|
97
|
+
id: k.id,
|
|
98
|
+
name: k.name,
|
|
99
|
+
prefix: k.prefix,
|
|
100
|
+
active: k.active,
|
|
101
|
+
createdAt: k.createdAt,
|
|
102
|
+
revokedAt: k.revokedAt,
|
|
103
|
+
});
|
|
104
|
+
const wrap = (fn) => (req, res, next) => {
|
|
105
|
+
fn(req, res).catch(next);
|
|
106
|
+
};
|
|
107
|
+
/** Returns null when the operator secret is missing or too weak: the caller must not mount anything. */
|
|
108
|
+
function adminRouter(deps) {
|
|
109
|
+
const { adminToken, identityStore: store } = deps;
|
|
110
|
+
if (!adminToken || adminToken.length < exports.MIN_ADMIN_TOKEN_LENGTH || !store)
|
|
111
|
+
return null;
|
|
112
|
+
const policy = deps.policy ?? new PlanPolicy_1.PlanPolicy();
|
|
113
|
+
const r = express_1.default.Router();
|
|
114
|
+
r.use(requireAdmin(adminToken));
|
|
115
|
+
r.use((0, inputGuard_1.rejectUnsafeBody)());
|
|
116
|
+
const tenantParam = (req) => {
|
|
117
|
+
const id = req.params.tenantId;
|
|
118
|
+
if (!TENANT_ID.test(id))
|
|
119
|
+
throw notFound('tenant');
|
|
120
|
+
return id;
|
|
121
|
+
};
|
|
122
|
+
const tenantView = async (id) => {
|
|
123
|
+
const tenant = await store.getTenant(id);
|
|
124
|
+
if (!tenant)
|
|
125
|
+
throw notFound('tenant');
|
|
126
|
+
const keys = await store.listKeys(id);
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
const used = keys.filter((k) => k.active && (k.expiresAt === null || k.expiresAt > now)).length;
|
|
129
|
+
return {
|
|
130
|
+
id: tenant.id,
|
|
131
|
+
name: tenant.name,
|
|
132
|
+
plan: tenant.plan,
|
|
133
|
+
founder: tenant.founder,
|
|
134
|
+
createdAt: tenant.createdAt,
|
|
135
|
+
seats: { used, limit: policy.limitsFor(tenant.plan, { founder: tenant.founder }).seats },
|
|
136
|
+
keys: keys.map(publicKey),
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
r.post('/tenants', wrap(async (req, res) => {
|
|
140
|
+
const parsed = CreateTenantSchema.safeParse(req.body);
|
|
141
|
+
if (!parsed.success)
|
|
142
|
+
throw (0, memories_1.zodToApiError)(parsed.error);
|
|
143
|
+
const { id, name, plan, founder } = parsed.data;
|
|
144
|
+
const created = await store.createTenant({ id, name: name ?? id, plan: (plan ?? 'free'), founder: founder === true });
|
|
145
|
+
if (!created)
|
|
146
|
+
throw new errors_1.LemmaApiError({ code: 'invalid_request', status: 409, message: 'tenant already exists', field: 'id' });
|
|
147
|
+
res.status(201).json({ id: created.id, name: created.name, plan: created.plan, founder: created.founder });
|
|
148
|
+
}));
|
|
149
|
+
r.get('/tenants/:tenantId', wrap(async (req, res) => {
|
|
150
|
+
res.json(await tenantView(tenantParam(req)));
|
|
151
|
+
}));
|
|
152
|
+
r.patch('/tenants/:tenantId', wrap(async (req, res) => {
|
|
153
|
+
const id = tenantParam(req);
|
|
154
|
+
const parsed = PatchTenantSchema.safeParse(req.body);
|
|
155
|
+
if (!parsed.success)
|
|
156
|
+
throw (0, memories_1.zodToApiError)(parsed.error);
|
|
157
|
+
const current = await tenantView(id);
|
|
158
|
+
const newSeats = policy.limitsFor(parsed.data.plan).seats;
|
|
159
|
+
if (current.seats.used > newSeats) {
|
|
160
|
+
throw new errors_1.LemmaApiError({
|
|
161
|
+
code: 'invalid_request',
|
|
162
|
+
status: 409,
|
|
163
|
+
message: `plan "${parsed.data.plan}" allows ${newSeats} seats but ${current.seats.used} are in use: revoke keys first`,
|
|
164
|
+
field: 'plan',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
await store.setTenantPlan(id, parsed.data.plan);
|
|
168
|
+
res.json(await tenantView(id));
|
|
169
|
+
}));
|
|
170
|
+
// Mark (or, to correct a mistake, unmark) a founder. Billing marks paid founder checkouts by itself.
|
|
171
|
+
r.post('/tenants/:tenantId/founder', wrap(async (req, res) => {
|
|
172
|
+
const id = tenantParam(req);
|
|
173
|
+
const parsed = FounderSchema.safeParse(req.body);
|
|
174
|
+
if (!parsed.success)
|
|
175
|
+
throw (0, memories_1.zodToApiError)(parsed.error);
|
|
176
|
+
if (!(await store.setTenantFounder(id, parsed.data.founder)))
|
|
177
|
+
throw notFound('tenant');
|
|
178
|
+
res.json(await tenantView(id));
|
|
179
|
+
}));
|
|
180
|
+
r.post('/tenants/:tenantId/keys', wrap(async (req, res) => {
|
|
181
|
+
const id = tenantParam(req);
|
|
182
|
+
const parsed = CreateKeySchema.safeParse(req.body);
|
|
183
|
+
if (!parsed.success)
|
|
184
|
+
throw (0, memories_1.zodToApiError)(parsed.error);
|
|
185
|
+
const tenant = await store.getTenant(id);
|
|
186
|
+
if (!tenant)
|
|
187
|
+
throw notFound('tenant');
|
|
188
|
+
const generated = (0, ApiKey_1.generateApiKey)(ApiKey_1.KEY_PREFIX_LIVE);
|
|
189
|
+
const result = await store.createKeyWithinSeats({ tenantId: id, name: parsed.data.name, plan: tenant.plan, prefix: ApiKey_1.KEY_PREFIX_LIVE, hash: generated.hash }, policy.limitsFor(tenant.plan).seats);
|
|
190
|
+
if (!result.ok) {
|
|
191
|
+
if (result.reason === 'no_tenant')
|
|
192
|
+
throw notFound('tenant');
|
|
193
|
+
if (result.reason === 'duplicate_name') {
|
|
194
|
+
throw new errors_1.LemmaApiError({ code: 'invalid_request', status: 409, message: 'an active key with that name already exists', field: 'name' });
|
|
195
|
+
}
|
|
196
|
+
throw new errors_1.LemmaApiError({
|
|
197
|
+
code: 'quota_exceeded',
|
|
198
|
+
status: 429,
|
|
199
|
+
message: `seat limit reached: ${result.used}/${result.seats} on plan "${tenant.plan}"`,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// The only response that ever carries the plaintext key.
|
|
203
|
+
res.status(201).json({ id: result.key.id, name: result.key.name, prefix: result.key.prefix, key: generated.key });
|
|
204
|
+
}));
|
|
205
|
+
r.delete('/tenants/:tenantId/keys/:keyId', wrap(async (req, res) => {
|
|
206
|
+
const id = tenantParam(req);
|
|
207
|
+
const keyId = req.params.keyId;
|
|
208
|
+
if (!KEY_ID.test(keyId))
|
|
209
|
+
throw notFound('key');
|
|
210
|
+
// The key must belong to THIS tenant: an id from another tenant is the same 404.
|
|
211
|
+
const keys = await store.listKeys(id);
|
|
212
|
+
if (!keys.some((k) => k.id === keyId))
|
|
213
|
+
throw notFound('key');
|
|
214
|
+
await store.revokeKey(keyId);
|
|
215
|
+
res.json({ revoked: [keyId] });
|
|
216
|
+
}));
|
|
217
|
+
r.get('/tenants/:tenantId/usage', wrap(async (req, res) => {
|
|
218
|
+
const id = tenantParam(req);
|
|
219
|
+
if (!(await store.getTenant(id)))
|
|
220
|
+
throw notFound('tenant');
|
|
221
|
+
const ledger = deps.usageLedger;
|
|
222
|
+
if (!ledger || !ledger.computeKeyActivity)
|
|
223
|
+
throw new errors_1.LemmaApiError({ code: 'not_implemented', status: 501, message: 'usage ledger unavailable' });
|
|
224
|
+
const rawSince = req.query.since;
|
|
225
|
+
let since;
|
|
226
|
+
if (rawSince !== undefined) {
|
|
227
|
+
// Digits only: Number('') is 0 and Number(' 5 ') is 5, neither of which is a timestamp anyone meant.
|
|
228
|
+
since = typeof rawSince === 'string' && /^\d{1,16}$/.test(rawSince) ? Number(rawSince) : NaN;
|
|
229
|
+
if (!Number.isSafeInteger(since)) {
|
|
230
|
+
throw new errors_1.LemmaApiError({ code: 'invalid_request', status: 400, message: 'since must be a non-negative integer (epoch ms)', field: 'since' });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const [usage, activity, keys] = await Promise.all([
|
|
234
|
+
ledger.computeUsage({ tenantId: id, since }),
|
|
235
|
+
ledger.computeKeyActivity({ tenantId: id, since }),
|
|
236
|
+
store.listKeys(id),
|
|
237
|
+
]);
|
|
238
|
+
const names = new Map(keys.map((k) => [k.id, k.name]));
|
|
239
|
+
res.json({
|
|
240
|
+
tenantId: id,
|
|
241
|
+
since: since ?? null,
|
|
242
|
+
metrics: usage.metrics,
|
|
243
|
+
excludedEvents: usage.excludedEvents,
|
|
244
|
+
// One row per key that made calls, with the dev's name and whether the key is still live.
|
|
245
|
+
keys: activity.map((a) => ({
|
|
246
|
+
keyId: a.keyId,
|
|
247
|
+
name: names.get(a.keyId) ?? null,
|
|
248
|
+
active: keys.find((k) => k.id === a.keyId)?.active ?? false,
|
|
249
|
+
requests: a.requests,
|
|
250
|
+
tokens: a.tokens,
|
|
251
|
+
byOperation: a.byOperation,
|
|
252
|
+
})),
|
|
253
|
+
});
|
|
254
|
+
}));
|
|
255
|
+
if (deps.stripeApi) {
|
|
256
|
+
const stripeApi = deps.stripeApi;
|
|
257
|
+
// A subscription in any of these states already pays for the tenant: a second one would bill twice.
|
|
258
|
+
const LIVE_SUBSCRIPTION = new Set(['active', 'trialing', 'past_due', 'unpaid', 'incomplete']);
|
|
259
|
+
r.post('/tenants/:tenantId/checkout', wrap(async (req, res) => {
|
|
260
|
+
const id = tenantParam(req);
|
|
261
|
+
const parsed = CheckoutSchema.safeParse(req.body);
|
|
262
|
+
if (!parsed.success)
|
|
263
|
+
throw (0, memories_1.zodToApiError)(parsed.error);
|
|
264
|
+
const { plan, interval, founder = false, email } = parsed.data;
|
|
265
|
+
if (founder && interval !== 'month') {
|
|
266
|
+
throw new errors_1.LemmaApiError({ code: 'invalid_request', status: 400, message: 'the founder price is for monthly billing only', field: 'founder' });
|
|
267
|
+
}
|
|
268
|
+
const tenant = await store.getTenant(id);
|
|
269
|
+
if (!tenant)
|
|
270
|
+
throw notFound('tenant');
|
|
271
|
+
if (tenant.plan === 'internal') {
|
|
272
|
+
throw new errors_1.LemmaApiError({ code: 'invalid_request', status: 409, message: 'an internal tenant is not sold through Stripe' });
|
|
273
|
+
}
|
|
274
|
+
const status = tenant.billing.status;
|
|
275
|
+
if (tenant.billing.subscriptionId && status && LIVE_SUBSCRIPTION.has(status)) {
|
|
276
|
+
throw new errors_1.LemmaApiError({
|
|
277
|
+
code: 'invalid_request',
|
|
278
|
+
status: 409,
|
|
279
|
+
message: `this tenant already has a subscription (${status}): change it in the billing portal instead`,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
const link = await stripeApi.createCheckout({ tenantId: id, plan, interval, founder, existingCustomerId: tenant.billing.customerId, email });
|
|
283
|
+
res.status(201).json({ tenantId: id, plan, interval, founder, trialDays: 14, url: link.url, expiresAt: link.expiresAt });
|
|
284
|
+
}));
|
|
285
|
+
r.post('/tenants/:tenantId/portal', wrap(async (req, res) => {
|
|
286
|
+
const id = tenantParam(req);
|
|
287
|
+
const tenant = await store.getTenant(id);
|
|
288
|
+
if (!tenant)
|
|
289
|
+
throw notFound('tenant');
|
|
290
|
+
if (!tenant.billing.customerId) {
|
|
291
|
+
throw new errors_1.LemmaApiError({ code: 'invalid_request', status: 409, message: 'this tenant has no Stripe customer yet: send it a checkout link first' });
|
|
292
|
+
}
|
|
293
|
+
res.json({ tenantId: id, url: (await stripeApi.createPortal(tenant.billing.customerId)).url });
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
if (deps.consoleStore) {
|
|
297
|
+
const consoleStore = deps.consoleStore;
|
|
298
|
+
r.post('/tenants/:tenantId/members', wrap(async (req, res) => {
|
|
299
|
+
const id = tenantParam(req);
|
|
300
|
+
const parsed = AddMemberSchema.safeParse(req.body);
|
|
301
|
+
if (!parsed.success)
|
|
302
|
+
throw (0, memories_1.zodToApiError)(parsed.error);
|
|
303
|
+
const added = await consoleStore.addMember(id, parsed.data.email, parsed.data.role ?? 'member');
|
|
304
|
+
if (!added.ok) {
|
|
305
|
+
if (added.reason === 'no_tenant')
|
|
306
|
+
throw notFound('tenant');
|
|
307
|
+
throw new errors_1.LemmaApiError({
|
|
308
|
+
code: 'invalid_request',
|
|
309
|
+
status: 409,
|
|
310
|
+
message: added.reason === 'exists' ? 'that person is already a member of this tenant' : 'that email already belongs to another tenant',
|
|
311
|
+
field: 'email',
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
res.status(201).json({ id: added.member.id, email: added.member.email, role: added.member.role });
|
|
315
|
+
}));
|
|
316
|
+
r.get('/tenants/:tenantId/members', wrap(async (req, res) => {
|
|
317
|
+
const id = tenantParam(req);
|
|
318
|
+
if (!(await store.getTenant(id)))
|
|
319
|
+
throw notFound('tenant');
|
|
320
|
+
res.json({ members: (await consoleStore.listMembers(id)).map((m) => ({ email: m.email, role: m.role })) });
|
|
321
|
+
}));
|
|
322
|
+
r.delete('/tenants/:tenantId/members/:email', wrap(async (req, res) => {
|
|
323
|
+
const id = tenantParam(req);
|
|
324
|
+
if (!(await consoleStore.removeMember(id, req.params.email)))
|
|
325
|
+
throw notFound('member');
|
|
326
|
+
res.json({ removed: req.params.email.trim().toLowerCase() });
|
|
327
|
+
}));
|
|
328
|
+
r.post('/tenants/:tenantId/members/:email/login-link', wrap(async (req, res) => {
|
|
329
|
+
const id = tenantParam(req);
|
|
330
|
+
const member = await consoleStore.findMemberByEmail(req.params.email);
|
|
331
|
+
// Another tenant's member is the same 404 as a stranger: this route never confirms who belongs where.
|
|
332
|
+
if (!member || member.tenantId !== id)
|
|
333
|
+
throw notFound('member');
|
|
334
|
+
const issued = await (0, consoleRouter_1.issueLoginLink)(consoleStore, member.email, Date.now());
|
|
335
|
+
if (!issued)
|
|
336
|
+
throw notFound('member');
|
|
337
|
+
res.status(201).json({ email: issued.email, url: (0, consoleRouter_1.loginLink)((0, consoleRouter_1.publicBase)(req, deps.publicBaseUrl), issued.token), expiresAt: issued.expiresAt });
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
r.use((_req, _res, next) => next(notFound('route')));
|
|
341
|
+
return r;
|
|
342
|
+
}
|
|
343
|
+
exports.default = adminRouter;
|
|
344
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lemma API v2 — GET /v2/entitlement
|
|
3
|
+
*
|
|
4
|
+
* What the presented key may do on the client, beyond the API itself: today, whether a seat on this
|
|
5
|
+
* plan also unlocks the local Pro tools. The answer comes from the tenant's plan (PLAN_INCLUDES_PRO),
|
|
6
|
+
* never from anything the caller sends. A revoked or expired key never gets here: authenticateV2
|
|
7
|
+
* answers it 401 first, which is how a client learns a seat was taken away.
|
|
8
|
+
*/
|
|
9
|
+
import type { RequestHandler } from 'express';
|
|
10
|
+
/** GET /v2/entitlement */
|
|
11
|
+
export declare function entitlementHandler(): RequestHandler;
|
|
12
|
+
export default entitlementHandler;
|
|
13
|
+
//# sourceMappingURL=entitlement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlement.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/entitlement.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C,0BAA0B;AAC1B,wBAAgB,kBAAkB,IAAI,cAAc,CAenD;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.entitlementHandler = entitlementHandler;
|
|
4
|
+
const PlanPolicy_1 = require("../../identity/PlanPolicy");
|
|
5
|
+
/** GET /v2/entitlement */
|
|
6
|
+
function entitlementHandler() {
|
|
7
|
+
return (req, res, next) => {
|
|
8
|
+
try {
|
|
9
|
+
const { tenant } = req;
|
|
10
|
+
const body = {
|
|
11
|
+
tenantId: tenant.id,
|
|
12
|
+
plan: tenant.plan,
|
|
13
|
+
includesPro: PlanPolicy_1.PLAN_INCLUDES_PRO[tenant.plan] === true,
|
|
14
|
+
...(tenant.keyName ? { keyName: tenant.keyName } : {}),
|
|
15
|
+
};
|
|
16
|
+
res.json(body);
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
next(err);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
exports.default = entitlementHandler;
|
|
24
|
+
//# sourceMappingURL=entitlement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlement.js","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/entitlement.ts"],"names":[],"mappings":";;AAcA,gDAeC;AAlBD,0DAA8D;AAE9D,0BAA0B;AAC1B,SAAgB,kBAAkB;IAChC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,GAA2B,CAAC;YAC/C,MAAM,IAAI,GAAwB;gBAChC,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW,EAAE,8BAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;gBACpD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,kBAAe,kBAAkB,CAAC"}
|
|
@@ -18,7 +18,20 @@ import { type MemoriesDeps } from './memories';
|
|
|
18
18
|
import { type RecallDeps } from './recall';
|
|
19
19
|
import { type VerifyDeps } from './verify';
|
|
20
20
|
import { type UsageDeps } from './usage';
|
|
21
|
-
|
|
21
|
+
import { type AdminDeps } from './admin';
|
|
22
|
+
import type { StripeBillingConfig } from '../../billing/stripeWebhook';
|
|
23
|
+
import type { ConsoleStore } from '../../console/ConsoleStore';
|
|
24
|
+
import type { LoginMailer } from '../../console/mailer';
|
|
25
|
+
export type MountDeps = AuthenticateV2Deps & MemoriesDeps & RecallDeps & VerifyDeps & UsageDeps & AdminDeps & {
|
|
26
|
+
billing?: StripeBillingConfig;
|
|
27
|
+
/** The web console: members, sign-in links and sessions. Absent => /console and the member routes are not mounted. */
|
|
28
|
+
consoleStore?: ConsoleStore;
|
|
29
|
+
loginMailer?: LoginMailer;
|
|
30
|
+
/** Where the console is reachable (CLOUD_PUBLIC_URL), for links in emails. */
|
|
31
|
+
publicBaseUrl?: string;
|
|
32
|
+
consoleDir?: string;
|
|
33
|
+
insecureCookies?: boolean;
|
|
34
|
+
};
|
|
22
35
|
export declare function mountRoutes(app: Express, deps: MountDeps): void;
|
|
23
36
|
export default mountRoutes;
|
|
24
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cloud/v2/routes/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxF,OAAO,EAA8D,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAMvD,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG;IAC1G,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,sHAAsH;IACtH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEJ,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAyD/D;AAED,eAAe,WAAW,CAAC"}
|