paracosm 0.8.489 → 0.8.496
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 +17 -0
- package/dist/cli/init.js +1 -1
- package/dist/cli/run.js +0 -0
- package/dist/cli/serve.js +0 -0
- package/dist/cli/server/library-import-route.d.ts +9 -0
- package/dist/cli/server/library-import-route.d.ts.map +1 -0
- package/dist/cli/server/library-import-route.js +115 -0
- package/dist/cli/server/library-import-route.js.map +1 -0
- package/dist/cli/server/run-history-store.d.ts +6 -0
- package/dist/cli/server/run-history-store.d.ts.map +1 -1
- package/dist/cli/server/run-history-store.js +1 -0
- package/dist/cli/server/run-history-store.js.map +1 -1
- package/dist/cli/server/sqlite-run-history-store.d.ts +33 -0
- package/dist/cli/server/sqlite-run-history-store.d.ts.map +1 -1
- package/dist/cli/server/sqlite-run-history-store.js +196 -117
- package/dist/cli/server/sqlite-run-history-store.js.map +1 -1
- package/dist/cli/server-app.d.ts.map +1 -1
- package/dist/cli/server-app.js +106 -14
- package/dist/cli/server-app.js.map +1 -1
- package/dist/cli/session-store.d.ts +55 -14
- package/dist/cli/session-store.d.ts.map +1 -1
- package/dist/cli/session-store.js +114 -69
- package/dist/cli/session-store.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -652,6 +652,23 @@ bun src/index.ts
|
|
|
652
652
|
PARACOSM_OUTPUT_DIR=./artifacts/run-001 bun src/index.ts
|
|
653
653
|
```
|
|
654
654
|
|
|
655
|
+
## Storage backend
|
|
656
|
+
|
|
657
|
+
Paracosm persists run history (the Library tab) and replayable session blobs (the Load menu) through [`@framers/sql-storage-adapter`](https://github.com/framersai/sql-storage-adapter), the open-source SQL abstraction maintained by Frame.dev. The same code paths run unchanged against SQLite (default), Postgres, sql.js, and IndexedDB; switching backends is one env var.
|
|
658
|
+
|
|
659
|
+
```bash
|
|
660
|
+
# Default: better-sqlite3 against ./data/runs.db + ./data/sessions.db
|
|
661
|
+
paracosm dashboard
|
|
662
|
+
|
|
663
|
+
# Postgres in production (Library + sessions persist to your existing cluster)
|
|
664
|
+
STORAGE_ADAPTER=postgres DATABASE_URL=postgres://user:pass@host/db paracosm dashboard
|
|
665
|
+
|
|
666
|
+
# Pure-WASM SQLite fallback when the native module isn't available
|
|
667
|
+
STORAGE_ADAPTER=sqljs paracosm dashboard
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
Run-history schema (`runs` table) and session schema (`sessions` table) are bootstrapped idempotently on first boot. Legacy v0.7 databases auto-migrate the `leader_*` columns to `actor_*` in place via `ALTER TABLE RENAME COLUMN`; no manual step needed.
|
|
671
|
+
|
|
655
672
|
## Seed Enrichment & Citation Flow
|
|
656
673
|
|
|
657
674
|
Pass real-world source material into the compiler and Paracosm grounds the scenario in citations that flow all the way through to department reports.
|
package/dist/cli/init.js
CHANGED
|
@@ -26,7 +26,7 @@ const USAGE = `paracosm init [dir] --domain <text|url> [--mode <m>] [--actors <n
|
|
|
26
26
|
dir output directory (default: ./paracosm-app)
|
|
27
27
|
--domain required: seed text describing the scenario, OR a URL
|
|
28
28
|
--mode turn-loop | batch-trajectory | batch-point (default: turn-loop)
|
|
29
|
-
--actors number of HEXACO
|
|
29
|
+
--actors number of HEXACO actors, 2-6 (default: 3)
|
|
30
30
|
--name project name, default: derived from --domain
|
|
31
31
|
--force overwrite non-empty target dir
|
|
32
32
|
|
package/dist/cli/run.js
CHANGED
|
File without changes
|
package/dist/cli/serve.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { RunHistoryStore } from './run-history-store.js';
|
|
3
|
+
import type { ParacosmServerMode } from './server-mode.js';
|
|
4
|
+
export interface LibraryImportDeps {
|
|
5
|
+
runHistoryStore: RunHistoryStore;
|
|
6
|
+
sourceMode: ParacosmServerMode;
|
|
7
|
+
}
|
|
8
|
+
export declare function handleLibraryImport(_req: IncomingMessage, res: ServerResponse, body: unknown, deps: LibraryImportDeps): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=library-import-route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-import-route.d.ts","sourceRoot":"","sources":["../../../src/cli/server/library-import-route.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAO3D,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAmEf"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/v1/library/import — accepts a RunArtifact (single) or array
|
|
3
|
+
* of RunArtifacts (bundle) from a Studio drop and inserts the enriched
|
|
4
|
+
* RunRecord(s) into the active run-history store. Lets users persist
|
|
5
|
+
* artifacts that originated outside this server (Studio JSON drops,
|
|
6
|
+
* shared exports, replay clones).
|
|
7
|
+
*
|
|
8
|
+
* @module paracosm/cli/server/library-import-route
|
|
9
|
+
*/
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { RunArtifactSchema } from '../../engine/schema/artifact.js';
|
|
13
|
+
import { createRunRecord, hashActorConfig } from './run-record.js';
|
|
14
|
+
import { enrichRunRecordFromArtifact } from './enrich-run-record.js';
|
|
15
|
+
const MAX_BUNDLE_SIZE = 50;
|
|
16
|
+
const SingleBodySchema = z.object({ artifact: z.unknown() });
|
|
17
|
+
const BundleBodySchema = z.object({ artifacts: z.array(z.unknown()).min(1).max(MAX_BUNDLE_SIZE) });
|
|
18
|
+
export async function handleLibraryImport(_req, res, body, deps) {
|
|
19
|
+
// Detect single vs bundle by which key is present.
|
|
20
|
+
const isBundle = !!(body && typeof body === 'object' && 'artifacts' in body);
|
|
21
|
+
const isSingle = !!(body && typeof body === 'object' && 'artifact' in body);
|
|
22
|
+
if (!isBundle && !isSingle) {
|
|
23
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
24
|
+
res.end(JSON.stringify({ error: 'Body must contain `artifact` (single) or `artifacts` (bundle)' }));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (isBundle) {
|
|
28
|
+
const parsed = BundleBodySchema.safeParse(body);
|
|
29
|
+
if (!parsed.success) {
|
|
30
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
31
|
+
res.end(JSON.stringify({ error: 'Invalid bundle', issues: parsed.error.issues.slice(0, 3) }));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const artifacts = [];
|
|
35
|
+
for (let i = 0; i < parsed.data.artifacts.length; i += 1) {
|
|
36
|
+
const a = RunArtifactSchema.safeParse(parsed.data.artifacts[i]);
|
|
37
|
+
if (!a.success) {
|
|
38
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
39
|
+
res.end(JSON.stringify({
|
|
40
|
+
error: `Bundle item ${i} is not a valid RunArtifact`,
|
|
41
|
+
issues: a.error.issues.slice(0, 3),
|
|
42
|
+
}));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Use the raw input (not the Zod-stripped result) so non-schema
|
|
46
|
+
// top-level fields (`leader`, `cost`) survive into the enrich
|
|
47
|
+
// pass. Zod strips by default; the schema acts only as a gate.
|
|
48
|
+
artifacts.push(parsed.data.artifacts[i]);
|
|
49
|
+
}
|
|
50
|
+
const bundleId = `bundle_${randomUUID()}`;
|
|
51
|
+
const result = { runIds: [], alreadyExisted: [] };
|
|
52
|
+
for (const artifact of artifacts) {
|
|
53
|
+
const inserted = await insertOne(artifact, bundleId, deps);
|
|
54
|
+
result.runIds.push(inserted.runId);
|
|
55
|
+
result.alreadyExisted.push(inserted.alreadyExisted);
|
|
56
|
+
}
|
|
57
|
+
res.writeHead(201, { 'Content-Type': 'application/json' });
|
|
58
|
+
res.end(JSON.stringify({ bundleId, ...result }));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Single
|
|
62
|
+
const parsed = SingleBodySchema.safeParse(body);
|
|
63
|
+
if (!parsed.success) {
|
|
64
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
65
|
+
res.end(JSON.stringify({ error: 'Invalid artifact body', issues: parsed.error.issues.slice(0, 3) }));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const a = RunArtifactSchema.safeParse(parsed.data.artifact);
|
|
69
|
+
if (!a.success) {
|
|
70
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
71
|
+
res.end(JSON.stringify({
|
|
72
|
+
error: 'Not a valid RunArtifact',
|
|
73
|
+
issues: a.error.issues.slice(0, 3),
|
|
74
|
+
}));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Same Zod-strip avoidance as the bundle path: forward the raw input
|
|
78
|
+
// so `leader` / `cost` survive into enrichRunRecordFromArtifact.
|
|
79
|
+
const inserted = await insertOne(parsed.data.artifact, undefined, deps);
|
|
80
|
+
res.writeHead(201, { 'Content-Type': 'application/json' });
|
|
81
|
+
res.end(JSON.stringify(inserted));
|
|
82
|
+
}
|
|
83
|
+
async function insertOne(artifact, bundleId, deps) {
|
|
84
|
+
// The artifact's metadata.runId is the source of truth — preserves
|
|
85
|
+
// identity across re-imports so duplicate drops collapse to a single
|
|
86
|
+
// Library row.
|
|
87
|
+
const importedRunId = artifact.metadata.runId;
|
|
88
|
+
const existing = await deps.runHistoryStore.getRun(importedRunId);
|
|
89
|
+
if (existing) {
|
|
90
|
+
return { runId: importedRunId, alreadyExisted: true };
|
|
91
|
+
}
|
|
92
|
+
const baseInput = {
|
|
93
|
+
scenarioId: artifact.metadata.scenario.id,
|
|
94
|
+
scenarioVersion: artifact.metadata.scenario.version ?? '1.0.0',
|
|
95
|
+
actorConfigHash: hashActorConfig({
|
|
96
|
+
runId: importedRunId,
|
|
97
|
+
scenario: artifact.metadata.scenario,
|
|
98
|
+
}),
|
|
99
|
+
economicsProfile: 'imported',
|
|
100
|
+
sourceMode: deps.sourceMode,
|
|
101
|
+
createdBy: 'user',
|
|
102
|
+
};
|
|
103
|
+
if (bundleId)
|
|
104
|
+
baseInput.bundleId = bundleId;
|
|
105
|
+
// Build a record carrying the imported runId rather than a fresh
|
|
106
|
+
// randomUUID — the artifact's identity comes with it.
|
|
107
|
+
const base = {
|
|
108
|
+
...createRunRecord(baseInput),
|
|
109
|
+
runId: importedRunId,
|
|
110
|
+
};
|
|
111
|
+
const enriched = enrichRunRecordFromArtifact(base, artifact);
|
|
112
|
+
await deps.runHistoryStore.insertRun(enriched);
|
|
113
|
+
return { runId: importedRunId, alreadyExisted: false };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=library-import-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-import-route.js","sourceRoot":"","sources":["../../../src/cli/server/library-import-route.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,12 @@ export interface RunHistoryStore {
|
|
|
35
35
|
countRuns?(filters?: Pick<ListRunsFilters, 'mode' | 'sourceMode' | 'scenarioId' | 'actorConfigHash' | 'q'>): Promise<number>;
|
|
36
36
|
aggregateStats?(filters?: Pick<ListRunsFilters, 'mode' | 'sourceMode' | 'scenarioId' | 'actorConfigHash'>): Promise<RunsAggregate>;
|
|
37
37
|
recordReplayResult?(runId: string, matches: boolean): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Destructive: delete every row in the runs table. Used by the
|
|
40
|
+
* `/admin/data/wipe` endpoint and CLI `paracosm wipe-data` for
|
|
41
|
+
* one-shot cleanups. Returns the count of deleted rows.
|
|
42
|
+
*/
|
|
43
|
+
wipeAll?(): Promise<number>;
|
|
38
44
|
}
|
|
39
45
|
export declare function createNoopRunHistoryStore(): RunHistoryStore;
|
|
40
46
|
//# sourceMappingURL=run-history-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B;oDACgD;IAChD,IAAI,CAAC,EAAE,WAAW,GAAG,kBAAkB,GAAG,aAAa,CAAC;IACxD;;wEAEoE;IACpE,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACjD;;4EAEwE;IACxE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7H,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnI,kBAAkB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B;oDACgD;IAChD,IAAI,CAAC,EAAE,WAAW,GAAG,kBAAkB,GAAG,aAAa,CAAC;IACxD;;wEAEoE;IACpE,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACjD;;4EAEwE;IACxE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7H,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnI,kBAAkB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE;;;;OAIG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,IAAI,eAAe,CAa3D"}
|
|
@@ -9,6 +9,7 @@ export function createNoopRunHistoryStore() {
|
|
|
9
9
|
return { totalRuns: 0, totalCostUSD: 0, totalDurationMs: 0, replaysAttempted: 0, replaysMatched: 0 };
|
|
10
10
|
},
|
|
11
11
|
async recordReplayResult() { },
|
|
12
|
+
async wipeAll() { return 0; },
|
|
12
13
|
};
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=run-history-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-history-store.js","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-history-store.js","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"AAgDA,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,KAAK,CAAC,SAAS,KAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,cAAc;YAClB,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACvG,CAAC;QACD,KAAK,CAAC,kBAAkB,KAAI,CAAC;QAC7B,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL-backed implementation of {@link RunHistoryStore}, built on
|
|
3
|
+
* `@framers/sql-storage-adapter` so the same code works on SQLite,
|
|
4
|
+
* Postgres, sql.js, and IndexedDB without touching call sites. The
|
|
5
|
+
* default adapter is better-sqlite3 (or sql.js fallback when the
|
|
6
|
+
* native module isn't installable). Set `STORAGE_ADAPTER=postgres`
|
|
7
|
+
* with `DATABASE_URL` to switch backends; the resolver inside
|
|
8
|
+
* sql-storage-adapter handles the rest.
|
|
9
|
+
*
|
|
10
|
+
* Single `runs` table with composite per-filter indexes. Run records
|
|
11
|
+
* are tiny (~200 bytes); 100K rows fits in 20 MB. No retention cap;
|
|
12
|
+
* add `PARACOSM_RUN_HISTORY_MAX_ROWS` env var if traffic ever warrants it.
|
|
13
|
+
*
|
|
14
|
+
* @module paracosm/cli/server/sqlite-run-history-store
|
|
15
|
+
*/
|
|
16
|
+
import { type DatabaseOptions } from '@framers/sql-storage-adapter';
|
|
1
17
|
import type { RunHistoryStore } from './run-history-store.js';
|
|
2
18
|
export interface SqliteRunHistoryStoreOptions {
|
|
19
|
+
/**
|
|
20
|
+
* SQLite database path. Used when the resolver picks better-sqlite3
|
|
21
|
+
* or sql.js. Ignored when STORAGE_ADAPTER selects a remote backend
|
|
22
|
+
* such as Postgres (DATABASE_URL takes precedence there).
|
|
23
|
+
*/
|
|
3
24
|
dbPath: string;
|
|
25
|
+
/**
|
|
26
|
+
* Optional override forwarded to `createDatabase`. Tests use this to
|
|
27
|
+
* pin `type: 'memory'` for hermetic isolation; production code
|
|
28
|
+
* leaves it undefined and lets the env-driven resolver pick.
|
|
29
|
+
*/
|
|
30
|
+
databaseOptions?: DatabaseOptions;
|
|
4
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Build an SQL-backed run history store. Returns a sync handle whose
|
|
34
|
+
* methods are async; the underlying adapter is opened lazily on first
|
|
35
|
+
* call so this factory plugs into the existing sync `createMarsServer`
|
|
36
|
+
* boot path without forcing every caller to become async.
|
|
37
|
+
*/
|
|
5
38
|
export declare function createSqliteRunHistoryStore(options: SqliteRunHistoryStoreOptions): RunHistoryStore;
|
|
6
39
|
//# sourceMappingURL=sqlite-run-history-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/sqlite-run-history-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqlite-run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/sqlite-run-history-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAuC,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAIzG,OAAO,KAAK,EAAmB,eAAe,EAAiB,MAAM,wBAAwB,CAAC;AAE9F,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAuPD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,GAAG,eAAe,CA4GlG"}
|