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.
Files changed (74) hide show
  1. package/dist/src/engine/compiler/cache.d.ts +12 -0
  2. package/dist/src/engine/compiler/cache.d.ts.map +1 -1
  3. package/dist/src/engine/compiler/cache.js +13 -0
  4. package/dist/src/engine/compiler/cache.js.map +1 -1
  5. package/dist/src/engine/compiler/generate-director.d.ts +13 -2
  6. package/dist/src/engine/compiler/generate-director.d.ts.map +1 -1
  7. package/dist/src/engine/compiler/generate-director.js +52 -39
  8. package/dist/src/engine/compiler/generate-director.js.map +1 -1
  9. package/dist/src/engine/compiler/generate-fingerprint.d.ts +14 -4
  10. package/dist/src/engine/compiler/generate-fingerprint.d.ts.map +1 -1
  11. package/dist/src/engine/compiler/generate-fingerprint.js +46 -60
  12. package/dist/src/engine/compiler/generate-fingerprint.js.map +1 -1
  13. package/dist/src/engine/compiler/generate-milestones.d.ts +17 -2
  14. package/dist/src/engine/compiler/generate-milestones.d.ts.map +1 -1
  15. package/dist/src/engine/compiler/generate-milestones.js +73 -67
  16. package/dist/src/engine/compiler/generate-milestones.js.map +1 -1
  17. package/dist/src/engine/compiler/generate-politics.d.ts +16 -5
  18. package/dist/src/engine/compiler/generate-politics.d.ts.map +1 -1
  19. package/dist/src/engine/compiler/generate-politics.js +33 -57
  20. package/dist/src/engine/compiler/generate-politics.js.map +1 -1
  21. package/dist/src/engine/compiler/generate-progression.d.ts +16 -7
  22. package/dist/src/engine/compiler/generate-progression.d.ts.map +1 -1
  23. package/dist/src/engine/compiler/generate-progression.js +44 -66
  24. package/dist/src/engine/compiler/generate-progression.js.map +1 -1
  25. package/dist/src/engine/compiler/generate-prompts.d.ts +16 -5
  26. package/dist/src/engine/compiler/generate-prompts.d.ts.map +1 -1
  27. package/dist/src/engine/compiler/generate-prompts.js +49 -64
  28. package/dist/src/engine/compiler/generate-prompts.js.map +1 -1
  29. package/dist/src/engine/compiler/generate-reactions.d.ts +17 -6
  30. package/dist/src/engine/compiler/generate-reactions.d.ts.map +1 -1
  31. package/dist/src/engine/compiler/generate-reactions.js +42 -60
  32. package/dist/src/engine/compiler/generate-reactions.js.map +1 -1
  33. package/dist/src/engine/compiler/index.d.ts.map +1 -1
  34. package/dist/src/engine/compiler/index.js +24 -11
  35. package/dist/src/engine/compiler/index.js.map +1 -1
  36. package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.d.ts +44 -0
  37. package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.d.ts.map +1 -0
  38. package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.js +49 -0
  39. package/dist/src/engine/compiler/llm-invocations/generateValidatedCode.js.map +1 -0
  40. package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.d.ts +35 -0
  41. package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.d.ts.map +1 -0
  42. package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.js +93 -0
  43. package/dist/src/engine/compiler/llm-invocations/generateValidatedJson.js.map +1 -0
  44. package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.d.ts +52 -0
  45. package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.d.ts.map +1 -0
  46. package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.js +58 -0
  47. package/dist/src/engine/compiler/llm-invocations/generateValidatedObject.js.map +1 -0
  48. package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.d.ts +34 -0
  49. package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.d.ts.map +1 -0
  50. package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.js +42 -0
  51. package/dist/src/engine/compiler/llm-invocations/generateValidatedProse.js.map +1 -0
  52. package/dist/src/engine/compiler/schemas/index.d.ts +7 -0
  53. package/dist/src/engine/compiler/schemas/index.d.ts.map +1 -0
  54. package/dist/src/engine/compiler/schemas/index.js +7 -0
  55. package/dist/src/engine/compiler/schemas/index.js.map +1 -0
  56. package/dist/src/engine/compiler/schemas/milestones.d.ts +91 -0
  57. package/dist/src/engine/compiler/schemas/milestones.d.ts.map +1 -0
  58. package/dist/src/engine/compiler/schemas/milestones.js +53 -0
  59. package/dist/src/engine/compiler/schemas/milestones.js.map +1 -0
  60. package/dist/src/engine/compiler/telemetry.d.ts +36 -0
  61. package/dist/src/engine/compiler/telemetry.d.ts.map +1 -0
  62. package/dist/src/engine/compiler/telemetry.js +49 -0
  63. package/dist/src/engine/compiler/telemetry.js.map +1 -0
  64. package/dist/src/engine/compiler/types.d.ts +26 -2
  65. package/dist/src/engine/compiler/types.d.ts.map +1 -1
  66. package/dist/src/runtime/cost-tracker.d.ts +40 -0
  67. package/dist/src/runtime/cost-tracker.d.ts.map +1 -1
  68. package/dist/src/runtime/cost-tracker.js +32 -2
  69. package/dist/src/runtime/cost-tracker.js.map +1 -1
  70. package/dist/src/runtime/orchestrator.d.ts +1 -0
  71. package/dist/src/runtime/orchestrator.d.ts.map +1 -1
  72. package/dist/src/runtime/orchestrator.js +5 -0
  73. package/dist/src/runtime/orchestrator.js.map +1 -1
  74. 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,CAK1E;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"}
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 Crisis Director system instructions from scenario JSON via LLM.
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
- export declare function generateDirectorInstructions(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
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;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6BjD,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,UAAU,SAAI,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCjD"}
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
- * Generate Crisis Director system instructions from scenario JSON via LLM.
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 a Crisis Director agent in a simulation engine.
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
- CRISIS CATEGORIES: ${categories.join(', ')}
16
+ EVENT CATEGORIES: ${categories.join(', ')}
19
17
 
20
- Generate complete Crisis Director system instructions. The instructions must:
21
- 1. Explain the Director's role: observe ${labels.settlementNoun} state and generate crises
22
- 2. List rules for crisis generation (exactly 2-3 options per crisis, one must be risky, reference real science/domain knowledge, escalate from prior decisions, calibrate to ${labels.settlementNoun} state)
23
- 3. List ALL crisis categories with brief descriptions relevant to this scenario's domain
24
- 4. List ALL available departments by exact ID name (use ONLY the department IDs listed above)
25
- 5. Specify the JSON output format: {"title","crisis","options":[{"id","label","description","isRisky"}],"riskyOptionId","riskSuccessProbability","category","researchKeywords","relevantDepartments","turnSummary"}
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
- export async function generateDirectorInstructions(scenarioJson, generateText, maxRetries = 3) {
30
- let lastError = '';
31
- for (let attempt = 0; attempt < maxRetries; attempt++) {
32
- const retryHint = attempt > 0 ? `\n\nPrevious attempt failed: ${lastError}. Fix the issue.` : '';
33
- const text = await generateText(buildPrompt(scenarioJson) + retryHint);
34
- const cleaned = text.trim().replace(/^```(?:text)?\n?/i, '').replace(/\n?```$/i, '').trim();
35
- if (cleaned.length < 100) {
36
- lastError = 'Instructions too short';
37
- continue;
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
- hook: () => cleaned,
48
- source: cleaned,
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
- const fallback = `You are the Crisis Director for a ${scenarioJson.labels?.settlementNoun ?? 'settlement'} simulation. Generate crises with 2-3 options (one risky). Available departments: ${deptList}. Return JSON with title, crisis, options, riskyOptionId, riskSuccessProbability, category, researchKeywords, relevantDepartments, turnSummary.`;
54
- console.warn('[compiler] Director instructions generation failed. Using fallback.');
55
- return { hook: () => fallback, source: fallback };
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":"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"}
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 LLM.
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
- export declare function parseResponse(text: string): ((finalState: any, outcomeLog: any[], leader: any, toolRegs: Record<string, string[]>, maxTurns: number) => Record<string, string>) | null;
8
- export declare function generateFingerprintHook(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
9
- hook: (finalState: any, outcomeLog: any[], leader: any, toolRegs: Record<string, string[]>, maxTurns: number) => Record<string, string>;
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;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA+BjD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,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,GAAG,IAAI,CAYtL;AAED,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,UAAU,SAAI,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,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;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8CtK"}
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
- * Generate a fingerprint hook from scenario JSON via LLM.
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
- Generate a TypeScript arrow function that classifies a simulation timeline. The function receives:
15
- - finalState: { agents: array, colony: Record<string, number>, politics: Record<string, any>, metadata: { currentYear: number, startYear: number } }
16
- - outcomeLog: array of { turn: number, year: number, outcome: 'risky_success' | 'risky_failure' | 'conservative_success' | 'conservative_failure' }
17
- - leader: { name: string, archetype: string, hexaco: Record<string, number> }
18
- - toolRegs: Record<string, string[]> (department -> tool names)
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
- Return an object with string values for 5-7 classification dimensions relevant to this scenario domain, plus a "summary" key joining them with " · ".
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. Use scenario-relevant classification names (not Mars-specific ones)
25
- 2. Each dimension should have 2-3 possible values (e.g., "resilient" | "brittle" | "antifragile")
26
- 3. Base classifications on final state data, outcome patterns, and leader personality
27
- 4. Always include a "summary" key that joins all dimension values with " · "
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
- if (typeof fn === 'function')
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
- export async function generateFingerprintHook(scenarioJson, generateText, maxRetries = 3) {
49
- let lastError = '';
50
- for (let attempt = 0; attempt < maxRetries; attempt++) {
51
- const retryHint = attempt > 0 ? `\n\nPrevious attempt failed: ${lastError}. Fix the issue.` : '';
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
- // Fallback: generic fingerprint
72
- console.warn('[compiler] Fingerprint hook generation failed. Using fallback.');
73
- const fallback = (finalState, outcomeLog, leader, toolRegs, maxTurns) => {
74
- const riskyWins = outcomeLog.filter(o => o.outcome === 'risky_success').length;
75
- const riskyLosses = outcomeLog.filter(o => o.outcome === 'risky_failure').length;
76
- const conservativeWins = outcomeLog.filter(o => o.outcome === 'conservative_success').length;
77
- const totalTools = Object.values(toolRegs).flat().length;
78
- const riskProfile = riskyWins + riskyLosses > conservativeWins ? 'expansionist' : 'conservative';
79
- const innovation = totalTools > maxTurns * 2 ? 'innovative' : totalTools > maxTurns ? 'adaptive' : 'conventional';
80
- const leadership = leader.hexaco?.extraversion > 0.7 ? 'charismatic' : leader.hexaco?.conscientiousness > 0.7 ? 'methodical' : 'collaborative';
81
- const summary = `${riskProfile} · ${innovation} · ${leadership}`;
82
- return { riskProfile, innovation, leadership, summary };
83
- };
84
- return { hook: fallback, source: '// Fallback fingerprint' };
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":"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"}
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 crises (turn 1 founding + final turn assessment) from scenario JSON via LLM.
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 declare function generateMilestones(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
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;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuCjD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAa3F;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,UAAU,SAAI,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoEjG"}
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"}