@neuroverseos/nv-sim 0.1.2 → 0.1.4

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.
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ /**
3
+ * Scenario Library — Named Multi-Event Stress Scenarios
4
+ *
5
+ * The layer that turns NV-SIM from a simulation engine into
6
+ * a scenario modeling platform.
7
+ *
8
+ * Instead of manually wiring events:
9
+ * nv-sim compare --inject tanker_explosion@3,sanctions@5
10
+ *
11
+ * Users run named scenarios:
12
+ * nv-sim scenario taiwan_crisis
13
+ *
14
+ * Each scenario bundles a world preset + a sequence of narrative events
15
+ * that model a realistic multi-phase crisis.
16
+ *
17
+ * Usage:
18
+ * nv-sim scenario taiwan_crisis
19
+ * nv-sim scenario bank_run
20
+ * nv-sim scenario oil_shock --compare
21
+ * nv-sim scenarios # List all
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.SCENARIO_LIBRARY = void 0;
25
+ exports.resolveScenarioEvents = resolveScenarioEvents;
26
+ exports.getScenariosByCategory = getScenariosByCategory;
27
+ const narrativeInjection_1 = require("./narrativeInjection");
28
+ // ============================================
29
+ // BUILT-IN SCENARIOS
30
+ // ============================================
31
+ exports.SCENARIO_LIBRARY = {
32
+ // --- Geopolitical ---
33
+ taiwan_crisis: {
34
+ id: "taiwan_crisis",
35
+ title: "Taiwan Strait Crisis",
36
+ description: "Military escalation near Taiwan triggers cascading economic and diplomatic shocks",
37
+ world: "strait_of_hormuz",
38
+ events: [
39
+ "taiwan_exercises@2",
40
+ "sanctions@4",
41
+ "flash_crash_rumor@5",
42
+ "rate_cut@7",
43
+ ],
44
+ compareWorlds: ["trading"],
45
+ category: "geopolitical",
46
+ rounds: 8,
47
+ },
48
+ hormuz_blockade: {
49
+ id: "hormuz_blockade",
50
+ title: "Strait of Hormuz Blockade",
51
+ description: "Tanker attack escalates to full shipping disruption with energy market cascade",
52
+ world: "strait_of_hormuz",
53
+ events: [
54
+ "tanker_explosion@2",
55
+ "sanctions@4",
56
+ "oil_discovery@6",
57
+ ],
58
+ compareWorlds: ["gas_price_spike"],
59
+ category: "geopolitical",
60
+ rounds: 7,
61
+ },
62
+ // --- Financial ---
63
+ bank_run: {
64
+ id: "bank_run",
65
+ title: "Banking Crisis — Contagion Cascade",
66
+ description: "Major bank insolvency triggers contagion, liquidity crisis, and emergency intervention",
67
+ world: "trading",
68
+ events: [
69
+ "bank_collapse@2",
70
+ "flash_crash_rumor@3",
71
+ "rate_cut@4",
72
+ "stimulus_package@6",
73
+ ],
74
+ compareWorlds: ["gas_price_spike"],
75
+ category: "financial",
76
+ rounds: 7,
77
+ },
78
+ flash_cascade: {
79
+ id: "flash_cascade",
80
+ title: "Flash Crash — Multi-Phase Cascade",
81
+ description: "Algorithmic failure triggers chain reaction across interconnected markets",
82
+ world: "trading",
83
+ events: [
84
+ "flash_crash_rumor@1",
85
+ "bank_collapse@3",
86
+ "rate_cut@5",
87
+ ],
88
+ category: "financial",
89
+ rounds: 6,
90
+ },
91
+ // --- Energy ---
92
+ oil_shock: {
93
+ id: "oil_shock",
94
+ title: "Oil Supply Shock",
95
+ description: "Tanker attack + sanctions create compound energy crisis",
96
+ world: "gas_price_spike",
97
+ events: [
98
+ "tanker_explosion@2",
99
+ "sanctions@4",
100
+ "grid_failure@5",
101
+ "oil_discovery@7",
102
+ ],
103
+ compareWorlds: ["strait_of_hormuz"],
104
+ category: "energy",
105
+ rounds: 8,
106
+ },
107
+ energy_transition_shock: {
108
+ id: "energy_transition_shock",
109
+ title: "Energy Transition Disruption",
110
+ description: "Grid failure during rapid transition triggers regulatory and market cascade",
111
+ world: "gas_price_spike",
112
+ events: [
113
+ "grid_failure@2",
114
+ "regulation_shock@3",
115
+ "stimulus_package@5",
116
+ ],
117
+ category: "energy",
118
+ rounds: 6,
119
+ },
120
+ // --- Political ---
121
+ election_shock: {
122
+ id: "election_shock",
123
+ title: "Election Crisis",
124
+ description: "Political shock cascades into market and regulatory disruption",
125
+ world: "trading",
126
+ events: [
127
+ "candidate_indicted@2",
128
+ "flash_crash_rumor@3",
129
+ "regulation_shock@5",
130
+ "stimulus_package@6",
131
+ ],
132
+ category: "political",
133
+ rounds: 7,
134
+ },
135
+ ai_crackdown: {
136
+ id: "ai_crackdown",
137
+ title: "AI Regulatory Crackdown",
138
+ description: "Overnight AI regulation triggers market panic and sector realignment",
139
+ world: "ai_regulation_crisis",
140
+ events: [
141
+ "regulation_shock@2",
142
+ "flash_crash_rumor@3",
143
+ "diplomatic_breakthrough@5",
144
+ ],
145
+ compareWorlds: ["trading"],
146
+ category: "political",
147
+ rounds: 6,
148
+ },
149
+ // --- Compound ---
150
+ perfect_storm: {
151
+ id: "perfect_storm",
152
+ title: "Perfect Storm — Multi-Domain Crisis",
153
+ description: "Geopolitical, financial, and energy shocks converge simultaneously",
154
+ world: "trading",
155
+ events: [
156
+ "tanker_explosion@1",
157
+ "bank_collapse@2",
158
+ "sanctions@3",
159
+ "grid_failure@4",
160
+ "rate_cut@5",
161
+ "ceasefire@7",
162
+ ],
163
+ compareWorlds: ["strait_of_hormuz", "gas_price_spike"],
164
+ category: "compound",
165
+ rounds: 8,
166
+ },
167
+ black_swan: {
168
+ id: "black_swan",
169
+ title: "Black Swan Cascade",
170
+ description: "Extreme low-probability events in rapid succession",
171
+ world: "trading",
172
+ events: [
173
+ "bank_collapse@1",
174
+ "tanker_explosion@2",
175
+ "taiwan_exercises@3",
176
+ "grid_failure@4",
177
+ "regulation_shock@5",
178
+ ],
179
+ compareWorlds: ["strait_of_hormuz"],
180
+ category: "compound",
181
+ rounds: 6,
182
+ },
183
+ };
184
+ // ============================================
185
+ // SCENARIO RESOLUTION
186
+ // ============================================
187
+ /**
188
+ * Parse a scenario's event list into NarrativeEvent objects.
189
+ */
190
+ function resolveScenarioEvents(scenario) {
191
+ const events = [];
192
+ for (const spec of scenario.events) {
193
+ const atIdx = spec.lastIndexOf("@");
194
+ if (atIdx === -1)
195
+ continue;
196
+ const eventId = spec.slice(0, atIdx).trim();
197
+ const round = parseInt(spec.slice(atIdx + 1), 10);
198
+ if (isNaN(round))
199
+ continue;
200
+ const preset = narrativeInjection_1.NARRATIVE_PRESETS[eventId];
201
+ if (preset) {
202
+ events.push({ ...preset, round });
203
+ }
204
+ else {
205
+ events.push({
206
+ id: `custom_${round}`,
207
+ headline: eventId,
208
+ round,
209
+ severity: "major",
210
+ targets: [],
211
+ direction: "mixed",
212
+ propagation: "normal",
213
+ category: "custom",
214
+ });
215
+ }
216
+ }
217
+ return events;
218
+ }
219
+ /**
220
+ * Get all scenarios grouped by category.
221
+ */
222
+ function getScenariosByCategory() {
223
+ const grouped = {};
224
+ for (const scenario of Object.values(exports.SCENARIO_LIBRARY)) {
225
+ if (!grouped[scenario.category]) {
226
+ grouped[scenario.category] = [];
227
+ }
228
+ grouped[scenario.category].push(scenario);
229
+ }
230
+ return grouped;
231
+ }
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * World Comparison Engine — Same Swarm, Different Rule Environments
4
+ *
5
+ * "NV-SIM lets you run the same swarm through different rule environments
6
+ * to see how governance changes emergent behavior."
7
+ *
8
+ * Unlike `compare` (baseline vs governed), this runs TWO governed simulations
9
+ * with different world rules. Same agents, same scenario — only the rules change.
10
+ *
11
+ * Usage:
12
+ * nv-sim worlds strait_of_hormuz gas_price_spike
13
+ * nv-sim worlds trading strait_of_hormuz
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.resolveWorld = resolveWorld;
17
+ exports.runWorldComparison = runWorldComparison;
18
+ const scenarioCapsule_1 = require("./scenarioCapsule");
19
+ const governedSimulation_1 = require("./governedSimulation");
20
+ function resolveWorld(presetId) {
21
+ if (presetId === "trading" || presetId === "flash_crash") {
22
+ return {
23
+ id: "trading-flash-crash",
24
+ title: "Flash Crash — Algorithmic Cascade",
25
+ scenario: governedSimulation_1.TRADING_DEMO.scenario.scenario,
26
+ stakeholders: governedSimulation_1.TRADING_DEMO.scenario.stakeholders,
27
+ assumptions: governedSimulation_1.TRADING_DEMO.scenario.assumptions,
28
+ constraints: governedSimulation_1.TRADING_DEMO.scenario.constraints,
29
+ swarm: governedSimulation_1.TRADING_DEMO.scenario.swarm,
30
+ depth: governedSimulation_1.TRADING_DEMO.scenario.depth,
31
+ world: governedSimulation_1.TRADING_DEMO.world,
32
+ paths: governedSimulation_1.TRADING_DEMO.paths,
33
+ };
34
+ }
35
+ const template = scenarioCapsule_1.SCENARIO_TEMPLATES[presetId];
36
+ if (!template) {
37
+ throw new Error(`Unknown preset: ${presetId}. Available: trading, ${Object.keys(scenarioCapsule_1.SCENARIO_TEMPLATES).join(", ")}`);
38
+ }
39
+ if (!template.world?.inline_definition) {
40
+ throw new Error(`Preset "${presetId}" has no world definition.`);
41
+ }
42
+ return {
43
+ id: template.world.world_id,
44
+ title: template.title,
45
+ scenario: template.scenario,
46
+ stakeholders: template.stakeholders,
47
+ assumptions: template.assumptions,
48
+ constraints: template.constraints,
49
+ swarm: (template.swarm ?? { enabled: true, rounds: 5, reaction_model: "mixed" }),
50
+ depth: template.depth,
51
+ world: template.world.inline_definition,
52
+ paths: [
53
+ {
54
+ id: "path_primary",
55
+ label: "Primary Response",
56
+ description: "Most likely course of action",
57
+ projected_outcome: "Moderate disruption with cascading effects",
58
+ probability: 0.6,
59
+ risk: "high",
60
+ tradeoffs: ["Speed vs. thoroughness", "Short-term vs. long-term"],
61
+ benefits_stakeholders: template.stakeholders.filter(s => s.disposition === "supportive").map(s => s.id),
62
+ harms_stakeholders: template.stakeholders.filter(s => s.disposition === "hostile").map(s => s.id),
63
+ },
64
+ {
65
+ id: "path_defensive",
66
+ label: "Defensive Posture",
67
+ description: "Conservative approach prioritizing stability",
68
+ projected_outcome: "Reduced damage but slower recovery",
69
+ probability: 0.7,
70
+ risk: "moderate",
71
+ tradeoffs: ["Safety vs. opportunity cost"],
72
+ benefits_stakeholders: template.stakeholders.filter(s => s.disposition !== "hostile").map(s => s.id),
73
+ harms_stakeholders: [],
74
+ },
75
+ ],
76
+ };
77
+ }
78
+ async function runWorldComparison(worldAId, worldBId, options) {
79
+ const worldADef = resolveWorld(worldAId);
80
+ const worldBDef = resolveWorld(worldBId);
81
+ // Use the scenario from world A as the shared scenario,
82
+ // but merge stakeholders from both worlds for richer simulation
83
+ const sharedScenario = worldADef.scenario + " " + worldBDef.scenario;
84
+ const mergedStakeholders = mergeStakeholders(worldADef.stakeholders, worldBDef.stakeholders);
85
+ // Build paths that work for both worlds
86
+ const sharedPaths = worldADef.paths;
87
+ options?.onProgress?.("World A", "simulating");
88
+ // Run World A governed comparison
89
+ const resultA = await (0, governedSimulation_1.runGovernedComparison)({
90
+ scenario: sharedScenario,
91
+ stakeholders: mergedStakeholders,
92
+ assumptions: worldADef.assumptions,
93
+ constraints: worldADef.constraints,
94
+ depth: worldADef.depth,
95
+ swarm: worldADef.swarm,
96
+ }, worldADef.world, sharedPaths);
97
+ options?.onProgress?.("World B", "simulating");
98
+ // Run World B governed comparison
99
+ const resultB = await (0, governedSimulation_1.runGovernedComparison)({
100
+ scenario: sharedScenario,
101
+ stakeholders: mergedStakeholders,
102
+ assumptions: worldBDef.assumptions,
103
+ constraints: worldBDef.constraints,
104
+ depth: worldBDef.depth,
105
+ swarm: worldBDef.swarm,
106
+ }, worldBDef.world, sharedPaths);
107
+ // Extract round snapshots
108
+ const roundsA = extractRoundSnapshots(resultA);
109
+ const roundsB = extractRoundSnapshots(resultB);
110
+ // Build delta
111
+ const metricsA = resultA.governed.metrics;
112
+ const metricsB = resultB.governed.metrics;
113
+ const stabilityDiff = metricsA.stabilityScore - metricsB.stabilityScore;
114
+ const volatilityDiff = metricsA.maxVolatility - metricsB.maxVolatility;
115
+ const coalitionRiskDiff = metricsA.coalitionRisks - metricsB.coalitionRisks;
116
+ const collapseDiff = metricsA.collapseProbability - metricsB.collapseProbability;
117
+ const moreStable = Math.abs(stabilityDiff) < 0.02 ? "equal"
118
+ : stabilityDiff > 0 ? "A" : "B";
119
+ const narrative = buildWorldNarrative(worldADef, worldBDef, metricsA, metricsB, moreStable);
120
+ return {
121
+ scenario: sharedScenario,
122
+ worldA: {
123
+ id: worldAId,
124
+ thesis: worldADef.world.thesis,
125
+ invariantCount: worldADef.world.invariants.length,
126
+ gateCount: (worldADef.world.gates ?? []).length,
127
+ metrics: metricsA,
128
+ trajectory: resultA.governed.swarm.trajectory,
129
+ governanceStats: resultA.governanceStats,
130
+ rounds: roundsA,
131
+ },
132
+ worldB: {
133
+ id: worldBId,
134
+ thesis: worldBDef.world.thesis,
135
+ invariantCount: worldBDef.world.invariants.length,
136
+ gateCount: (worldBDef.world.gates ?? []).length,
137
+ metrics: metricsB,
138
+ trajectory: resultB.governed.swarm.trajectory,
139
+ governanceStats: resultB.governanceStats,
140
+ rounds: roundsB,
141
+ },
142
+ delta: {
143
+ stabilityDiff: Number((stabilityDiff * 100).toFixed(1)),
144
+ volatilityDiff: Number((volatilityDiff * 100).toFixed(1)),
145
+ coalitionRiskDiff,
146
+ collapseDiff: Number((collapseDiff * 100).toFixed(1)),
147
+ moreStable,
148
+ narrative,
149
+ },
150
+ };
151
+ }
152
+ function mergeStakeholders(a, b) {
153
+ const seen = new Set();
154
+ const merged = [];
155
+ for (const s of [...a, ...b]) {
156
+ if (!seen.has(s.id)) {
157
+ seen.add(s.id);
158
+ merged.push(s);
159
+ }
160
+ }
161
+ return merged;
162
+ }
163
+ function extractRoundSnapshots(result) {
164
+ return result.governed.swarm.rounds.map((r) => ({
165
+ round: r.round,
166
+ avgImpact: r.reactions.reduce((s, rx) => s + rx.impact, 0) / r.reactions.length,
167
+ maxVolatility: Math.max(...r.reactions.map((rx) => Math.abs(rx.impact))),
168
+ agentImpacts: r.reactions.map((rx) => ({
169
+ id: rx.stakeholder_id,
170
+ impact: rx.impact,
171
+ confidence: rx.confidence,
172
+ })),
173
+ interventions: r.emergent_dynamics ?? [],
174
+ }));
175
+ }
176
+ function buildWorldNarrative(worldA, worldB, metricsA, metricsB, moreStable) {
177
+ const parts = [];
178
+ parts.push(`World A ("${worldA.world.thesis.slice(0, 60)}...") vs World B ("${worldB.world.thesis.slice(0, 60)}...").`);
179
+ if (moreStable === "A") {
180
+ parts.push(`World A produced a more stable system (${(metricsA.stabilityScore * 100).toFixed(0)}% vs ${(metricsB.stabilityScore * 100).toFixed(0)}%).`);
181
+ }
182
+ else if (moreStable === "B") {
183
+ parts.push(`World B produced a more stable system (${(metricsB.stabilityScore * 100).toFixed(0)}% vs ${(metricsA.stabilityScore * 100).toFixed(0)}%).`);
184
+ }
185
+ else {
186
+ parts.push(`Both worlds produced similar stability levels.`);
187
+ }
188
+ const invDiff = worldA.world.invariants.length - worldB.world.invariants.length;
189
+ if (invDiff !== 0) {
190
+ parts.push(`World ${invDiff > 0 ? "A" : "B"} has ${Math.abs(invDiff)} more invariant${Math.abs(invDiff) > 1 ? "s" : ""}, providing tighter structural constraints.`);
191
+ }
192
+ parts.push("Same agents, different rules — the world shapes the outcome.");
193
+ return parts.join(" ");
194
+ }
Binary file
@@ -0,0 +1,23 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>NV-SIM — NeuroVerse Simulation</title>
7
+ <meta name="description" content="Governed agent simulation — compare emergent outcomes with and without governance constraints.">
8
+ <meta name="author" content="NeuroverseOS" />
9
+ <meta property="og:type" content="website" />
10
+ <meta property="og:title" content="NV-SIM — NeuroVerse Simulation">
11
+ <meta property="og:description" content="Governed agent simulation — compare emergent outcomes with and without governance constraints.">
12
+ <meta name="twitter:card" content="summary" />
13
+ <meta name="twitter:site" content="@neuroverseos" />
14
+ <meta name="twitter:title" content="NV-SIM — NeuroVerse Simulation">
15
+ <meta name="twitter:description" content="Governed agent simulation — compare emergent outcomes with and without governance constraints.">
16
+ <link rel="icon" type="image/x-icon" href="/favicon.ico">
17
+ <script type="module" crossorigin src="/assets/index-DHKd4rcV.js"></script>
18
+ <link rel="stylesheet" crossorigin href="/assets/index-SyyA3z3U.css">
19
+ </head>
20
+ <body>
21
+ <div id="root"></div>
22
+ </body>
23
+ </html>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" fill="none"><rect width="1200" height="1200" fill="#EAEAEA" rx="3"/><g opacity=".5"><g opacity=".5"><path fill="#FAFAFA" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/></g><path stroke="url(#a)" stroke-width="2.418" d="M0-1.209h553.581" transform="scale(1 -1) rotate(45 1163.11 91.165)"/><path stroke="url(#b)" stroke-width="2.418" d="M404.846 598.671h391.726"/><path stroke="url(#c)" stroke-width="2.418" d="M599.5 795.742V404.017"/><path stroke="url(#d)" stroke-width="2.418" d="m795.717 796.597-391.441-391.44"/><path fill="#fff" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/><g clip-path="url(#e)"><path fill="#666" fill-rule="evenodd" d="M616.426 586.58h-31.434v16.176l3.553-3.554.531-.531h9.068l.074-.074 8.463-8.463h2.565l7.18 7.181V586.58Zm-15.715 14.654 3.698 3.699 1.283 1.282-2.565 2.565-1.282-1.283-5.2-5.199h-6.066l-5.514 5.514-.073.073v2.876a2.418 2.418 0 0 0 2.418 2.418h26.598a2.418 2.418 0 0 0 2.418-2.418v-8.317l-8.463-8.463-7.181 7.181-.071.072Zm-19.347 5.442v4.085a6.045 6.045 0 0 0 6.046 6.045h26.598a6.044 6.044 0 0 0 6.045-6.045v-7.108l1.356-1.355-1.282-1.283-.074-.073v-17.989h-38.689v23.43l-.146.146.146.147Z" clip-rule="evenodd"/></g><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/></g><defs><linearGradient id="a" x1="554.061" x2="-.48" y1=".083" y2=".087" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="796.912" x2="404.507" y1="599.963" y2="599.965" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="600.792" x2="600.794" y1="403.677" y2="796.082" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="404.85" x2="796.972" y1="403.903" y2="796.02" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><clipPath id="e"><path fill="#fff" d="M581.364 580.535h38.689v38.689h-38.689z"/></clipPath></defs></svg>
@@ -0,0 +1,14 @@
1
+ User-agent: Googlebot
2
+ Allow: /
3
+
4
+ User-agent: Bingbot
5
+ Allow: /
6
+
7
+ User-agent: Twitterbot
8
+ Allow: /
9
+
10
+ User-agent: facebookexternalhit
11
+ Allow: /
12
+
13
+ User-agent: *
14
+ Allow: /
package/package.json CHANGED
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "name": "@neuroverseos/nv-sim",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
- "description": "CLI for running governed vs baseline agent simulations to explore how world rules shape emergent system behavior.",
7
- "files": [
8
- "dist",
9
- "README.md",
10
- "LICENSE"
11
- ],
6
+ "description": "CLI for running governed vs baseline agent simulations to explore how world rules shape emergent system behavior.",
12
7
  "repository": {
13
8
  "type": "git",
14
9
  "url": "https://github.com/NeuroverseOS/neuroverse-simulations"
@@ -20,16 +15,23 @@
20
15
  "bin": {
21
16
  "nv-sim": "dist/engine/cli.js"
22
17
  },
18
+ "files": [
19
+ "dist",
20
+ "variants",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
23
24
  "scripts": {
24
25
  "dev": "vite",
25
- "build": "vite build",
26
- "build:cli": "tsc -p tsconfig.cli.json && echo '{\"type\":\"commonjs\"}' > dist/package.json",
26
+ "build": "vite build && tsc -p tsconfig.cli.json && echo '{\"type\":\"commonjs\"}' > dist/package.json && chmod +x dist/engine/cli.js",
27
+ "build:cli": "tsc -p tsconfig.cli.json && echo '{\"type\":\"commonjs\"}' > dist/package.json && chmod +x dist/engine/cli.js",
27
28
  "build:dev": "vite build --mode development",
28
- "build:all": "vite build && tsc -p tsconfig.cli.json",
29
+ "build:all": "vite build && tsc -p tsconfig.cli.json && echo '{\"type\":\"commonjs\"}' > dist/package.json && chmod +x dist/engine/cli.js",
29
30
  "lint": "eslint .",
30
31
  "preview": "vite preview",
31
32
  "test": "vitest run",
32
- "test:watch": "vitest"
33
+ "test:watch": "vitest",
34
+ "prepublishOnly": "npm run build"
33
35
  },
34
36
  "dependencies": {
35
37
  "@hookform/resolvers": "^3.10.0",
File without changes