paracosm 0.4.225 → 0.4.229
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/src/engine/compiler/cache.d.ts +12 -0
- package/dist/src/engine/compiler/cache.d.ts.map +1 -1
- package/dist/src/engine/compiler/cache.js +13 -0
- package/dist/src/engine/compiler/cache.js.map +1 -1
- package/dist/src/engine/compiler/generate-director.d.ts +13 -2
- package/dist/src/engine/compiler/generate-director.d.ts.map +1 -1
- package/dist/src/engine/compiler/generate-director.js +52 -39
- package/dist/src/engine/compiler/generate-director.js.map +1 -1
- package/dist/src/engine/compiler/generate-fingerprint.d.ts +14 -4
- package/dist/src/engine/compiler/generate-fingerprint.d.ts.map +1 -1
- package/dist/src/engine/compiler/generate-fingerprint.js +46 -60
- package/dist/src/engine/compiler/generate-fingerprint.js.map +1 -1
- package/dist/src/engine/compiler/generate-milestones.d.ts +17 -2
- package/dist/src/engine/compiler/generate-milestones.d.ts.map +1 -1
- package/dist/src/engine/compiler/generate-milestones.js +73 -67
- package/dist/src/engine/compiler/generate-milestones.js.map +1 -1
- package/dist/src/engine/compiler/generate-politics.d.ts +16 -5
- package/dist/src/engine/compiler/generate-politics.d.ts.map +1 -1
- package/dist/src/engine/compiler/generate-politics.js +33 -57
- package/dist/src/engine/compiler/generate-politics.js.map +1 -1
- package/dist/src/engine/compiler/generate-progression.d.ts +16 -7
- package/dist/src/engine/compiler/generate-progression.d.ts.map +1 -1
- package/dist/src/engine/compiler/generate-progression.js +44 -66
- package/dist/src/engine/compiler/generate-progression.js.map +1 -1
- package/dist/src/engine/compiler/generate-prompts.d.ts +16 -5
- package/dist/src/engine/compiler/generate-prompts.d.ts.map +1 -1
- package/dist/src/engine/compiler/generate-prompts.js +49 -64
- package/dist/src/engine/compiler/generate-prompts.js.map +1 -1
- package/dist/src/engine/compiler/generate-reactions.d.ts +17 -6
- package/dist/src/engine/compiler/generate-reactions.d.ts.map +1 -1
- package/dist/src/engine/compiler/generate-reactions.js +42 -60
- package/dist/src/engine/compiler/generate-reactions.js.map +1 -1
- package/dist/src/engine/compiler/index.d.ts.map +1 -1
- package/dist/src/engine/compiler/index.js +24 -11
- package/dist/src/engine/compiler/index.js.map +1 -1
- package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.d.ts +44 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.d.ts.map +1 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.js +49 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.js.map +1 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.d.ts +35 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.d.ts.map +1 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.js +93 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.js.map +1 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.d.ts +52 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.d.ts.map +1 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.js +58 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.js.map +1 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.d.ts +34 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.d.ts.map +1 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.js +42 -0
- package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.js.map +1 -0
- package/dist/src/engine/compiler/schemas/index.d.ts +7 -0
- package/dist/src/engine/compiler/schemas/index.d.ts.map +1 -0
- package/dist/src/engine/compiler/schemas/index.js +7 -0
- package/dist/src/engine/compiler/schemas/index.js.map +1 -0
- package/dist/src/engine/compiler/schemas/milestones.d.ts +91 -0
- package/dist/src/engine/compiler/schemas/milestones.d.ts.map +1 -0
- package/dist/src/engine/compiler/schemas/milestones.js +53 -0
- package/dist/src/engine/compiler/schemas/milestones.js.map +1 -0
- package/dist/src/engine/compiler/telemetry.d.ts +36 -0
- package/dist/src/engine/compiler/telemetry.d.ts.map +1 -0
- package/dist/src/engine/compiler/telemetry.js +49 -0
- package/dist/src/engine/compiler/telemetry.js.map +1 -0
- package/dist/src/engine/compiler/types.d.ts +26 -2
- package/dist/src/engine/compiler/types.d.ts.map +1 -1
- package/dist/src/runtime/cost-tracker.d.ts +40 -0
- package/dist/src/runtime/cost-tracker.d.ts.map +1 -1
- package/dist/src/runtime/cost-tracker.js +32 -2
- package/dist/src/runtime/cost-tracker.js.map +1 -1
- package/dist/src/runtime/orchestrator.d.ts +1 -0
- package/dist/src/runtime/orchestrator.d.ts.map +1 -1
- package/dist/src/runtime/orchestrator.js +5 -0
- package/dist/src/runtime/orchestrator.js.map +1 -1
- package/package.json +2 -2
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
* Stores generated hook source alongside a manifest tracking
|
|
4
4
|
* the scenario hash, model used, and generation timestamp.
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Bump this to invalidate all cached hook sources globally after a
|
|
8
|
+
* prompt-format change. The hash folded into {@link hashScenario} so
|
|
9
|
+
* a bump forces every scenario to recompile its hooks on next use.
|
|
10
|
+
*
|
|
11
|
+
* Version history:
|
|
12
|
+
* - v1: initial format
|
|
13
|
+
* - v2 (2026-04-18): milestones prompt switched from [founding, legacy]
|
|
14
|
+
* array shape to { founding, legacy } object shape for OpenAI
|
|
15
|
+
* response_format:json_object compatibility.
|
|
16
|
+
*/
|
|
17
|
+
export declare const COMPILE_SCHEMA_VERSION = 2;
|
|
6
18
|
/** SHA-256 hash of the scenario JSON, used for cache invalidation. */
|
|
7
19
|
export declare function hashScenario(scenarioJson: Record<string, unknown>): string;
|
|
8
20
|
/** Read a cached hook result. Returns null on cache miss. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAM1E;AAOD,6DAA6D;AAC7D,wBAAgB,SAAS,CACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,SAAoB,GAC1B,MAAM,GAAG,IAAI,CAqBf;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,aAAa,EAAE,MAAM,EACrB,OAAO,SAAoB,GAC1B,OAAO,GAAG,IAAI,CAWhB;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,OAAO,EACf,OAAO,SAAoB,GAC1B,IAAI,CAUN;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQ9H;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CACxB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,SAAoB,GAC1B,IAAI,CA0BN"}
|
|
@@ -7,10 +7,23 @@ import { createHash } from 'node:crypto';
|
|
|
7
7
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
const DEFAULT_CACHE_DIR = '.paracosm/cache';
|
|
10
|
+
/**
|
|
11
|
+
* Bump this to invalidate all cached hook sources globally after a
|
|
12
|
+
* prompt-format change. The hash folded into {@link hashScenario} so
|
|
13
|
+
* a bump forces every scenario to recompile its hooks on next use.
|
|
14
|
+
*
|
|
15
|
+
* Version history:
|
|
16
|
+
* - v1: initial format
|
|
17
|
+
* - v2 (2026-04-18): milestones prompt switched from [founding, legacy]
|
|
18
|
+
* array shape to { founding, legacy } object shape for OpenAI
|
|
19
|
+
* response_format:json_object compatibility.
|
|
20
|
+
*/
|
|
21
|
+
export const COMPILE_SCHEMA_VERSION = 2;
|
|
10
22
|
/** SHA-256 hash of the scenario JSON, used for cache invalidation. */
|
|
11
23
|
export function hashScenario(scenarioJson) {
|
|
12
24
|
return createHash('sha256')
|
|
13
25
|
.update(JSON.stringify(scenarioJson, null, 0))
|
|
26
|
+
.update(`|v${COMPILE_SCHEMA_VERSION}`)
|
|
14
27
|
.digest('hex')
|
|
15
28
|
.slice(0, 16);
|
|
16
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/engine/compiler/cache.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/engine/compiler/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generate
|
|
2
|
+
* Generate Event Director system instructions via generateValidatedProse.
|
|
3
|
+
* The director is the agent that emits per-turn events grounded in
|
|
4
|
+
* current sim state; this hook produces the scenario-specific system
|
|
5
|
+
* prompt the director agent runs under.
|
|
6
|
+
*
|
|
7
|
+
* @module paracosm/engine/compiler/generate-director
|
|
3
8
|
*/
|
|
4
9
|
import type { GenerateTextFn } from './types.js';
|
|
5
|
-
|
|
10
|
+
import type { CompilerTelemetry } from './telemetry.js';
|
|
11
|
+
export interface GenerateDirectorOptions {
|
|
12
|
+
telemetry?: CompilerTelemetry;
|
|
13
|
+
}
|
|
14
|
+
export declare function generateDirectorInstructions(scenarioJson: Record<string, any>, generateText: GenerateTextFn, options?: GenerateDirectorOptions): Promise<{
|
|
6
15
|
hook: () => string;
|
|
7
16
|
source: string;
|
|
17
|
+
attempts: number;
|
|
18
|
+
fromFallback: boolean;
|
|
8
19
|
}>;
|
|
9
20
|
//# sourceMappingURL=generate-director.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-director.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-director.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generate-director.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-director.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAyDxD,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAgB1F"}
|
|
@@ -1,57 +1,70 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
function buildPrompt(scenarioJson) {
|
|
1
|
+
import { generateValidatedProse } from './llm-invocations/generateValidatedProse.js';
|
|
2
|
+
function buildSystemBlock(scenarioJson) {
|
|
5
3
|
const labels = scenarioJson.labels ?? {};
|
|
6
4
|
const depts = (scenarioJson.departments ?? []).map((d) => `- ${d.id}: ${d.label} (${d.role})`).join('\n');
|
|
7
5
|
const effects = scenarioJson.effects ?? {};
|
|
8
6
|
const categories = typeof effects === 'object' && !Array.isArray(effects)
|
|
9
7
|
? Object.keys(effects)
|
|
10
8
|
: effects.flatMap?.((e) => Object.keys(e.categoryDefaults ?? {})) ?? [];
|
|
11
|
-
return `You are generating system instructions for
|
|
9
|
+
return `You are generating system instructions for an Event Director agent in a simulation engine.
|
|
12
10
|
|
|
13
11
|
SCENARIO: ${labels.name ?? 'Unknown'}
|
|
14
12
|
SETTLEMENT TYPE: ${labels.settlementNoun ?? 'settlement'}
|
|
15
13
|
POPULATION NOUN: ${labels.populationNoun ?? 'members'}
|
|
16
14
|
DEPARTMENTS:
|
|
17
15
|
${depts}
|
|
18
|
-
|
|
16
|
+
EVENT CATEGORIES: ${categories.join(', ')}
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
1. Explain the Director's role: observe ${labels.settlementNoun} state and generate
|
|
22
|
-
2. List rules
|
|
23
|
-
3. List ALL
|
|
24
|
-
4. List ALL available departments by exact ID
|
|
25
|
-
5. Specify the JSON output format: {"title","
|
|
26
|
-
|
|
27
|
-
Return ONLY the instructions text. No markdown fences. No code. Just the system prompt text the Director agent will receive.`;
|
|
18
|
+
The instructions you produce must:
|
|
19
|
+
1. Explain the Director's role: observe ${labels.settlementNoun} state and generate events each turn
|
|
20
|
+
2. List rules (2-3 options per event, one risky; reference real science; escalate from prior decisions; calibrate to ${labels.settlementNoun} state)
|
|
21
|
+
3. List ALL event categories with brief descriptions relevant to this scenario
|
|
22
|
+
4. List ALL available departments by exact ID (use ONLY the department IDs listed above)
|
|
23
|
+
5. Specify the JSON output format: {"title","description","options":[{"id","label","description","isRisky"}],"riskyOptionId","riskSuccessProbability","category","researchKeywords","relevantDepartments","turnSummary"}`;
|
|
28
24
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// Verify it mentions at least some departments
|
|
40
|
-
const deptIds = (scenarioJson.departments ?? []).map((d) => d.id);
|
|
41
|
-
const mentioned = deptIds.filter((id) => cleaned.toLowerCase().includes(id.toLowerCase()));
|
|
42
|
-
if (mentioned.length < Math.min(2, deptIds.length)) {
|
|
43
|
-
lastError = `Only mentions ${mentioned.length} of ${deptIds.length} departments`;
|
|
44
|
-
continue;
|
|
25
|
+
const userPrompt = 'Return ONLY the instructions text. No markdown fences. No code. Just the system prompt text the Director agent will receive.';
|
|
26
|
+
function buildValidator(scenarioJson) {
|
|
27
|
+
const deptIds = (scenarioJson.departments ?? []).map((d) => d.id);
|
|
28
|
+
const minMentions = Math.min(2, deptIds.length);
|
|
29
|
+
return (text) => {
|
|
30
|
+
if (text.length < 200)
|
|
31
|
+
return { ok: false, reason: `instructions too short (${text.length} chars, need >= 200)` };
|
|
32
|
+
const mentioned = deptIds.filter((id) => text.toLowerCase().includes(id.toLowerCase()));
|
|
33
|
+
if (mentioned.length < minMentions) {
|
|
34
|
+
return { ok: false, reason: `instructions mention only ${mentioned.length} of ${deptIds.length} department IDs (need >= ${minMentions})` };
|
|
45
35
|
}
|
|
46
|
-
return {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
// Fallback: generic instructions
|
|
36
|
+
return { ok: true };
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function buildFallback(scenarioJson) {
|
|
40
|
+
const labels = scenarioJson.labels ?? {};
|
|
52
41
|
const deptList = (scenarioJson.departments ?? []).map((d) => d.id).join(', ');
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
42
|
+
return `You are the Event Director for a ${labels.settlementNoun ?? 'settlement'} simulation. Your role: observe the state of the ${labels.settlementNoun ?? 'settlement'} each turn and generate one event.
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
1. Each event must have 2-3 options; one MUST be isRisky=true.
|
|
46
|
+
2. Ground descriptions in real science and domain references.
|
|
47
|
+
3. Escalate from prior turn outcomes. Do not repeat event categories consecutively.
|
|
48
|
+
4. Calibrate difficulty to current state (resources, morale, population).
|
|
49
|
+
5. Identify relevantDepartments from this fixed list: ${deptList}.
|
|
50
|
+
|
|
51
|
+
Return JSON with fields: title, description, options[{id,label,description,isRisky}], riskyOptionId, riskSuccessProbability (0.3-0.8), category, researchKeywords, relevantDepartments, turnSummary.`;
|
|
52
|
+
}
|
|
53
|
+
export async function generateDirectorInstructions(scenarioJson, generateText, options = {}) {
|
|
54
|
+
const result = await generateValidatedProse({
|
|
55
|
+
hookName: 'director',
|
|
56
|
+
systemCacheable: buildSystemBlock(scenarioJson),
|
|
57
|
+
prompt: userPrompt,
|
|
58
|
+
validate: buildValidator(scenarioJson),
|
|
59
|
+
fallback: buildFallback(scenarioJson),
|
|
60
|
+
generateText,
|
|
61
|
+
telemetry: options.telemetry,
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
hook: () => result.text,
|
|
65
|
+
source: result.text,
|
|
66
|
+
attempts: result.attempts,
|
|
67
|
+
fromFallback: result.fromFallback,
|
|
68
|
+
};
|
|
56
69
|
}
|
|
57
70
|
//# sourceMappingURL=generate-director.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-director.js","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-director.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-director.js","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-director.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generate a fingerprint hook from scenario JSON via
|
|
2
|
+
* Generate a fingerprint hook from scenario JSON via generateValidatedCode.
|
|
3
3
|
* The fingerprint classifies the final simulation timeline into
|
|
4
4
|
* scenario-relevant categories (resilience, governance style, etc.).
|
|
5
|
+
*
|
|
6
|
+
* @module paracosm/engine/compiler/generate-fingerprint
|
|
5
7
|
*/
|
|
6
8
|
import type { GenerateTextFn } from './types.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
import type { CompilerTelemetry } from './telemetry.js';
|
|
10
|
+
type FingerprintFn = (finalState: any, outcomeLog: any[], leader: any, toolRegs: Record<string, string[]>, maxTurns: number) => Record<string, string>;
|
|
11
|
+
export declare function parseResponse(text: string): FingerprintFn | null;
|
|
12
|
+
export interface GenerateFingerprintOptions {
|
|
13
|
+
telemetry?: CompilerTelemetry;
|
|
14
|
+
}
|
|
15
|
+
export declare function generateFingerprintHook(scenarioJson: Record<string, any>, generateText: GenerateTextFn, options?: GenerateFingerprintOptions): Promise<{
|
|
16
|
+
hook: FingerprintFn;
|
|
10
17
|
source: string;
|
|
18
|
+
attempts: number;
|
|
19
|
+
fromFallback: boolean;
|
|
11
20
|
}>;
|
|
21
|
+
export {};
|
|
12
22
|
//# sourceMappingURL=generate-fingerprint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-fingerprint.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-fingerprint.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generate-fingerprint.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,KAAK,aAAa,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AA8BvJ,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUhE;AA2BD,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAa3F"}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* The fingerprint classifies the final simulation timeline into
|
|
4
|
-
* scenario-relevant categories (resilience, governance style, etc.).
|
|
5
|
-
*/
|
|
6
|
-
function buildPrompt(scenarioJson) {
|
|
1
|
+
import { generateValidatedCode } from './llm-invocations/generateValidatedCode.js';
|
|
2
|
+
function buildSystemBlock(scenarioJson) {
|
|
7
3
|
const labels = scenarioJson.labels ?? {};
|
|
8
4
|
const depts = (scenarioJson.departments ?? []).map((d) => d.id).join(', ');
|
|
9
5
|
return `You are generating a timeline fingerprint hook for a simulation engine.
|
|
@@ -11,76 +7,66 @@ function buildPrompt(scenarioJson) {
|
|
|
11
7
|
SCENARIO: ${labels.name ?? 'Unknown'} — ${labels.settlementNoun ?? 'settlement'} simulation
|
|
12
8
|
DEPARTMENTS: ${depts}
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
10
|
+
Function signature: (finalState, outcomeLog, leader, toolRegs, maxTurns) => Record<string, string>
|
|
11
|
+
|
|
12
|
+
Inputs:
|
|
13
|
+
- finalState: { agents, colony, politics, metadata: { currentYear, startYear } }
|
|
14
|
+
- outcomeLog: [{ turn, year, outcome: 'risky_success' | 'risky_failure' | 'conservative_success' | 'conservative_failure' }]
|
|
15
|
+
- leader: { name, archetype, hexaco }
|
|
16
|
+
- toolRegs: Record<dept, string[]> (department -> tool names)
|
|
19
17
|
- maxTurns: number
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
Output: object with 5-7 classification dimensions (each 2-3 possible values e.g. "resilient" | "brittle") PLUS a "summary" key joining them with " · ".
|
|
22
20
|
|
|
23
21
|
Rules:
|
|
24
|
-
1.
|
|
25
|
-
2.
|
|
26
|
-
3.
|
|
27
|
-
4.
|
|
28
|
-
5. Do NOT use external imports
|
|
29
|
-
6. Return the function as a TypeScript arrow function
|
|
30
|
-
|
|
31
|
-
Return ONLY the function, no markdown fences, no explanation.`;
|
|
22
|
+
1. Scenario-relevant classification names (not Mars-specific)
|
|
23
|
+
2. Base classifications on final state, outcome patterns, leader personality
|
|
24
|
+
3. Always include "summary"
|
|
25
|
+
4. NO external imports`;
|
|
32
26
|
}
|
|
27
|
+
const userPrompt = 'Return ONLY the arrow function. No markdown fences.';
|
|
33
28
|
export function parseResponse(text) {
|
|
34
29
|
let cleaned = text.trim();
|
|
35
|
-
cleaned = cleaned.replace(/^```(?:typescript|ts)?\n?/i, '').replace(/\n?```$/i, '').trim();
|
|
30
|
+
cleaned = cleaned.replace(/^```(?:typescript|ts|javascript|js)?\n?/i, '').replace(/\n?```$/i, '').trim();
|
|
36
31
|
if (cleaned.endsWith(';'))
|
|
37
32
|
cleaned = cleaned.slice(0, -1).trim();
|
|
38
33
|
try {
|
|
39
34
|
const fn = new Function('return ' + cleaned)();
|
|
40
|
-
|
|
41
|
-
return fn;
|
|
42
|
-
return null;
|
|
35
|
+
return typeof fn === 'function' ? fn : null;
|
|
43
36
|
}
|
|
44
37
|
catch {
|
|
45
38
|
return null;
|
|
46
39
|
}
|
|
47
40
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const text = await generateText(buildPrompt(scenarioJson) + retryHint);
|
|
53
|
-
const fn = parseResponse(text);
|
|
54
|
-
if (!fn) {
|
|
55
|
-
lastError = 'Could not parse response into a function';
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
// Quick smoke test
|
|
59
|
-
try {
|
|
60
|
-
const result = fn({ agents: [], colony: { morale: 0.6, population: 80 }, politics: { earthDependencyPct: 50 }, metadata: { currentYear: 2070, startYear: 2035 } }, [{ turn: 1, year: 2035, outcome: 'conservative_success' }], { name: 'Test', archetype: 'test', hexaco: { openness: 0.5, conscientiousness: 0.5, extraversion: 0.5, agreeableness: 0.5, emotionality: 0.5, honestyHumility: 0.5 } }, { engineering: ['tool1'] }, 8);
|
|
61
|
-
if (typeof result !== 'object' || !result.summary) {
|
|
62
|
-
lastError = 'Fingerprint must return object with summary key';
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
return { hook: fn, source: text.trim() };
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
lastError = String(err);
|
|
69
|
-
}
|
|
41
|
+
function smokeTest(fn) {
|
|
42
|
+
const result = fn({ agents: [], colony: { morale: 0.6, population: 80 }, politics: { earthDependencyPct: 50 }, metadata: { currentYear: 2070, startYear: 2035 } }, [{ turn: 1, year: 2035, outcome: 'conservative_success' }], { name: 'Test', archetype: 'test', hexaco: { openness: 0.5, conscientiousness: 0.5, extraversion: 0.5, agreeableness: 0.5, emotionality: 0.5, honestyHumility: 0.5 } }, { engineering: ['tool1'] }, 8);
|
|
43
|
+
if (typeof result !== 'object' || !result.summary) {
|
|
44
|
+
throw new Error('Fingerprint must return object with summary key');
|
|
70
45
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
46
|
+
}
|
|
47
|
+
const fallback = (_fs, outcomeLog, leader, toolRegs, maxTurns) => {
|
|
48
|
+
const riskyWins = outcomeLog.filter(o => o.outcome === 'risky_success').length;
|
|
49
|
+
const riskyLosses = outcomeLog.filter(o => o.outcome === 'risky_failure').length;
|
|
50
|
+
const conservativeWins = outcomeLog.filter(o => o.outcome === 'conservative_success').length;
|
|
51
|
+
const totalTools = Object.values(toolRegs).flat().length;
|
|
52
|
+
const riskProfile = riskyWins + riskyLosses > conservativeWins ? 'expansionist' : 'conservative';
|
|
53
|
+
const innovation = totalTools > maxTurns * 2 ? 'innovative' : totalTools > maxTurns ? 'adaptive' : 'conventional';
|
|
54
|
+
const leadership = leader.hexaco?.extraversion > 0.7 ? 'charismatic' : leader.hexaco?.conscientiousness > 0.7 ? 'methodical' : 'collaborative';
|
|
55
|
+
const summary = `${riskProfile} · ${innovation} · ${leadership}`;
|
|
56
|
+
return { riskProfile, innovation, leadership, summary };
|
|
57
|
+
};
|
|
58
|
+
export async function generateFingerprintHook(scenarioJson, generateText, options = {}) {
|
|
59
|
+
const result = await generateValidatedCode({
|
|
60
|
+
hookName: 'fingerprint',
|
|
61
|
+
systemCacheable: buildSystemBlock(scenarioJson),
|
|
62
|
+
prompt: userPrompt,
|
|
63
|
+
parse: parseResponse,
|
|
64
|
+
smokeTest,
|
|
65
|
+
fallback,
|
|
66
|
+
fallbackSource: '// Fallback fingerprint',
|
|
67
|
+
generateText,
|
|
68
|
+
telemetry: options.telemetry,
|
|
69
|
+
});
|
|
70
|
+
return { hook: result.hook, source: result.source, attempts: result.attempts, fromFallback: result.fromFallback };
|
|
85
71
|
}
|
|
86
72
|
//# sourceMappingURL=generate-fingerprint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-fingerprint.js","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-fingerprint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-fingerprint.js","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-fingerprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generate milestone
|
|
2
|
+
* Generate milestone events (turn 1 founding + final turn legacy) from
|
|
3
|
+
* scenario JSON via Zod-validated LLM call.
|
|
4
|
+
*
|
|
5
|
+
* @module paracosm/engine/compiler/generate-milestones
|
|
3
6
|
*/
|
|
4
7
|
import type { MilestoneEventDef } from '../types.js';
|
|
5
8
|
import type { GenerateTextFn } from './types.js';
|
|
9
|
+
import type { CompilerTelemetry } from './telemetry.js';
|
|
10
|
+
/**
|
|
11
|
+
* Parse a cached milestones source back into the two milestones.
|
|
12
|
+
* Accepts both the v2 object shape `{ founding, legacy }` and the legacy
|
|
13
|
+
* v1 array shape `[founding, legacy]` so old cache entries don't break
|
|
14
|
+
* after the format migration.
|
|
15
|
+
*/
|
|
6
16
|
export declare function parseMilestones(text: string): [MilestoneEventDef, MilestoneEventDef] | null;
|
|
7
|
-
export
|
|
17
|
+
export interface GenerateMilestonesOptions {
|
|
18
|
+
telemetry?: CompilerTelemetry;
|
|
19
|
+
}
|
|
20
|
+
export declare function generateMilestones(scenarioJson: Record<string, any>, generateText: GenerateTextFn, options?: GenerateMilestonesOptions): Promise<{
|
|
8
21
|
hook: (turn: number, maxTurns: number) => MilestoneEventDef | null;
|
|
9
22
|
source: string;
|
|
23
|
+
attempts: number;
|
|
24
|
+
fromFallback: boolean;
|
|
10
25
|
}>;
|
|
11
26
|
//# sourceMappingURL=generate-milestones.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-milestones.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-milestones.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generate-milestones.d.ts","sourceRoot":"","sources":["../../../../src/engine/compiler/generate-milestones.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAsFxD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAe3F;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAsB1I"}
|