paracosm 0.9.1021 → 0.9.1024
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 +12 -11
- package/assets/landing.css +1 -533
- package/dist/dashboard/dist/assets/{index-YkbFYo4m.js → index-Da6eIzNW.js} +2 -2
- package/dist/dashboard/dist/assets/{pdf-D0rlhCn8.js → pdf-CdfMQ2jQ.js} +1 -1
- package/dist/dashboard/dist/index.html +1 -1
- package/dist/dashboard/dist/llms-full.txt +5 -7
- package/dist/dashboard/dist/llms.txt +2 -0
- package/dist/dashboard/dist/sitemap.xml +7 -27
- package/dist/dashboard/landing.html +35 -292
- package/dist/server/rate-limiter.d.ts +0 -9
- package/dist/server/rate-limiter.d.ts.map +1 -1
- package/dist/server/rate-limiter.js +0 -36
- package/dist/server/rate-limiter.js.map +1 -1
- package/dist/server/routes/waitlist.d.ts +15 -19
- package/dist/server/routes/waitlist.d.ts.map +1 -1
- package/dist/server/routes/waitlist.js +5 -107
- package/dist/server/routes/waitlist.js.map +1 -1
- package/dist/server/server-app.d.ts +1 -1
- package/dist/server/server-app.d.ts.map +1 -1
- package/dist/server/server-app.js +28 -27
- package/dist/server/server-app.js.map +1 -1
- package/dist/server/services/email-templates.d.ts +4 -11
- package/dist/server/services/email-templates.d.ts.map +1 -1
- package/dist/server/services/email-templates.js +4 -70
- package/dist/server/services/email-templates.js.map +1 -1
- package/dist/server/stores/session.d.ts +6 -4
- package/dist/server/stores/session.d.ts.map +1 -1
- package/dist/server/stores/session.js +5 -3
- package/dist/server/stores/session.js.map +1 -1
- package/dist/server/stores/sqlite-run-history.d.ts +8 -12
- package/dist/server/stores/sqlite-run-history.d.ts.map +1 -1
- package/dist/server/stores/sqlite-run-history.js +6 -6
- package/dist/server/stores/sqlite-run-history.js.map +1 -1
- package/dist/server/stores/waitlist.d.ts +9 -6
- package/dist/server/stores/waitlist.d.ts.map +1 -1
- package/dist/server/stores/waitlist.js +8 -5
- package/dist/server/stores/waitlist.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/server/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAoB9E,MAAM,OAAO,aAAa;IAChB,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC7C,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/server/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
};
|
|
17
|
-
waitlistFrom: string;
|
|
18
|
-
}
|
|
19
|
-
export declare function handleWaitlist(req: IncomingMessage, res: ServerResponse, rawBody: string, deps: WaitlistRouteDeps): Promise<void>;
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/waitlist handler. The landing-page waitlist is closed: the
|
|
3
|
+
* route answers 410 Gone with `{ error: 'waitlist_closed' }` and stores
|
|
4
|
+
* nothing. The signups collected while it was open stay in the waitlist
|
|
5
|
+
* store (`../stores/waitlist.ts`), where
|
|
6
|
+
* `scripts/send-waitlist-broadcast.ts` reads them.
|
|
7
|
+
*
|
|
8
|
+
* @module paracosm/cli/server/waitlist-route
|
|
9
|
+
*/
|
|
10
|
+
import type { ServerResponse } from 'node:http';
|
|
11
|
+
/**
|
|
12
|
+
* Answers a waitlist signup with 410 Gone. It reads no request body,
|
|
13
|
+
* sends no email and never opens the waitlist store.
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleWaitlistClosed(res: ServerResponse): void;
|
|
20
16
|
//# sourceMappingURL=waitlist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waitlist.d.ts","sourceRoot":"","sources":["../../../src/server/routes/waitlist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"waitlist.d.ts","sourceRoot":"","sources":["../../../src/server/routes/waitlist.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAG9D"}
|
|
@@ -1,111 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* best-effort. Returns the user's position. Email is awaited so we
|
|
5
|
-
* can report `emailSent` accurately to the client; the await never
|
|
6
|
-
* throws because `sendEmail` swallows all errors.
|
|
7
|
-
*
|
|
8
|
-
* @module paracosm/cli/server/waitlist-route
|
|
2
|
+
* Answers a waitlist signup with 410 Gone. It reads no request body,
|
|
3
|
+
* sends no email and never opens the waitlist store.
|
|
9
4
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const WaitlistBodySchema = z.object({
|
|
14
|
-
email: z.string().trim().toLowerCase().email().max(254),
|
|
15
|
-
name: z
|
|
16
|
-
.string()
|
|
17
|
-
.trim()
|
|
18
|
-
.max(120)
|
|
19
|
-
.optional()
|
|
20
|
-
.or(z.literal('').transform(() => undefined)),
|
|
21
|
-
useCase: z
|
|
22
|
-
.string()
|
|
23
|
-
.trim()
|
|
24
|
-
.max(2000)
|
|
25
|
-
.optional()
|
|
26
|
-
.or(z.literal('').transform(() => undefined)),
|
|
27
|
-
source: z
|
|
28
|
-
.string()
|
|
29
|
-
.trim()
|
|
30
|
-
.max(40)
|
|
31
|
-
.regex(/^[a-zA-Z0-9_-]+$/)
|
|
32
|
-
.optional()
|
|
33
|
-
.or(z.literal('').transform(() => undefined)),
|
|
34
|
-
// Self-classification ('hobbyist' if omitted). Strict enum so the column
|
|
35
|
-
// never receives unexpected values; the store enforces the same set.
|
|
36
|
-
userType: z
|
|
37
|
-
.enum(WAITLIST_USER_TYPES)
|
|
38
|
-
.optional()
|
|
39
|
-
.or(z.literal('').transform(() => undefined))
|
|
40
|
-
.default('hobbyist'),
|
|
41
|
-
});
|
|
42
|
-
function jsonResponse(res, status, body) {
|
|
43
|
-
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
44
|
-
res.end(JSON.stringify(body));
|
|
45
|
-
}
|
|
46
|
-
export async function handleWaitlist(req, res, rawBody, deps) {
|
|
47
|
-
let parsed;
|
|
48
|
-
try {
|
|
49
|
-
parsed = WaitlistBodySchema.safeParse(JSON.parse(rawBody || '{}'));
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
jsonResponse(res, 400, { error: 'Invalid JSON' });
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
if (!parsed.success) {
|
|
56
|
-
jsonResponse(res, 400, {
|
|
57
|
-
error: 'Invalid payload',
|
|
58
|
-
issues: parsed.error.issues.map((i) => ({ path: i.path, message: i.message })),
|
|
59
|
-
});
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const ip = deps.rateLimiter.getClientIp(req);
|
|
63
|
-
const decision = deps.rateLimiter.consumeWaitlist(ip);
|
|
64
|
-
if (!decision.allowed) {
|
|
65
|
-
jsonResponse(res, 429, {
|
|
66
|
-
error: 'Already submitted recently. Try again in a few minutes.',
|
|
67
|
-
});
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const { email, name, useCase, source, userType } = parsed.data;
|
|
71
|
-
let result;
|
|
72
|
-
try {
|
|
73
|
-
result = await deps.waitlistStore.insertOrGetExisting({
|
|
74
|
-
email,
|
|
75
|
-
name: name ?? null,
|
|
76
|
-
useCase: useCase ?? null,
|
|
77
|
-
source: source ?? null,
|
|
78
|
-
userType,
|
|
79
|
-
ip,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch (err) {
|
|
83
|
-
console.error('[waitlist] store insert failed:', err);
|
|
84
|
-
jsonResponse(res, 500, { error: 'Waitlist insert failed' });
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
let emailSent = false;
|
|
88
|
-
if (!result.alreadyExisted) {
|
|
89
|
-
const rendered = renderWaitlistConfirmation({
|
|
90
|
-
email,
|
|
91
|
-
name: name ?? null,
|
|
92
|
-
position: result.position,
|
|
93
|
-
useCase: useCase ?? null,
|
|
94
|
-
});
|
|
95
|
-
emailSent = await deps.sendEmail({
|
|
96
|
-
from: deps.waitlistFrom,
|
|
97
|
-
to: email,
|
|
98
|
-
subject: rendered.subject,
|
|
99
|
-
html: rendered.html,
|
|
100
|
-
text: rendered.text,
|
|
101
|
-
replyTo: 'team@frame.dev',
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
jsonResponse(res, 200, {
|
|
105
|
-
ok: true,
|
|
106
|
-
position: result.position,
|
|
107
|
-
alreadyOnList: result.alreadyExisted,
|
|
108
|
-
emailSent,
|
|
109
|
-
});
|
|
5
|
+
export function handleWaitlistClosed(res) {
|
|
6
|
+
res.writeHead(410, { 'Content-Type': 'application/json' });
|
|
7
|
+
res.end(JSON.stringify({ error: 'waitlist_closed' }));
|
|
110
8
|
}
|
|
111
9
|
//# sourceMappingURL=waitlist.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waitlist.js","sourceRoot":"","sources":["../../../src/server/routes/waitlist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"waitlist.js","sourceRoot":"","sources":["../../../src/server/routes/waitlist.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAmB;IACtD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -16,7 +16,7 @@ export interface CreateMarsServerOptions {
|
|
|
16
16
|
}>;
|
|
17
17
|
compileScenario?: (scenarioJson: Record<string, unknown>, options: Record<string, unknown>) => Promise<ScenarioPackage>;
|
|
18
18
|
scenarioDir?: string;
|
|
19
|
-
/** Max simulations per IP per day. 0 = unlimited.
|
|
19
|
+
/** Max simulations per IP per day. 0 = unlimited. Overrides the RATE_LIMIT env var; with neither set the limit is 1. */
|
|
20
20
|
maxSimsPerDay?: number;
|
|
21
21
|
/**
|
|
22
22
|
* Grace period (ms) between the last SSE client disconnecting and the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-app.d.ts","sourceRoot":"","sources":["../../src/server/server-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,EAA4C,KAAK,0BAA0B,EAA+B,MAAM,sBAAsB,CAAC;AAC9I,OAAO,EAA8D,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWrH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AA6B1D,OAAO,EAAoB,KAAK,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AAKjG,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"server-app.d.ts","sourceRoot":"","sources":["../../src/server/server-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,7 @@ import { enrichRunRecordFromArtifact } from './services/enrich-run-record.js';
|
|
|
24
24
|
import { createNoopRunHistoryStore } from './stores/run-history.js';
|
|
25
25
|
import { createSqliteRunHistoryStore } from './stores/sqlite-run-history.js';
|
|
26
26
|
import { createWaitlistStore } from './stores/waitlist.js';
|
|
27
|
-
import {
|
|
28
|
-
import { sendEmail } from './services/email.js';
|
|
27
|
+
import { handleWaitlistClosed } from './routes/waitlist.js';
|
|
29
28
|
import { handlePublicDemoRoute } from './routes/public-demo.js';
|
|
30
29
|
import { handlePlatformApiRoute } from './routes/platform-api.js';
|
|
31
30
|
import { validateForkSetupPreconditions } from './fork-preconditions.js';
|
|
@@ -638,11 +637,26 @@ export function createMarsServer(options = {}) {
|
|
|
638
637
|
console.log(` [sessions] Failed to open session store: ${err}`);
|
|
639
638
|
}
|
|
640
639
|
const runHistoryStore = options.runHistoryStore ?? resolveRunHistoryStore(env);
|
|
641
|
-
//
|
|
642
|
-
//
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
640
|
+
// The landing-page waitlist is closed (routes/waitlist.ts answers
|
|
641
|
+
// 410), so the server leaves the signups it collected in
|
|
642
|
+
// `${APP_DIR}/data/waitlist.db` alone and does not open the file.
|
|
643
|
+
// PARACOSM_WAITLIST_STORE=1 opens an existing store at startup and
|
|
644
|
+
// logs how many signups it holds, for the operator who is about to
|
|
645
|
+
// export them (`scripts/send-waitlist-broadcast.ts --dry-run` lists
|
|
646
|
+
// the addresses). Opening runs the store's own schema bootstrap;
|
|
647
|
+
// no server code inserts, updates or deletes a signup.
|
|
648
|
+
if (env.PARACOSM_WAITLIST_STORE === '1') {
|
|
649
|
+
const waitlistDbPath = resolve(env.APP_DIR || '.', 'data', 'waitlist.db');
|
|
650
|
+
if (existsSync(waitlistDbPath)) {
|
|
651
|
+
createWaitlistStore({ dbPath: waitlistDbPath })
|
|
652
|
+
.count()
|
|
653
|
+
.then((n) => console.log(` [waitlist] Opened waitlist store at ${waitlistDbPath} (${n} signup${n === 1 ? '' : 's'} stored; the route accepts no new ones)`))
|
|
654
|
+
.catch((err) => console.log(` [waitlist] Failed to read waitlist store: ${err}`));
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
console.log(` [waitlist] No waitlist store at ${waitlistDbPath}; nothing to read`);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
646
660
|
// Coalesce disk writes so a burst of broadcasts (e.g. 50 forge_attempt
|
|
647
661
|
// events during a turn) only triggers one persist call. 500ms debounce
|
|
648
662
|
// is short enough that a crash loses at most a half-second of events
|
|
@@ -1589,24 +1603,11 @@ export function createMarsServer(options = {}) {
|
|
|
1589
1603
|
}
|
|
1590
1604
|
return;
|
|
1591
1605
|
}
|
|
1592
|
-
//
|
|
1593
|
-
//
|
|
1594
|
-
//
|
|
1595
|
-
// unlimited mode), fall through to allow-all because there is only
|
|
1596
|
-
// one operator to protect from abusive submissions.
|
|
1606
|
+
// The landing-page waitlist is closed: the route answers 410
|
|
1607
|
+
// `{ error: 'waitlist_closed' }` without reading the body or
|
|
1608
|
+
// touching the stored signups.
|
|
1597
1609
|
if (req.url === '/api/waitlist' && req.method === 'POST') {
|
|
1598
|
-
|
|
1599
|
-
await handleWaitlist(req, res, body, {
|
|
1600
|
-
waitlistStore,
|
|
1601
|
-
sendEmail,
|
|
1602
|
-
rateLimiter: {
|
|
1603
|
-
consumeWaitlist: (ip) => rateLimiter
|
|
1604
|
-
? rateLimiter.consumeWaitlist(ip)
|
|
1605
|
-
: { allowed: true, remaining: 0, resetAt: Date.now() + 1, limit: 1 },
|
|
1606
|
-
getClientIp: (r) => IpRateLimiter.getIp(r),
|
|
1607
|
-
},
|
|
1608
|
-
waitlistFrom,
|
|
1609
|
-
});
|
|
1610
|
+
handleWaitlistClosed(res);
|
|
1610
1611
|
return;
|
|
1611
1612
|
}
|
|
1612
1613
|
// Tier 5 Quickstart onboarding endpoints.
|
|
@@ -2714,9 +2715,9 @@ export function createMarsServer(options = {}) {
|
|
|
2714
2715
|
}
|
|
2715
2716
|
}
|
|
2716
2717
|
// Serve hand-crafted diagram SVGs (system flow, etc). Single source
|
|
2717
|
-
// at `assets/diagrams/` — referenced from landing.html
|
|
2718
|
-
//
|
|
2719
|
-
//
|
|
2718
|
+
// at `assets/diagrams/` — referenced from landing.html and the
|
|
2719
|
+
// README. Same path-traversal guard as `/brand/` and `/demo/`; same
|
|
2720
|
+
// file types; same cache policy.
|
|
2720
2721
|
if (req.url?.split('?')[0].startsWith('/diagrams/')) {
|
|
2721
2722
|
try {
|
|
2722
2723
|
const diagramRoot = resolve(__dirname, '..', '..', 'assets', 'diagrams');
|