@essentialai/cogent-server 3.4.0 → 3.4.3
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/dist/__tests__/helpers.d.ts +5 -2
- package/dist/__tests__/helpers.d.ts.map +1 -1
- package/dist/__tests__/helpers.js +11 -4
- package/dist/__tests__/helpers.js.map +1 -1
- package/dist/__tests__/services/session-store-contract.d.ts +17 -0
- package/dist/__tests__/services/session-store-contract.d.ts.map +1 -0
- package/dist/__tests__/services/session-store-contract.js +186 -0
- package/dist/__tests__/services/session-store-contract.js.map +1 -0
- package/dist/app.d.ts +9 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +18 -2
- package/dist/app.js.map +1 -1
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -1
- package/dist/contract/control-plane-contract.d.ts +93 -0
- package/dist/contract/control-plane-contract.d.ts.map +1 -0
- package/dist/contract/control-plane-contract.js +72 -0
- package/dist/contract/control-plane-contract.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +3 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate-cli.d.ts +2 -0
- package/dist/db/migrate-cli.d.ts.map +1 -0
- package/dist/db/migrate-cli.js +54 -0
- package/dist/db/migrate-cli.js.map +1 -0
- package/dist/db/migrate.d.ts +31 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +98 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/0001_init_sessions.down.sql +4 -0
- package/dist/db/migrations/0001_init_sessions.up.sql +46 -0
- package/dist/db/migrations/0002_org_quotas.down.sql +2 -0
- package/dist/db/migrations/0002_org_quotas.up.sql +13 -0
- package/dist/db/pool.d.ts +39 -0
- package/dist/db/pool.d.ts.map +1 -0
- package/dist/db/pool.js +72 -0
- package/dist/db/pool.js.map +1 -0
- package/dist/index.js +33 -3
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +32 -0
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/control-plane-auth.d.ts +17 -0
- package/dist/middleware/control-plane-auth.d.ts.map +1 -0
- package/dist/middleware/control-plane-auth.js +35 -0
- package/dist/middleware/control-plane-auth.js.map +1 -0
- package/dist/routes/control-plane.d.ts +20 -0
- package/dist/routes/control-plane.d.ts.map +1 -0
- package/dist/routes/control-plane.js +122 -0
- package/dist/routes/control-plane.js.map +1 -0
- package/dist/routes/messages.d.ts.map +1 -1
- package/dist/routes/messages.js +18 -0
- package/dist/routes/messages.js.map +1 -1
- package/dist/routes/poll.js +2 -2
- package/dist/routes/poll.js.map +1 -1
- package/dist/routes/sessions.d.ts +22 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +99 -13
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/validation-hook.d.ts +31 -0
- package/dist/routes/validation-hook.d.ts.map +1 -1
- package/dist/routes/validation-hook.js +3 -0
- package/dist/routes/validation-hook.js.map +1 -1
- package/dist/services/auth-service.d.ts +5 -45
- package/dist/services/auth-service.d.ts.map +1 -1
- package/dist/services/auth-service.js +5 -60
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/connection-manager.d.ts +15 -0
- package/dist/services/connection-manager.d.ts.map +1 -1
- package/dist/services/connection-manager.js +29 -0
- package/dist/services/connection-manager.js.map +1 -1
- package/dist/services/join-rate-limiter.d.ts +50 -0
- package/dist/services/join-rate-limiter.d.ts.map +1 -0
- package/dist/services/join-rate-limiter.js +89 -0
- package/dist/services/join-rate-limiter.js.map +1 -0
- package/dist/services/obs-log.d.ts +51 -0
- package/dist/services/obs-log.d.ts.map +1 -0
- package/dist/services/obs-log.js +93 -0
- package/dist/services/obs-log.js.map +1 -0
- package/dist/services/session-store-memory.d.ts +60 -0
- package/dist/services/session-store-memory.d.ts.map +1 -0
- package/dist/services/session-store-memory.js +189 -0
- package/dist/services/session-store-memory.js.map +1 -0
- package/dist/services/session-store-postgres.d.ts +60 -0
- package/dist/services/session-store-postgres.d.ts.map +1 -0
- package/dist/services/session-store-postgres.js +393 -0
- package/dist/services/session-store-postgres.js.map +1 -0
- package/dist/services/session-store.d.ts +73 -5
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +63 -17
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/stats-service.d.ts.map +1 -1
- package/dist/services/stats-service.js +2 -0
- package/dist/services/stats-service.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/pages/FaqPage.d.ts.map +1 -1
- package/dist/ui/pages/FaqPage.js +7 -5
- package/dist/ui/pages/FaqPage.js.map +1 -1
- package/dist/ui/pages/LandingPage.d.ts.map +1 -1
- package/dist/ui/pages/LandingPage.js +2 -2
- package/dist/ui/pages/LandingPage.js.map +1 -1
- package/package.json +11 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Hono } from "hono";
|
|
2
2
|
import type { ServerType } from "@hono/node-server";
|
|
3
|
-
import { SessionStore } from "../services/session-store.js";
|
|
3
|
+
import type { SessionStore } from "../services/session-store.js";
|
|
4
4
|
import { AuthService } from "../services/auth-service.js";
|
|
5
5
|
import { ConnectionManager } from "../services/connection-manager.js";
|
|
6
6
|
import { MessageQueueService } from "../services/message-queue.js";
|
|
@@ -22,8 +22,11 @@ export interface TestApp {
|
|
|
22
22
|
* Each call creates a fresh temp directory for isolation.
|
|
23
23
|
*
|
|
24
24
|
* @param maxMessages - Message cap for the session store (default 500, use small value for cap tests)
|
|
25
|
+
* @param multiTenant - Enable Business Edition Org_ID enforcement (default false = free relay)
|
|
26
|
+
* @param controlPlaneToken - Shared control-plane bearer token. Only consumed when
|
|
27
|
+
* multiTenant=true (the control-plane route is mounted only on the business relay).
|
|
25
28
|
*/
|
|
26
|
-
export declare function createTestApp(maxMessages?: number): Promise<TestApp>;
|
|
29
|
+
export declare function createTestApp(maxMessages?: number, multiTenant?: boolean, controlPlaneToken?: string | null): Promise<TestApp>;
|
|
27
30
|
/**
|
|
28
31
|
* Helper to create a session and get a bearer token.
|
|
29
32
|
* Returns { sessionId, token } for use in subsequent requests.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,mBAAmB,CAAC;IAClC,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,WAAW,SAAM,EACjB,WAAW,UAAQ,EACnB,iBAAiB,GAAE,MAAM,GAAG,IAAW,GACtC,OAAO,CAAC,OAAO,CAAC,CA+ClB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EACpB,MAAM,SAAsB,GAC3B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ/C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,SAAmB,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclC;AAED;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,OAAO;IACxC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACpE,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,WAAW,SAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiE3E"}
|
|
@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { createAdaptorServer } from "@hono/node-server";
|
|
5
|
-
import {
|
|
5
|
+
import { FileSessionStore } from "../services/session-store.js";
|
|
6
6
|
import { AuthService } from "../services/auth-service.js";
|
|
7
7
|
import { ConnectionManager } from "../services/connection-manager.js";
|
|
8
8
|
import { MessageQueueService } from "../services/message-queue.js";
|
|
@@ -15,10 +15,13 @@ import { createApp } from "../app.js";
|
|
|
15
15
|
* Each call creates a fresh temp directory for isolation.
|
|
16
16
|
*
|
|
17
17
|
* @param maxMessages - Message cap for the session store (default 500, use small value for cap tests)
|
|
18
|
+
* @param multiTenant - Enable Business Edition Org_ID enforcement (default false = free relay)
|
|
19
|
+
* @param controlPlaneToken - Shared control-plane bearer token. Only consumed when
|
|
20
|
+
* multiTenant=true (the control-plane route is mounted only on the business relay).
|
|
18
21
|
*/
|
|
19
|
-
export async function createTestApp(maxMessages = 500) {
|
|
22
|
+
export async function createTestApp(maxMessages = 500, multiTenant = false, controlPlaneToken = null) {
|
|
20
23
|
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "route-test-"));
|
|
21
|
-
const sessionStore = new
|
|
24
|
+
const sessionStore = new FileSessionStore(tmpDir, maxMessages);
|
|
22
25
|
const authService = new AuthService(4); // Low rounds for fast tests
|
|
23
26
|
const connectionManager = new ConnectionManager(30_000);
|
|
24
27
|
const messageQueue = new MessageQueueService(sessionStore);
|
|
@@ -40,6 +43,8 @@ export async function createTestApp(maxMessages = 500) {
|
|
|
40
43
|
heartbeatMaxMissed: 3,
|
|
41
44
|
adapterRegistry,
|
|
42
45
|
channelIndex,
|
|
46
|
+
multiTenant,
|
|
47
|
+
controlPlaneToken,
|
|
43
48
|
});
|
|
44
49
|
return {
|
|
45
50
|
app,
|
|
@@ -98,7 +103,7 @@ export async function registerPeer(app, sessionId, token, peerId, label = `Peer
|
|
|
98
103
|
*/
|
|
99
104
|
export async function createTestWsApp(maxMessages = 500) {
|
|
100
105
|
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "ws-test-"));
|
|
101
|
-
const sessionStore = new
|
|
106
|
+
const sessionStore = new FileSessionStore(tmpDir, maxMessages);
|
|
102
107
|
const authService = new AuthService(4);
|
|
103
108
|
await sessionStore.init();
|
|
104
109
|
const connectionManager = new ConnectionManager(30_000);
|
|
@@ -120,6 +125,8 @@ export async function createTestWsApp(maxMessages = 500) {
|
|
|
120
125
|
heartbeatMaxMissed: 3,
|
|
121
126
|
adapterRegistry,
|
|
122
127
|
channelIndex,
|
|
128
|
+
multiTenant: false,
|
|
129
|
+
controlPlaneToken: null,
|
|
123
130
|
});
|
|
124
131
|
// Create real HTTP server on ephemeral port
|
|
125
132
|
const server = createAdaptorServer(app);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SessionStore } from "../../services/session-store.js";
|
|
2
|
+
import type { TokenEntry } from "../../types.js";
|
|
3
|
+
/** A store instance + how to tear it down, at a small message cap (5). */
|
|
4
|
+
export interface ContractFixture {
|
|
5
|
+
store: SessionStore;
|
|
6
|
+
cleanup: () => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function makeToken(suffix?: string): TokenEntry;
|
|
9
|
+
/**
|
|
10
|
+
* One behavioral contract every SessionStore implementation must satisfy
|
|
11
|
+
* identically — run against FileSessionStore, InMemorySessionStore, and (gated)
|
|
12
|
+
* PostgresSessionStore so divergence is caught. Session IDs are real UUIDs
|
|
13
|
+
* (production uses UUIDs; the Postgres schema's session_id is a uuid column).
|
|
14
|
+
* `MAX = 5` (message cap).
|
|
15
|
+
*/
|
|
16
|
+
export declare function runSessionStoreContract(name: string, setup: () => Promise<ContractFixture>): void;
|
|
17
|
+
//# sourceMappingURL=session-store-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store-contract.d.ts","sourceRoot":"","sources":["../../../src/__tests__/services/session-store-contract.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAGD,wBAAgB,SAAS,CAAC,MAAM,SAAM,GAAG,UAAU,CAGlD;AAgBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAkLjG"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { ErrorCode } from "@essentialai/cogent";
|
|
4
|
+
let tokenCounter = 0;
|
|
5
|
+
export function makeToken(suffix = "t") {
|
|
6
|
+
tokenCounter += 1;
|
|
7
|
+
return { tokenHash: `hash_${suffix}_${tokenCounter}`, createdAt: new Date().toISOString() };
|
|
8
|
+
}
|
|
9
|
+
function makeMessage(i) {
|
|
10
|
+
return {
|
|
11
|
+
id: `msg-${i}`,
|
|
12
|
+
fromPeerId: "alice",
|
|
13
|
+
toPeerId: "bob",
|
|
14
|
+
message: `m${i}`,
|
|
15
|
+
response: null,
|
|
16
|
+
timestamp: new Date().toISOString(),
|
|
17
|
+
durationMs: null,
|
|
18
|
+
success: true,
|
|
19
|
+
error: null,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* One behavioral contract every SessionStore implementation must satisfy
|
|
24
|
+
* identically — run against FileSessionStore, InMemorySessionStore, and (gated)
|
|
25
|
+
* PostgresSessionStore so divergence is caught. Session IDs are real UUIDs
|
|
26
|
+
* (production uses UUIDs; the Postgres schema's session_id is a uuid column).
|
|
27
|
+
* `MAX = 5` (message cap).
|
|
28
|
+
*/
|
|
29
|
+
export function runSessionStoreContract(name, setup) {
|
|
30
|
+
describe(`SessionStore contract — ${name}`, () => {
|
|
31
|
+
let store;
|
|
32
|
+
let cleanup;
|
|
33
|
+
beforeEach(async () => {
|
|
34
|
+
({ store, cleanup } = await setup());
|
|
35
|
+
await store.init();
|
|
36
|
+
});
|
|
37
|
+
afterEach(async () => {
|
|
38
|
+
await cleanup();
|
|
39
|
+
});
|
|
40
|
+
it("creates and reads back a session", async () => {
|
|
41
|
+
const id = randomUUID();
|
|
42
|
+
const tok = makeToken();
|
|
43
|
+
const state = await store.createSession(id, "label-1", "secret-hash", tok);
|
|
44
|
+
expect(state.sessionId).toBe(id);
|
|
45
|
+
expect(state.label).toBe("label-1");
|
|
46
|
+
expect(state.tokens).toHaveLength(1);
|
|
47
|
+
expect(state.peers).toEqual({});
|
|
48
|
+
expect(state.messages).toEqual([]);
|
|
49
|
+
const read = await store.getSession(id);
|
|
50
|
+
expect(read.sessionId).toBe(id);
|
|
51
|
+
expect(read.label).toBe("label-1");
|
|
52
|
+
expect(read.tokens[0].tokenHash).toBe(tok.tokenHash);
|
|
53
|
+
});
|
|
54
|
+
it("returns null for a missing session (and for a malformed id)", async () => {
|
|
55
|
+
expect(await store.getSession(randomUUID())).toBeNull();
|
|
56
|
+
expect(await store.getSession("not-a-uuid")).toBeNull(); // no 500/throw, parity
|
|
57
|
+
});
|
|
58
|
+
it("throws INVALID_INPUT on a duplicate sessionId", async () => {
|
|
59
|
+
const id = randomUUID();
|
|
60
|
+
await store.createSession(id, "a", "h", makeToken());
|
|
61
|
+
await expect(store.createSession(id, "b", "h2", makeToken())).rejects.toMatchObject({
|
|
62
|
+
code: ErrorCode.INVALID_INPUT,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it("resolves a session by token hash", async () => {
|
|
66
|
+
const id = randomUUID();
|
|
67
|
+
const tok = makeToken();
|
|
68
|
+
await store.createSession(id, "l", "h", tok);
|
|
69
|
+
expect((await store.getSessionByTokenHash(tok.tokenHash)).sessionId).toBe(id);
|
|
70
|
+
expect(await store.getSessionByTokenHash("nope")).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
it("applies updateSession and persists peers + messages", async () => {
|
|
73
|
+
const id = randomUUID();
|
|
74
|
+
await store.createSession(id, "l", "h", makeToken());
|
|
75
|
+
const updated = await store.updateSession(id, (s) => {
|
|
76
|
+
s.peers["p1"] = { peerId: "p1", cwd: "/x", label: "P1" };
|
|
77
|
+
s.messages.push(makeMessage(0));
|
|
78
|
+
return s;
|
|
79
|
+
});
|
|
80
|
+
expect(updated.messages).toHaveLength(1);
|
|
81
|
+
const read = await store.getSession(id);
|
|
82
|
+
expect(read.messages).toHaveLength(1);
|
|
83
|
+
expect(read.peers["p1"]).toBeDefined();
|
|
84
|
+
});
|
|
85
|
+
it("round-trips the offline messageQueue and channelMappings", async () => {
|
|
86
|
+
const id = randomUUID();
|
|
87
|
+
await store.createSession(id, "l", "h", makeToken());
|
|
88
|
+
await store.updateSession(id, (s) => {
|
|
89
|
+
s.messageQueue = { p1: [{ messageId: "m1", enqueuedAt: "2026-06-04T00:00:00.000Z", message: makeMessage(0) }] };
|
|
90
|
+
s.channelMappings = { slack: { platform: "slack", channelId: "C1", mappedAt: "2026-06-04T00:00:00.000Z" } };
|
|
91
|
+
return s;
|
|
92
|
+
});
|
|
93
|
+
const read = await store.getSession(id);
|
|
94
|
+
expect(read.messageQueue.p1).toHaveLength(1); // must NOT be silently dropped
|
|
95
|
+
expect(read.messageQueue.p1[0].messageId).toBe("m1");
|
|
96
|
+
expect(read.channelMappings.slack.channelId).toBe("C1");
|
|
97
|
+
});
|
|
98
|
+
it("updateSession throws SESSION_NOT_FOUND for a missing session", async () => {
|
|
99
|
+
await expect(store.updateSession(randomUUID(), (s) => s)).rejects.toMatchObject({
|
|
100
|
+
code: ErrorCode.SESSION_NOT_FOUND,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it("enforces the message cap (5)", async () => {
|
|
104
|
+
const id = randomUUID();
|
|
105
|
+
await store.createSession(id, "l", "h", makeToken());
|
|
106
|
+
for (let i = 0; i < 8; i++) {
|
|
107
|
+
await store.updateSession(id, (s) => {
|
|
108
|
+
s.messages.push(makeMessage(i));
|
|
109
|
+
return s;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const read = await store.getSession(id);
|
|
113
|
+
expect(read.messages).toHaveLength(5);
|
|
114
|
+
expect(read.messages.map((m) => m.id)).toEqual(["msg-3", "msg-4", "msg-5", "msg-6", "msg-7"]);
|
|
115
|
+
});
|
|
116
|
+
it("addToken adds + indexes a token; throws SESSION_NOT_FOUND when the session is missing", async () => {
|
|
117
|
+
const id = randomUUID();
|
|
118
|
+
await store.createSession(id, "l", "h", makeToken());
|
|
119
|
+
const t2 = makeToken();
|
|
120
|
+
await store.addToken(id, t2);
|
|
121
|
+
expect((await store.getSession(id)).tokens).toHaveLength(2);
|
|
122
|
+
expect((await store.getSessionByTokenHash(t2.tokenHash)).sessionId).toBe(id);
|
|
123
|
+
await expect(store.addToken(randomUUID(), makeToken())).rejects.toMatchObject({
|
|
124
|
+
code: ErrorCode.SESSION_NOT_FOUND,
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
it("deleteSession removes the session and clears its indexes", async () => {
|
|
128
|
+
const id = randomUUID();
|
|
129
|
+
const tok = makeToken();
|
|
130
|
+
await store.createSession(id, "del-label", "h", tok);
|
|
131
|
+
await store.deleteSession(id);
|
|
132
|
+
expect(await store.getSession(id)).toBeNull();
|
|
133
|
+
expect(await store.getSessionByTokenHash(tok.tokenHash)).toBeNull();
|
|
134
|
+
expect(store.isLabelTaken("del-label")).toBe(false);
|
|
135
|
+
expect(store.getSessionIdByLabel("del-label")).toBeNull();
|
|
136
|
+
expect(await store.listSessions()).toEqual([]);
|
|
137
|
+
});
|
|
138
|
+
it("round-trips orgIdHash + orgScope and scopes labels per org", async () => {
|
|
139
|
+
const a1 = randomUUID();
|
|
140
|
+
const b1 = randomUUID();
|
|
141
|
+
await store.createSession(a1, "sprint-42", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-a" });
|
|
142
|
+
await store.createSession(b1, "sprint-42", "h", makeToken(), undefined, { idHash: "hb", scope: "scope-b" });
|
|
143
|
+
const a = await store.getSession(a1);
|
|
144
|
+
expect(a.orgIdHash).toBe("ha");
|
|
145
|
+
expect(a.orgScope).toBe("scope-a");
|
|
146
|
+
expect(store.getSessionIdByLabel("sprint-42", "scope-a")).toBe(a1);
|
|
147
|
+
expect(store.getSessionIdByLabel("sprint-42", "scope-b")).toBe(b1);
|
|
148
|
+
expect(store.getSessionIdByLabel("sprint-42")).toBeNull(); // public scope can't see business
|
|
149
|
+
await expect(store.createSession(randomUUID(), "sprint-42", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-a" })).rejects.toMatchObject({ code: ErrorCode.INVALID_INPUT });
|
|
150
|
+
});
|
|
151
|
+
it("countAgentsByOrgScope sums peers across the org's sessions, scope-isolated", async () => {
|
|
152
|
+
const a1 = randomUUID();
|
|
153
|
+
const a2 = randomUUID();
|
|
154
|
+
const b1 = randomUUID();
|
|
155
|
+
await store.createSession(a1, "chan-a1", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-x" });
|
|
156
|
+
await store.createSession(a2, "chan-a2", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-x" });
|
|
157
|
+
await store.createSession(b1, "chan-b1", "h", makeToken(), undefined, { idHash: "hb", scope: "scope-y" });
|
|
158
|
+
await store.updateSession(a1, (s) => {
|
|
159
|
+
s.peers["alice"] = { peerId: "alice", cwd: "/x", label: "A" };
|
|
160
|
+
s.peers["bob"] = { peerId: "bob", cwd: "/x", label: "B" };
|
|
161
|
+
return s;
|
|
162
|
+
});
|
|
163
|
+
await store.updateSession(a2, (s) => {
|
|
164
|
+
s.peers["carol"] = { peerId: "carol", cwd: "/x", label: "C" };
|
|
165
|
+
return s;
|
|
166
|
+
});
|
|
167
|
+
await store.updateSession(b1, (s) => {
|
|
168
|
+
s.peers["dave"] = { peerId: "dave", cwd: "/x", label: "D" };
|
|
169
|
+
return s;
|
|
170
|
+
});
|
|
171
|
+
expect(await store.countAgentsByOrgScope("scope-x")).toBe(3); // alice+bob+carol
|
|
172
|
+
expect(await store.countAgentsByOrgScope("scope-y")).toBe(1); // dave only
|
|
173
|
+
expect(await store.countAgentsByOrgScope("scope-unknown")).toBe(0);
|
|
174
|
+
});
|
|
175
|
+
it("tracks the global message counter atomically", async () => {
|
|
176
|
+
expect(await store.getGlobalMessageCount()).toBe(0);
|
|
177
|
+
await Promise.all([
|
|
178
|
+
store.incrementGlobalMessageCount(),
|
|
179
|
+
store.incrementGlobalMessageCount(),
|
|
180
|
+
store.incrementGlobalMessageCount(),
|
|
181
|
+
]);
|
|
182
|
+
expect(await store.getGlobalMessageCount()).toBe(3);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=session-store-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store-contract.js","sourceRoot":"","sources":["../../../src/__tests__/services/session-store-contract.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
CHANGED
|
@@ -23,6 +23,15 @@ export interface AppDeps {
|
|
|
23
23
|
heartbeatMaxMissed: number;
|
|
24
24
|
adapterRegistry?: AdapterRegistry;
|
|
25
25
|
channelIndex?: ChannelIndex;
|
|
26
|
+
/** Multi-tenant (Business Edition) flag, sourced once from config.MULTI_TENANT. */
|
|
27
|
+
multiTenant: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Shared bearer token the control plane authenticates with (Business Edition).
|
|
30
|
+
* `null` when unset → the control-plane endpoint, even if mounted, rejects every
|
|
31
|
+
* request (fail-closed). Sourced from config.CONTROL_PLANE_TOKEN. Required (not
|
|
32
|
+
* optional) so a forgotten wiring is a compile error, matching `adminPassword`.
|
|
33
|
+
*/
|
|
34
|
+
controlPlaneToken: string | null;
|
|
26
35
|
}
|
|
27
36
|
/** Return type of createApp -- app + injectWebSocket for index.ts wiring. */
|
|
28
37
|
export interface AppResult {
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAc5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,oDAAoD;AACpD,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,mBAAmB,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,mFAAmF;IACnF,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,iBAAiB,KAAK,IAAI,CAAC;CAC7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CA8GlD"}
|
package/dist/app.js
CHANGED
|
@@ -4,6 +4,7 @@ import { requestLogger } from "./middleware/request-logger.js";
|
|
|
4
4
|
import { errorHandler } from "./middleware/error-handler.js";
|
|
5
5
|
import { notFoundHandler } from "./middleware/not-found.js";
|
|
6
6
|
import { createSessionRoutes } from "./routes/sessions.js";
|
|
7
|
+
import { JoinRateLimiter } from "./services/join-rate-limiter.js";
|
|
7
8
|
import { createHealthRoutes } from "./routes/health.js";
|
|
8
9
|
import { createPeerRoutes } from "./routes/peers.js";
|
|
9
10
|
import { createMessageRoutes } from "./routes/messages.js";
|
|
@@ -14,6 +15,8 @@ import { createWsHandler } from "./ws/handler.js";
|
|
|
14
15
|
import { createAdapterWsHandler } from "./ws/adapter-handler.js";
|
|
15
16
|
import { createAdapterRoutes } from "./routes/adapter.js";
|
|
16
17
|
import { createChannelMappingRoutes } from "./routes/channel-mappings.js";
|
|
18
|
+
import { createControlPlaneRoutes } from "./routes/control-plane.js";
|
|
19
|
+
import { createControlPlaneAuthMiddleware } from "./middleware/control-plane-auth.js";
|
|
17
20
|
/**
|
|
18
21
|
* Create and configure the Hono app with all middleware and routes.
|
|
19
22
|
*
|
|
@@ -24,9 +27,14 @@ import { createChannelMappingRoutes } from "./routes/channel-mappings.js";
|
|
|
24
27
|
* be called with the HTTP server after serve() -- see RESEARCH.md Pitfall 2.
|
|
25
28
|
*/
|
|
26
29
|
export function createApp(deps) {
|
|
27
|
-
const { sessionStore, authService, startTime, maxMessages, connectionManager, messageQueue, statsService, adminPassword, heartbeatIntervalMs, heartbeatMaxMissed, adapterRegistry, channelIndex, } = deps;
|
|
30
|
+
const { sessionStore, authService, startTime, maxMessages, connectionManager, messageQueue, statsService, adminPassword, heartbeatIntervalMs, heartbeatMaxMissed, adapterRegistry, channelIndex, multiTenant, controlPlaneToken, } = deps;
|
|
28
31
|
const app = new Hono();
|
|
29
32
|
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });
|
|
33
|
+
// Brute-force lockout for session joins, within a 15-min window -> 15-min
|
|
34
|
+
// lockout. Tier 1: 5 failures per (IP, channel) for UX. Tier 2: 20 failures
|
|
35
|
+
// per channel (non-spoofable) as the security backstop against header-forged
|
|
36
|
+
// IP rotation. Process-local for the single-node MVP.
|
|
37
|
+
const joinRateLimiter = new JoinRateLimiter(5, 20, 15 * 60_000, 15 * 60_000);
|
|
30
38
|
// --- Error handling ---
|
|
31
39
|
app.onError(errorHandler);
|
|
32
40
|
app.notFound(notFoundHandler);
|
|
@@ -64,7 +72,7 @@ export function createApp(deps) {
|
|
|
64
72
|
const uiRoutes = createUiRoutes({ statsService, adminPassword, sessionStore, connectionManager });
|
|
65
73
|
app.route("/", uiRoutes);
|
|
66
74
|
// --- Unauthenticated routes ---
|
|
67
|
-
app.route("/api/sessions", createSessionRoutes(sessionStore, authService));
|
|
75
|
+
app.route("/api/sessions", createSessionRoutes(sessionStore, authService, multiTenant, joinRateLimiter));
|
|
68
76
|
app.route("/api/health", createHealthRoutes(sessionStore, startTime, connectionManager));
|
|
69
77
|
// --- Authenticated routes ---
|
|
70
78
|
// Peer routes: /:sessionId/peers (POST, GET), /:sessionId/peers/:peerId (DELETE)
|
|
@@ -81,6 +89,14 @@ export function createApp(deps) {
|
|
|
81
89
|
if (channelIndex) {
|
|
82
90
|
app.route("/api/sessions", createChannelMappingRoutes(sessionStore, authService, channelIndex));
|
|
83
91
|
}
|
|
92
|
+
// --- Control-plane receiver (Business Edition only) ---
|
|
93
|
+
// Mounted ONLY on the multi-tenant relay; the free relay never exposes it. The
|
|
94
|
+
// auth middleware is fail-closed, so a missing token rejects every request even
|
|
95
|
+
// though the route is mounted.
|
|
96
|
+
if (multiTenant) {
|
|
97
|
+
app.use("/api/control-plane/*", createControlPlaneAuthMiddleware(controlPlaneToken, authService));
|
|
98
|
+
app.route("/api/control-plane", createControlPlaneRoutes(sessionStore, authService, connectionManager));
|
|
99
|
+
}
|
|
84
100
|
return { app, injectWebSocket };
|
|
85
101
|
}
|
|
86
102
|
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAOpD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -25,6 +25,13 @@ declare const ServerConfigSchema: z.ZodObject<{
|
|
|
25
25
|
SESSION_INACTIVITY_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
26
26
|
SESSION_CLEANUP_INTERVAL_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
27
27
|
ADMIN_PASSWORD: z.ZodOptional<z.ZodString>;
|
|
28
|
+
CONTROL_PLANE_TOKEN: z.ZodOptional<z.ZodString>;
|
|
29
|
+
MULTI_TENANT: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<boolean, string>>;
|
|
30
|
+
DATABASE_URL: z.ZodOptional<z.ZodString>;
|
|
31
|
+
DB_POOL_MAX: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
32
|
+
DB_CONNECTION_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
33
|
+
DB_IDLE_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
34
|
+
DB_STATEMENT_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
28
35
|
}, z.core.$strip>;
|
|
29
36
|
/** Inferred server configuration type. */
|
|
30
37
|
export type ServerConfig = z.infer<typeof ServerConfigSchema>;
|
|
@@ -49,6 +56,13 @@ export interface ConfigFileOptions {
|
|
|
49
56
|
sessionInactivityMs?: number;
|
|
50
57
|
sessionCleanupIntervalMs?: number;
|
|
51
58
|
adminPassword?: string;
|
|
59
|
+
controlPlaneToken?: string;
|
|
60
|
+
multiTenant?: boolean;
|
|
61
|
+
databaseUrl?: string;
|
|
62
|
+
dbPoolMax?: number;
|
|
63
|
+
dbConnectionTimeoutMs?: number;
|
|
64
|
+
dbIdleTimeoutMs?: number;
|
|
65
|
+
dbStatementTimeoutMs?: number;
|
|
52
66
|
}
|
|
53
67
|
/**
|
|
54
68
|
* Load a config.json file and return its values mapped to COGENT_SERVER_* env var names.
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;GAGG;AACH,QAAA,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;GAGG;AACH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgEtB,CAAC;AAEH,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AA6BD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BzE;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,UAAU,GAAE,MAAgD,GAC3D,QAAQ,CAAC,YAAY,CAAC,CA2BxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAAC,YAAY,CAAC,CAOxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
|
package/dist/config.js
CHANGED
|
@@ -31,6 +31,43 @@ const ServerConfigSchema = z.object({
|
|
|
31
31
|
SESSION_CLEANUP_INTERVAL_MS: z.coerce.number().default(3_600_000),
|
|
32
32
|
/** Admin dashboard password. When undefined, admin dashboard is disabled entirely. */
|
|
33
33
|
ADMIN_PASSWORD: z.string().optional(),
|
|
34
|
+
/**
|
|
35
|
+
* Shared bearer token authenticating the control plane (Business Edition) on
|
|
36
|
+
* the privileged /api/control-plane/* endpoint. When UNSET, that endpoint is
|
|
37
|
+
* fail-closed (every request rejected) — an unconfigured token must never mean
|
|
38
|
+
* "open". Only meaningful with MULTI_TENANT=true (the route isn't mounted on
|
|
39
|
+
* the free relay). When SET it must be ≥32 chars (Sec-M1): the timing-safe compare
|
|
40
|
+
* defeats prefix-timing + unconfigured-open, but NOT low-entropy online guessing of a
|
|
41
|
+
* fully-armed any-org endpoint. Optional() keeps the free relay (token unset) unaffected.
|
|
42
|
+
*/
|
|
43
|
+
CONTROL_PLANE_TOKEN: z
|
|
44
|
+
.string()
|
|
45
|
+
.min(32, "CONTROL_PLANE_TOKEN must be ≥32 chars (high-entropy) — it guards the any-org control-plane endpoint")
|
|
46
|
+
.optional(),
|
|
47
|
+
/**
|
|
48
|
+
* Multi-tenant (Business Edition) flag. Off on the free relay.
|
|
49
|
+
* Parsed explicitly from the string "true" -- NOT z.coerce.boolean(), which
|
|
50
|
+
* would coerce the string "false" to `true`.
|
|
51
|
+
*/
|
|
52
|
+
MULTI_TENANT: z
|
|
53
|
+
.string()
|
|
54
|
+
.default("false")
|
|
55
|
+
.transform((v) => v === "true"),
|
|
56
|
+
/**
|
|
57
|
+
* Postgres connection string for the business instance (FR35). OPTIONAL:
|
|
58
|
+
* when unset, the relay uses the file store and never opens a pool (the free
|
|
59
|
+
* relay path is unchanged). Story 2.4b selects the Postgres store from this.
|
|
60
|
+
*/
|
|
61
|
+
DATABASE_URL: z.string().optional(),
|
|
62
|
+
/** Max pooled connections (bounded — the back-pressure ceiling). */
|
|
63
|
+
DB_POOL_MAX: z.coerce.number().int().min(1).default(10),
|
|
64
|
+
/** Acquire timeout: a connect that can't be served in this window REJECTS
|
|
65
|
+
* (graceful degradation) instead of hanging. */
|
|
66
|
+
DB_CONNECTION_TIMEOUT_MS: z.coerce.number().int().min(1).default(5_000),
|
|
67
|
+
/** Idle client reaped after this long. */
|
|
68
|
+
DB_IDLE_TIMEOUT_MS: z.coerce.number().int().min(0).default(30_000),
|
|
69
|
+
/** Per-statement timeout (server-side) to bound runaway queries. */
|
|
70
|
+
DB_STATEMENT_TIMEOUT_MS: z.coerce.number().int().min(0).default(30_000),
|
|
34
71
|
});
|
|
35
72
|
const ENV_PREFIX = "COGENT_SERVER_";
|
|
36
73
|
/** Maps camelCase config.json keys to COGENT_SERVER_* env var names. */
|
|
@@ -51,6 +88,13 @@ const CONFIG_KEY_MAP = {
|
|
|
51
88
|
sessionInactivityMs: "COGENT_SERVER_SESSION_INACTIVITY_MS",
|
|
52
89
|
sessionCleanupIntervalMs: "COGENT_SERVER_SESSION_CLEANUP_INTERVAL_MS",
|
|
53
90
|
adminPassword: "COGENT_SERVER_ADMIN_PASSWORD",
|
|
91
|
+
controlPlaneToken: "COGENT_SERVER_CONTROL_PLANE_TOKEN",
|
|
92
|
+
multiTenant: "COGENT_SERVER_MULTI_TENANT",
|
|
93
|
+
databaseUrl: "COGENT_SERVER_DATABASE_URL",
|
|
94
|
+
dbPoolMax: "COGENT_SERVER_DB_POOL_MAX",
|
|
95
|
+
dbConnectionTimeoutMs: "COGENT_SERVER_DB_CONNECTION_TIMEOUT_MS",
|
|
96
|
+
dbIdleTimeoutMs: "COGENT_SERVER_DB_IDLE_TIMEOUT_MS",
|
|
97
|
+
dbStatementTimeoutMs: "COGENT_SERVER_DB_STATEMENT_TIMEOUT_MS",
|
|
54
98
|
};
|
|
55
99
|
/**
|
|
56
100
|
* Load a config.json file and return its values mapped to COGENT_SERVER_* env var names.
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,UAAU,CAAC,CACtD;IACD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACrE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,qBAAqB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IAC3D,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACtE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACpC,4DAA4D;IAC5D,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3D,wGAAwG;IACxG,uBAAuB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,+FAA+F;IAC/F,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACrD,iDAAiD;IACjD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACpD,uDAAuD;IACvD,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IAChE,kGAAkG;IAClG,qBAAqB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IAC7D,4EAA4E;IAC5E,2BAA2B,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACjE,sFAAsF;IACtF,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|