paracosm 0.0.1 → 0.2.0

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 (273) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +224 -0
  3. package/dist/cli/sim-config.d.ts +100 -0
  4. package/dist/cli/sim-config.d.ts.map +1 -0
  5. package/dist/cli/sim-config.js +124 -0
  6. package/dist/cli/sim-config.js.map +1 -0
  7. package/dist/cli/types.d.ts +73 -0
  8. package/dist/cli/types.d.ts.map +1 -0
  9. package/dist/cli/types.js +2 -0
  10. package/dist/cli/types.js.map +1 -0
  11. package/dist/engine/_template/index.d.ts +9 -0
  12. package/dist/engine/_template/index.d.ts.map +1 -0
  13. package/dist/engine/_template/index.js +91 -0
  14. package/dist/engine/_template/index.js.map +1 -0
  15. package/dist/engine/compiler/cache.d.ts +12 -0
  16. package/dist/engine/compiler/cache.d.ts.map +1 -0
  17. package/dist/engine/compiler/cache.js +75 -0
  18. package/dist/engine/compiler/cache.js.map +1 -0
  19. package/dist/engine/compiler/generate-director.d.ts +9 -0
  20. package/dist/engine/compiler/generate-director.d.ts.map +1 -0
  21. package/dist/engine/compiler/generate-director.js +57 -0
  22. package/dist/engine/compiler/generate-director.js.map +1 -0
  23. package/dist/engine/compiler/generate-fingerprint.d.ts +12 -0
  24. package/dist/engine/compiler/generate-fingerprint.d.ts.map +1 -0
  25. package/dist/engine/compiler/generate-fingerprint.js +86 -0
  26. package/dist/engine/compiler/generate-fingerprint.js.map +1 -0
  27. package/dist/engine/compiler/generate-milestones.d.ts +11 -0
  28. package/dist/engine/compiler/generate-milestones.d.ts.map +1 -0
  29. package/dist/engine/compiler/generate-milestones.js +121 -0
  30. package/dist/engine/compiler/generate-milestones.js.map +1 -0
  31. package/dist/engine/compiler/generate-politics.d.ts +11 -0
  32. package/dist/engine/compiler/generate-politics.d.ts.map +1 -0
  33. package/dist/engine/compiler/generate-politics.js +85 -0
  34. package/dist/engine/compiler/generate-politics.js.map +1 -0
  35. package/dist/engine/compiler/generate-progression.d.ts +15 -0
  36. package/dist/engine/compiler/generate-progression.d.ts.map +1 -0
  37. package/dist/engine/compiler/generate-progression.js +104 -0
  38. package/dist/engine/compiler/generate-progression.js.map +1 -0
  39. package/dist/engine/compiler/generate-prompts.d.ts +11 -0
  40. package/dist/engine/compiler/generate-prompts.d.ts.map +1 -0
  41. package/dist/engine/compiler/generate-prompts.js +90 -0
  42. package/dist/engine/compiler/generate-prompts.js.map +1 -0
  43. package/dist/engine/compiler/generate-reactions.d.ts +12 -0
  44. package/dist/engine/compiler/generate-reactions.d.ts.map +1 -0
  45. package/dist/engine/compiler/generate-reactions.js +90 -0
  46. package/dist/engine/compiler/generate-reactions.js.map +1 -0
  47. package/dist/engine/compiler/index.d.ts +34 -0
  48. package/dist/engine/compiler/index.d.ts.map +1 -0
  49. package/dist/engine/compiler/index.js +270 -0
  50. package/dist/engine/compiler/index.js.map +1 -0
  51. package/dist/engine/compiler/seed-ingestion.d.ts +40 -0
  52. package/dist/engine/compiler/seed-ingestion.d.ts.map +1 -0
  53. package/dist/engine/compiler/seed-ingestion.js +232 -0
  54. package/dist/engine/compiler/seed-ingestion.js.map +1 -0
  55. package/dist/engine/compiler/types.d.ts +30 -0
  56. package/dist/engine/compiler/types.d.ts.map +1 -0
  57. package/dist/engine/compiler/types.js +5 -0
  58. package/dist/engine/compiler/types.js.map +1 -0
  59. package/dist/engine/compiler/validate.d.ts +37 -0
  60. package/dist/engine/compiler/validate.d.ts.map +1 -0
  61. package/dist/engine/compiler/validate.js +141 -0
  62. package/dist/engine/compiler/validate.js.map +1 -0
  63. package/dist/engine/core/agent-generator.d.ts +11 -0
  64. package/dist/engine/core/agent-generator.d.ts.map +1 -0
  65. package/dist/engine/core/agent-generator.js +85 -0
  66. package/dist/engine/core/agent-generator.js.map +1 -0
  67. package/dist/engine/core/kernel.d.ts +69 -0
  68. package/dist/engine/core/kernel.d.ts.map +1 -0
  69. package/dist/engine/core/kernel.js +223 -0
  70. package/dist/engine/core/kernel.js.map +1 -0
  71. package/dist/engine/core/progression.d.ts +38 -0
  72. package/dist/engine/core/progression.d.ts.map +1 -0
  73. package/dist/engine/core/progression.js +292 -0
  74. package/dist/engine/core/progression.js.map +1 -0
  75. package/dist/engine/core/rng.d.ts +19 -0
  76. package/dist/engine/core/rng.d.ts.map +1 -0
  77. package/dist/engine/core/rng.js +34 -0
  78. package/dist/engine/core/rng.js.map +1 -0
  79. package/dist/engine/core/state.d.ts +144 -0
  80. package/dist/engine/core/state.d.ts.map +1 -0
  81. package/dist/engine/core/state.js +5 -0
  82. package/dist/engine/core/state.js.map +1 -0
  83. package/dist/engine/effect-registry.d.ts +14 -0
  84. package/dist/engine/effect-registry.d.ts.map +1 -0
  85. package/dist/engine/effect-registry.js +28 -0
  86. package/dist/engine/effect-registry.js.map +1 -0
  87. package/dist/engine/event-taxonomy.d.ts +9 -0
  88. package/dist/engine/event-taxonomy.d.ts.map +1 -0
  89. package/dist/engine/event-taxonomy.js +13 -0
  90. package/dist/engine/event-taxonomy.js.map +1 -0
  91. package/dist/engine/index.d.ts +25 -0
  92. package/dist/engine/index.d.ts.map +1 -0
  93. package/dist/engine/index.js +19 -0
  94. package/dist/engine/index.js.map +1 -0
  95. package/dist/engine/lunar/effects.d.ts +7 -0
  96. package/dist/engine/lunar/effects.d.ts.map +1 -0
  97. package/dist/engine/lunar/effects.js +16 -0
  98. package/dist/engine/lunar/effects.js.map +1 -0
  99. package/dist/engine/lunar/events.d.ts +3 -0
  100. package/dist/engine/lunar/events.d.ts.map +1 -0
  101. package/dist/engine/lunar/events.js +11 -0
  102. package/dist/engine/lunar/events.js.map +1 -0
  103. package/dist/engine/lunar/fingerprint.d.ts +5 -0
  104. package/dist/engine/lunar/fingerprint.d.ts.map +1 -0
  105. package/dist/engine/lunar/fingerprint.js +17 -0
  106. package/dist/engine/lunar/fingerprint.js.map +1 -0
  107. package/dist/engine/lunar/hooks.d.ts +10 -0
  108. package/dist/engine/lunar/hooks.d.ts.map +1 -0
  109. package/dist/engine/lunar/hooks.js +10 -0
  110. package/dist/engine/lunar/hooks.js.map +1 -0
  111. package/dist/engine/lunar/index.d.ts +8 -0
  112. package/dist/engine/lunar/index.d.ts.map +1 -0
  113. package/dist/engine/lunar/index.js +38 -0
  114. package/dist/engine/lunar/index.js.map +1 -0
  115. package/dist/engine/lunar/metrics.d.ts +4 -0
  116. package/dist/engine/lunar/metrics.d.ts.map +1 -0
  117. package/dist/engine/lunar/metrics.js +14 -0
  118. package/dist/engine/lunar/metrics.js.map +1 -0
  119. package/dist/engine/lunar/milestones.d.ts +3 -0
  120. package/dist/engine/lunar/milestones.d.ts.map +1 -0
  121. package/dist/engine/lunar/milestones.js +53 -0
  122. package/dist/engine/lunar/milestones.js.map +1 -0
  123. package/dist/engine/lunar/names.d.ts +4 -0
  124. package/dist/engine/lunar/names.d.ts.map +1 -0
  125. package/dist/engine/lunar/names.js +23 -0
  126. package/dist/engine/lunar/names.js.map +1 -0
  127. package/dist/engine/lunar/politics.d.ts +6 -0
  128. package/dist/engine/lunar/politics.d.ts.map +1 -0
  129. package/dist/engine/lunar/politics.js +13 -0
  130. package/dist/engine/lunar/politics.js.map +1 -0
  131. package/dist/engine/lunar/presets.d.ts +25 -0
  132. package/dist/engine/lunar/presets.d.ts.map +1 -0
  133. package/dist/engine/lunar/presets.js +24 -0
  134. package/dist/engine/lunar/presets.js.map +1 -0
  135. package/dist/engine/lunar/progression-hooks.d.ts +7 -0
  136. package/dist/engine/lunar/progression-hooks.d.ts.map +1 -0
  137. package/dist/engine/lunar/progression-hooks.js +20 -0
  138. package/dist/engine/lunar/progression-hooks.js.map +1 -0
  139. package/dist/engine/lunar/prompts.d.ts +10 -0
  140. package/dist/engine/lunar/prompts.d.ts.map +1 -0
  141. package/dist/engine/lunar/prompts.js +64 -0
  142. package/dist/engine/lunar/prompts.js.map +1 -0
  143. package/dist/engine/lunar/reactions.d.ts +5 -0
  144. package/dist/engine/lunar/reactions.d.ts.map +1 -0
  145. package/dist/engine/lunar/reactions.js +15 -0
  146. package/dist/engine/lunar/reactions.js.map +1 -0
  147. package/dist/engine/lunar/research-bundle.d.ts +8 -0
  148. package/dist/engine/lunar/research-bundle.d.ts.map +1 -0
  149. package/dist/engine/lunar/research-bundle.js +157 -0
  150. package/dist/engine/lunar/research-bundle.js.map +1 -0
  151. package/dist/engine/lunar/scenario.json +117 -0
  152. package/dist/engine/mars/effects.d.ts +18 -0
  153. package/dist/engine/mars/effects.d.ts.map +1 -0
  154. package/dist/engine/mars/effects.js +21 -0
  155. package/dist/engine/mars/effects.js.map +1 -0
  156. package/dist/engine/mars/events.d.ts +9 -0
  157. package/dist/engine/mars/events.d.ts.map +1 -0
  158. package/dist/engine/mars/events.js +12 -0
  159. package/dist/engine/mars/events.js.map +1 -0
  160. package/dist/engine/mars/fingerprint.d.ts +6 -0
  161. package/dist/engine/mars/fingerprint.d.ts.map +1 -0
  162. package/dist/engine/mars/fingerprint.js +21 -0
  163. package/dist/engine/mars/fingerprint.js.map +1 -0
  164. package/dist/engine/mars/hooks.d.ts +11 -0
  165. package/dist/engine/mars/hooks.d.ts.map +1 -0
  166. package/dist/engine/mars/hooks.js +11 -0
  167. package/dist/engine/mars/hooks.js.map +1 -0
  168. package/dist/engine/mars/index.d.ts +8 -0
  169. package/dist/engine/mars/index.d.ts.map +1 -0
  170. package/dist/engine/mars/index.js +44 -0
  171. package/dist/engine/mars/index.js.map +1 -0
  172. package/dist/engine/mars/metrics.d.ts +21 -0
  173. package/dist/engine/mars/metrics.d.ts.map +1 -0
  174. package/dist/engine/mars/metrics.js +25 -0
  175. package/dist/engine/mars/metrics.js.map +1 -0
  176. package/dist/engine/mars/milestones.d.ts +15 -0
  177. package/dist/engine/mars/milestones.d.ts.map +1 -0
  178. package/dist/engine/mars/milestones.js +72 -0
  179. package/dist/engine/mars/milestones.js.map +1 -0
  180. package/dist/engine/mars/names.d.ts +12 -0
  181. package/dist/engine/mars/names.d.ts.map +1 -0
  182. package/dist/engine/mars/names.js +45 -0
  183. package/dist/engine/mars/names.js.map +1 -0
  184. package/dist/engine/mars/politics.d.ts +7 -0
  185. package/dist/engine/mars/politics.d.ts.map +1 -0
  186. package/dist/engine/mars/politics.js +14 -0
  187. package/dist/engine/mars/politics.js.map +1 -0
  188. package/dist/engine/mars/presets.d.ts +29 -0
  189. package/dist/engine/mars/presets.d.ts.map +1 -0
  190. package/dist/engine/mars/presets.js +28 -0
  191. package/dist/engine/mars/presets.js.map +1 -0
  192. package/dist/engine/mars/progression-hooks.d.ts +8 -0
  193. package/dist/engine/mars/progression-hooks.d.ts.map +1 -0
  194. package/dist/engine/mars/progression-hooks.js +21 -0
  195. package/dist/engine/mars/progression-hooks.js.map +1 -0
  196. package/dist/engine/mars/prompts.d.ts +12 -0
  197. package/dist/engine/mars/prompts.d.ts.map +1 -0
  198. package/dist/engine/mars/prompts.js +75 -0
  199. package/dist/engine/mars/prompts.js.map +1 -0
  200. package/dist/engine/mars/reactions.d.ts +7 -0
  201. package/dist/engine/mars/reactions.d.ts.map +1 -0
  202. package/dist/engine/mars/reactions.js +24 -0
  203. package/dist/engine/mars/reactions.js.map +1 -0
  204. package/dist/engine/mars/research-bundle.d.ts +7 -0
  205. package/dist/engine/mars/research-bundle.d.ts.map +1 -0
  206. package/dist/engine/mars/research-bundle.js +174 -0
  207. package/dist/engine/mars/research-bundle.js.map +1 -0
  208. package/dist/engine/mars/scenario.json +118 -0
  209. package/dist/engine/metric-registry.d.ts +12 -0
  210. package/dist/engine/metric-registry.d.ts.map +1 -0
  211. package/dist/engine/metric-registry.js +26 -0
  212. package/dist/engine/metric-registry.js.map +1 -0
  213. package/dist/engine/types.d.ts +349 -0
  214. package/dist/engine/types.d.ts.map +1 -0
  215. package/dist/engine/types.js +7 -0
  216. package/dist/engine/types.js.map +1 -0
  217. package/dist/runtime/agent-memory.d.ts +43 -0
  218. package/dist/runtime/agent-memory.d.ts.map +1 -0
  219. package/dist/runtime/agent-memory.js +201 -0
  220. package/dist/runtime/agent-memory.js.map +1 -0
  221. package/dist/runtime/agent-reactions.d.ts +55 -0
  222. package/dist/runtime/agent-reactions.d.ts.map +1 -0
  223. package/dist/runtime/agent-reactions.js +136 -0
  224. package/dist/runtime/agent-reactions.js.map +1 -0
  225. package/dist/runtime/batch.d.ts +43 -0
  226. package/dist/runtime/batch.d.ts.map +1 -0
  227. package/dist/runtime/batch.js +49 -0
  228. package/dist/runtime/batch.js.map +1 -0
  229. package/dist/runtime/contracts.d.ts +127 -0
  230. package/dist/runtime/contracts.d.ts.map +1 -0
  231. package/dist/runtime/contracts.js +2 -0
  232. package/dist/runtime/contracts.js.map +1 -0
  233. package/dist/runtime/departments.d.ts +28 -0
  234. package/dist/runtime/departments.d.ts.map +1 -0
  235. package/dist/runtime/departments.js +111 -0
  236. package/dist/runtime/departments.js.map +1 -0
  237. package/dist/runtime/director.d.ts +92 -0
  238. package/dist/runtime/director.d.ts.map +1 -0
  239. package/dist/runtime/director.js +220 -0
  240. package/dist/runtime/director.js.map +1 -0
  241. package/dist/runtime/index.d.ts +16 -0
  242. package/dist/runtime/index.d.ts.map +1 -0
  243. package/dist/runtime/index.js +12 -0
  244. package/dist/runtime/index.js.map +1 -0
  245. package/dist/runtime/orchestrator.d.ts +66 -0
  246. package/dist/runtime/orchestrator.d.ts.map +1 -0
  247. package/dist/runtime/orchestrator.js +821 -0
  248. package/dist/runtime/orchestrator.js.map +1 -0
  249. package/dist/runtime/research/knowledge-base.d.ts +14 -0
  250. package/dist/runtime/research/knowledge-base.d.ts.map +1 -0
  251. package/dist/runtime/research/knowledge-base.js +229 -0
  252. package/dist/runtime/research/knowledge-base.js.map +1 -0
  253. package/dist/runtime/research/research-memory.d.ts +21 -0
  254. package/dist/runtime/research/research-memory.d.ts.map +1 -0
  255. package/dist/runtime/research/research-memory.js +118 -0
  256. package/dist/runtime/research/research-memory.js.map +1 -0
  257. package/dist/runtime/research/research.d.ts +4 -0
  258. package/dist/runtime/research/research.d.ts.map +1 -0
  259. package/dist/runtime/research/research.js +138 -0
  260. package/dist/runtime/research/research.js.map +1 -0
  261. package/dist/runtime/research/scenario-research.d.ts +13 -0
  262. package/dist/runtime/research/scenario-research.d.ts.map +1 -0
  263. package/dist/runtime/research/scenario-research.js +58 -0
  264. package/dist/runtime/research/scenario-research.js.map +1 -0
  265. package/dist/runtime/research/scenarios.d.ts +3 -0
  266. package/dist/runtime/research/scenarios.d.ts.map +1 -0
  267. package/dist/runtime/research/scenarios.js +252 -0
  268. package/dist/runtime/research/scenarios.js.map +1 -0
  269. package/dist/runtime/runtime-helpers.d.ts +12 -0
  270. package/dist/runtime/runtime-helpers.d.ts.map +1 -0
  271. package/dist/runtime/runtime-helpers.js +33 -0
  272. package/dist/runtime/runtime-helpers.js.map +1 -0
  273. package/package.json +78 -4
@@ -0,0 +1,73 @@
1
+ import type { HexacoProfile } from '../engine/core/state.js';
2
+ export type { HexacoProfile };
3
+ export interface LeaderConfig {
4
+ name: string;
5
+ archetype: string;
6
+ colony: string;
7
+ hexaco: HexacoProfile;
8
+ instructions: string;
9
+ }
10
+ export interface Citation {
11
+ text: string;
12
+ url: string;
13
+ doi?: string;
14
+ context: string;
15
+ }
16
+ export interface ForgedToolRecord {
17
+ name: string;
18
+ mode: 'compose' | 'sandbox';
19
+ description: string;
20
+ confidence: number;
21
+ judgeVerdict: 'approved' | 'rejected';
22
+ }
23
+ export interface ColonySnapshot {
24
+ population: number;
25
+ waterLitersPerDay: number;
26
+ foodMonthsReserve: number;
27
+ powerKw: number;
28
+ morale: number;
29
+ infrastructureModules: number;
30
+ scienceOutput: number;
31
+ unplannedDeaths: number;
32
+ toolsForgedTotal: number;
33
+ }
34
+ export interface TurnResult {
35
+ turn: number;
36
+ year: number;
37
+ title: string;
38
+ crisis: string;
39
+ decision: string;
40
+ reasoning: string;
41
+ citations: Citation[];
42
+ toolsForged: ForgedToolRecord[];
43
+ snapshot: ColonySnapshot;
44
+ rawResponse: string;
45
+ }
46
+ export interface SimulationLog {
47
+ simulation: 'mars-genesis';
48
+ version: '1.0.0';
49
+ startedAt: string;
50
+ completedAt: string;
51
+ leader: Omit<LeaderConfig, 'instructions'>;
52
+ turns: TurnResult[];
53
+ finalAssessment: {
54
+ population: number;
55
+ toolsForged: number;
56
+ unplannedDeaths: number;
57
+ scienceOutput: number;
58
+ infrastructureModules: number;
59
+ morale: number;
60
+ };
61
+ }
62
+ export interface Scenario {
63
+ turn: number;
64
+ year: number;
65
+ title: string;
66
+ crisis: string;
67
+ researchKeywords: string[];
68
+ snapshotHints: Partial<ColonySnapshot>;
69
+ riskyOption: string;
70
+ riskSuccessProbability: number;
71
+ options?: import('../runtime/contracts.js').CrisisOption[];
72
+ }
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,UAAU,GAAG,UAAU,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAC3C,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,eAAe,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,yBAAyB,EAAE,YAAY,EAAE,CAAC;CAC5D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SCENARIO TEMPLATE — Replace "my-scenario" with your scenario name.
3
+ *
4
+ * Copy this entire _template/ directory and fill in each file.
5
+ * See src/engine/mars/ and src/engine/lunar/ for complete examples.
6
+ */
7
+ import type { ScenarioPackage } from '../types.js';
8
+ export declare const myScenario: ScenarioPackage;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/_template/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAcnD,eAAO,MAAM,UAAU,EAAE,eAoFxB,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * SCENARIO TEMPLATE — Replace "my-scenario" with your scenario name.
3
+ *
4
+ * Copy this entire _template/ directory and fill in each file.
5
+ * See src/engine/mars/ and src/engine/lunar/ for complete examples.
6
+ */
7
+ // Import your scenario components:
8
+ // import { MY_CATEGORY_EFFECTS } from './effects.js';
9
+ // import { MY_WORLD_METRICS, MY_CAPACITY_METRICS } from './metrics.js';
10
+ // import { MY_EVENT_DEFINITIONS } from './events.js';
11
+ // import { myProgressionHook } from './progression-hooks.js';
12
+ // import { myDepartmentPromptLines, myDirectorInstructions } from './prompts.js';
13
+ // import { MY_KNOWLEDGE_BUNDLE } from './research-bundle.js';
14
+ // import { MY_DEFAULT_KEY_PERSONNEL, MY_DEFAULT_LEADERS } from './presets.js';
15
+ // import { myFingerprint } from './fingerprint.js';
16
+ // import { myPoliticsHook } from './politics.js';
17
+ // import { myReactionContext } from './reactions.js';
18
+ // import { getMyMilestoneCrisis } from './milestones.js';
19
+ export const myScenario = {
20
+ id: 'my-scenario',
21
+ version: '1.0.0',
22
+ engineArchetype: 'closed_turn_based_settlement',
23
+ labels: {
24
+ name: 'My Scenario',
25
+ shortName: 'my',
26
+ populationNoun: 'members',
27
+ settlementNoun: 'settlement',
28
+ currency: 'credits',
29
+ },
30
+ theme: {
31
+ primaryColor: '#22c55e',
32
+ accentColor: '#86efac',
33
+ cssVariables: {},
34
+ },
35
+ setup: {
36
+ defaultTurns: 8,
37
+ defaultSeed: 100,
38
+ defaultStartYear: 2040,
39
+ defaultPopulation: 50,
40
+ configurableSections: ['leaders', 'personnel', 'resources', 'departments', 'events', 'models', 'advanced'],
41
+ },
42
+ world: {
43
+ metrics: {},
44
+ capacities: {},
45
+ statuses: {},
46
+ politics: {},
47
+ environment: {},
48
+ },
49
+ departments: [
50
+ // { id: 'engineering', label: 'Engineering', role: 'Chief Engineer', icon: '⚙️', defaultModel: 'gpt-5.4-mini', instructions: '...' },
51
+ ],
52
+ metrics: [
53
+ // { id: 'population', label: 'Population', source: 'metrics.population', format: 'number' },
54
+ ],
55
+ events: [
56
+ // { id: 'crisis', label: 'Crisis', icon: '⚠️', color: '#ef4444' },
57
+ ],
58
+ effects: [
59
+ // { id: 'category_effects', type: 'category_outcome', label: 'Category Effects', categoryDefaults: MY_CATEGORY_EFFECTS },
60
+ ],
61
+ ui: {
62
+ headerMetrics: [],
63
+ tooltipFields: [],
64
+ reportSections: ['crisis', 'departments', 'decision', 'outcome'],
65
+ departmentIcons: {},
66
+ eventRenderers: {},
67
+ setupSections: ['leaders', 'personnel', 'resources', 'departments', 'events', 'models', 'advanced'],
68
+ },
69
+ knowledge: {
70
+ topics: {},
71
+ categoryMapping: {},
72
+ },
73
+ policies: {
74
+ toolForging: { enabled: true },
75
+ liveSearch: { enabled: false, mode: 'off' },
76
+ bulletin: { enabled: true },
77
+ characterChat: { enabled: true },
78
+ sandbox: { timeoutMs: 10000, memoryMB: 128 },
79
+ },
80
+ presets: [],
81
+ hooks: {
82
+ // progressionHook: myProgressionHook,
83
+ // departmentPromptHook: (ctx) => myDepartmentPromptLines(ctx.department, ctx.state),
84
+ // directorInstructions: myDirectorInstructions,
85
+ // fingerprintHook: myFingerprint,
86
+ // politicsHook: myPoliticsHook,
87
+ // reactionContextHook: myReactionContext,
88
+ // getMilestoneCrisis: getMyMilestoneCrisis,
89
+ },
90
+ };
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/_template/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,mCAAmC;AACnC,sDAAsD;AACtD,wEAAwE;AACxE,sDAAsD;AACtD,8DAA8D;AAC9D,kFAAkF;AAClF,8DAA8D;AAC9D,+EAA+E;AAC/E,oDAAoD;AACpD,kDAAkD;AAClD,sDAAsD;AACtD,0DAA0D;AAE1D,MAAM,CAAC,MAAM,UAAU,GAAoB;IACzC,EAAE,EAAE,aAAa;IACjB,OAAO,EAAE,OAAO;IAChB,eAAe,EAAE,8BAA8B;IAE/C,MAAM,EAAE;QACN,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,SAAS;QACzB,cAAc,EAAE,YAAY;QAC5B,QAAQ,EAAE,SAAS;KACpB;IAED,KAAK,EAAE;QACL,YAAY,EAAE,SAAS;QACvB,WAAW,EAAE,SAAS;QACtB,YAAY,EAAE,EAAE;KACjB;IAED,KAAK,EAAE;QACL,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,GAAG;QAChB,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,EAAE;QACrB,oBAAoB,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;KAC3G;IAED,KAAK,EAAE;QACL,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,EAAE;KAChB;IAED,WAAW,EAAE;IACX,sIAAsI;KACvI;IAED,OAAO,EAAE;IACP,6FAA6F;KAC9F;IAED,MAAM,EAAE;IACN,mEAAmE;KACpE;IAED,OAAO,EAAE;IACP,0HAA0H;KAC3H;IAED,EAAE,EAAE;QACF,aAAa,EAAE,EAAE;QACjB,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,CAAC;QAChE,eAAe,EAAE,EAAE;QACnB,cAAc,EAAE,EAAE;QAClB,aAAa,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;KACpG;IAED,SAAS,EAAE;QACT,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,EAAE;KACpB;IAED,QAAQ,EAAE;QACR,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9B,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;QAC3C,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC3B,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAChC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE;KAC7C;IAED,OAAO,EAAE,EAAE;IAEX,KAAK,EAAE;IACL,sCAAsC;IACtC,qFAAqF;IACrF,gDAAgD;IAChD,kCAAkC;IAClC,gCAAgC;IAChC,0CAA0C;IAC1C,4CAA4C;KAC7C;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Disk cache for generated scenario hooks.
3
+ * Stores generated hook source alongside a manifest tracking
4
+ * the scenario hash, model used, and generation timestamp.
5
+ */
6
+ /** SHA-256 hash of the scenario JSON, used for cache invalidation. */
7
+ export declare function hashScenario(scenarioJson: Record<string, unknown>): string;
8
+ /** Read a cached hook result. Returns null on cache miss. */
9
+ export declare function readCache(scenarioJson: Record<string, unknown>, hookName: string, model: string, baseDir?: string): string | null;
10
+ /** Write a hook result to disk cache. */
11
+ export declare function writeCache(scenarioJson: Record<string, unknown>, hookName: string, content: string, model: string, baseDir?: string): void;
12
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Disk cache for generated scenario hooks.
3
+ * Stores generated hook source alongside a manifest tracking
4
+ * the scenario hash, model used, and generation timestamp.
5
+ */
6
+ import { createHash } from 'node:crypto';
7
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ const DEFAULT_CACHE_DIR = '.paracosm/cache';
10
+ /** SHA-256 hash of the scenario JSON, used for cache invalidation. */
11
+ export function hashScenario(scenarioJson) {
12
+ return createHash('sha256')
13
+ .update(JSON.stringify(scenarioJson, null, 0))
14
+ .digest('hex')
15
+ .slice(0, 16);
16
+ }
17
+ /** Build the cache directory path for a scenario + version combo. */
18
+ function cacheDir(scenarioId, version, baseDir) {
19
+ return join(baseDir, `${scenarioId}-v${version}`);
20
+ }
21
+ /** Read a cached hook result. Returns null on cache miss. */
22
+ export function readCache(scenarioJson, hookName, model, baseDir = DEFAULT_CACHE_DIR) {
23
+ const id = scenarioJson.id ?? 'unknown';
24
+ const ver = scenarioJson.version ?? '0.0.0';
25
+ const dir = cacheDir(id, ver, baseDir);
26
+ const manifestPath = join(dir, 'manifest.json');
27
+ if (!existsSync(manifestPath))
28
+ return null;
29
+ try {
30
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
31
+ const currentHash = hashScenario(scenarioJson);
32
+ if (manifest.scenarioHash !== currentHash)
33
+ return null;
34
+ if (manifest.model !== model)
35
+ return null;
36
+ const hookFile = manifest.hooks[hookName];
37
+ if (!hookFile)
38
+ return null;
39
+ const hookPath = join(dir, hookFile);
40
+ if (!existsSync(hookPath))
41
+ return null;
42
+ return readFileSync(hookPath, 'utf-8');
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ /** Write a hook result to disk cache. */
49
+ export function writeCache(scenarioJson, hookName, content, model, baseDir = DEFAULT_CACHE_DIR) {
50
+ const id = scenarioJson.id ?? 'unknown';
51
+ const ver = scenarioJson.version ?? '0.0.0';
52
+ const dir = cacheDir(id, ver, baseDir);
53
+ mkdirSync(dir, { recursive: true });
54
+ const manifestPath = join(dir, 'manifest.json');
55
+ let manifest;
56
+ try {
57
+ manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
58
+ }
59
+ catch {
60
+ manifest = {
61
+ scenarioHash: hashScenario(scenarioJson),
62
+ model,
63
+ timestamp: new Date().toISOString(),
64
+ hooks: {},
65
+ };
66
+ }
67
+ const fileName = `${hookName}.ts`;
68
+ writeFileSync(join(dir, fileName), content, 'utf-8');
69
+ manifest.hooks[hookName] = fileName;
70
+ manifest.scenarioHash = hashScenario(scenarioJson);
71
+ manifest.model = model;
72
+ manifest.timestamp = new Date().toISOString();
73
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');
74
+ }
75
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/engine/compiler/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generate Crisis Director system instructions from scenario JSON via LLM.
3
+ */
4
+ import type { GenerateTextFn } from './types.js';
5
+ export declare function generateDirectorInstructions(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
6
+ hook: () => string;
7
+ source: string;
8
+ }>;
9
+ //# sourceMappingURL=generate-director.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Generate Crisis Director system instructions from scenario JSON via LLM.
3
+ */
4
+ function buildPrompt(scenarioJson) {
5
+ const labels = scenarioJson.labels ?? {};
6
+ const depts = (scenarioJson.departments ?? []).map((d) => `- ${d.id}: ${d.label} (${d.role})`).join('\n');
7
+ const effects = scenarioJson.effects ?? {};
8
+ const categories = typeof effects === 'object' && !Array.isArray(effects)
9
+ ? Object.keys(effects)
10
+ : effects.flatMap?.((e) => Object.keys(e.categoryDefaults ?? {})) ?? [];
11
+ return `You are generating system instructions for a Crisis Director agent in a simulation engine.
12
+
13
+ SCENARIO: ${labels.name ?? 'Unknown'}
14
+ SETTLEMENT TYPE: ${labels.settlementNoun ?? 'settlement'}
15
+ POPULATION NOUN: ${labels.populationNoun ?? 'members'}
16
+ DEPARTMENTS:
17
+ ${depts}
18
+ CRISIS CATEGORIES: ${categories.join(', ')}
19
+
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.`;
28
+ }
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;
45
+ }
46
+ return {
47
+ hook: () => cleaned,
48
+ source: cleaned,
49
+ };
50
+ }
51
+ // Fallback: generic instructions
52
+ 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 };
56
+ }
57
+ //# sourceMappingURL=generate-director.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-director.js","sourceRoot":"","sources":["../../../src/engine/compiler/generate-director.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
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
+ 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>;
10
+ source: string;
11
+ }>;
12
+ //# sourceMappingURL=generate-fingerprint.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,86 @@
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) {
7
+ const labels = scenarioJson.labels ?? {};
8
+ const depts = (scenarioJson.departments ?? []).map((d) => d.id).join(', ');
9
+ return `You are generating a timeline fingerprint hook for a simulation engine.
10
+
11
+ SCENARIO: ${labels.name ?? 'Unknown'} — ${labels.settlementNoun ?? 'settlement'} simulation
12
+ DEPARTMENTS: ${depts}
13
+
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)
19
+ - maxTurns: number
20
+
21
+ Return an object with string values for 5-7 classification dimensions relevant to this scenario domain, plus a "summary" key joining them with " · ".
22
+
23
+ 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.`;
32
+ }
33
+ export function parseResponse(text) {
34
+ let cleaned = text.trim();
35
+ cleaned = cleaned.replace(/^```(?:typescript|ts)?\n?/i, '').replace(/\n?```$/i, '').trim();
36
+ if (cleaned.endsWith(';'))
37
+ cleaned = cleaned.slice(0, -1).trim();
38
+ try {
39
+ const fn = new Function('return ' + cleaned)();
40
+ if (typeof fn === 'function')
41
+ return fn;
42
+ return null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
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
+ }
70
+ }
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' };
85
+ }
86
+ //# sourceMappingURL=generate-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-fingerprint.js","sourceRoot":"","sources":["../../../src/engine/compiler/generate-fingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generate milestone crises (turn 1 founding + final turn assessment) from scenario JSON via LLM.
3
+ */
4
+ import type { MilestoneEventDef } from '../types.js';
5
+ import type { GenerateTextFn } from './types.js';
6
+ export declare function parseMilestones(text: string): [MilestoneEventDef, MilestoneEventDef] | null;
7
+ export declare function generateMilestones(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
8
+ hook: (turn: number, maxTurns: number) => MilestoneEventDef | null;
9
+ source: string;
10
+ }>;
11
+ //# sourceMappingURL=generate-milestones.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Generate milestone crises (turn 1 founding + final turn assessment) from scenario JSON via LLM.
3
+ */
4
+ function buildPrompt(scenarioJson) {
5
+ const labels = scenarioJson.labels ?? {};
6
+ const depts = (scenarioJson.departments ?? []).map((d) => d.id).join(', ');
7
+ return `You are generating milestone crises for a simulation engine.
8
+
9
+ SCENARIO: ${labels.name ?? 'Unknown'}
10
+ SETTLEMENT TYPE: ${labels.settlementNoun ?? 'settlement'}
11
+ POPULATION NOUN: ${labels.populationNoun ?? 'members'}
12
+ DEPARTMENTS: ${depts}
13
+ DEFAULT TURNS: ${scenarioJson.setup?.defaultTurns ?? 12}
14
+
15
+ Generate TWO milestone crises as a JSON array:
16
+
17
+ 1. FOUNDING CRISIS (turn 1): The ${labels.populationNoun} arrive at the ${labels.settlementNoun}. They must make their first major decision (site selection, initial strategy, resource allocation). Two options: safe/conservative vs risky/ambitious. Include domain-specific science and real-world references.
18
+
19
+ 2. LEGACY ASSESSMENT (final turn): The ${labels.settlementNoun} must submit a comprehensive status report. Asks the commander to evaluate population, infrastructure, self-sufficiency, science, culture, tools built, and legacy. Two options: honest assessment vs ambitious projection.
20
+
21
+ Each milestone must have this exact JSON shape:
22
+ {
23
+ "title": "string",
24
+ "crisis": "string (detailed description with specific domain references)",
25
+ "options": [
26
+ { "id": "option_a", "label": "string", "description": "string", "isRisky": false },
27
+ { "id": "option_b", "label": "string", "description": "string", "isRisky": true }
28
+ ],
29
+ "riskyOptionId": "option_b",
30
+ "riskSuccessProbability": 0.5-0.7,
31
+ "category": "string",
32
+ "researchKeywords": ["string"],
33
+ "relevantDepartments": ["string"],
34
+ "turnSummary": "string"
35
+ }
36
+
37
+ Return ONLY a JSON array of exactly 2 objects: [founding, legacy]. No markdown fences.`;
38
+ }
39
+ export function parseMilestones(text) {
40
+ let cleaned = text.trim();
41
+ cleaned = cleaned.replace(/^```(?:json)?\n?/i, '').replace(/\n?```$/i, '').trim();
42
+ try {
43
+ const arr = JSON.parse(cleaned);
44
+ if (!Array.isArray(arr) || arr.length < 2)
45
+ return null;
46
+ const [founding, legacy] = arr;
47
+ if (!founding.title || !founding.options || !legacy.title || !legacy.options)
48
+ return null;
49
+ return [founding, legacy];
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ export async function generateMilestones(scenarioJson, generateText, maxRetries = 3) {
56
+ let lastError = '';
57
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
58
+ const retryHint = attempt > 0 ? `\n\nPrevious attempt failed: ${lastError}. Fix the issue and return valid JSON.` : '';
59
+ const text = await generateText(buildPrompt(scenarioJson) + retryHint);
60
+ const result = parseMilestones(text);
61
+ if (!result) {
62
+ lastError = 'Could not parse milestones JSON array';
63
+ continue;
64
+ }
65
+ const [founding, legacy] = result;
66
+ return {
67
+ hook: (turn, maxTurns) => {
68
+ if (turn === 1)
69
+ return founding;
70
+ if (turn === maxTurns)
71
+ return legacy;
72
+ return null;
73
+ },
74
+ source: JSON.stringify(result, null, 2),
75
+ };
76
+ }
77
+ // Fallback: generic milestones
78
+ const labels = scenarioJson.labels ?? {};
79
+ const fallbackFounding = {
80
+ title: 'Founding',
81
+ description: `The ${labels.populationNoun ?? 'members'} have arrived at the ${labels.settlementNoun ?? 'settlement'}. Choose your initial strategy.`,
82
+ crisis: `The ${labels.populationNoun ?? 'members'} have arrived at the ${labels.settlementNoun ?? 'settlement'}. Choose your initial strategy.`,
83
+ options: [
84
+ { id: 'option_a', label: 'Conservative Start', description: 'Establish a safe, stable foundation', isRisky: false },
85
+ { id: 'option_b', label: 'Ambitious Start', description: 'Push for rapid expansion with higher risk', isRisky: true },
86
+ ],
87
+ riskyOptionId: 'option_b',
88
+ riskSuccessProbability: 0.6,
89
+ category: 'infrastructure',
90
+ researchKeywords: [labels.settlementNoun ?? 'settlement'],
91
+ relevantDepartments: (scenarioJson.departments ?? []).slice(0, 2).map((d) => d.id),
92
+ turnSummary: `The ${labels.settlementNoun ?? 'settlement'} is founded. First decisions shape everything.`,
93
+ };
94
+ const fallbackLegacy = {
95
+ title: 'Legacy Assessment',
96
+ description: `Submit a comprehensive status report on the ${labels.settlementNoun ?? 'settlement'}.`,
97
+ crisis: `Submit a comprehensive status report on the ${labels.settlementNoun ?? 'settlement'}.`,
98
+ options: [
99
+ { id: 'option_a', label: 'Honest Assessment', description: 'Report factually, including failures', isRisky: false },
100
+ { id: 'option_b', label: 'Ambitious Projection', description: 'Emphasize achievements, propose bold vision', isRisky: true },
101
+ ],
102
+ riskyOptionId: 'option_b',
103
+ riskSuccessProbability: 0.5,
104
+ category: 'political',
105
+ researchKeywords: [],
106
+ relevantDepartments: (scenarioJson.departments ?? []).slice(0, 3).map((d) => d.id),
107
+ turnSummary: 'Time for a comprehensive assessment.',
108
+ };
109
+ console.warn('[compiler] Milestone generation failed. Using fallback milestones.');
110
+ return {
111
+ hook: (turn, maxTurns) => {
112
+ if (turn === 1)
113
+ return fallbackFounding;
114
+ if (turn === maxTurns)
115
+ return fallbackLegacy;
116
+ return null;
117
+ },
118
+ source: JSON.stringify([fallbackFounding, fallbackLegacy], null, 2),
119
+ };
120
+ }
121
+ //# sourceMappingURL=generate-milestones.js.map