@game-infra/game-state-schemas 0.1.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.
@@ -0,0 +1,368 @@
1
+ import { type InferOutput } from "valibot";
2
+ /**
3
+ * What goes inside a session's `data` and its journal entries' for **freeform
4
+ * mode**: play that follows the player's own words instead of authored
5
+ * branches.
6
+ *
7
+ * Where story mode stores a tree of beats addressed by the choices taken to
8
+ * reach them, freeform mode stores a linear journal of **turns**. Each turn
9
+ * records what the player wrote, what the narrator answered, the skill check
10
+ * that was rolled (if the attempt warranted one), the state effects that
11
+ * followed — the same `ActivationDTO` vocabulary a story branch carries — and
12
+ * the **memories** the turn left behind. Replaying the journal from the start
13
+ * rebuilds the whole session state, so nothing beyond the journal is stored.
14
+ *
15
+ * Memories are organised as a *synapse graph*: every remembered fact connects
16
+ * to one or more **neurons** — a character, a faction, a location, or a domain
17
+ * such as war or romance — and recall walks those connections rather than the
18
+ * whole journal. Old memories are **consolidated**: several small entries
19
+ * connected to the same neuron collapse into one summary, the way five small
20
+ * grievances become "many past grievances". A consolidation is recorded on the
21
+ * turn that performed it, so replay compresses exactly as play did.
22
+ *
23
+ * None of this is attached to any endpoint — `game-state-service` stores `data`
24
+ * as an opaque string, the same way `game-content-service` stores authored
25
+ * design content — but two clients reading the same session must agree on the
26
+ * shapes, so they live here.
27
+ *
28
+ * They live in *this* package rather than `@game-infra/story-schemas` because a
29
+ * journal is not design. A world and its cast are authored once and read by
30
+ * every player; a session's turns belong to one player, change every turn, and
31
+ * are deleted with the run.
32
+ */
33
+ /** Separator inside a neuron id, between its kind and the entity it names. */
34
+ export declare const NEURON_KEY_SEPARATOR = ":";
35
+ /**
36
+ * The id of a neuron: its kind, then the id it wraps.
37
+ *
38
+ * Entity neurons wrap a design id (`character:tallow`, `faction:ash-wardens`);
39
+ * domain neurons wrap a domain name (`domain:war`). Keeping the kind in the id
40
+ * is what lets a memory's `neuronIds` list mix people and themes freely.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { neuronKey } from '@game-infra/game-state-schemas'
45
+ *
46
+ * neuronKey('character', 'tallow') // 'character:tallow'
47
+ * neuronKey('domain', 'war') // 'domain:war'
48
+ * ```
49
+ */
50
+ export declare function neuronKey(kind: string, id: string): string;
51
+ /**
52
+ * The kind and wrapped id a neuron key encodes. The inverse of
53
+ * {@link neuronKey}; a key with no separator reads as a bare domain.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * import { parseNeuronKey } from '@game-infra/game-state-schemas'
58
+ *
59
+ * parseNeuronKey('character:tallow') // { kind: 'character', id: 'tallow' }
60
+ * parseNeuronKey('war') // { kind: 'domain', id: 'war' }
61
+ * ```
62
+ */
63
+ export declare function parseNeuronKey(key: string): {
64
+ kind: string;
65
+ id: string;
66
+ };
67
+ /**
68
+ * The suggested domain neurons: the recurring subject matters of play that are
69
+ * nobody in particular. A game may extend the list — a domain neuron is just a
70
+ * key — but sharing a default set means two clients file "the war got worse"
71
+ * under the same neuron.
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * import { FREEFORM_DOMAINS, neuronKey } from '@game-infra/game-state-schemas'
76
+ *
77
+ * FREEFORM_DOMAINS.includes('romance') // true
78
+ * neuronKey('domain', 'romance') // 'domain:romance'
79
+ * ```
80
+ */
81
+ export declare const FREEFORM_DOMAINS: readonly ["war", "politics", "economy", "business", "crime", "romance", "faith", "health", "knowledge", "travel"];
82
+ /**
83
+ * One remembered fact — an engram.
84
+ *
85
+ * `neuronIds` are the {@link neuronKey} connections recall walks; `turn` is
86
+ * when it was formed, which is what lets recent memory outrank old memory; and
87
+ * `weight` (1–5) is how much it mattered, which is what lets a betrayal outrank
88
+ * a purchase. A memory produced by consolidation looks like any other — its
89
+ * sources are named by the {@link ConsolidationDTOSchema} that replaced them.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * import type { MemoryDTO } from '@game-infra/game-state-schemas'
94
+ *
95
+ * const memory: MemoryDTO = {
96
+ * id: 'm4-1',
97
+ * text: 'Ilse saw you pocket the ledger and said nothing.',
98
+ * neuronIds: ['character:warden-ilse', 'domain:crime'],
99
+ * turn: 4,
100
+ * weight: 4,
101
+ * }
102
+ * ```
103
+ */
104
+ export declare const MemoryDTOSchema: import("valibot").ObjectSchema<{
105
+ readonly id: import("valibot").StringSchema<undefined>;
106
+ /** One sentence, written to be read back to a narrator later. */
107
+ readonly text: import("valibot").StringSchema<undefined>;
108
+ /** The {@link neuronKey} connections recall walks. */
109
+ readonly neuronIds: import("valibot").ArraySchema<import("valibot").StringSchema<undefined>, undefined>;
110
+ /** The turn index the memory was formed on. */
111
+ readonly turn: import("valibot").NumberSchema<undefined>;
112
+ /** Salience, 1 (incidental) to 5 (unforgettable). */
113
+ readonly weight: import("valibot").NumberSchema<undefined>;
114
+ }, undefined>;
115
+ export type MemoryDTO = InferOutput<typeof MemoryDTOSchema>;
116
+ /**
117
+ * One act of forgetting-by-summary: the memories consolidated away, and the
118
+ * single summary memory that stands for them from this turn on.
119
+ *
120
+ * Recorded on the turn that performed it so replaying the journal compresses
121
+ * exactly as play did — the superseded ids stop being recalled, the summary
122
+ * starts.
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * import type { ConsolidationDTO } from '@game-infra/game-state-schemas'
127
+ *
128
+ * const consolidation: ConsolidationDTO = {
129
+ * memoryIds: ['m2-1', 'm3-2', 'm5-1'],
130
+ * memory: {
131
+ * id: 'c9-1',
132
+ * text: 'The wardens hold many small grievances against you.',
133
+ * neuronIds: ['faction:ash-wardens'],
134
+ * turn: 9,
135
+ * weight: 4,
136
+ * },
137
+ * }
138
+ * ```
139
+ */
140
+ export declare const ConsolidationDTOSchema: import("valibot").ObjectSchema<{
141
+ /** The memories the summary supersedes. */
142
+ readonly memoryIds: import("valibot").ArraySchema<import("valibot").StringSchema<undefined>, undefined>;
143
+ /** The summary that stands for them. */
144
+ readonly memory: import("valibot").ObjectSchema<{
145
+ readonly id: import("valibot").StringSchema<undefined>;
146
+ /** One sentence, written to be read back to a narrator later. */
147
+ readonly text: import("valibot").StringSchema<undefined>;
148
+ /** The {@link neuronKey} connections recall walks. */
149
+ readonly neuronIds: import("valibot").ArraySchema<import("valibot").StringSchema<undefined>, undefined>;
150
+ /** The turn index the memory was formed on. */
151
+ readonly turn: import("valibot").NumberSchema<undefined>;
152
+ /** Salience, 1 (incidental) to 5 (unforgettable). */
153
+ readonly weight: import("valibot").NumberSchema<undefined>;
154
+ }, undefined>;
155
+ }, undefined>;
156
+ export type ConsolidationDTO = InferOutput<typeof ConsolidationDTOSchema>;
157
+ /**
158
+ * One situational bonus or malus on a check, with the reason it applies —
159
+ * `{ label: 'the wardens distrust you', amount: -2 }` — so a roll readout can
160
+ * say why the odds were what they were.
161
+ */
162
+ export declare const CheckModifierDTOSchema: import("valibot").ObjectSchema<{
163
+ readonly label: import("valibot").StringSchema<undefined>;
164
+ readonly amount: import("valibot").NumberSchema<undefined>;
165
+ }, undefined>;
166
+ export type CheckModifierDTO = InferOutput<typeof CheckModifierDTOSchema>;
167
+ /** How hard an attempt was judged. `trivial` attempts are not rolled at all. */
168
+ export declare const FREEFORM_COMPLEXITIES: readonly ["trivial", "easy", "moderate", "hard", "formidable"];
169
+ export declare const FreeformComplexitySchema: import("valibot").PicklistSchema<readonly ["trivial", "easy", "moderate", "hard", "formidable"], undefined>;
170
+ export type FreeformComplexity = InferOutput<typeof FreeformComplexitySchema>;
171
+ /** How a rolled check landed. */
172
+ export declare const FREEFORM_OUTCOMES: readonly ["critical-success", "success", "failure", "critical-failure"];
173
+ export declare const FreeformOutcomeSchema: import("valibot").PicklistSchema<readonly ["critical-success", "success", "failure", "critical-failure"], undefined>;
174
+ export type FreeformOutcome = InferOutput<typeof FreeformOutcomeSchema>;
175
+ /**
176
+ * A skill check, rolled once and recorded forever.
177
+ *
178
+ * The roll happens when the turn is resolved and its result is stored, never
179
+ * re-rolled: replaying the journal must rebuild the same session, and dice do
180
+ * not replay. Everything a reader needs to see the roll was fair is here — the
181
+ * skill and stat it leaned on, the difficulty the complexity mapped to, the
182
+ * die, every modifier with its reason, and the total that met or missed it.
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * import type { ResolvedCheckDTO } from '@game-infra/game-state-schemas'
187
+ *
188
+ * const check: ResolvedCheckDTO = {
189
+ * skillId: 'skulking',
190
+ * statId: 'grace',
191
+ * complexity: 'hard',
192
+ * difficulty: 16,
193
+ * roll: 13,
194
+ * modifiers: [
195
+ * { label: 'Skulking rank', amount: 2 },
196
+ * { label: 'moonless night', amount: 1 },
197
+ * ],
198
+ * total: 16,
199
+ * outcome: 'success',
200
+ * }
201
+ * ```
202
+ */
203
+ export declare const ResolvedCheckDTOSchema: import("valibot").ObjectSchema<{
204
+ /** The skill rolled, when one applied. */
205
+ readonly skillId: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
206
+ /** The stat behind it, when one applied. */
207
+ readonly statId: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
208
+ readonly complexity: import("valibot").PicklistSchema<readonly ["trivial", "easy", "moderate", "hard", "formidable"], undefined>;
209
+ /** The target number the complexity mapped to. */
210
+ readonly difficulty: import("valibot").NumberSchema<undefined>;
211
+ /** The die, unmodified. */
212
+ readonly roll: import("valibot").NumberSchema<undefined>;
213
+ /** Every bonus and malus that applied, each with its reason. */
214
+ readonly modifiers: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
215
+ readonly label: import("valibot").StringSchema<undefined>;
216
+ readonly amount: import("valibot").NumberSchema<undefined>;
217
+ }, undefined>, undefined>;
218
+ /** `roll` plus every modifier. */
219
+ readonly total: import("valibot").NumberSchema<undefined>;
220
+ readonly outcome: import("valibot").PicklistSchema<readonly ["critical-success", "success", "failure", "critical-failure"], undefined>;
221
+ }, undefined>;
222
+ export type ResolvedCheckDTO = InferOutput<typeof ResolvedCheckDTOSchema>;
223
+ /**
224
+ * A character first met during freeform play, persisted so the world remembers
225
+ * them.
226
+ *
227
+ * The definition is whatever design-document character shape the game uses —
228
+ * this contract guarantees only the id and name and passes the rest through,
229
+ * the same stance `sessionState.ts` takes on `data`.
230
+ */
231
+ export declare const IntroducedEntityDTOSchema: import("valibot").LooseObjectSchema<{
232
+ readonly id: import("valibot").StringSchema<undefined>;
233
+ readonly name: import("valibot").StringSchema<undefined>;
234
+ }, undefined>;
235
+ export type IntroducedEntityDTO = InferOutput<typeof IntroducedEntityDTOSchema>;
236
+ /**
237
+ * One turn of freeform play — the payload of one journal entry, stored at the
238
+ * entry's `sequence`.
239
+ *
240
+ * Everything downstream of the player's words is recorded: the neurons the
241
+ * adjudicator judged relevant (`focus`), the check it rolled (absent when the
242
+ * attempt was trivial or purely conversational), the effects in the same
243
+ * `ActivationDTO` vocabulary a story branch carries, the characters the turn
244
+ * introduced, the memories it formed and the consolidations it performed.
245
+ * Folding turns in order rebuilds the play state, the cast and the memory
246
+ * graph; nothing else is stored.
247
+ *
248
+ * @example
249
+ * ```ts
250
+ * import type { FreeformTurnPayload } from '@game-infra/game-state-schemas'
251
+ *
252
+ * const turn: FreeformTurnPayload = {
253
+ * index: 4,
254
+ * input: 'I slip the ledger under my coat and walk out.',
255
+ * title: 'The ledger walks out',
256
+ * narration: 'The clasp catches once, then gives…',
257
+ * focus: ['character:warden-ilse', 'domain:crime'],
258
+ * check: {
259
+ * skillId: 'skulking', statId: 'grace', complexity: 'moderate', difficulty: 12,
260
+ * roll: 11, modifiers: [{ label: 'Skulking rank', amount: 2 }], total: 13,
261
+ * outcome: 'success',
262
+ * },
263
+ * effects: [{ type: 'GrantItem', params: { itemId: 'ilses-ledger', quantity: 1 } }],
264
+ * introduced: [],
265
+ * memories: [{
266
+ * id: 'm4-1', text: 'You stole the ledger from under Ilse\'s eyes.',
267
+ * neuronIds: ['character:warden-ilse', 'domain:crime'], turn: 4, weight: 4,
268
+ * }],
269
+ * consolidations: [],
270
+ * model: 'aion',
271
+ * }
272
+ * ```
273
+ */
274
+ export declare const FreeformTurnPayloadSchema: import("valibot").ObjectSchema<{
275
+ readonly index: import("valibot").NumberSchema<undefined>;
276
+ /** What the player wrote. Empty on the opening turn. */
277
+ readonly input: import("valibot").StringSchema<undefined>;
278
+ /** A few words naming the moment, for the journal listing. */
279
+ readonly title: import("valibot").StringSchema<undefined>;
280
+ /** The narrator's answer — what actually happened. */
281
+ readonly narration: import("valibot").StringSchema<undefined>;
282
+ /** The {@link neuronKey}s the adjudicator judged relevant to this turn. */
283
+ readonly focus: import("valibot").ArraySchema<import("valibot").StringSchema<undefined>, undefined>;
284
+ /** The check that was rolled, when the attempt warranted one. */
285
+ readonly check: import("valibot").OptionalSchema<import("valibot").ObjectSchema<{
286
+ /** The skill rolled, when one applied. */
287
+ readonly skillId: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
288
+ /** The stat behind it, when one applied. */
289
+ readonly statId: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
290
+ readonly complexity: import("valibot").PicklistSchema<readonly ["trivial", "easy", "moderate", "hard", "formidable"], undefined>;
291
+ /** The target number the complexity mapped to. */
292
+ readonly difficulty: import("valibot").NumberSchema<undefined>;
293
+ /** The die, unmodified. */
294
+ readonly roll: import("valibot").NumberSchema<undefined>;
295
+ /** Every bonus and malus that applied, each with its reason. */
296
+ readonly modifiers: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
297
+ readonly label: import("valibot").StringSchema<undefined>;
298
+ readonly amount: import("valibot").NumberSchema<undefined>;
299
+ }, undefined>, undefined>;
300
+ /** `roll` plus every modifier. */
301
+ readonly total: import("valibot").NumberSchema<undefined>;
302
+ readonly outcome: import("valibot").PicklistSchema<readonly ["critical-success", "success", "failure", "critical-failure"], undefined>;
303
+ }, undefined>, undefined>;
304
+ /** State changes, in the same vocabulary a story branch's effects use. */
305
+ readonly effects: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
306
+ readonly type: import("valibot").StringSchema<undefined>;
307
+ readonly params: import("valibot").RecordSchema<import("valibot").StringSchema<undefined>, import("valibot").UnknownSchema, undefined>;
308
+ }, undefined>, undefined>;
309
+ /** Characters first met this turn, persisted with their definitions. */
310
+ readonly introduced: import("valibot").ArraySchema<import("valibot").LooseObjectSchema<{
311
+ readonly id: import("valibot").StringSchema<undefined>;
312
+ readonly name: import("valibot").StringSchema<undefined>;
313
+ }, undefined>, undefined>;
314
+ /** The memories this turn formed. */
315
+ readonly memories: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
316
+ readonly id: import("valibot").StringSchema<undefined>;
317
+ /** One sentence, written to be read back to a narrator later. */
318
+ readonly text: import("valibot").StringSchema<undefined>;
319
+ /** The {@link neuronKey} connections recall walks. */
320
+ readonly neuronIds: import("valibot").ArraySchema<import("valibot").StringSchema<undefined>, undefined>;
321
+ /** The turn index the memory was formed on. */
322
+ readonly turn: import("valibot").NumberSchema<undefined>;
323
+ /** Salience, 1 (incidental) to 5 (unforgettable). */
324
+ readonly weight: import("valibot").NumberSchema<undefined>;
325
+ }, undefined>, undefined>;
326
+ /** The memory summaries this turn performed. */
327
+ readonly consolidations: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
328
+ /** The memories the summary supersedes. */
329
+ readonly memoryIds: import("valibot").ArraySchema<import("valibot").StringSchema<undefined>, undefined>;
330
+ /** The summary that stands for them. */
331
+ readonly memory: import("valibot").ObjectSchema<{
332
+ readonly id: import("valibot").StringSchema<undefined>;
333
+ /** One sentence, written to be read back to a narrator later. */
334
+ readonly text: import("valibot").StringSchema<undefined>;
335
+ /** The {@link neuronKey} connections recall walks. */
336
+ readonly neuronIds: import("valibot").ArraySchema<import("valibot").StringSchema<undefined>, undefined>;
337
+ /** The turn index the memory was formed on. */
338
+ readonly turn: import("valibot").NumberSchema<undefined>;
339
+ /** Salience, 1 (incidental) to 5 (unforgettable). */
340
+ readonly weight: import("valibot").NumberSchema<undefined>;
341
+ }, undefined>;
342
+ }, undefined>, undefined>;
343
+ /** The model that resolved the turn, so a re-read can say what produced it. */
344
+ readonly model: import("valibot").StringSchema<undefined>;
345
+ }, undefined>;
346
+ export type FreeformTurnPayload = InferOutput<typeof FreeformTurnPayloadSchema>;
347
+ /**
348
+ * A freeform session's header payload — what goes inside a
349
+ * {@link GameSessionRecord}'s `data`. The session is scoped to the world it
350
+ * plays in; its turns are the journal entries under it.
351
+ *
352
+ * @example
353
+ * ```ts
354
+ * import type { FreeformSessionPayload } from '@game-infra/game-state-schemas'
355
+ *
356
+ * const session: FreeformSessionPayload = {
357
+ * title: 'A thief in Cinderhold',
358
+ * premise: 'Arrive with nothing and see what the city lets you take.',
359
+ * }
360
+ * ```
361
+ */
362
+ export declare const FreeformSessionPayloadSchema: import("valibot").ObjectSchema<{
363
+ readonly title: import("valibot").StringSchema<undefined>;
364
+ /** The player's opening intent — what this playthrough is about. May be empty. */
365
+ readonly premise: import("valibot").StringSchema<undefined>;
366
+ }, undefined>;
367
+ export type FreeformSessionPayload = InferOutput<typeof FreeformSessionPayloadSchema>;
368
+ //# sourceMappingURL=freeformPayloads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freeformPayloads.d.ts","sourceRoot":"","sources":["../src/freeformPayloads.ts"],"names":[],"mappings":"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"}