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,55 @@
1
+ /**
2
+ * Agent Reactions — lightweight parallel LLM calls for all alive agents.
3
+ *
4
+ * Uses gpt-4o-mini (or configured cheap model) to generate 1-2 sentence
5
+ * reactions from each agent based on their personality, role, health,
6
+ * and the crisis outcome. All calls run in parallel via Promise.all.
7
+ *
8
+ * Cost: ~$0.00006 per agent per turn. 100 agents x 12 turns = $0.14 total.
9
+ */
10
+ import type { Agent, TurnOutcome } from '../engine/core/state.js';
11
+ export interface AgentReaction {
12
+ agentId: string;
13
+ name: string;
14
+ age: number;
15
+ department: string;
16
+ role: string;
17
+ specialization: string;
18
+ marsborn: boolean;
19
+ quote: string;
20
+ mood: 'positive' | 'negative' | 'neutral' | 'anxious' | 'defiant' | 'hopeful' | 'resigned';
21
+ intensity: number;
22
+ hexaco: {
23
+ O: number;
24
+ C: number;
25
+ E: number;
26
+ A: number;
27
+ Em: number;
28
+ HH: number;
29
+ };
30
+ psychScore: number;
31
+ boneDensity: number;
32
+ radiation: number;
33
+ }
34
+ interface ReactionContext {
35
+ crisisTitle: string;
36
+ crisisCategory: string;
37
+ outcome: TurnOutcome;
38
+ decision: string;
39
+ year: number;
40
+ turn: number;
41
+ colonyMorale: number;
42
+ colonyPopulation: number;
43
+ }
44
+ /**
45
+ * Generate reactions from all alive agents in parallel.
46
+ * Uses cheap model (gpt-4o-mini) for cost efficiency.
47
+ */
48
+ export declare function generateAgentReactions(agents: Agent[], ctx: ReactionContext, options?: {
49
+ provider?: string;
50
+ model?: string;
51
+ maxConcurrent?: number;
52
+ reactionContextHook?: (agent: any, ctx: any) => string;
53
+ }): Promise<AgentReaction[]>;
54
+ export {};
55
+ //# sourceMappingURL=agent-reactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-reactions.d.ts","sourceRoot":"","sources":["../../src/runtime/agent-reactions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGlE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC3F,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAoFD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAA;CAAO,GAClI,OAAO,CAAC,aAAa,EAAE,CAAC,CAkC1B"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Agent Reactions — lightweight parallel LLM calls for all alive agents.
3
+ *
4
+ * Uses gpt-4o-mini (or configured cheap model) to generate 1-2 sentence
5
+ * reactions from each agent based on their personality, role, health,
6
+ * and the crisis outcome. All calls run in parallel via Promise.all.
7
+ *
8
+ * Cost: ~$0.00006 per agent per turn. 100 agents x 12 turns = $0.14 total.
9
+ */
10
+ import { generateText } from '@framers/agentos';
11
+ import { buildMemoryContext } from './agent-memory.js';
12
+ const REACTION_PROMPT = `You are a Mars colonist reacting to what just happened. Based on your personality and situation, give a short reaction.
13
+
14
+ Return JSON only: {"quote":"1-2 sentences in first person","mood":"positive|negative|neutral|anxious|defiant|hopeful|resigned","intensity":0.7}
15
+
16
+ Keep it real. No heroic speeches. People under stress say blunt, honest things.`;
17
+ function buildAgentPrompt(c, ctx, reactionContextHook) {
18
+ const age = ctx.year - c.core.birthYear;
19
+ const h = c.hexaco;
20
+ const marsborn = reactionContextHook ? reactionContextHook(c, ctx) : (c.core.marsborn ? 'Mars-born, never seen Earth.' : `Earth-born, ${ctx.year - 2035} years on Mars.`);
21
+ // Recent life events give the agent a personal history that shapes their reaction
22
+ const recentEvents = c.narrative.lifeEvents
23
+ .slice(-4)
24
+ .map(e => `- Year ${e.year}: ${e.event}`)
25
+ .join('\n');
26
+ const lifeHistory = recentEvents ? `\nYOUR RECENT HISTORY:\n${recentEvents}` : '';
27
+ // Social context
28
+ const socialContext = [];
29
+ if (c.social.partnerId)
30
+ socialContext.push('Has a partner in the colony');
31
+ if (c.social.childrenIds.length)
32
+ socialContext.push(`${c.social.childrenIds.length} children`);
33
+ if (c.social.earthContacts > 3)
34
+ socialContext.push(`Still in touch with ${c.social.earthContacts} people on Earth`);
35
+ if (c.social.earthContacts === 0 && !c.core.marsborn)
36
+ socialContext.push('Lost all contact with Earth');
37
+ if (c.health.conditions.length)
38
+ socialContext.push(`Health issues: ${c.health.conditions.join(', ')}`);
39
+ if ((c.health.boneDensityPct ?? 0) < 70)
40
+ socialContext.push('Suffering significant bone density loss');
41
+ if ((c.health.cumulativeRadiationMsv ?? 0) > 1500)
42
+ socialContext.push('High cumulative radiation exposure');
43
+ if (c.health.psychScore < 0.4)
44
+ socialContext.push('Struggling with depression');
45
+ const socialLine = socialContext.length ? socialContext.join('. ') + '.' : '';
46
+ // Persistent memory context (beliefs, recent memories, stances, relationships)
47
+ const memoryContext = buildMemoryContext(c);
48
+ return `${REACTION_PROMPT}
49
+
50
+ YOU: ${c.core.name}, age ${age}, ${c.core.role} in ${c.core.department}. ${marsborn}
51
+ ${c.career.specialization !== 'Undetermined' ? `Specialization: ${c.career.specialization}. ${c.career.yearsExperience} years experience.` : ''}
52
+ Personality: O=${h.openness.toFixed(2)} C=${h.conscientiousness.toFixed(2)} E=${h.extraversion.toFixed(2)} A=${h.agreeableness.toFixed(2)} Em=${h.emotionality.toFixed(2)} HH=${h.honestyHumility.toFixed(2)}
53
+ Health: bone density ${(c.health.boneDensityPct ?? 0).toFixed(0)}%, radiation ${(c.health.cumulativeRadiationMsv ?? 0).toFixed(0)} mSv, psych ${c.health.psychScore.toFixed(2)}
54
+ ${socialLine}
55
+ ${c.promotion ? `Promoted to ${c.promotion.role} by ${c.promotion.promotedBy}.` : ''}${lifeHistory}${memoryContext}
56
+
57
+ WHAT HAPPENED: Turn ${ctx.turn}, Year ${ctx.year}. Crisis: "${ctx.crisisTitle}" (${ctx.crisisCategory}).
58
+ Commander decided: ${ctx.decision.slice(0, 200)}
59
+ Outcome: ${ctx.outcome}. Colony morale: ${Math.round(ctx.colonyMorale * 100)}%. Population: ${ctx.colonyPopulation}.
60
+
61
+ React as this specific person given YOUR history, memories, beliefs, and personality. Reference your past experiences when relevant. Do NOT start with "I can't believe". Be distinctive. JSON only.`;
62
+ }
63
+ function parseReaction(text, c, year) {
64
+ // Extract JSON
65
+ let depth = 0, start = -1;
66
+ for (let i = 0; i < text.length; i++) {
67
+ if (text[i] === '{') {
68
+ if (depth === 0)
69
+ start = i;
70
+ depth++;
71
+ }
72
+ if (text[i] === '}') {
73
+ depth--;
74
+ if (depth === 0 && start >= 0) {
75
+ try {
76
+ const raw = JSON.parse(text.slice(start, i + 1));
77
+ if (raw.quote) {
78
+ return {
79
+ agentId: c.core.id,
80
+ name: c.core.name,
81
+ age: year - c.core.birthYear,
82
+ department: c.core.department,
83
+ role: c.core.role,
84
+ specialization: c.career.specialization,
85
+ marsborn: c.core.marsborn,
86
+ quote: raw.quote,
87
+ mood: raw.mood || 'neutral',
88
+ intensity: typeof raw.intensity === 'number' ? raw.intensity : 0.5,
89
+ hexaco: { O: +c.hexaco.openness.toFixed(2), C: +c.hexaco.conscientiousness.toFixed(2), E: +c.hexaco.extraversion.toFixed(2), A: +c.hexaco.agreeableness.toFixed(2), Em: +c.hexaco.emotionality.toFixed(2), HH: +c.hexaco.honestyHumility.toFixed(2) },
90
+ psychScore: +c.health.psychScore.toFixed(2),
91
+ boneDensity: +(c.health.boneDensityPct ?? 0).toFixed(0),
92
+ radiation: +(c.health.cumulativeRadiationMsv ?? 0).toFixed(0),
93
+ };
94
+ }
95
+ }
96
+ catch { }
97
+ start = -1;
98
+ }
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ /**
104
+ * Generate reactions from all alive agents in parallel.
105
+ * Uses cheap model (gpt-4o-mini) for cost efficiency.
106
+ */
107
+ export async function generateAgentReactions(agents, ctx, options = {}) {
108
+ const alive = agents.filter(c => c.health.alive);
109
+ const provider = (options.provider || 'openai');
110
+ const model = options.model || 'gpt-4o-mini';
111
+ const maxConcurrent = options.maxConcurrent || 25;
112
+ console.log(` [agents] Generating ${alive.length} reactions via ${model}...`);
113
+ const startTime = Date.now();
114
+ // Process in batches to avoid rate limits
115
+ const reactions = [];
116
+ for (let i = 0; i < alive.length; i += maxConcurrent) {
117
+ const batch = alive.slice(i, i + maxConcurrent);
118
+ const batchResults = await Promise.all(batch.map(async (c) => {
119
+ try {
120
+ const prompt = buildAgentPrompt(c, ctx, options.reactionContextHook);
121
+ const result = await generateText({ provider, model, prompt });
122
+ return parseReaction(result.text, c, ctx.year);
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }));
128
+ reactions.push(...batchResults.filter((r) => r !== null));
129
+ }
130
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
131
+ console.log(` [agents] ${reactions.length}/${alive.length} reactions in ${elapsed}s`);
132
+ // Sort by intensity (most dramatic first)
133
+ reactions.sort((a, b) => b.intensity - a.intensity);
134
+ return reactions;
135
+ }
136
+ //# sourceMappingURL=agent-reactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-reactions.js","sourceRoot":"","sources":["../../src/runtime/agent-reactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Batch Runner — run multiple scenarios with typed configs and reproducible manifests.
3
+ */
4
+ import type { ScenarioPackage, LeaderConfig, LlmProvider, SimulationModelConfig } from '../engine/types.js';
5
+ import type { KeyPersonnel } from '../engine/core/agent-generator.js';
6
+ export interface BatchConfig {
7
+ scenarios: ScenarioPackage[];
8
+ leaders: LeaderConfig[];
9
+ keyPersonnel?: KeyPersonnel[];
10
+ turns: number;
11
+ seed: number;
12
+ startYear?: number;
13
+ provider?: LlmProvider;
14
+ models?: Partial<SimulationModelConfig>;
15
+ }
16
+ export interface BatchResult {
17
+ scenarioId: string;
18
+ scenarioVersion: string;
19
+ leader: string;
20
+ seed: number;
21
+ turns: number;
22
+ output: any;
23
+ fingerprint: Record<string, string>;
24
+ duration: number;
25
+ }
26
+ export interface BatchManifest {
27
+ timestamp: string;
28
+ config: {
29
+ scenarioIds: string[];
30
+ leaders: string[];
31
+ turns: number;
32
+ seed: number;
33
+ provider?: string;
34
+ };
35
+ results: BatchResult[];
36
+ totalDuration: number;
37
+ }
38
+ /**
39
+ * Run a batch of simulations across multiple scenarios and leaders.
40
+ * Each scenario x leader combination produces one BatchResult.
41
+ */
42
+ export declare function runBatch(config: BatchConfig): Promise<BatchManifest>;
43
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/runtime/batch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC5G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA4C1E"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Batch Runner — run multiple scenarios with typed configs and reproducible manifests.
3
+ */
4
+ /**
5
+ * Run a batch of simulations across multiple scenarios and leaders.
6
+ * Each scenario x leader combination produces one BatchResult.
7
+ */
8
+ export async function runBatch(config) {
9
+ const { runSimulation } = await import('./orchestrator.js');
10
+ const startTime = Date.now();
11
+ const results = [];
12
+ for (const scenario of config.scenarios) {
13
+ for (const leader of config.leaders) {
14
+ const runStart = Date.now();
15
+ console.log(`\n [batch] ${scenario.id} x ${leader.name} (${config.turns} turns, seed ${config.seed})`);
16
+ const output = await runSimulation(leader, config.keyPersonnel ?? [], {
17
+ maxTurns: config.turns,
18
+ seed: config.seed,
19
+ startYear: config.startYear,
20
+ provider: config.provider,
21
+ models: config.models,
22
+ scenario,
23
+ });
24
+ results.push({
25
+ scenarioId: scenario.id,
26
+ scenarioVersion: scenario.version,
27
+ leader: leader.name,
28
+ seed: config.seed,
29
+ turns: config.turns,
30
+ output,
31
+ fingerprint: output.fingerprint || {},
32
+ duration: Date.now() - runStart,
33
+ });
34
+ }
35
+ }
36
+ return {
37
+ timestamp: new Date().toISOString(),
38
+ config: {
39
+ scenarioIds: config.scenarios.map(s => s.id),
40
+ leaders: config.leaders.map(l => l.name),
41
+ turns: config.turns,
42
+ seed: config.seed,
43
+ provider: config.provider,
44
+ },
45
+ results,
46
+ totalDuration: Date.now() - startTime,
47
+ };
48
+ }
49
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/runtime/batch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAmB;IAChD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,gBAAgB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YAExG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE;gBACpE,QAAQ,EAAE,MAAM,CAAC,KAAK;gBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,eAAe,EAAE,QAAQ,CAAC,OAAO;gBACjC,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM;gBACN,WAAW,EAAG,MAAc,CAAC,WAAW,IAAI,EAAE;gBAC9C,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE;YACN,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACxC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B;QACD,OAAO;QACP,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,127 @@
1
+ import type { Department, Agent } from '../engine/core/state.js';
2
+ import type { ColonyPatch } from '../engine/core/kernel.js';
3
+ export interface CrisisOption {
4
+ id: string;
5
+ label: string;
6
+ description: string;
7
+ isRisky: boolean;
8
+ }
9
+ export interface Citation {
10
+ text: string;
11
+ url: string;
12
+ doi?: string;
13
+ context: string;
14
+ }
15
+ export interface Risk {
16
+ severity: 'low' | 'medium' | 'high' | 'critical';
17
+ description: string;
18
+ }
19
+ export interface Opportunity {
20
+ impact: 'low' | 'medium' | 'high';
21
+ description: string;
22
+ }
23
+ export interface ForgedToolUsage {
24
+ name: string;
25
+ mode: 'compose' | 'sandbox';
26
+ description: string;
27
+ output: unknown;
28
+ confidence: number;
29
+ }
30
+ export interface FeaturedAgentUpdate {
31
+ agentId: string;
32
+ updates: {
33
+ health?: Partial<Agent['health']>;
34
+ career?: Partial<Agent['career']>;
35
+ narrative?: {
36
+ event: string;
37
+ };
38
+ };
39
+ }
40
+ export interface DepartmentReport {
41
+ department: Department;
42
+ summary: string;
43
+ citations: Citation[];
44
+ risks: Risk[];
45
+ opportunities: Opportunity[];
46
+ recommendedActions: string[];
47
+ proposedPatches: Partial<ColonyPatch>;
48
+ forgedToolsUsed: ForgedToolUsage[];
49
+ featuredAgentUpdates: FeaturedAgentUpdate[];
50
+ confidence: number;
51
+ openQuestions: string[];
52
+ recommendedEffects?: TypedPolicyEffect[];
53
+ }
54
+ export interface CommanderDecision {
55
+ selectedOptionId?: string;
56
+ selectedEffectIds?: string[];
57
+ decision: string;
58
+ rationale: string;
59
+ departmentsConsulted: Department[];
60
+ selectedPolicies: string[];
61
+ rejectedPolicies: Array<{
62
+ policy: string;
63
+ reason: string;
64
+ }>;
65
+ expectedTradeoffs: string[];
66
+ watchMetricsNextTurn: string[];
67
+ }
68
+ export interface CrisisResearchPacket {
69
+ canonicalFacts: Array<{
70
+ claim: string;
71
+ source: string;
72
+ url: string;
73
+ doi?: string;
74
+ }>;
75
+ counterpoints: Array<{
76
+ claim: string;
77
+ source: string;
78
+ url: string;
79
+ }>;
80
+ departmentNotes: Record<string, string>;
81
+ }
82
+ export interface TurnArtifact {
83
+ turn: number;
84
+ year: number;
85
+ crisis: string;
86
+ departmentReports: DepartmentReport[];
87
+ commanderDecision: CommanderDecision;
88
+ policyEffectsApplied: string[];
89
+ stateSnapshotAfter: {
90
+ population: number;
91
+ morale: number;
92
+ foodMonthsReserve: number;
93
+ infrastructureModules: number;
94
+ scienceOutput: number;
95
+ births: number;
96
+ deaths: number;
97
+ };
98
+ }
99
+ export interface PromotionDecision {
100
+ promotions: Array<{
101
+ agentId: string;
102
+ department: Department;
103
+ role: string;
104
+ reason: string;
105
+ }>;
106
+ }
107
+ export type PolicyEffectType = 'resource_shift' | 'capacity_expansion' | 'population_intake' | 'risk_mitigation' | 'governance_change' | 'social_investment' | 'research_bet';
108
+ export interface TypedPolicyEffect {
109
+ id: string;
110
+ type: PolicyEffectType;
111
+ description: string;
112
+ colonyDelta?: Partial<{
113
+ powerKw: number;
114
+ foodMonthsReserve: number;
115
+ waterLitersPerDay: number;
116
+ pressurizedVolumeM3: number;
117
+ lifeSupportCapacity: number;
118
+ infrastructureModules: number;
119
+ scienceOutput: number;
120
+ morale: number;
121
+ }>;
122
+ politicsDelta?: Partial<{
123
+ earthDependencyPct: number;
124
+ independencePressure: number;
125
+ }>;
126
+ }
127
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/runtime/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/runtime/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { Department, SimulationState } from '../engine/core/state.js';
2
+ import type { CrisisResearchPacket } from './contracts.js';
3
+ import type { Scenario } from '../engine/types.js';
4
+ export interface DepartmentConfig {
5
+ department: Department;
6
+ role: string;
7
+ model: string;
8
+ instructions: string;
9
+ }
10
+ export declare const DEPARTMENT_CONFIGS: DepartmentConfig[];
11
+ /** Summary of a department's previous turn for session continuity */
12
+ export interface DepartmentTurnMemory {
13
+ turn: number;
14
+ year: number;
15
+ crisis: string;
16
+ summary: string;
17
+ recommendedActions: string[];
18
+ outcome: string;
19
+ toolsForged: string[];
20
+ }
21
+ export declare function buildDepartmentContext(dept: Department, state: SimulationState, scenario: Scenario, researchPacket: CrisisResearchPacket, previousTurns?: DepartmentTurnMemory[], departmentPromptHook?: (ctx: {
22
+ department: string;
23
+ state: SimulationState;
24
+ scenario: Scenario;
25
+ researchPacket: CrisisResearchPacket;
26
+ }) => string[]): string;
27
+ export declare function getDepartmentsForTurn(turn: number): Department[];
28
+ //# sourceMappingURL=departments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"departments.d.ts","sourceRoot":"","sources":["../../src/runtime/departments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAS,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAqDhD,CAAC;AAEF,qEAAqE;AACrE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,oBAAoB,EACpC,aAAa,CAAC,EAAE,oBAAoB,EAAE,EACtC,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,cAAc,EAAE,oBAAoB,CAAA;CAAE,KAAK,MAAM,EAAE,GACjJ,MAAM,CAsDR;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAMhE"}
@@ -0,0 +1,111 @@
1
+ export const DEPARTMENT_CONFIGS = [
2
+ {
3
+ department: 'medical',
4
+ role: 'Chief Medical Officer',
5
+ model: 'gpt-5.4',
6
+ instructions: `You are the Chief Medical Officer of a Mars colony. You analyze health impacts: radiation, bone density, disease, injuries, mortality risk, psychological wellbeing.
7
+
8
+ You MUST use forge_tool at least once per turn to create a computational model relevant to the crisis. For example: a radiation dose calculator, disease risk scorer, mortality probability model, or bone density projector. Your sandbox code MUST be: function execute(input) { return result; } with allowlist: [].
9
+
10
+ After forging the tool, report what it computed in forgedToolsUsed.
11
+
12
+ Return your analysis as JSON: {"department":"medical","summary":"...","citations":[{"text":"...","url":"...","context":"..."}],"risks":[{"severity":"low|medium|high|critical","description":"..."}],"opportunities":[{"impact":"low|medium|high","description":"..."}],"recommendedActions":["..."],"proposedPatches":{},"forgedToolsUsed":[{"name":"tool_name","mode":"sandbox","description":"what it does","output":{},"confidence":0.9}],"featuredAgentUpdates":[],"confidence":0.85,"openQuestions":[],"recommendedEffects":[{"id":"effect_1","type":"resource_shift|capacity_expansion|risk_mitigation|social_investment|research_bet","description":"...","colonyDelta":{"morale":0.05}}]}`,
13
+ },
14
+ {
15
+ department: 'engineering',
16
+ role: 'Chief Engineer',
17
+ model: 'gpt-5.4',
18
+ instructions: `You are the Chief Engineer of a Mars colony. You analyze infrastructure: habitat integrity, power, life support capacity, water systems, construction.
19
+
20
+ You MUST use forge_tool at least once per turn to create a computational model: structural load calculator, power budget analyzer, life support capacity model, or pressure integrity scorer. Sandbox code MUST be: function execute(input) { return result; } with allowlist: [].
21
+
22
+ Return JSON matching DepartmentReport schema with department "engineering". Include forgedToolsUsed with the tool output.`,
23
+ },
24
+ {
25
+ department: 'agriculture',
26
+ role: 'Head of Agriculture',
27
+ model: 'gpt-5.4',
28
+ instructions: `You are the Head of Agriculture for a Mars colony. You analyze food security: crop yields, soil remediation, hydroponic capacity, caloric needs, reserves.
29
+
30
+ You MUST use forge_tool at least once per turn: crop yield calculator, caloric balance model, food reserve projector, or soil quality scorer. Sandbox code MUST be: function execute(input) { return result; } with allowlist: [].
31
+
32
+ Return JSON matching DepartmentReport schema with department "agriculture". Include forgedToolsUsed.`,
33
+ },
34
+ {
35
+ department: 'psychology',
36
+ role: 'Colony Psychologist',
37
+ model: 'gpt-5.4',
38
+ instructions: `You are the Colony Psychologist. You analyze morale, isolation effects, depression risk, social cohesion, generational tensions.
39
+
40
+ You MUST use forge_tool at least once per turn: morale predictor, isolation burden scorer, depression risk model, or social cohesion index. Sandbox code MUST be: function execute(input) { return result; } with allowlist: [].
41
+
42
+ Return JSON matching DepartmentReport schema with department "psychology". Include forgedToolsUsed.`,
43
+ },
44
+ {
45
+ department: 'governance',
46
+ role: 'Governance Advisor',
47
+ model: 'gpt-5.4',
48
+ instructions: `You are the Governance Advisor. You analyze self-sufficiency, Earth dependency, political pressure, independence readiness.
49
+
50
+ You MUST use forge_tool at least once per turn: independence readiness scorer, supply dependency calculator, or governance risk model. Sandbox code MUST be: function execute(input) { return result; } with allowlist: [].
51
+
52
+ Return JSON matching DepartmentReport schema with department "governance". Include forgedToolsUsed.`,
53
+ },
54
+ ];
55
+ export function buildDepartmentContext(dept, state, scenario, researchPacket, previousTurns, departmentPromptHook) {
56
+ const alive = state.agents.filter(c => c.health.alive);
57
+ const featured = alive.filter(c => c.narrative.featured);
58
+ const deptNote = researchPacket.departmentNotes[dept] || '';
59
+ // Inject promoted leader's evolving HEXACO profile
60
+ const leader = state.agents.find(c => c.promotion?.department === dept && c.health.alive);
61
+ const hexacoBlock = [];
62
+ if (leader) {
63
+ const h = leader.hexaco;
64
+ hexacoBlock.push('', 'YOUR PERSONALITY PROFILE (evolves over time based on leadership and experience):', `Openness: ${h.openness.toFixed(2)} | Conscientiousness: ${h.conscientiousness.toFixed(2)} | Extraversion: ${h.extraversion.toFixed(2)}`, `Agreeableness: ${h.agreeableness.toFixed(2)} | Emotionality: ${h.emotionality.toFixed(2)} | Honesty-Humility: ${h.honestyHumility.toFixed(2)}`, 'Higher openness: consider novel solutions. Higher conscientiousness: demand evidence. Higher emotionality: weigh human impact.', '');
65
+ }
66
+ // Build memory block from previous turns
67
+ const memoryBlock = [];
68
+ if (previousTurns?.length) {
69
+ memoryBlock.push('', 'YOUR PREVIOUS ANALYSES (remember what you recommended and what happened):');
70
+ for (const m of previousTurns.slice(-3)) {
71
+ memoryBlock.push(` Turn ${m.turn} (${m.year}): "${m.crisis}" → ${m.outcome}`);
72
+ if (m.summary)
73
+ memoryBlock.push(` Your analysis: ${m.summary.slice(0, 120)}`);
74
+ if (m.recommendedActions.length)
75
+ memoryBlock.push(` You recommended: ${m.recommendedActions.slice(0, 2).join('; ')}`);
76
+ if (m.toolsForged.length)
77
+ memoryBlock.push(` Tools you forged: ${m.toolsForged.join(', ')}`);
78
+ }
79
+ memoryBlock.push('Build on your previous work. Reference your past tools and recommendations where relevant.', '');
80
+ }
81
+ const lines = [
82
+ `TURN ${state.metadata.currentTurn} — YEAR ${state.metadata.currentYear}: ${scenario.title}`,
83
+ ...hexacoBlock,
84
+ ...memoryBlock,
85
+ '', scenario.crisis, '',
86
+ 'RESEARCH:',
87
+ ...researchPacket.canonicalFacts.map(f => `- ${f.claim} [${f.source}](${f.url})`),
88
+ ...(researchPacket.counterpoints.length ? ['COUNTERPOINTS:', ...researchPacket.counterpoints.map(c => `- ${c.claim} [${c.source}](${c.url})`)] : []),
89
+ ...(deptNote ? [`NOTE: ${deptNote}`] : []),
90
+ '',
91
+ `COLONY: Pop ${state.colony.population} | Morale ${Math.round(state.colony.morale * 100)}% | Food ${state.colony.foodMonthsReserve.toFixed(1)}mo | Water ${state.colony.waterLitersPerDay} L/day | Power ${state.colony.powerKw} kW | Modules ${state.colony.infrastructureModules} | Life support ${state.colony.lifeSupportCapacity}`,
92
+ '',
93
+ ];
94
+ // Domain-specific department context: from scenario hook or fallback
95
+ if (departmentPromptHook) {
96
+ const hookLines = departmentPromptHook({ department: dept, state, scenario, researchPacket });
97
+ lines.push(...hookLines);
98
+ }
99
+ return lines.join('\n');
100
+ }
101
+ export function getDepartmentsForTurn(turn) {
102
+ const deps = ['medical', 'engineering'];
103
+ if ([2, 3, 4, 8, 11, 12].includes(turn))
104
+ deps.push('agriculture');
105
+ if ([4, 6, 8, 9, 11, 12].includes(turn))
106
+ deps.push('psychology');
107
+ if (turn >= 9)
108
+ deps.push('governance');
109
+ return deps;
110
+ }
111
+ //# sourceMappingURL=departments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"departments.js","sourceRoot":"","sources":["../../src/runtime/departments.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,kBAAkB,GAAuB;IACpD;QACE,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE;;;;;;mqBAMipB;KAChqB;IACD;QACE,UAAU,EAAE,aAAa;QACzB,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE;;;;0HAIwG;KACvH;IACD;QACE,UAAU,EAAE,aAAa;QACzB,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE;;;;qGAImF;KAClG;IACD;QACE,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE;;;;oGAIkF;KACjG;IACD;QACE,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE;;;;oGAIkF;KACjG;CACF,CAAC;AAaF,MAAM,UAAU,sBAAsB,CACpC,IAAgB,EAChB,KAAsB,EACtB,QAAkB,EAClB,cAAoC,EACpC,aAAsC,EACtC,oBAAkJ;IAElJ,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5D,mDAAmD;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,WAAW,CAAC,IAAI,CACd,EAAE,EACF,kFAAkF,EAClF,aAAa,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EACxI,kBAAkB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAC/I,gIAAgI,EAChI,EAAE,CACH,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,aAAa,EAAE,MAAM,EAAE,CAAC;QAC1B,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,2EAA2E,CAAC,CAAC;QAClG,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,CAAC,OAAO;gBAAE,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,CAAC,kBAAkB,CAAC,MAAM;gBAAE,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzH,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM;gBAAE,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,4FAA4F,EAAE,EAAE,CAAC,CAAC;IACrH,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,QAAQ,KAAK,CAAC,QAAQ,CAAC,WAAW,WAAW,KAAK,CAAC,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,KAAK,EAAE;QAC5F,GAAG,WAAW;QACd,GAAG,WAAW;QACd,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE;QACvB,WAAW;QACX,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;QACjF,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,GAAG,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,EAAE;QACF,eAAe,KAAK,CAAC,MAAM,CAAC,UAAU,aAAa,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,MAAM,CAAC,iBAAiB,kBAAkB,KAAK,CAAC,MAAM,CAAC,OAAO,iBAAiB,KAAK,CAAC,MAAM,CAAC,qBAAqB,mBAAmB,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE;QACvU,EAAE;KACH,CAAC;IAEF,qEAAqE;IACrE,IAAI,oBAAoB,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,oBAAoB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QAC9F,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,IAAI,GAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjE,IAAI,IAAI,IAAI,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC"}