@inventure71/paddockjs 0.3.0 → 1.0.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 (54) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/INSTALL_AND_UPDATE.md +3 -1
  3. package/README.md +142 -9
  4. package/docs/architecture.md +49 -15
  5. package/docs/concepts.md +20 -3
  6. package/docs/data_contract.md +185 -27
  7. package/docs/data_model.md +1 -1
  8. package/docs/learnings.md +1 -1
  9. package/docs/rules.md +140 -19
  10. package/docs/system_specs.md +39 -16
  11. package/docs/training.md +103 -1
  12. package/examples/train-basic-policy.mjs +5 -6
  13. package/examples/trainingData.mjs +133 -0
  14. package/package.json +5 -2
  15. package/src/api/PaddockSimulatorController.js +32 -2
  16. package/src/app/F1SimulatorApp.js +1101 -128
  17. package/src/app/domBindings.js +10 -1
  18. package/src/config/defaultOptions.js +4 -4
  19. package/src/environment/actions.js +25 -2
  20. package/src/environment/evaluation.js +184 -0
  21. package/src/environment/index.d.ts +281 -1
  22. package/src/environment/index.js +13 -0
  23. package/src/environment/observationOptions.js +12 -0
  24. package/src/environment/observations.js +189 -17
  25. package/src/environment/options.js +7 -0
  26. package/src/environment/recorder.js +28 -0
  27. package/src/environment/runtime.js +41 -6
  28. package/src/environment/scenarios.js +220 -0
  29. package/src/environment/sensors.js +145 -35
  30. package/src/environment/specs.js +92 -8
  31. package/src/environment/workerProtocol.js +52 -0
  32. package/src/index.d.ts +366 -3
  33. package/src/index.js +21 -0
  34. package/src/rendering/proceduralTrackAsset.js +336 -23
  35. package/src/simulation/collisionGeometry.js +214 -0
  36. package/src/simulation/driverController.js +431 -65
  37. package/src/simulation/raceSimulation.js +2132 -171
  38. package/src/simulation/rules/collisionSteward.js +69 -0
  39. package/src/simulation/rules/penaltyLedger.js +153 -0
  40. package/src/simulation/rules/pitLaneSpeedingSteward.js +71 -0
  41. package/src/simulation/rules/tireRequirementSteward.js +29 -0
  42. package/src/simulation/rules/trackLimitsSteward.js +85 -0
  43. package/src/simulation/rulesConfig.js +352 -0
  44. package/src/simulation/trackModel.js +1154 -76
  45. package/src/simulation/units.js +6 -4
  46. package/src/simulation/vehicleGeometry.js +247 -0
  47. package/src/simulation/vehiclePhysics.js +82 -50
  48. package/src/simulation/wheelSurface.js +338 -0
  49. package/src/styles.css +300 -42
  50. package/src/ui/bannerTemplates.js +69 -0
  51. package/src/ui/componentTemplates.js +36 -96
  52. package/src/ui/raceControlStatusBanner.js +39 -0
  53. package/src/ui/shellTemplate.js +1 -1
  54. package/src/ui/templateUtils.js +23 -0
@@ -0,0 +1,133 @@
1
+ export const TRAINING_DEMO_DRIVERS = [
2
+ {
3
+ id: 'budget',
4
+ code: 'BUD',
5
+ icon: 'BB',
6
+ name: 'Budget Buddy',
7
+ color: '#ff2d55',
8
+ tire: 'M',
9
+ raceData: ['AI finance coach', 'Python + LLM', 'Budget guardrails'],
10
+ },
11
+ {
12
+ id: 'noir',
13
+ code: 'NOI',
14
+ icon: 'NN',
15
+ name: 'Neural Noir',
16
+ color: '#ffb000',
17
+ tire: 'M',
18
+ raceData: ['Procedural mystery', 'Gemini storytelling', 'Unreal loop'],
19
+ },
20
+ {
21
+ id: 'vinyl',
22
+ code: 'HOL',
23
+ icon: 'HV',
24
+ name: 'HoloVinyl',
25
+ color: '#00c2a8',
26
+ tire: 'H',
27
+ raceData: ['Touchless DJ control', 'Computer vision', 'Hand tracking'],
28
+ },
29
+ {
30
+ id: 'drsorriso',
31
+ code: 'DRS',
32
+ icon: 'DR',
33
+ name: 'DrSorrisoDonations',
34
+ color: '#e10600',
35
+ tire: 'S',
36
+ raceData: ['Donation intake', 'Database workflow', 'Automation tool'],
37
+ },
38
+ {
39
+ id: 'victoria',
40
+ code: 'VIC',
41
+ icon: 'VI',
42
+ name: 'VictorIA',
43
+ color: '#00a3ff',
44
+ tire: 'M',
45
+ raceData: ['Game AI sandbox', 'Robotics ideas', 'Vision systems'],
46
+ },
47
+ {
48
+ id: 'reminderz',
49
+ code: 'REM',
50
+ icon: 'RZ',
51
+ name: 'ReminderZ',
52
+ color: '#a3e635',
53
+ tire: 'H',
54
+ raceData: ['Knowledge workflow', 'Personal graph', 'Capture tool'],
55
+ },
56
+ {
57
+ id: 'clipclop',
58
+ code: 'CLP',
59
+ icon: 'CC',
60
+ name: 'ClipClop',
61
+ color: '#f97316',
62
+ tire: 'S',
63
+ raceData: ['Mac + Android sync', 'Local clipboard', 'Productivity app'],
64
+ },
65
+ {
66
+ id: 'core',
67
+ code: 'COR',
68
+ icon: 'AI',
69
+ name: 'Core Conflict',
70
+ color: '#38bdf8',
71
+ tire: 'M',
72
+ raceData: ['Runtime AI agents', 'Multiplayer state', 'Game systems'],
73
+ },
74
+ ];
75
+
76
+ export const TRAINING_DEMO_ENTRIES = [
77
+ {
78
+ driverId: 'budget',
79
+ driverNumber: 71,
80
+ timingName: 'Budget',
81
+ driver: { pace: 52, racecraft: 74, aggression: 38, riskTolerance: 47, patience: 81, consistency: 86 },
82
+ vehicle: { id: 'budget-bb01', name: 'BB-01 Ledger', power: 48, braking: 72, aero: 55, dragEfficiency: 66, mechanicalGrip: 63, weightControl: 58, tireCare: 82 },
83
+ },
84
+ {
85
+ driverId: 'noir',
86
+ driverNumber: 13,
87
+ timingName: 'Noir',
88
+ driver: { pace: 68, racecraft: 83, aggression: 61, riskTolerance: 72, patience: 57, consistency: 64 },
89
+ vehicle: { id: 'noir-nn13', name: 'NN-13 Shadow', power: 64, braking: 60, aero: 73, dragEfficiency: 57, mechanicalGrip: 69, weightControl: 54, tireCare: 51 },
90
+ },
91
+ {
92
+ driverId: 'vinyl',
93
+ driverNumber: 33,
94
+ timingName: 'HoloVinyl',
95
+ driver: { pace: 71, racecraft: 66, aggression: 52, riskTolerance: 59, patience: 62, consistency: 58 },
96
+ vehicle: { id: 'vinyl-hv33', name: 'HV-33 Groove', power: 70, braking: 49, aero: 58, dragEfficiency: 74, mechanicalGrip: 52, weightControl: 68, tireCare: 46 },
97
+ },
98
+ {
99
+ driverId: 'drsorriso',
100
+ driverNumber: 55,
101
+ timingName: 'DrSorriso',
102
+ driver: { pace: 46, racecraft: 69, aggression: 44, riskTolerance: 43, patience: 76, consistency: 73 },
103
+ vehicle: { id: 'sorriso-ds55', name: 'DS-55 Intake', power: 54, braking: 67, aero: 62, dragEfficiency: 49, mechanicalGrip: 71, weightControl: 45, tireCare: 69 },
104
+ },
105
+ {
106
+ driverId: 'victoria',
107
+ driverNumber: 11,
108
+ timingName: 'VictorIA',
109
+ driver: { pace: 78, racecraft: 79, aggression: 58, riskTolerance: 65, patience: 55, consistency: 68 },
110
+ vehicle: { id: 'victoria-vi11', name: 'VI-11 Vector', power: 76, braking: 58, aero: 65, dragEfficiency: 63, mechanicalGrip: 61, weightControl: 60, tireCare: 48 },
111
+ },
112
+ {
113
+ driverId: 'reminderz',
114
+ driverNumber: 7,
115
+ timingName: 'ReminderZ',
116
+ driver: { pace: 41, racecraft: 61, aggression: 34, riskTolerance: 39, patience: 85, consistency: 80 },
117
+ vehicle: { id: 'reminderz-rz07', name: 'RZ-07 Recall', power: 42, braking: 76, aero: 50, dragEfficiency: 72, mechanicalGrip: 58, weightControl: 63, tireCare: 88 },
118
+ },
119
+ {
120
+ driverId: 'clipclop',
121
+ driverNumber: 14,
122
+ timingName: 'ClipClop',
123
+ driver: { pace: 73, racecraft: 88, aggression: 76, riskTolerance: 78, patience: 48, consistency: 61 },
124
+ vehicle: { id: 'clipclop-cc14', name: 'CC-14 Sync', power: 68, braking: 63, aero: 59, dragEfficiency: 61, mechanicalGrip: 78, weightControl: 56, tireCare: 44 },
125
+ },
126
+ {
127
+ driverId: 'core',
128
+ driverNumber: 91,
129
+ timingName: 'Core',
130
+ driver: { pace: 82, racecraft: 85, aggression: 67, riskTolerance: 74, patience: 53, consistency: 72 },
131
+ vehicle: { id: 'core-ai91', name: 'AI-91 Core', power: 80, braking: 61, aero: 72, dragEfficiency: 59, mechanicalGrip: 75, weightControl: 51, tireCare: 50 },
132
+ },
133
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inventure71/paddockjs",
3
- "version": "0.3.0",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "description": "A data-driven browser F1 simulator component for host websites.",
6
6
  "license": "Apache-2.0",
@@ -70,8 +70,10 @@
70
70
  "scripts": {
71
71
  "test": "vitest run src",
72
72
  "types:check": "tsc -p tsconfig.types.json --noEmit",
73
- "check": "npm test && npm run types:check && npm run pack:dry && npm run showcase:ci",
73
+ "check": "npm test && npm run types:check && npm run pack:dry && npm run consumer:smoke && npm run showcase:ci && npm run browser:smoke",
74
74
  "pack:dry": "npm pack --dry-run",
75
+ "consumer:smoke": "node scripts/consumer-package-smoke.mjs",
76
+ "browser:smoke": "node smoke/browser-smoke.mjs",
75
77
  "showcase:install": "npm --prefix local-preview ci",
76
78
  "showcase:dev": "npm --prefix local-preview run dev",
77
79
  "showcase:build": "npm --prefix local-preview run build",
@@ -86,6 +88,7 @@
86
88
  },
87
89
  "devDependencies": {
88
90
  "@changesets/cli": "2.29.7",
91
+ "playwright": "^1.57.0",
89
92
  "typescript": "5.9.3",
90
93
  "vitest": "4.1.5"
91
94
  }
@@ -1,16 +1,18 @@
1
1
  import { F1SimulatorApp } from '../app/F1SimulatorApp.js';
2
+ import {
3
+ createRaceDataPanelMarkup,
4
+ createTelemetrySectorBannerMarkup,
5
+ } from '../ui/bannerTemplates.js';
2
6
  import {
3
7
  createCarDriverOverviewMarkup,
4
8
  createCameraControlsMarkup,
5
9
  createRaceCanvasMarkup,
6
10
  createRaceControlsMarkup,
7
- createRaceDataPanelMarkup,
8
11
  createRaceTelemetryDrawerMarkup,
9
12
  createSafetyCarControlMarkup,
10
13
  createTelemetryCoreMarkup,
11
14
  createTelemetryLapTimesMarkup,
12
15
  createTelemetryPanelMarkup,
13
- createTelemetrySectorBannerMarkup,
14
16
  createTelemetrySectorTimesMarkup,
15
17
  createTelemetrySectorsMarkup,
16
18
  createTimingTowerMarkup,
@@ -215,6 +217,14 @@ export class PaddockSimulatorController {
215
217
  this.app?.setSafetyCarDeployed(deployed);
216
218
  }
217
219
 
220
+ setRedFlagDeployed(deployed) {
221
+ this.app?.setRedFlagDeployed?.(deployed);
222
+ }
223
+
224
+ setPitLaneOpen(open) {
225
+ this.app?.setPitLaneOpen?.(open);
226
+ }
227
+
218
228
  callSafetyCar() {
219
229
  this.setSafetyCarDeployed(true);
220
230
  }
@@ -228,6 +238,26 @@ export class PaddockSimulatorController {
228
238
  this.setSafetyCarDeployed(!active);
229
239
  }
230
240
 
241
+ setPitIntent(driverId, intent, targetCompound) {
242
+ return this.app?.setPitIntent(driverId, intent, targetCompound) ?? false;
243
+ }
244
+
245
+ getPitIntent(driverId) {
246
+ return this.app?.getPitIntent(driverId) ?? 0;
247
+ }
248
+
249
+ getPitTargetCompound(driverId) {
250
+ return this.app?.getPitTargetCompound?.(driverId) ?? null;
251
+ }
252
+
253
+ servePenalty(penaltyId) {
254
+ return this.app?.servePenalty(penaltyId) ?? null;
255
+ }
256
+
257
+ cancelPenalty(penaltyId) {
258
+ return this.app?.cancelPenalty(penaltyId) ?? null;
259
+ }
260
+
231
261
  getSnapshot() {
232
262
  return this.app?.getSnapshot() ?? null;
233
263
  }