@typeonce/ritmo-devtools 0.6.0 → 0.8.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 (72) hide show
  1. package/README.md +105 -21
  2. package/dist/Determinism.d.ts +70 -0
  3. package/dist/Determinism.d.ts.map +1 -0
  4. package/dist/Determinism.js +137 -0
  5. package/dist/Determinism.js.map +1 -0
  6. package/dist/Format.d.ts +8 -1
  7. package/dist/Format.d.ts.map +1 -1
  8. package/dist/Format.js +47 -5
  9. package/dist/Format.js.map +1 -1
  10. package/dist/Invariant.d.ts +34 -12
  11. package/dist/Invariant.d.ts.map +1 -1
  12. package/dist/Invariant.js +6 -19
  13. package/dist/Invariant.js.map +1 -1
  14. package/dist/Lint.d.ts +60 -0
  15. package/dist/Lint.d.ts.map +1 -0
  16. package/dist/Lint.js +15 -0
  17. package/dist/Lint.js.map +1 -0
  18. package/dist/Monitor.d.ts +18 -4
  19. package/dist/Monitor.d.ts.map +1 -1
  20. package/dist/Monitor.js +32 -21
  21. package/dist/Monitor.js.map +1 -1
  22. package/dist/Replay.d.ts +271 -0
  23. package/dist/Replay.d.ts.map +1 -0
  24. package/dist/Replay.js +335 -0
  25. package/dist/Replay.js.map +1 -0
  26. package/dist/ReplayNodeSink.d.ts +11 -0
  27. package/dist/ReplayNodeSink.d.ts.map +1 -0
  28. package/dist/ReplayNodeSink.js +29 -0
  29. package/dist/ReplayNodeSink.js.map +1 -0
  30. package/dist/ReplayVitePlugin.d.ts +41 -0
  31. package/dist/ReplayVitePlugin.d.ts.map +1 -0
  32. package/dist/ReplayVitePlugin.js +41 -0
  33. package/dist/ReplayVitePlugin.js.map +1 -0
  34. package/dist/ReplayViteSink.d.ts +30 -0
  35. package/dist/ReplayViteSink.d.ts.map +1 -0
  36. package/dist/ReplayViteSink.js +9 -0
  37. package/dist/ReplayViteSink.js.map +1 -0
  38. package/dist/Session.d.ts +66 -14
  39. package/dist/Session.d.ts.map +1 -1
  40. package/dist/Session.js +93 -7
  41. package/dist/Session.js.map +1 -1
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +57 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +3 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/internal/monitor.d.ts +4 -2
  51. package/dist/internal/monitor.d.ts.map +1 -1
  52. package/dist/internal/monitor.js +9 -3
  53. package/dist/internal/monitor.js.map +1 -1
  54. package/dist/internal/version.d.ts +7 -0
  55. package/dist/internal/version.d.ts.map +1 -0
  56. package/dist/internal/version.js +7 -0
  57. package/dist/internal/version.js.map +1 -0
  58. package/package.json +5 -2
  59. package/src/Determinism.ts +190 -0
  60. package/src/Format.ts +50 -4
  61. package/src/Invariant.ts +38 -12
  62. package/src/Lint.ts +72 -0
  63. package/src/Monitor.ts +49 -26
  64. package/src/Replay.ts +583 -0
  65. package/src/ReplayNodeSink.ts +38 -0
  66. package/src/ReplayVitePlugin.ts +74 -0
  67. package/src/ReplayViteSink.ts +33 -0
  68. package/src/Session.ts +154 -24
  69. package/src/cli.ts +55 -0
  70. package/src/index.ts +3 -0
  71. package/src/internal/monitor.ts +12 -5
  72. package/src/internal/version.ts +6 -0
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/internal/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/internal/monitor.ts"],"names":[],"mappings":"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"}
@@ -22,15 +22,18 @@ export class Collector {
22
22
  maxHistory;
23
23
  maxLines;
24
24
  population;
25
+ clock;
26
+ /** `now` reads the host clock (milliseconds); the collector times its own work with it. */
25
27
  constructor(population, now, options = {}) {
26
28
  this.population = population;
27
- this.windowStart = now;
29
+ this.clock = now;
30
+ this.windowStart = now();
28
31
  this.maxHistory = options.history ?? 60;
29
32
  this.maxLines = options.entityLines ?? 40;
30
33
  }
31
34
  /** Folds one trace event. Pass it to `debug.observe`. */
32
35
  observe = (event) => {
33
- const started = performance.now();
36
+ const started = this.clock();
34
37
  switch (event.type) {
35
38
  case "system":
36
39
  this.onSystem(event);
@@ -46,6 +49,9 @@ export class Collector {
46
49
  case "deferred":
47
50
  this.onDeferred(event);
48
51
  break;
52
+ case "failure.ignored":
53
+ this.alert("ignored-failure", `ignored:${event.frame}`, Format.ignoredFailure(event), event.frame);
54
+ break;
49
55
  case "schedule.end":
50
56
  if (!event.schedule.includes(" > ")) {
51
57
  const schedule = this.scheduleOf(event.schedule);
@@ -55,7 +61,7 @@ export class Collector {
55
61
  }
56
62
  break;
57
63
  }
58
- this.overhead += performance.now() - started;
64
+ this.overhead += Math.max(0, this.clock() - started);
59
65
  };
60
66
  windowOf(system) {
61
67
  let window = this.systems.get(system);
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/internal/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/internal/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The package version, written into replay files. Kept equal to
3
+ * `package.json` by `scripts/sync-version.ts` (run by \`pnpm version-packages\`)
4
+ * and checked by a test.
5
+ */
6
+ export declare const libraryVersion = "0.8.0";
7
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/internal/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,cAAc,UAAU,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The package version, written into replay files. Kept equal to
3
+ * `package.json` by `scripts/sync-version.ts` (run by \`pnpm version-packages\`)
4
+ * and checked by a test.
5
+ */
6
+ export const libraryVersion = "0.8.0";
7
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/internal/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typeonce/ritmo-devtools",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Headless debug sessions, trace history, text reports, and a live browser monitor for Ritmo runtimes",
5
5
  "author": "Sandro Maglione",
6
6
  "license": "MIT",
@@ -29,6 +29,9 @@
29
29
  "README.md",
30
30
  "LICENSE"
31
31
  ],
32
+ "bin": {
33
+ "ritmo-devtools": "./dist/cli.js"
34
+ },
32
35
  "exports": {
33
36
  "./package.json": "./package.json",
34
37
  ".": {
@@ -47,7 +50,7 @@
47
50
  "provenance": true
48
51
  },
49
52
  "dependencies": {
50
- "@typeonce/ritmo": "^0.6.0"
53
+ "@typeonce/ritmo": "^0.8.0"
51
54
  },
52
55
  "engines": {
53
56
  "node": ">=20"
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Runs the same headless simulation twice and reports its first differing
3
+ * value. Supply fresh runtimes and scripted input; services and host time
4
+ * are inputs, not world state. Transient components are included, so this
5
+ * works even when the schema cannot be snapshotted.
6
+ *
7
+ * A mismatch is rerun with tracing on the differing frame to name the first
8
+ * system or schedule marker after which the worlds differ. If that rerun
9
+ * does not reproduce it, `after` is undefined: the original mismatch still
10
+ * fails the check. This checks repeatability on the current JS engine, not
11
+ * equality between platforms or every possible input sequence.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const result = Determinism.check(({ hostClock }) => makeSimulation(hostClock), {
16
+ * schedule: "update", frames: 1800, hostClock: HostClock.test()
17
+ * })
18
+ * if (!result.ok) throw new Error(JSON.stringify(result))
19
+ * ```
20
+ * @module Determinism
21
+ * @docGroup devtools
22
+ */
23
+ import type { Debug, HostClock } from "@typeonce/ritmo"
24
+ import type { Schema } from "@typeonce/ritmo/Schema"
25
+ import type { AnyScheduleOrder, ExecutableScheduleDefinition } from "@typeonce/ritmo/Schedule"
26
+ import type { Target as SessionTarget } from "./Session.ts"
27
+
28
+ /** A fresh debug runtime, already set up, and its runnable schedules. */
29
+ export interface Target<S extends Schema.Any, Root, Names extends string> {
30
+ readonly runtime: Pick<SessionTarget<S, Root>, "debug" | "tryTick">
31
+ readonly schedules: Readonly<Record<Names, ExecutableScheduleDefinition<S, any, Root, any, any, AnyScheduleOrder>>>
32
+ }
33
+
34
+ /** Inputs supplied to each build, including diagnostic reruns. */
35
+ export interface Context {
36
+ readonly hostClock: HostClock.HostClock
37
+ }
38
+
39
+ /** Selects one schedule and a finite, whole number of frames to compare. */
40
+ export interface Options<Names extends string> extends Context {
41
+ readonly schedule: Names
42
+ readonly frames: number
43
+ }
44
+
45
+ /** A mismatch names the first value; execution errors remain explicit failures. */
46
+ export type CheckResult =
47
+ | { readonly ok: true; readonly frames: number }
48
+ | {
49
+ readonly ok: false
50
+ /** 0 means the initial worlds already differ. */
51
+ readonly frame: number
52
+ readonly reason: "difference"
53
+ readonly difference: string
54
+ readonly first: unknown
55
+ readonly second: unknown
56
+ readonly after: string | undefined
57
+ }
58
+ | {
59
+ readonly ok: false
60
+ readonly frame: number
61
+ readonly reason: "invalid-options" | "shared-runtime" | "failure" | "defect"
62
+ readonly run: "first" | "second"
63
+ readonly error: unknown
64
+ }
65
+
66
+ type Captured = { readonly kind: string; readonly value?: unknown; readonly entries?: ReadonlyArray<readonly [string, Captured]> }
67
+ type Difference = { readonly path: string; readonly first: unknown; readonly second: unknown }
68
+ type Trace = { readonly after: string; readonly state: Captured }
69
+
70
+ // Copy values immediately: dump values may be mutable and shared with the
71
+ // next tick. JSON would silently discard undefined, NaN, maps, and cycles.
72
+ const capture = (value: unknown, seen = new Map<object, number>()): Captured => {
73
+ if (typeof value !== "object" || value === null) return { kind: typeof value, value }
74
+ const previous = seen.get(value)
75
+ if (previous !== undefined) return { kind: "reference", value: previous }
76
+ seen.set(value, seen.size)
77
+ if (value instanceof Date) return { kind: "Date", value: value.getTime() }
78
+ if (value instanceof RegExp) return { kind: "RegExp", value: `${value.source}/${value.flags}/${value.lastIndex}` }
79
+ if (value instanceof Map) return { kind: "Map", entries: [...value].map(([key, entry], index) => [String(index), capture([key, entry], seen)]) }
80
+ if (value instanceof Set) return { kind: "Set", entries: [...value].map((entry, index) => [String(index), capture(entry, seen)]) }
81
+ if (value instanceof ArrayBuffer) return { kind: "ArrayBuffer", entries: [...new Uint8Array(value)].map((entry, index) => [String(index), capture(entry, seen)]) }
82
+ if (ArrayBuffer.isView(value)) return { kind: value.constructor.name, entries: [...new Uint8Array(value.buffer, value.byteOffset, value.byteLength)].map((entry, index) => [String(index), capture(entry, seen)]) }
83
+ if (value instanceof WeakMap || value instanceof WeakSet || value instanceof Promise) {
84
+ throw new Error(`Determinism cannot inspect ${value.constructor.name}; keep opaque host state in a service`)
85
+ }
86
+ return {
87
+ kind: Array.isArray(value) ? "Array" : Object.getPrototypeOf(value)?.constructor?.name ?? "Object",
88
+ entries: Reflect.ownKeys(value).map((key) => [String(key), capture(Reflect.get(value, key), seen)])
89
+ }
90
+ }
91
+
92
+ const difference = (first: Captured, second: Captured, path = "world"): Difference | undefined => {
93
+ if (first.kind !== second.kind || !Object.is(first.value, second.value)) return { path, first: first.value ?? first.kind, second: second.value ?? second.kind }
94
+ const a = first.entries ?? []
95
+ const b = second.entries ?? []
96
+ for (let index = 0; index < Math.max(a.length, b.length); index++) {
97
+ const left = a[index]
98
+ const right = b[index]
99
+ if (left === undefined || right === undefined || left[0] !== right[0]) return { path: `${path}.keys[${index}]`, first: left?.[0], second: right?.[0] }
100
+ const found = difference(left[1], right[1], `${path}[${JSON.stringify(left[0])}]`)
101
+ if (found !== undefined) return found
102
+ }
103
+ return undefined
104
+ }
105
+
106
+ /**
107
+ * Checks a schedule with identical inputs on two independently built worlds.
108
+ * The factory must make a fresh runtime each time (also on diagnostic
109
+ * reruns); it must not read live keyboard, pointer, network, or wall time.
110
+ * Values are compared structurally, with Object.is for primitives (NaN
111
+ * equals NaN). Maps and sets include iteration order. Functions compare by
112
+ * identity; weak collections and promises fail explicitly as uninspectable.
113
+ */
114
+ export const check = <S extends Schema.Any, Root, const Names extends string>(
115
+ make: (context: Context) => Target<S, Root, Names>,
116
+ options: Options<NoInfer<Names>>
117
+ ): CheckResult => {
118
+ if (!Number.isSafeInteger(options.frames) || options.frames < 0) {
119
+ return { ok: false, frame: 0, reason: "invalid-options", run: "first", error: "frames must be a finite whole number, 0 or more" }
120
+ }
121
+ const context: Context = { hostClock: options.hostClock }
122
+ let run: "first" | "second" = "first"
123
+ let frame = 0
124
+ try {
125
+ const first = make(context)
126
+ run = "second"
127
+ const second = make(context)
128
+ if (first.runtime === second.runtime || first.runtime.debug === second.runtime.debug) {
129
+ return { ok: false, frame: 0, reason: "shared-runtime", run, error: "the factory must build a fresh runtime each time" }
130
+ }
131
+ const a = first.schedules[options.schedule]
132
+ const b = second.schedules[options.schedule]
133
+ if (a === undefined || b === undefined) return { ok: false, frame: 0, reason: "invalid-options", run, error: `unknown schedule ${options.schedule}` }
134
+ for (; frame <= options.frames; frame++) {
135
+ if (frame > 0) {
136
+ run = "first"
137
+ const result = first.runtime.tryTick(a)
138
+ if (!result.ok) return { ok: false, frame, reason: "failure", run, error: result.error }
139
+ }
140
+ run = "first"
141
+ const left = capture(first.runtime.debug.dump())
142
+ if (frame > 0) {
143
+ run = "second"
144
+ const result = second.runtime.tryTick(b)
145
+ if (!result.ok) return { ok: false, frame, reason: "failure", run, error: result.error }
146
+ }
147
+ run = "second"
148
+ const found = difference(left, capture(second.runtime.debug.dump()))
149
+ if (found !== undefined) {
150
+ const after = frame === 0 ? undefined : locate(make, context, options.schedule, frame)
151
+ return { ok: false, frame, reason: "difference", difference: found.path, first: found.first, second: found.second, after }
152
+ }
153
+ }
154
+ return { ok: true, frames: options.frames }
155
+ } catch (error) {
156
+ return { ok: false, frame, reason: "defect", run, error }
157
+ }
158
+ }
159
+
160
+ const locate = <S extends Schema.Any, Root, Names extends string>(
161
+ make: (context: Context) => Target<S, Root, Names>, context: Context, schedule: Names, frame: number
162
+ ): string | undefined => {
163
+ const stops: Array<() => void> = []
164
+ try {
165
+ const first = make(context)
166
+ const second = make(context)
167
+ const traces: [Array<Trace>, Array<Trace>] = [[], []]
168
+ for (let index = 1; index <= frame; index++) {
169
+ for (const [run, target] of [first, second].entries()) {
170
+ if (index === frame) stops.push(target.runtime.debug.observe((event: Debug.TraceEvent) => {
171
+ const after = event.type === "system" ? event.system : event.type === "deferred" ? "applyDeferred()" : event.type === "transition" ? "applyStateTransitions()" : undefined
172
+ if (after !== undefined) traces[run as 0 | 1].push({ after, state: capture(target.runtime.debug.dump()) })
173
+ }))
174
+ if (!target.runtime.tryTick(target.schedules[schedule]).ok) return undefined
175
+ }
176
+ }
177
+ for (let index = 0; index < Math.max(traces[0].length, traces[1].length); index++) {
178
+ const a = traces[0][index]
179
+ const b = traces[1][index]
180
+ if (a === undefined || b === undefined || a.after !== b.after) return a?.after ?? b?.after
181
+ if (difference(a.state, b.state) !== undefined) return a.after
182
+ }
183
+ return undefined
184
+ } catch {
185
+ // Diagnostic replay must not replace the original mismatch with a new error.
186
+ return undefined
187
+ } finally {
188
+ for (const stop of stops) stop()
189
+ }
190
+ }
package/src/Format.ts CHANGED
@@ -88,6 +88,10 @@ export const value = (input: unknown, options: ValueOptions = {}): string => {
88
88
 
89
89
  const list = (items: ReadonlyArray<string>): string => items.length === 0 ? "-" : items.join(", ")
90
90
 
91
+ /** One transition as `Machine from -> to`; a sub-state without a value prints `(inactive)`. */
92
+ export const transition = (event: Pick<Debug.TransitionEvent, "machine" | "from" | "to">): string =>
93
+ `${event.machine} ${event.from === undefined ? "(inactive)" : String(event.from)} -> ${event.to === undefined ? "(inactive)" : String(event.to)}`
94
+
91
95
  /** One system's placements and declared access, indented under its name. */
92
96
  export const system = (input: Debug.SystemDescription): string => {
93
97
  const lines: Array<string> = [`${input.name} @ ${input.placements.join(", ")}`]
@@ -100,6 +104,10 @@ export const system = (input: Debug.SystemDescription): string => {
100
104
  query.without.length > 0 ? `without ${query.without.join(", ")}` : undefined,
101
105
  query.added.length > 0 ? `added ${query.added.join(", ")}` : undefined,
102
106
  query.changed.length > 0 ? `changed ${query.changed.join(", ")}` : undefined,
107
+ ...query.anyOf.map((members) => `any of (${[
108
+ ...members.added.map((name) => `added ${name}`),
109
+ ...members.changed.map((name) => `changed ${name}`)
110
+ ].join(", ")})`),
103
111
  query.relations.length > 0 ? query.relations.join(", ") : undefined
104
112
  ].filter((part) => part !== undefined)
105
113
  lines.push(` query ${query.slot}: ${parts.join("; ")}`)
@@ -107,7 +115,8 @@ export const system = (input: Debug.SystemDescription): string => {
107
115
  const add = (label: string, items: ReadonlyArray<string>) => {
108
116
  if (items.length > 0) lines.push(` ${label}: ${items.join(", ")}`)
109
117
  }
110
- add("reads resources", input.resources.reads)
118
+ add("reads resources", input.resources.reads.filter((name) => !input.resources.changed.includes(name)))
119
+ add("reads resources when changed", input.resources.changed)
111
120
  add("writes resources", input.resources.writes)
112
121
  add("reads events", input.events.reads)
113
122
  add("emits events", input.events.writes)
@@ -119,6 +128,13 @@ export const system = (input: Debug.SystemDescription): string => {
119
128
  if (input.despawned) lines.push(" reads despawned")
120
129
  add("reads relation failures", input.relationFailures)
121
130
  add("services", input.services)
131
+ add("may spawn", input.commands.spawns)
132
+ add("may insert", input.commands.inserts)
133
+ add("may remove", input.commands.removes)
134
+ add("may despawn", input.commands.despawns)
135
+ add("may despawn scope", input.commands.despawnsScope)
136
+ add("may relate", input.commands.relates)
137
+ if (input.thisTick.length > 0) add("needs this tick", input.thisTick)
122
138
  add("when", input.when)
123
139
  add("pauses when", input.pauseWhen)
124
140
  if (input.local) lines.push(" local state")
@@ -135,7 +151,10 @@ export const lintLines = (lints: ReadonlyArray<Debug.Lint>): Array<string> => [
135
151
  export const description = (input: Debug.Description): string => {
136
152
  const lines: Array<string> = []
137
153
  lines.push("# Components")
138
- for (const component of input.components) lines.push(`${component.name} (${component.storage})`)
154
+ for (const component of input.components) {
155
+ const notes = [component.storage, ...(component.immutable ? ["immutable"] : []), ...(component.requires.length > 0 ? [`requires ${component.requires.join(", ")}`] : [])]
156
+ lines.push(`${component.name} (${notes.join(", ")})`)
157
+ }
139
158
  lines.push("", "# Resources")
140
159
  for (const resource of input.resources) {
141
160
  lines.push(`${resource.name} (${resource.storage}${resource.present ? "" : ", no value"})`)
@@ -155,7 +174,14 @@ export const description = (input: Debug.Description): string => {
155
174
  if (input.machines.length > 0) {
156
175
  lines.push("", "# Machines")
157
176
  for (const machine of input.machines) {
158
- lines.push(`${machine.name} = ${machine.current === undefined ? "(not provided)" : String(machine.current)} [${machine.states.join(" | ")}]`)
177
+ const current = !machine.provided ? "(not provided)" : machine.current === undefined ? "(inactive)" : String(machine.current)
178
+ lines.push(`${machine.name} = ${current} [${machine.states.join(" | ")}]${machine.within === undefined ? "" : ` within ${machine.within}`}`)
179
+ }
180
+ }
181
+ if (input.scopes.length > 0) {
182
+ lines.push("", "# Scopes")
183
+ for (const scope of input.scopes) {
184
+ lines.push(`${scope.name}${scope.despawnOn.length > 0 ? ` (despawned on ${scope.despawnOn.join(", ")})` : ""}`)
159
185
  }
160
186
  }
161
187
  if (input.services.length > 0) {
@@ -253,6 +279,8 @@ const effect = (input: Debug.Effect, options: ValueOptions): string => {
253
279
  return `unrelate e${input.entity} ${input.relation}`
254
280
  case "relationFailure":
255
281
  return `relation failure e${input.entity} ${input.relation}: ${input.error}`
282
+ case "requirementViolated":
283
+ return `skipped ${input.command} e${input.entity}: ${input.component} requires ${input.missing}`
256
284
  }
257
285
  }
258
286
 
@@ -269,6 +297,22 @@ export type LineKind =
269
297
  | "skip"
270
298
  | "transition"
271
299
  | "restore"
300
+ | "ignored"
301
+
302
+ /**
303
+ * The text for a failed tick result nobody read: who failed, with what, how
304
+ * many later systems did not run, and when it was found unread.
305
+ */
306
+ export const ignoredFailure = (event: Debug.FailureIgnoredEvent, options: ValueOptions = {}): string => {
307
+ const who = event.system === undefined ? `${event.schedule} did not run` : `${event.system} failed`
308
+ // A system failure shows what the system returned; anything else (missing requirements) as it is.
309
+ const error = typeof event.error === "object" && event.error !== null && (event.error as { readonly kind?: unknown }).kind === "SystemFailure"
310
+ ? (event.error as { readonly error: unknown }).error
311
+ : event.error
312
+ const later = `${event.skipped.length} later ${event.skipped.length === 1 ? "system" : "systems"} did not run`
313
+ const found = event.when === "next-tick" ? "not read before the next tick" : "not read before the session ended"
314
+ return `tick failure ignored: ${who} with ${value(error, options)}; ${later} (${found})`
315
+ }
272
316
 
273
317
  /**
274
318
  * Structural equality for plain data: primitives by `Object.is`, arrays and
@@ -354,6 +398,8 @@ export const lines = (event: Debug.TraceEvent, options: ValueOptions = {}): Read
354
398
  return []
355
399
  case "restore":
356
400
  return [{ kind: "restore", frame: event.frame, schedule: "", system: undefined, entity: undefined, subject: undefined, noop: false, text: `restore ${event.ok ? "applied" : "rejected"}` }]
401
+ case "failure.ignored":
402
+ return [{ kind: "ignored", frame: event.frame, schedule: event.schedule, system: event.system, entity: undefined, subject: undefined, noop: false, text: ignoredFailure(event, options) }]
357
403
  case "transition":
358
404
  return [{
359
405
  kind: "transition",
@@ -363,7 +409,7 @@ export const lines = (event: Debug.TraceEvent, options: ValueOptions = {}): Read
363
409
  entity: undefined,
364
410
  subject: event.machine,
365
411
  noop: event.outcome === "unchanged",
366
- text: `transition ${event.machine} ${String(event.from)} -> ${String(event.to)} ${event.outcome}`
412
+ text: `transition ${transition(event)} ${event.outcome}`
367
413
  }]
368
414
  case "system.skipped": {
369
415
  const discarded = event.discarded.map((entry) => `${entry.count} ${entry.stream}`)
package/src/Invariant.ts CHANGED
@@ -1,28 +1,54 @@
1
1
  /**
2
2
  * Named world checks evaluated after every frame of a session run.
3
3
  *
4
- * A check returns a message describing the violation, or `undefined` when the
5
- * invariant holds. Read the world through `runtime.inspect(...)` with a
6
- * `Game.Inspector`, so the check stays typed and read-only.
4
+ * An invariant is a `Game.Inspector` whose projection returns a message
5
+ * describing the violation, or `undefined` when the invariant holds. The
6
+ * inspector declares its reads like a system and cannot write, so the check
7
+ * is typed and read-only, and `Session.make` rejects at compile time an
8
+ * invariant that reads a resource, service, or machine the runtime does not
9
+ * provide. The invariant is named after its inspector.
10
+ *
11
+ * Use `Invariant.fromInspector` for checks over the world during a session.
12
+ * Use `Game.Inspector` with `runtime.inspect(...)` directly for one-off reads
13
+ * in tests and scripts.
7
14
  *
8
15
  * @module Invariant
9
16
  * @docGroup devtools
10
17
  *
11
18
  * @example
12
19
  * ```ts
13
- * const PlayerInsideWorld = Invariant.make("player inside world", () => {
14
- * for (const position of runtime.inspect(PlayerPositions)) {
15
- * if (position.x < 0 || position.x > WORLD_WIDTH) return `player at x=${position.x}`
20
+ * const PlayerInsideWorld = Invariant.fromInspector(Game.Inspector("player inside world", {
21
+ * queries: { players: Game.Query({ selection: { position: Game.Query.read(Position) }, with: [Player] }) }
22
+ * }, ({ queries }) => {
23
+ * for (const { data } of queries.players.each()) {
24
+ * const { x } = data.position.get()
25
+ * if (x < 0 || x > WORLD_WIDTH) return `player at x=${x}`
16
26
  * }
17
27
  * return undefined
18
- * })
28
+ * }))
29
+ *
30
+ * const session = Session.make(runtime, { schedules: { update }, invariants: [PlayerInsideWorld] })
19
31
  * ```
20
32
  */
33
+ import type * as Inspector from "@typeonce/ritmo/Inspector"
34
+
35
+ export namespace Invariant {
36
+ /** An inspector usable as an invariant: it returns a violation message or `undefined`. */
37
+ export type CheckInspector = Inspector.InspectorDefinition<any, string | undefined, any, any, any>
38
+ }
21
39
 
22
- export interface Invariant {
23
- readonly name: string
24
- /** A violation message, or `undefined` when the invariant holds. */
25
- readonly check: () => string | undefined
40
+ export interface Invariant<I extends Invariant.CheckInspector = Invariant.CheckInspector> {
41
+ /** The inspector's name, printed when the invariant is violated. */
42
+ readonly name: I["name"]
43
+ /** The read-only check: a violation message, or `undefined` when the invariant holds. */
44
+ readonly inspector: I
26
45
  }
27
46
 
28
- export const make = (name: string, check: () => string | undefined): Invariant => ({ name, check })
47
+ /**
48
+ * Turns a `Game.Inspector` that returns `string | undefined` into an
49
+ * invariant for `Session.make({ invariants })`.
50
+ */
51
+ export const fromInspector = <const I extends Invariant.CheckInspector>(inspector: I): Invariant<I> => ({
52
+ name: inspector.name,
53
+ inspector
54
+ })
package/src/Lint.ts ADDED
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The static lints of a game's schedules, as a tool: `describe()`'s lints over
3
+ * a headless runtime, each with its fix, and a verdict (warnings fail, info
4
+ * does not).
5
+ *
6
+ * Run it from a game's `check` script with the CLI:
7
+ *
8
+ * ```sh
9
+ * ritmo-devtools lint src/simulation.ts
10
+ * ```
11
+ *
12
+ * The entry module exports `lintTarget`, a function that builds the game's
13
+ * headless runtime (made with `debug: { hostClock }`) and names its schedules: the
14
+ * ones ticked headless in `schedules`, and the ones that need a renderer or
15
+ * other host services in `describe` (described and linted, never run).
16
+ *
17
+ * Use `Session.make(...).describe()` instead to read the lints while
18
+ * debugging; this module is for the pass/fail check.
19
+ *
20
+ * @module Lint
21
+ * @docGroup devtools
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * // src/simulation.ts
26
+ * export const lintTarget = (): Lint.Target<typeof Game.schema, typeof Game.schema> => {
27
+ * const sim = createSimulation({ keyboard: Keyboard.scripted(bindings, []) })
28
+ * return { runtime: sim.runtime, schedules: { setup: sim.setup, update: sim.update }, describe: { render } }
29
+ * }
30
+ * ```
31
+ */
32
+ import type * as Debug from "@typeonce/ritmo/Debug"
33
+ import type { AnyScheduleOrder, ExecutableScheduleDefinition } from "@typeonce/ritmo/Schedule"
34
+ import type { Schema } from "@typeonce/ritmo/Schema"
35
+
36
+ import * as Rendered from "./Rendered.ts"
37
+
38
+ type AnySchedule<S extends Schema.Any, Root> = ExecutableScheduleDefinition<S, any, Root, any, any, AnyScheduleOrder>
39
+
40
+ /** What `lintTarget` returns. */
41
+ export interface Target<S extends Schema.Any, Root> {
42
+ /** A runtime made with `debug: { hostClock }`. */
43
+ readonly runtime: { readonly debug: Debug.Handle<S, Root> }
44
+ /** The schedules the game ticks, by name. */
45
+ readonly schedules: Readonly<Record<string, AnySchedule<S, Root>>>
46
+ /** Schedules to describe without running (a render schedule needing a renderer). */
47
+ readonly describe?: Readonly<Record<string, AnySchedule<S, Root>>>
48
+ /** Events the host publishes with `runtime.send` (UI requests, network messages): written, for the lints. */
49
+ readonly hostEvents?: ReadonlyArray<Schema.EventDescriptor<S>>
50
+ }
51
+
52
+ export interface Report {
53
+ readonly lints: ReadonlyArray<Debug.Lint>
54
+ readonly warnings: number
55
+ readonly infos: number
56
+ /** `true` when there is no warning-level lint. */
57
+ readonly ok: boolean
58
+ }
59
+
60
+ /** Lints the target's schedules. */
61
+ export const run = <S extends Schema.Any, Root>(target: Target<S, Root>): Rendered.Rendered<Report> => {
62
+ target.runtime.debug.nameSchedules({ ...target.describe, ...target.schedules })
63
+ target.runtime.debug.declareHostEvents(target.hostEvents ?? [])
64
+ const lints = target.runtime.debug.describe().lints
65
+ const warnings = lints.filter((lint) => lint.severity === "warning").length
66
+ const report: Report = { lints, warnings, infos: lints.length - warnings, ok: warnings === 0 }
67
+ const lines = [
68
+ ...lints.flatMap((lint) => [`${lint.severity} ${lint.code} ${lint.subject}: ${lint.message}`, ` fix: ${lint.fix}`]),
69
+ `${warnings} ${warnings === 1 ? "warning" : "warnings"}, ${report.infos} info${warnings > 0 ? " (warnings fail)" : ""}`
70
+ ]
71
+ return Rendered.make(report, lines.join("\n"))
72
+ }