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.
- package/LICENSE +190 -0
- package/README.md +224 -0
- package/dist/cli/sim-config.d.ts +100 -0
- package/dist/cli/sim-config.d.ts.map +1 -0
- package/dist/cli/sim-config.js +124 -0
- package/dist/cli/sim-config.js.map +1 -0
- package/dist/cli/types.d.ts +73 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/engine/_template/index.d.ts +9 -0
- package/dist/engine/_template/index.d.ts.map +1 -0
- package/dist/engine/_template/index.js +91 -0
- package/dist/engine/_template/index.js.map +1 -0
- package/dist/engine/compiler/cache.d.ts +12 -0
- package/dist/engine/compiler/cache.d.ts.map +1 -0
- package/dist/engine/compiler/cache.js +75 -0
- package/dist/engine/compiler/cache.js.map +1 -0
- package/dist/engine/compiler/generate-director.d.ts +9 -0
- package/dist/engine/compiler/generate-director.d.ts.map +1 -0
- package/dist/engine/compiler/generate-director.js +57 -0
- package/dist/engine/compiler/generate-director.js.map +1 -0
- package/dist/engine/compiler/generate-fingerprint.d.ts +12 -0
- package/dist/engine/compiler/generate-fingerprint.d.ts.map +1 -0
- package/dist/engine/compiler/generate-fingerprint.js +86 -0
- package/dist/engine/compiler/generate-fingerprint.js.map +1 -0
- package/dist/engine/compiler/generate-milestones.d.ts +11 -0
- package/dist/engine/compiler/generate-milestones.d.ts.map +1 -0
- package/dist/engine/compiler/generate-milestones.js +121 -0
- package/dist/engine/compiler/generate-milestones.js.map +1 -0
- package/dist/engine/compiler/generate-politics.d.ts +11 -0
- package/dist/engine/compiler/generate-politics.d.ts.map +1 -0
- package/dist/engine/compiler/generate-politics.js +85 -0
- package/dist/engine/compiler/generate-politics.js.map +1 -0
- package/dist/engine/compiler/generate-progression.d.ts +15 -0
- package/dist/engine/compiler/generate-progression.d.ts.map +1 -0
- package/dist/engine/compiler/generate-progression.js +104 -0
- package/dist/engine/compiler/generate-progression.js.map +1 -0
- package/dist/engine/compiler/generate-prompts.d.ts +11 -0
- package/dist/engine/compiler/generate-prompts.d.ts.map +1 -0
- package/dist/engine/compiler/generate-prompts.js +90 -0
- package/dist/engine/compiler/generate-prompts.js.map +1 -0
- package/dist/engine/compiler/generate-reactions.d.ts +12 -0
- package/dist/engine/compiler/generate-reactions.d.ts.map +1 -0
- package/dist/engine/compiler/generate-reactions.js +90 -0
- package/dist/engine/compiler/generate-reactions.js.map +1 -0
- package/dist/engine/compiler/index.d.ts +34 -0
- package/dist/engine/compiler/index.d.ts.map +1 -0
- package/dist/engine/compiler/index.js +270 -0
- package/dist/engine/compiler/index.js.map +1 -0
- package/dist/engine/compiler/seed-ingestion.d.ts +40 -0
- package/dist/engine/compiler/seed-ingestion.d.ts.map +1 -0
- package/dist/engine/compiler/seed-ingestion.js +232 -0
- package/dist/engine/compiler/seed-ingestion.js.map +1 -0
- package/dist/engine/compiler/types.d.ts +30 -0
- package/dist/engine/compiler/types.d.ts.map +1 -0
- package/dist/engine/compiler/types.js +5 -0
- package/dist/engine/compiler/types.js.map +1 -0
- package/dist/engine/compiler/validate.d.ts +37 -0
- package/dist/engine/compiler/validate.d.ts.map +1 -0
- package/dist/engine/compiler/validate.js +141 -0
- package/dist/engine/compiler/validate.js.map +1 -0
- package/dist/engine/core/agent-generator.d.ts +11 -0
- package/dist/engine/core/agent-generator.d.ts.map +1 -0
- package/dist/engine/core/agent-generator.js +85 -0
- package/dist/engine/core/agent-generator.js.map +1 -0
- package/dist/engine/core/kernel.d.ts +69 -0
- package/dist/engine/core/kernel.d.ts.map +1 -0
- package/dist/engine/core/kernel.js +223 -0
- package/dist/engine/core/kernel.js.map +1 -0
- package/dist/engine/core/progression.d.ts +38 -0
- package/dist/engine/core/progression.d.ts.map +1 -0
- package/dist/engine/core/progression.js +292 -0
- package/dist/engine/core/progression.js.map +1 -0
- package/dist/engine/core/rng.d.ts +19 -0
- package/dist/engine/core/rng.d.ts.map +1 -0
- package/dist/engine/core/rng.js +34 -0
- package/dist/engine/core/rng.js.map +1 -0
- package/dist/engine/core/state.d.ts +144 -0
- package/dist/engine/core/state.d.ts.map +1 -0
- package/dist/engine/core/state.js +5 -0
- package/dist/engine/core/state.js.map +1 -0
- package/dist/engine/effect-registry.d.ts +14 -0
- package/dist/engine/effect-registry.d.ts.map +1 -0
- package/dist/engine/effect-registry.js +28 -0
- package/dist/engine/effect-registry.js.map +1 -0
- package/dist/engine/event-taxonomy.d.ts +9 -0
- package/dist/engine/event-taxonomy.d.ts.map +1 -0
- package/dist/engine/event-taxonomy.js +13 -0
- package/dist/engine/event-taxonomy.js.map +1 -0
- package/dist/engine/index.d.ts +25 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +19 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/lunar/effects.d.ts +7 -0
- package/dist/engine/lunar/effects.d.ts.map +1 -0
- package/dist/engine/lunar/effects.js +16 -0
- package/dist/engine/lunar/effects.js.map +1 -0
- package/dist/engine/lunar/events.d.ts +3 -0
- package/dist/engine/lunar/events.d.ts.map +1 -0
- package/dist/engine/lunar/events.js +11 -0
- package/dist/engine/lunar/events.js.map +1 -0
- package/dist/engine/lunar/fingerprint.d.ts +5 -0
- package/dist/engine/lunar/fingerprint.d.ts.map +1 -0
- package/dist/engine/lunar/fingerprint.js +17 -0
- package/dist/engine/lunar/fingerprint.js.map +1 -0
- package/dist/engine/lunar/hooks.d.ts +10 -0
- package/dist/engine/lunar/hooks.d.ts.map +1 -0
- package/dist/engine/lunar/hooks.js +10 -0
- package/dist/engine/lunar/hooks.js.map +1 -0
- package/dist/engine/lunar/index.d.ts +8 -0
- package/dist/engine/lunar/index.d.ts.map +1 -0
- package/dist/engine/lunar/index.js +38 -0
- package/dist/engine/lunar/index.js.map +1 -0
- package/dist/engine/lunar/metrics.d.ts +4 -0
- package/dist/engine/lunar/metrics.d.ts.map +1 -0
- package/dist/engine/lunar/metrics.js +14 -0
- package/dist/engine/lunar/metrics.js.map +1 -0
- package/dist/engine/lunar/milestones.d.ts +3 -0
- package/dist/engine/lunar/milestones.d.ts.map +1 -0
- package/dist/engine/lunar/milestones.js +53 -0
- package/dist/engine/lunar/milestones.js.map +1 -0
- package/dist/engine/lunar/names.d.ts +4 -0
- package/dist/engine/lunar/names.d.ts.map +1 -0
- package/dist/engine/lunar/names.js +23 -0
- package/dist/engine/lunar/names.js.map +1 -0
- package/dist/engine/lunar/politics.d.ts +6 -0
- package/dist/engine/lunar/politics.d.ts.map +1 -0
- package/dist/engine/lunar/politics.js +13 -0
- package/dist/engine/lunar/politics.js.map +1 -0
- package/dist/engine/lunar/presets.d.ts +25 -0
- package/dist/engine/lunar/presets.d.ts.map +1 -0
- package/dist/engine/lunar/presets.js +24 -0
- package/dist/engine/lunar/presets.js.map +1 -0
- package/dist/engine/lunar/progression-hooks.d.ts +7 -0
- package/dist/engine/lunar/progression-hooks.d.ts.map +1 -0
- package/dist/engine/lunar/progression-hooks.js +20 -0
- package/dist/engine/lunar/progression-hooks.js.map +1 -0
- package/dist/engine/lunar/prompts.d.ts +10 -0
- package/dist/engine/lunar/prompts.d.ts.map +1 -0
- package/dist/engine/lunar/prompts.js +64 -0
- package/dist/engine/lunar/prompts.js.map +1 -0
- package/dist/engine/lunar/reactions.d.ts +5 -0
- package/dist/engine/lunar/reactions.d.ts.map +1 -0
- package/dist/engine/lunar/reactions.js +15 -0
- package/dist/engine/lunar/reactions.js.map +1 -0
- package/dist/engine/lunar/research-bundle.d.ts +8 -0
- package/dist/engine/lunar/research-bundle.d.ts.map +1 -0
- package/dist/engine/lunar/research-bundle.js +157 -0
- package/dist/engine/lunar/research-bundle.js.map +1 -0
- package/dist/engine/lunar/scenario.json +117 -0
- package/dist/engine/mars/effects.d.ts +18 -0
- package/dist/engine/mars/effects.d.ts.map +1 -0
- package/dist/engine/mars/effects.js +21 -0
- package/dist/engine/mars/effects.js.map +1 -0
- package/dist/engine/mars/events.d.ts +9 -0
- package/dist/engine/mars/events.d.ts.map +1 -0
- package/dist/engine/mars/events.js +12 -0
- package/dist/engine/mars/events.js.map +1 -0
- package/dist/engine/mars/fingerprint.d.ts +6 -0
- package/dist/engine/mars/fingerprint.d.ts.map +1 -0
- package/dist/engine/mars/fingerprint.js +21 -0
- package/dist/engine/mars/fingerprint.js.map +1 -0
- package/dist/engine/mars/hooks.d.ts +11 -0
- package/dist/engine/mars/hooks.d.ts.map +1 -0
- package/dist/engine/mars/hooks.js +11 -0
- package/dist/engine/mars/hooks.js.map +1 -0
- package/dist/engine/mars/index.d.ts +8 -0
- package/dist/engine/mars/index.d.ts.map +1 -0
- package/dist/engine/mars/index.js +44 -0
- package/dist/engine/mars/index.js.map +1 -0
- package/dist/engine/mars/metrics.d.ts +21 -0
- package/dist/engine/mars/metrics.d.ts.map +1 -0
- package/dist/engine/mars/metrics.js +25 -0
- package/dist/engine/mars/metrics.js.map +1 -0
- package/dist/engine/mars/milestones.d.ts +15 -0
- package/dist/engine/mars/milestones.d.ts.map +1 -0
- package/dist/engine/mars/milestones.js +72 -0
- package/dist/engine/mars/milestones.js.map +1 -0
- package/dist/engine/mars/names.d.ts +12 -0
- package/dist/engine/mars/names.d.ts.map +1 -0
- package/dist/engine/mars/names.js +45 -0
- package/dist/engine/mars/names.js.map +1 -0
- package/dist/engine/mars/politics.d.ts +7 -0
- package/dist/engine/mars/politics.d.ts.map +1 -0
- package/dist/engine/mars/politics.js +14 -0
- package/dist/engine/mars/politics.js.map +1 -0
- package/dist/engine/mars/presets.d.ts +29 -0
- package/dist/engine/mars/presets.d.ts.map +1 -0
- package/dist/engine/mars/presets.js +28 -0
- package/dist/engine/mars/presets.js.map +1 -0
- package/dist/engine/mars/progression-hooks.d.ts +8 -0
- package/dist/engine/mars/progression-hooks.d.ts.map +1 -0
- package/dist/engine/mars/progression-hooks.js +21 -0
- package/dist/engine/mars/progression-hooks.js.map +1 -0
- package/dist/engine/mars/prompts.d.ts +12 -0
- package/dist/engine/mars/prompts.d.ts.map +1 -0
- package/dist/engine/mars/prompts.js +75 -0
- package/dist/engine/mars/prompts.js.map +1 -0
- package/dist/engine/mars/reactions.d.ts +7 -0
- package/dist/engine/mars/reactions.d.ts.map +1 -0
- package/dist/engine/mars/reactions.js +24 -0
- package/dist/engine/mars/reactions.js.map +1 -0
- package/dist/engine/mars/research-bundle.d.ts +7 -0
- package/dist/engine/mars/research-bundle.d.ts.map +1 -0
- package/dist/engine/mars/research-bundle.js +174 -0
- package/dist/engine/mars/research-bundle.js.map +1 -0
- package/dist/engine/mars/scenario.json +118 -0
- package/dist/engine/metric-registry.d.ts +12 -0
- package/dist/engine/metric-registry.d.ts.map +1 -0
- package/dist/engine/metric-registry.js +26 -0
- package/dist/engine/metric-registry.js.map +1 -0
- package/dist/engine/types.d.ts +349 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +7 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/runtime/agent-memory.d.ts +43 -0
- package/dist/runtime/agent-memory.d.ts.map +1 -0
- package/dist/runtime/agent-memory.js +201 -0
- package/dist/runtime/agent-memory.js.map +1 -0
- package/dist/runtime/agent-reactions.d.ts +55 -0
- package/dist/runtime/agent-reactions.d.ts.map +1 -0
- package/dist/runtime/agent-reactions.js +136 -0
- package/dist/runtime/agent-reactions.js.map +1 -0
- package/dist/runtime/batch.d.ts +43 -0
- package/dist/runtime/batch.d.ts.map +1 -0
- package/dist/runtime/batch.js +49 -0
- package/dist/runtime/batch.js.map +1 -0
- package/dist/runtime/contracts.d.ts +127 -0
- package/dist/runtime/contracts.d.ts.map +1 -0
- package/dist/runtime/contracts.js +2 -0
- package/dist/runtime/contracts.js.map +1 -0
- package/dist/runtime/departments.d.ts +28 -0
- package/dist/runtime/departments.d.ts.map +1 -0
- package/dist/runtime/departments.js +111 -0
- package/dist/runtime/departments.js.map +1 -0
- package/dist/runtime/director.d.ts +92 -0
- package/dist/runtime/director.d.ts.map +1 -0
- package/dist/runtime/director.js +220 -0
- package/dist/runtime/director.js.map +1 -0
- package/dist/runtime/index.d.ts +16 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +12 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/orchestrator.d.ts +66 -0
- package/dist/runtime/orchestrator.d.ts.map +1 -0
- package/dist/runtime/orchestrator.js +821 -0
- package/dist/runtime/orchestrator.js.map +1 -0
- package/dist/runtime/research/knowledge-base.d.ts +14 -0
- package/dist/runtime/research/knowledge-base.d.ts.map +1 -0
- package/dist/runtime/research/knowledge-base.js +229 -0
- package/dist/runtime/research/knowledge-base.js.map +1 -0
- package/dist/runtime/research/research-memory.d.ts +21 -0
- package/dist/runtime/research/research-memory.d.ts.map +1 -0
- package/dist/runtime/research/research-memory.js +118 -0
- package/dist/runtime/research/research-memory.js.map +1 -0
- package/dist/runtime/research/research.d.ts +4 -0
- package/dist/runtime/research/research.d.ts.map +1 -0
- package/dist/runtime/research/research.js +138 -0
- package/dist/runtime/research/research.js.map +1 -0
- package/dist/runtime/research/scenario-research.d.ts +13 -0
- package/dist/runtime/research/scenario-research.d.ts.map +1 -0
- package/dist/runtime/research/scenario-research.js +58 -0
- package/dist/runtime/research/scenario-research.js.map +1 -0
- package/dist/runtime/research/scenarios.d.ts +3 -0
- package/dist/runtime/research/scenarios.d.ts.map +1 -0
- package/dist/runtime/research/scenarios.js +252 -0
- package/dist/runtime/research/scenarios.js.map +1 -0
- package/dist/runtime/runtime-helpers.d.ts +12 -0
- package/dist/runtime/runtime-helpers.d.ts.map +1 -0
- package/dist/runtime/runtime-helpers.js +33 -0
- package/dist/runtime/runtime-helpers.js.map +1 -0
- package/package.json +78 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-milestones.js","sourceRoot":"","sources":["../../../src/engine/compiler/generate-milestones.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,SAAS,WAAW,CAAC,YAAiC;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhF,OAAO;;YAEG,MAAM,CAAC,IAAI,IAAI,SAAS;mBACjB,MAAM,CAAC,cAAc,IAAI,YAAY;mBACrC,MAAM,CAAC,cAAc,IAAI,SAAS;eACtC,KAAK;iBACH,YAAY,CAAC,KAAK,EAAE,YAAY,IAAI,EAAE;;;;mCAIpB,MAAM,CAAC,cAAc,kBAAkB,MAAM,CAAC,cAAc;;yCAEtD,MAAM,CAAC,cAAc;;;;;;;;;;;;;;;;;;uFAkByB,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAElF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1F,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAiC,EACjC,YAA4B,EAC5B,UAAU,GAAG,CAAC;IAEd,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,gCAAgC,SAAS,wCAAwC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS,GAAG,uCAAuC,CAAC;YACpD,SAAS;QACX,CAAC;QAED,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;QAElC,OAAO;YACL,IAAI,EAAE,CAAC,IAAY,EAAE,QAAgB,EAAE,EAAE;gBACvC,IAAI,IAAI,KAAK,CAAC;oBAAE,OAAO,QAAQ,CAAC;gBAChC,IAAI,IAAI,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAsB;QAC1C,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,OAAO,MAAM,CAAC,cAAc,IAAI,SAAS,wBAAwB,MAAM,CAAC,cAAc,IAAI,YAAY,iCAAiC;QACpJ,MAAM,EAAE,OAAO,MAAM,CAAC,cAAc,IAAI,SAAS,wBAAwB,MAAM,CAAC,cAAc,IAAI,YAAY,iCAAiC;QAC/I,OAAO,EAAE;YACP,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,qCAAqC,EAAE,OAAO,EAAE,KAAK,EAAE;YACnH,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,2CAA2C,EAAE,OAAO,EAAE,IAAI,EAAE;SACtH;QACD,aAAa,EAAE,UAAU;QACzB,sBAAsB,EAAE,GAAG;QAC3B,QAAQ,EAAE,gBAAgB;QAC1B,gBAAgB,EAAE,CAAC,MAAM,CAAC,cAAc,IAAI,YAAY,CAAC;QACzD,mBAAmB,EAAE,CAAC,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,WAAW,EAAE,OAAO,MAAM,CAAC,cAAc,IAAI,YAAY,gDAAgD;KAC1G,CAAC;IAEF,MAAM,cAAc,GAAsB;QACxC,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,+CAA+C,MAAM,CAAC,cAAc,IAAI,YAAY,GAAG;QACpG,MAAM,EAAE,+CAA+C,MAAM,CAAC,cAAc,IAAI,YAAY,GAAG;QAC/F,OAAO,EAAE;YACP,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,sCAAsC,EAAE,OAAO,EAAE,KAAK,EAAE;YACnH,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,6CAA6C,EAAE,OAAO,EAAE,IAAI,EAAE;SAC7H;QACD,aAAa,EAAE,UAAU;QACzB,sBAAsB,EAAE,GAAG;QAC3B,QAAQ,EAAE,WAAW;QACrB,gBAAgB,EAAE,EAAE;QACpB,mBAAmB,EAAE,CAAC,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,WAAW,EAAE,sCAAsC;KACpD,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACnF,OAAO;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,gBAAgB,CAAC;YACxC,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,cAAc,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KACpE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a politics hook from scenario JSON via LLM.
|
|
3
|
+
* The politics hook returns delta values for political/social crisis outcomes.
|
|
4
|
+
*/
|
|
5
|
+
import type { GenerateTextFn } from './types.js';
|
|
6
|
+
export declare function parseResponse(text: string): ((category: string, outcome: string) => Record<string, number> | null) | null;
|
|
7
|
+
export declare function generatePoliticsHook(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
|
|
8
|
+
hook: (category: string, outcome: string) => Record<string, number> | null;
|
|
9
|
+
source: string;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=generate-politics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-politics.d.ts","sourceRoot":"","sources":["../../../src/engine/compiler/generate-politics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAsCjD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAYzH;AAED,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,UAAU,SAAI,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCzG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a politics hook from scenario JSON via LLM.
|
|
3
|
+
* The politics hook returns delta values for political/social crisis outcomes.
|
|
4
|
+
*/
|
|
5
|
+
function buildPrompt(scenarioJson) {
|
|
6
|
+
const labels = scenarioJson.labels ?? {};
|
|
7
|
+
const effects = scenarioJson.effects ?? {};
|
|
8
|
+
const categories = typeof effects === 'object' && !Array.isArray(effects)
|
|
9
|
+
? Object.keys(effects)
|
|
10
|
+
: [];
|
|
11
|
+
return `You are generating a politics hook for a simulation engine.
|
|
12
|
+
|
|
13
|
+
SCENARIO: ${labels.name ?? 'Unknown'} — ${labels.settlementNoun ?? 'settlement'} simulation
|
|
14
|
+
CRISIS CATEGORIES: ${categories.join(', ')}
|
|
15
|
+
|
|
16
|
+
Generate a TypeScript arrow function that returns politics deltas for political/social crisis outcomes.
|
|
17
|
+
|
|
18
|
+
The function receives:
|
|
19
|
+
- category: string (one of the crisis categories above)
|
|
20
|
+
- outcome: string (contains "success" or "failure")
|
|
21
|
+
|
|
22
|
+
Return:
|
|
23
|
+
- null if the category is not political/social in nature
|
|
24
|
+
- A Record<string, number> of politics field deltas for political/social categories
|
|
25
|
+
|
|
26
|
+
For success outcomes, the deltas should push toward independence/autonomy.
|
|
27
|
+
For failure outcomes, the deltas should push toward dependency/instability.
|
|
28
|
+
|
|
29
|
+
Pick 1-3 politics field names appropriate to this scenario's domain.
|
|
30
|
+
|
|
31
|
+
Rules:
|
|
32
|
+
1. Return null for non-political categories
|
|
33
|
+
2. Return a plain object with numeric deltas for political categories
|
|
34
|
+
3. Do NOT use external imports
|
|
35
|
+
4. Keep delta values small (e.g., 0.01-0.10 for percentages, 1-5 for integers)
|
|
36
|
+
|
|
37
|
+
Return ONLY the arrow function, no markdown fences, no explanation.`;
|
|
38
|
+
}
|
|
39
|
+
export function parseResponse(text) {
|
|
40
|
+
let cleaned = text.trim();
|
|
41
|
+
cleaned = cleaned.replace(/^```(?:typescript|ts)?\n?/i, '').replace(/\n?```$/i, '').trim();
|
|
42
|
+
if (cleaned.endsWith(';'))
|
|
43
|
+
cleaned = cleaned.slice(0, -1).trim();
|
|
44
|
+
try {
|
|
45
|
+
const fn = new Function('return ' + cleaned)();
|
|
46
|
+
if (typeof fn === 'function')
|
|
47
|
+
return fn;
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function generatePoliticsHook(scenarioJson, generateText, maxRetries = 3) {
|
|
55
|
+
let lastError = '';
|
|
56
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
57
|
+
const retryHint = attempt > 0 ? `\n\nPrevious attempt failed: ${lastError}. Fix the issue.` : '';
|
|
58
|
+
const text = await generateText(buildPrompt(scenarioJson) + retryHint);
|
|
59
|
+
const fn = parseResponse(text);
|
|
60
|
+
if (!fn) {
|
|
61
|
+
lastError = 'Could not parse response into a function';
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Smoke test
|
|
65
|
+
try {
|
|
66
|
+
const nonPolitical = fn('environmental', 'risky_success');
|
|
67
|
+
const political = fn('political', 'risky_success');
|
|
68
|
+
if (political !== null && typeof political !== 'object') {
|
|
69
|
+
lastError = 'Political result must be null or object';
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
return { hook: fn, source: text.trim() };
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
lastError = String(err);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Fallback: no-op
|
|
79
|
+
console.warn('[compiler] Politics hook generation failed. Using no-op.');
|
|
80
|
+
return {
|
|
81
|
+
hook: () => null,
|
|
82
|
+
source: '// No-op: generation failed',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=generate-politics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-politics.js","sourceRoot":"","sources":["../../../src/engine/compiler/generate-politics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a progression hook from scenario JSON via LLM.
|
|
3
|
+
* The progression hook applies between-turn health/status changes
|
|
4
|
+
* based on the scenario's environment and domain.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProgressionHookContext } from '../types.js';
|
|
7
|
+
import type { GenerateTextFn } from './types.js';
|
|
8
|
+
/** Parse the LLM response into an executable function. */
|
|
9
|
+
export declare function parseResponse(text: string): ((ctx: ProgressionHookContext) => void) | null;
|
|
10
|
+
/** Generate a progression hook via LLM, with retries on validation failure. */
|
|
11
|
+
export declare function generateProgressionHook(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
|
|
12
|
+
hook: (ctx: ProgressionHookContext) => void;
|
|
13
|
+
source: string;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=generate-progression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-progression.d.ts","sourceRoot":"","sources":["../../../src/engine/compiler/generate-progression.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqCjD,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,CAAC,GAAG,IAAI,CAqB1F;AAED,+EAA+E;AAC/E,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,GAAG,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAwC1E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a progression hook from scenario JSON via LLM.
|
|
3
|
+
* The progression hook applies between-turn health/status changes
|
|
4
|
+
* based on the scenario's environment and domain.
|
|
5
|
+
*/
|
|
6
|
+
/** Build the prompt for generating a progression hook. */
|
|
7
|
+
function buildPrompt(scenarioJson) {
|
|
8
|
+
const labels = scenarioJson.labels ?? {};
|
|
9
|
+
const env = scenarioJson.world?.environment ?? {};
|
|
10
|
+
const depts = (scenarioJson.departments ?? []).map((d) => d.id).join(', ');
|
|
11
|
+
return `You are generating a between-turn progression hook for a simulation engine.
|
|
12
|
+
|
|
13
|
+
SCENARIO: ${labels.name ?? 'Unknown'} — ${labels.settlementNoun ?? 'settlement'} simulation
|
|
14
|
+
POPULATION NOUN: ${labels.populationNoun ?? 'members'}
|
|
15
|
+
SETTLEMENT: ${labels.settlementNoun ?? 'settlement'}
|
|
16
|
+
ENVIRONMENT VARIABLES: ${JSON.stringify(env, null, 2)}
|
|
17
|
+
DEPARTMENTS: ${depts}
|
|
18
|
+
|
|
19
|
+
Generate a TypeScript function body for a progression hook. The function receives a context object with these fields:
|
|
20
|
+
- ctx.agents: array of agent objects with { core: { marsborn: boolean, birthYear: number, name: string }, health: { alive: boolean, boneDensityPct: number, cumulativeRadiationMsv: number, psychScore: number } }
|
|
21
|
+
- ctx.yearDelta: number of simulated years since last turn
|
|
22
|
+
- ctx.year: current simulated year
|
|
23
|
+
- ctx.turn: current turn number
|
|
24
|
+
- ctx.startYear: simulation start year
|
|
25
|
+
- ctx.rng: { chance(p: number): boolean, next(): number, pick<T>(arr: T[]): T, int(min: number, max: number): number }
|
|
26
|
+
|
|
27
|
+
Rules:
|
|
28
|
+
1. Only modify health fields on ALIVE agents (check c.health.alive first, iterate ctx.agents)
|
|
29
|
+
2. Use environment-appropriate health degradation for this scenario's domain
|
|
30
|
+
3. Multiply time-scaled effects by ctx.yearDelta
|
|
31
|
+
4. Use Math.max/Math.min to keep values bounded (boneDensityPct: 0-100, psychScore: 0-1, cumulativeRadiationMsv: >= 0)
|
|
32
|
+
5. Do NOT use external imports, do NOT use require()
|
|
33
|
+
6. The function signature is: (ctx: ProgressionHookContext) => void
|
|
34
|
+
7. Use ctx.rng.chance(p) for probabilistic effects instead of Math.random()
|
|
35
|
+
|
|
36
|
+
Return ONLY the complete function as a TypeScript arrow function, no explanation, no markdown fences. Example format:
|
|
37
|
+
(ctx) => { for (const c of ctx.agents) { if (!c.health.alive) continue; /* effects */ } }`;
|
|
38
|
+
}
|
|
39
|
+
/** Parse the LLM response into an executable function. */
|
|
40
|
+
export function parseResponse(text) {
|
|
41
|
+
let cleaned = text.trim();
|
|
42
|
+
// Strip markdown fences if present
|
|
43
|
+
cleaned = cleaned.replace(/^```(?:typescript|ts)?\n?/i, '').replace(/\n?```$/i, '').trim();
|
|
44
|
+
// Strip trailing semicolons
|
|
45
|
+
if (cleaned.endsWith(';'))
|
|
46
|
+
cleaned = cleaned.slice(0, -1).trim();
|
|
47
|
+
try {
|
|
48
|
+
// Wrap in a function constructor
|
|
49
|
+
const fn = new Function('return ' + cleaned)();
|
|
50
|
+
if (typeof fn === 'function')
|
|
51
|
+
return fn;
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Try wrapping as function body if it's just statements
|
|
56
|
+
try {
|
|
57
|
+
const fn = new Function('ctx', cleaned);
|
|
58
|
+
return (ctx) => fn(ctx);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Generate a progression hook via LLM, with retries on validation failure. */
|
|
66
|
+
export async function generateProgressionHook(scenarioJson, generateText, maxRetries = 3) {
|
|
67
|
+
const prompt = buildPrompt(scenarioJson);
|
|
68
|
+
let lastError = '';
|
|
69
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
70
|
+
const retryHint = attempt > 0 ? `\n\nPrevious attempt failed: ${lastError}. Fix the issue.` : '';
|
|
71
|
+
const text = await generateText(prompt + retryHint);
|
|
72
|
+
const fn = parseResponse(text);
|
|
73
|
+
if (!fn) {
|
|
74
|
+
lastError = 'Could not parse response into a function';
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Quick smoke test
|
|
78
|
+
try {
|
|
79
|
+
const testColonists = [
|
|
80
|
+
{ core: { marsborn: false, birthYear: 2010, name: 'Test' }, health: { alive: true, boneDensityPct: 95, cumulativeRadiationMsv: 100, psychScore: 0.7 }, career: {}, social: {}, narrative: {}, hexaco: {} },
|
|
81
|
+
{ core: { marsborn: false, birthYear: 2010, name: 'Dead' }, health: { alive: false, boneDensityPct: 80, cumulativeRadiationMsv: 50, psychScore: 0.5 }, career: {}, social: {}, narrative: {}, hexaco: {} },
|
|
82
|
+
];
|
|
83
|
+
fn({
|
|
84
|
+
agents: testColonists,
|
|
85
|
+
yearDelta: 4,
|
|
86
|
+
year: 2045,
|
|
87
|
+
turn: 3,
|
|
88
|
+
startYear: 2035,
|
|
89
|
+
rng: { chance: () => false, next: () => 0.5, pick: (arr) => arr[0], int: (min, max) => min },
|
|
90
|
+
});
|
|
91
|
+
return { hook: fn, source: text.trim() };
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
lastError = String(err);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Fallback: no-op hook
|
|
98
|
+
console.warn(`[compiler] Progression hook generation failed after ${maxRetries} retries. Using no-op.`);
|
|
99
|
+
return {
|
|
100
|
+
hook: () => { },
|
|
101
|
+
source: '// No-op: generation failed',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=generate-progression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-progression.js","sourceRoot":"","sources":["../../../src/engine/compiler/generate-progression.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a department prompt hook from scenario JSON via LLM.
|
|
3
|
+
* The department prompt hook builds context lines for each department agent.
|
|
4
|
+
*/
|
|
5
|
+
import type { GenerateTextFn } from './types.js';
|
|
6
|
+
export declare function parseResponse(text: string): ((ctx: any) => string[]) | null;
|
|
7
|
+
export declare function generateDepartmentPromptHook(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
|
|
8
|
+
hook: (ctx: any) => string[];
|
|
9
|
+
source: string;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=generate-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-prompts.d.ts","sourceRoot":"","sources":["../../../src/engine/compiler/generate-prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAiCjD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,CAAC,GAAG,IAAI,CAY3E;AAED,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,UAAU,SAAI,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA2C3D"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a department prompt hook from scenario JSON via LLM.
|
|
3
|
+
* The department prompt hook builds context lines for each department agent.
|
|
4
|
+
*/
|
|
5
|
+
function buildPrompt(scenarioJson) {
|
|
6
|
+
const labels = scenarioJson.labels ?? {};
|
|
7
|
+
const depts = (scenarioJson.departments ?? []).map((d) => `- ${d.id}: ${d.label} (${d.role}) — ${d.instructions}`).join('\n');
|
|
8
|
+
return `You are generating a department prompt hook for a simulation engine.
|
|
9
|
+
|
|
10
|
+
SCENARIO: ${labels.name ?? 'Unknown'} — ${labels.settlementNoun ?? 'settlement'} simulation
|
|
11
|
+
DEPARTMENTS:
|
|
12
|
+
${depts}
|
|
13
|
+
|
|
14
|
+
Generate a TypeScript arrow function that returns an array of context lines for a specific department. The function receives a context object:
|
|
15
|
+
- ctx.department: string (department ID, one of the above)
|
|
16
|
+
- ctx.state: { agents: array, colony: Record<string, number>, politics: Record<string, any>, metadata: { currentYear: number } }
|
|
17
|
+
- ctx.scenario: any (scenario data)
|
|
18
|
+
- ctx.researchPacket: { canonicalFacts: array, counterpoints: array, departmentNotes: Record<string, string> }
|
|
19
|
+
|
|
20
|
+
For each department, compute and return 2-4 lines of scenario-relevant statistics from ctx.state. Each line should be a section header followed by numbers/stats.
|
|
21
|
+
|
|
22
|
+
Example output: ['HEALTH:', 'Avg radiation: 150 mSv | Avg bone: 85% | Population: 80']
|
|
23
|
+
|
|
24
|
+
Rules:
|
|
25
|
+
1. Use a switch statement on ctx.department with a case for each department ID
|
|
26
|
+
2. Access ctx.state.agents (filter alive ones), ctx.state.colony (numeric metrics), ctx.state.politics
|
|
27
|
+
3. Compute averages, counts, and status summaries relevant to each department
|
|
28
|
+
4. Return string[] (array of context lines)
|
|
29
|
+
5. Return an empty array for unknown departments
|
|
30
|
+
6. Do NOT use external imports
|
|
31
|
+
|
|
32
|
+
Return ONLY the arrow function, no markdown fences, no explanation.`;
|
|
33
|
+
}
|
|
34
|
+
export function parseResponse(text) {
|
|
35
|
+
let cleaned = text.trim();
|
|
36
|
+
cleaned = cleaned.replace(/^```(?:typescript|ts)?\n?/i, '').replace(/\n?```$/i, '').trim();
|
|
37
|
+
if (cleaned.endsWith(';'))
|
|
38
|
+
cleaned = cleaned.slice(0, -1).trim();
|
|
39
|
+
try {
|
|
40
|
+
const fn = new Function('return ' + cleaned)();
|
|
41
|
+
if (typeof fn === 'function')
|
|
42
|
+
return fn;
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function generateDepartmentPromptHook(scenarioJson, generateText, maxRetries = 3) {
|
|
50
|
+
let lastError = '';
|
|
51
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
52
|
+
const retryHint = attempt > 0 ? `\n\nPrevious attempt failed: ${lastError}. Fix the issue.` : '';
|
|
53
|
+
const text = await generateText(buildPrompt(scenarioJson) + retryHint);
|
|
54
|
+
const fn = parseResponse(text);
|
|
55
|
+
if (!fn) {
|
|
56
|
+
lastError = 'Could not parse response into a function';
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
// Smoke test
|
|
60
|
+
try {
|
|
61
|
+
const deptId = (scenarioJson.departments ?? [])[0]?.id ?? 'engineering';
|
|
62
|
+
const result = fn({
|
|
63
|
+
department: deptId,
|
|
64
|
+
state: {
|
|
65
|
+
agents: [{ core: { name: 'Test' }, health: { alive: true, boneDensityPct: 90, cumulativeRadiationMsv: 100, psychScore: 0.7 } }],
|
|
66
|
+
colony: { morale: 0.6, population: 80, foodMonthsReserve: 6, powerKw: 300, infrastructureModules: 10, scienceOutput: 5, lifeSupportCapacity: 100 },
|
|
67
|
+
politics: { earthDependencyPct: 50, governanceStatus: 'colonial' },
|
|
68
|
+
metadata: { currentYear: 2045 },
|
|
69
|
+
},
|
|
70
|
+
scenario: scenarioJson,
|
|
71
|
+
researchPacket: { canonicalFacts: [], counterpoints: [], departmentNotes: {} },
|
|
72
|
+
});
|
|
73
|
+
if (!Array.isArray(result)) {
|
|
74
|
+
lastError = 'Must return an array of strings';
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
return { hook: fn, source: text.trim() };
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
lastError = String(err);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Fallback: empty lines
|
|
84
|
+
console.warn('[compiler] Department prompt hook generation failed. Using fallback.');
|
|
85
|
+
return {
|
|
86
|
+
hook: (ctx) => [`[${ctx.department}] No scenario-specific context available.`],
|
|
87
|
+
source: '// Fallback department prompts',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=generate-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-prompts.js","sourceRoot":"","sources":["../../../src/engine/compiler/generate-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a reaction context hook from scenario JSON via LLM.
|
|
3
|
+
* The reaction context hook returns location/identity/health phrasing
|
|
4
|
+
* for individual colonist reaction prompts.
|
|
5
|
+
*/
|
|
6
|
+
import type { GenerateTextFn } from './types.js';
|
|
7
|
+
export declare function parseResponse(text: string): ((colonist: any, ctx: any) => string) | null;
|
|
8
|
+
export declare function generateReactionContextHook(scenarioJson: Record<string, any>, generateText: GenerateTextFn, maxRetries?: number): Promise<{
|
|
9
|
+
hook: (colonist: any, ctx: any) => string;
|
|
10
|
+
source: string;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=generate-reactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-reactions.d.ts","sourceRoot":"","sources":["../../../src/engine/compiler/generate-reactions.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,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,CAYxF;AAED,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,YAAY,EAAE,cAAc,EAC5B,UAAU,SAAI,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA6CxE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a reaction context hook from scenario JSON via LLM.
|
|
3
|
+
* The reaction context hook returns location/identity/health phrasing
|
|
4
|
+
* for individual colonist reaction prompts.
|
|
5
|
+
*/
|
|
6
|
+
function buildPrompt(scenarioJson) {
|
|
7
|
+
const labels = scenarioJson.labels ?? {};
|
|
8
|
+
return `You are generating a reaction context hook for a simulation engine.
|
|
9
|
+
|
|
10
|
+
SCENARIO: ${labels.name ?? 'Unknown'} — ${labels.settlementNoun ?? 'settlement'} simulation
|
|
11
|
+
POPULATION NOUN: ${labels.populationNoun ?? 'members'}
|
|
12
|
+
START YEAR: ${scenarioJson.setup?.defaultStartYear ?? 2035}
|
|
13
|
+
|
|
14
|
+
Generate a TypeScript arrow function that returns a 1-3 sentence string providing location/identity context for a ${labels.populationNoun ?? 'member'} reaction prompt.
|
|
15
|
+
|
|
16
|
+
The function receives:
|
|
17
|
+
- colonist: { core: { marsborn: boolean, birthYear: number, name: string }, health: { alive: boolean, boneDensityPct: number, cumulativeRadiationMsv: number, psychScore: number } }
|
|
18
|
+
- ctx: { year: number, turn: number }
|
|
19
|
+
|
|
20
|
+
Return a string with:
|
|
21
|
+
1. Identity phrasing (born at the ${labels.settlementNoun ?? 'settlement'} vs arrived from elsewhere)
|
|
22
|
+
2. Health context if relevant (low bone density, high radiation, low psych score)
|
|
23
|
+
3. Scenario-appropriate language
|
|
24
|
+
|
|
25
|
+
Rules:
|
|
26
|
+
1. Return a string, not an object
|
|
27
|
+
2. Keep it to 1-3 short sentences
|
|
28
|
+
3. Reference scenario-specific health concerns
|
|
29
|
+
4. Do NOT use external imports
|
|
30
|
+
|
|
31
|
+
Return ONLY the arrow 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 generateReactionContextHook(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
|
+
// Smoke test
|
|
59
|
+
try {
|
|
60
|
+
const result = fn({ core: { marsborn: false, birthYear: 2010, name: 'Test' }, health: { alive: true, boneDensityPct: 80, cumulativeRadiationMsv: 200, psychScore: 0.6 } }, { year: 2045, turn: 3 });
|
|
61
|
+
if (typeof result !== 'string') {
|
|
62
|
+
lastError = 'Must return a string';
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
return { hook: fn, source: text.trim() };
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
lastError = String(err);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Fallback: generic reaction context
|
|
72
|
+
const labels = scenarioJson.labels ?? {};
|
|
73
|
+
console.warn('[compiler] Reaction context hook generation failed. Using fallback.');
|
|
74
|
+
return {
|
|
75
|
+
hook: (colonist, ctx) => {
|
|
76
|
+
const lines = [];
|
|
77
|
+
if (colonist.core?.marsborn) {
|
|
78
|
+
lines.push(`Born at the ${labels.settlementNoun ?? 'settlement'}.`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push(`Arrived ${ctx.year - (scenarioJson.setup?.defaultStartYear ?? 2035)} years ago.`);
|
|
82
|
+
}
|
|
83
|
+
if (colonist.health?.psychScore < 0.4)
|
|
84
|
+
lines.push('Struggling with low morale.');
|
|
85
|
+
return lines.join(' ');
|
|
86
|
+
},
|
|
87
|
+
source: '// Fallback reaction context',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=generate-reactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-reactions.js","sourceRoot":"","sources":["../../../src/engine/compiler/generate-reactions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,SAAS,WAAW,CAAC,YAAiC;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;IAEzC,OAAO;;YAEG,MAAM,CAAC,IAAI,IAAI,SAAS,MAAM,MAAM,CAAC,cAAc,IAAI,YAAY;mBAC5D,MAAM,CAAC,cAAc,IAAI,SAAS;cACvC,YAAY,CAAC,KAAK,EAAE,gBAAgB,IAAI,IAAI;;oHAE0D,MAAM,CAAC,cAAc,IAAI,QAAQ;;;;;;;oCAOjH,MAAM,CAAC,cAAc,IAAI,YAAY;;;;;;;;;;oEAUL,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3F,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,EAAE,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,YAAiC,EACjC,YAA4B,EAC5B,UAAU,GAAG,CAAC;IAEd,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,gCAAgC,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC;QACvE,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,SAAS,GAAG,0CAA0C,CAAC;YACvD,SAAS;QACX,CAAC;QAED,aAAa;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CACf,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EACvJ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CACxB,CAAC;YACF,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,SAAS,GAAG,sBAAsB,CAAC;gBACnC,SAAS;YACX,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACpF,OAAO;QACL,IAAI,EAAE,CAAC,QAAa,EAAE,GAAQ,EAAE,EAAE;YAChC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,cAAc,IAAI,YAAY,GAAG,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,gBAAgB,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;YAChG,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACjF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,EAAE,8BAA8B;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paracosm Scenario Compiler
|
|
3
|
+
*
|
|
4
|
+
* Takes a raw scenario JSON (the data portion of a ScenarioPackage) and generates
|
|
5
|
+
* all runtime hooks via LLM calls. Returns a complete ScenarioPackage ready to
|
|
6
|
+
* pass to runSimulation().
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { compileScenario } from 'paracosm/compiler';
|
|
11
|
+
* import { runSimulation } from 'paracosm/runtime';
|
|
12
|
+
*
|
|
13
|
+
* const scenario = await compileScenario(submarineJson, {
|
|
14
|
+
* provider: 'anthropic',
|
|
15
|
+
* model: 'claude-sonnet-4-6',
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* const output = await runSimulation(leader, personnel, { scenario, maxTurns: 8 });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import type { ScenarioPackage } from '../types.js';
|
|
22
|
+
import type { CompileOptions, GenerateTextFn } from './types.js';
|
|
23
|
+
export type { CompileOptions, GenerateTextFn };
|
|
24
|
+
export { ingestSeed, ingestFromUrl } from './seed-ingestion.js';
|
|
25
|
+
export type { SeedIngestionOptions } from './seed-ingestion.js';
|
|
26
|
+
/**
|
|
27
|
+
* Compile a scenario JSON into a complete ScenarioPackage with generated hooks.
|
|
28
|
+
*
|
|
29
|
+
* @param scenarioJson - The data portion of a scenario (labels, departments, metrics, effects, etc.)
|
|
30
|
+
* @param options - Compiler options (provider, model, cache settings)
|
|
31
|
+
* @returns A complete ScenarioPackage ready for runSimulation()
|
|
32
|
+
*/
|
|
33
|
+
export declare function compileScenario(scenarioJson: Record<string, unknown>, options?: CompileOptions): Promise<ScenarioPackage>;
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/compiler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAYjE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAsEhE;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAsJ1B"}
|