holonovel 2026.8.22

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,492 @@
1
+ // World Model — kinds, properties, rooms, things, exits, containment, convert_source
2
+ // REQ-195, REQ-196, REQ-198, REQ-199, REQ-200, REQ-201, REQ-202, REQ-222
3
+ // REQ-316, REQ-317, REQ-318, REQ-319, REQ-320
4
+ export const WORLD_MODEL_KINDS = {
5
+ thing: { parent: null, description: "A physical object in the world." },
6
+ container: { parent: "thing", description: "A thing that can hold other things. Portable by default. When closed, contents are blocked." },
7
+ supporter: { parent: "thing", description: "A thing that other things can rest on. Fixed by default." },
8
+ door: { parent: "thing", description: "A thing that connects two rooms and may be opened or closed. Blocks passage when closed. Lockable." },
9
+ device: { parent: "thing", description: "A thing that can be switched on or off. Portable by default." },
10
+ vehicle: { parent: "thing", description: "An enterable thing with a virtual interior room. Moves between rooms. Fixed by default." },
11
+ person: { parent: "thing", description: "An animate being. Visible and examinable in rooms." },
12
+ backdrop: { parent: "thing", description: "A thing present in multiple rooms; scenery-level." },
13
+ region: { parent: null, description: "A named area spanning multiple rooms." },
14
+ };
15
+ export const ROOM_DIRECTIONS = [
16
+ "north", "south", "east", "west",
17
+ "northeast", "northwest", "southeast", "southwest",
18
+ "up", "down", "in", "out",
19
+ ];
20
+ export function oppositeDirection(dir) {
21
+ const pairs = {
22
+ north: "south", south: "north", east: "west", west: "east",
23
+ northeast: "southwest", northwest: "southeast", southeast: "northwest", southwest: "northeast",
24
+ up: "down", down: "up", in: "out", out: "in",
25
+ };
26
+ return pairs[dir] ?? dir;
27
+ }
28
+ export function createEmptyWorldModel() {
29
+ return { rooms: new Map(), things: new Map() };
30
+ }
31
+ export const BASE_PARSER_COMMANDS = [
32
+ { verb: "look", category: "navigation", args: [] },
33
+ { verb: "go", category: "navigation", args: ["direction"] },
34
+ { verb: "north", category: "navigation", args: [] },
35
+ { verb: "south", category: "navigation", args: [] },
36
+ { verb: "east", category: "navigation", args: [] },
37
+ { verb: "west", category: "navigation", args: [] },
38
+ { verb: "northeast", category: "navigation", args: [] },
39
+ { verb: "northwest", category: "navigation", args: [] },
40
+ { verb: "southeast", category: "navigation", args: [] },
41
+ { verb: "southwest", category: "navigation", args: [] },
42
+ { verb: "up", category: "navigation", args: [] },
43
+ { verb: "down", category: "navigation", args: [] },
44
+ { verb: "in", category: "navigation", args: [] },
45
+ { verb: "out", category: "navigation", args: [] },
46
+ { verb: "take", category: "object_interaction", args: ["thing"] },
47
+ { verb: "drop", category: "object_interaction", args: ["thing"] },
48
+ { verb: "inventory", category: "inventory", args: [] },
49
+ { verb: "i", category: "inventory", args: [] },
50
+ { verb: "open", category: "object_interaction", args: ["thing"] },
51
+ { verb: "close", category: "object_interaction", args: ["thing"] },
52
+ { verb: "unlock", category: "object_interaction", args: ["thing", "key"] },
53
+ { verb: "lock", category: "object_interaction", args: ["thing", "key"] },
54
+ { verb: "put", category: "object_interaction", args: ["thing", "target"] },
55
+ { verb: "search", category: "inspection", args: ["thing"] },
56
+ { verb: "examine", category: "inspection", args: ["thing"] },
57
+ { verb: "wait", category: "wait", args: [] },
58
+ ];
59
+ export function resolveThingName(input, thingsInRoom, inventory) {
60
+ const lower = input.toLowerCase().trim();
61
+ const candidates = thingsInRoom.filter(t => t.name.toLowerCase().includes(lower));
62
+ return candidates;
63
+ }
64
+ export function resolveThingInInventory(input, heldThings) {
65
+ const lower = input.toLowerCase().trim();
66
+ return heldThings.filter(t => t.name.toLowerCase().includes(lower));
67
+ }
68
+ function splitStatements(source) {
69
+ const statements = [];
70
+ const raw = source.split("\n");
71
+ for (const line of raw) {
72
+ const trimmed = line.trim();
73
+ if (!trimmed || trimmed.startsWith("//") || trimmed.startsWith("#"))
74
+ continue;
75
+ let current = "";
76
+ let inQuote = false;
77
+ let skipNextSpace = false;
78
+ for (let i = 0; i < trimmed.length; i++) {
79
+ const ch = trimmed[i];
80
+ if (ch === '"')
81
+ inQuote = !inQuote;
82
+ current += ch;
83
+ if (!inQuote && ch === "." && i < trimmed.length - 1 && trimmed[i + 1] === " ") {
84
+ // Don't split if next non-space char is a quote (attached description)
85
+ let j = i + 1;
86
+ while (j < trimmed.length && trimmed[j] === " ")
87
+ j++;
88
+ if (j < trimmed.length && trimmed[j] === '"') {
89
+ current += " ";
90
+ i++;
91
+ skipNextSpace = true;
92
+ continue;
93
+ }
94
+ statements.push(current.trim());
95
+ current = "";
96
+ skipNextSpace = true;
97
+ }
98
+ else if (skipNextSpace && ch === " ") {
99
+ skipNextSpace = false;
100
+ continue;
101
+ }
102
+ else {
103
+ skipNextSpace = false;
104
+ }
105
+ }
106
+ const remain = current.trim();
107
+ if (remain)
108
+ statements.push(remain);
109
+ }
110
+ return statements;
111
+ }
112
+ export function convertSource(source, existingWorld) {
113
+ const warnings = [];
114
+ const world = createEmptyWorldModel();
115
+ const statements = splitStatements(source);
116
+ const statementLines = statements.map((text, i) => ({ line: i + 1, text }));
117
+ // Pass 1: collect room names and declarations
118
+ let currentThing = null;
119
+ let currentRoom = null;
120
+ for (const stmt of statementLines) {
121
+ const text = stmt.text;
122
+ const lnum = stmt.line;
123
+ // TTRPG annotations (attached to current room/thing)
124
+ if (text.startsWith("@")) {
125
+ const annotationMatch = text.match(/^@(\w+)\((.+?)\)(?:\s+(.+))?$/);
126
+ if (annotationMatch) {
127
+ const [, category, target, content] = annotationMatch;
128
+ // Attach to world-model objects
129
+ if (category === "npc") {
130
+ if (!world.rooms.has(target)) {
131
+ // Check if it names a room or if we should create a generic annotation
132
+ }
133
+ warnings.push({ line: lnum, pattern: text, message: `TTRPG annotation '@${category}' — resolved as linked annotation.` });
134
+ }
135
+ continue;
136
+ }
137
+ }
138
+ // Room declaration: "<Name> is a room." or "<Name> is a room. "Description.""
139
+ const roomMatch = text.match(/^(.+?) is a room\.\s*(?:"(.*)")?\s*(with\s+.*)?$/i);
140
+ if (roomMatch) {
141
+ const name = roomMatch[1].trim();
142
+ const description = roomMatch[2] || "";
143
+ const room = {
144
+ name,
145
+ description,
146
+ exits: new Map(),
147
+ doorRefs: new Map(),
148
+ annotations: {},
149
+ };
150
+ world.rooms.set(name.toLowerCase(), room);
151
+ currentRoom = name;
152
+ currentThing = null;
153
+ continue;
154
+ }
155
+ // Multi-direction door form: "<Name> is <dir> of <RoomA> and <dir2> of <RoomB>."
156
+ const doorMatch = text.match(/^(.+?) is (\w+) of (.+?) and (\w+) of (.+?)\.$/i);
157
+ if (doorMatch) {
158
+ const doorName = doorMatch[1].trim();
159
+ const dirA = doorMatch[2].toLowerCase();
160
+ const roomA = doorMatch[3].trim();
161
+ const dirB = doorMatch[4].toLowerCase();
162
+ const roomB = doorMatch[5].trim();
163
+ if (isDirection(dirA) && isDirection(dirB)) {
164
+ let rA = world.rooms.get(roomA.toLowerCase());
165
+ if (!rA) {
166
+ rA = { name: roomA, description: "", exits: new Map(), doorRefs: new Map(), annotations: {} };
167
+ world.rooms.set(roomA.toLowerCase(), rA);
168
+ }
169
+ let rB = world.rooms.get(roomB.toLowerCase());
170
+ if (!rB) {
171
+ rB = { name: roomB, description: "", exits: new Map(), doorRefs: new Map(), annotations: {} };
172
+ world.rooms.set(roomB.toLowerCase(), rB);
173
+ }
174
+ rA.exits.set(dirA, roomB);
175
+ rB.exits.set(dirB, roomA);
176
+ rA.doorRefs.set(dirA, doorName);
177
+ rB.doorRefs.set(dirB, doorName);
178
+ const door = {
179
+ name: doorName,
180
+ description: "",
181
+ kind: "door",
182
+ location: roomA,
183
+ locationType: "room",
184
+ portable: false,
185
+ openable: true,
186
+ open: false,
187
+ lockable: true,
188
+ locked: true,
189
+ lit: false,
190
+ switchable: false,
191
+ switched_on: false,
192
+ enterable: false,
193
+ vehiclePassengers: [],
194
+ wearable: false,
195
+ worn_by: null,
196
+ readable: false,
197
+ read_text: null,
198
+ edible: false,
199
+ drinkable: false,
200
+ climbable: false,
201
+ transparent: false,
202
+ annotations: {},
203
+ doorConnects: { roomA, roomB },
204
+ };
205
+ world.things.set(doorName.toLowerCase(), door);
206
+ currentThing = doorName;
207
+ currentRoom = null;
208
+ continue;
209
+ }
210
+ }
211
+ // Exit declaration: "<Direction> of <Room> is <Target>."
212
+ const exitMatch = text.match(/^(\w+) of (.+?) is (.+?)\.$/i);
213
+ if (exitMatch) {
214
+ const dir = exitMatch[1].toLowerCase();
215
+ const roomName = exitMatch[2].trim();
216
+ const targetName = exitMatch[3].trim();
217
+ if (!isDirection(dir)) {
218
+ warnings.push({ line: lnum, pattern: text, message: `Unknown direction '${dir}'.` });
219
+ continue;
220
+ }
221
+ if (targetName.toLowerCase() === "nowhere") {
222
+ const room = world.rooms.get(roomName.toLowerCase());
223
+ if (room)
224
+ room.exits.delete(dir);
225
+ continue;
226
+ }
227
+ let room = world.rooms.get(roomName.toLowerCase());
228
+ if (!room) {
229
+ room = { name: roomName, description: "", exits: new Map(), doorRefs: new Map(), annotations: {} };
230
+ world.rooms.set(roomName.toLowerCase(), room);
231
+ }
232
+ let target = world.rooms.get(targetName.toLowerCase());
233
+ if (!target) {
234
+ target = { name: targetName, description: "", exits: new Map(), doorRefs: new Map(), annotations: {} };
235
+ world.rooms.set(targetName.toLowerCase(), target);
236
+ }
237
+ room.exits.set(dir, targetName);
238
+ // Implicit reverse exit
239
+ target.exits.set(oppositeDirection(dir), roomName);
240
+ currentRoom = null;
241
+ currentThing = null;
242
+ continue;
243
+ }
244
+ // Thing in room: "<Name> is in <Room>." or "A <name> is in <Room>."
245
+ const thingInMatch = text.match(/^(?:A |An )?(.+?) is in (.+?)\.\s*(?:"(.*)")?\s*$/i);
246
+ if (thingInMatch) {
247
+ const thingName = thingInMatch[1].trim();
248
+ const location = thingInMatch[2].trim();
249
+ const desc = thingInMatch[3] || "";
250
+ const thing = {
251
+ name: thingName,
252
+ description: desc,
253
+ kind: "thing",
254
+ location: location,
255
+ locationType: "room",
256
+ portable: true,
257
+ openable: false,
258
+ open: false,
259
+ lockable: false,
260
+ locked: false,
261
+ lit: false,
262
+ switchable: false,
263
+ switched_on: false,
264
+ enterable: false,
265
+ vehiclePassengers: [],
266
+ wearable: false,
267
+ worn_by: null,
268
+ readable: false,
269
+ read_text: null,
270
+ edible: false,
271
+ drinkable: false,
272
+ climbable: false,
273
+ transparent: false,
274
+ annotations: {},
275
+ };
276
+ world.things.set(thingName.toLowerCase(), thing);
277
+ currentThing = thingName;
278
+ currentRoom = null;
279
+ continue;
280
+ }
281
+ // Thing on supporter: "<Name> is on <Supporter>."
282
+ const thingOnMatch = text.match(/^(.+?) is on (.+?)\.\s*(?:"(.*)")?\s*$/i);
283
+ if (thingOnMatch) {
284
+ const thingName = thingOnMatch[1].trim();
285
+ const supporter = thingOnMatch[2].trim();
286
+ const desc = thingOnMatch[3] || "";
287
+ const thing = {
288
+ name: thingName,
289
+ description: desc,
290
+ kind: "thing",
291
+ location: supporter,
292
+ locationType: "supporter",
293
+ portable: true,
294
+ openable: false,
295
+ open: false,
296
+ lockable: false,
297
+ locked: false,
298
+ lit: false,
299
+ switchable: false,
300
+ switched_on: false,
301
+ enterable: false,
302
+ vehiclePassengers: [],
303
+ wearable: false,
304
+ worn_by: null,
305
+ readable: false,
306
+ read_text: null,
307
+ edible: false,
308
+ drinkable: false,
309
+ climbable: false,
310
+ transparent: false,
311
+ annotations: {},
312
+ };
313
+ world.things.set(thingName.toLowerCase(), thing);
314
+ currentThing = thingName;
315
+ currentRoom = null;
316
+ continue;
317
+ }
318
+ // Thing kind declaration: "<Name> is a <kind>." or "<Name> is a <kind>. "Description.""
319
+ const kindMatch = text.match(/^(.+?) is a (thing|container|supporter|door|device|vehicle|person|backdrop)\.\s*(?:"(.*)")?\s*$/i);
320
+ if (kindMatch) {
321
+ const name = kindMatch[1].trim();
322
+ const kind = kindMatch[2].toLowerCase();
323
+ const desc = kindMatch[3] || "";
324
+ const existing = world.things.get(name.toLowerCase());
325
+ if (existing) {
326
+ existing.kind = kind;
327
+ existing.description = existing.description || desc;
328
+ if (kind === "container") {
329
+ existing.openable = true;
330
+ existing.portable = true;
331
+ }
332
+ if (kind === "supporter") {
333
+ existing.portable = false;
334
+ }
335
+ if (kind === "door") {
336
+ existing.openable = true;
337
+ existing.portable = false;
338
+ }
339
+ if (kind === "device") {
340
+ existing.switchable = true;
341
+ }
342
+ if (kind === "vehicle") {
343
+ existing.portable = false;
344
+ existing.enterable = true;
345
+ existing.vehiclePassengers = existing.vehiclePassengers || [];
346
+ }
347
+ }
348
+ else {
349
+ const thing = {
350
+ name,
351
+ description: desc,
352
+ kind,
353
+ location: currentRoom || null,
354
+ locationType: currentRoom ? "room" : null,
355
+ portable: kind === "supporter" || kind === "door" || kind === "vehicle" ? false : true,
356
+ openable: kind === "container" || kind === "door",
357
+ open: false,
358
+ lockable: kind === "container" || kind === "door",
359
+ locked: kind === "door",
360
+ lit: false,
361
+ switchable: kind === "device",
362
+ switched_on: false,
363
+ enterable: kind === "vehicle",
364
+ vehiclePassengers: [],
365
+ wearable: false,
366
+ worn_by: null,
367
+ readable: false,
368
+ read_text: null,
369
+ edible: false,
370
+ drinkable: false,
371
+ climbable: false,
372
+ transparent: false,
373
+ annotations: {},
374
+ };
375
+ if (kind === "door") {
376
+ thing.locked = true;
377
+ }
378
+ world.things.set(name.toLowerCase(), thing);
379
+ }
380
+ currentThing = name;
381
+ currentRoom = null;
382
+ continue;
383
+ }
384
+ // Property declaration: "<Name> is <property>." or "It is <property> and <property>."
385
+ const propMatch = text.match(/^It is (fixed|portable|openable|open|close|closed|lockable|locked|lit|dark)(?: and (fixed|portable|locked|open|closed))?\.\s*$/i) ||
386
+ text.match(/^(.+?) is (fixed|portable|openable|open|lockable|locked|lit|dark)\.\s*$/i);
387
+ if (propMatch) {
388
+ let targetName = currentThing;
389
+ let props = [];
390
+ if (propMatch[1] && propMatch[1].match(/^(fixed|portable|openable|open|lockable|locked|lit|dark|close|closed)$/i)) {
391
+ // "It is ..." form
392
+ props = [propMatch[1], propMatch[2]].filter(Boolean).map(s => s.toLowerCase().replace(/close$/, "closed"));
393
+ }
394
+ else if (propMatch[1]) {
395
+ targetName = propMatch[1].trim();
396
+ props = [propMatch[2]].filter(Boolean).map(s => s.toLowerCase());
397
+ }
398
+ if (!targetName) {
399
+ warnings.push({ line: lnum, pattern: text, message: "Property declaration with no current thing target." });
400
+ continue;
401
+ }
402
+ const thing = world.things.get(targetName.toLowerCase());
403
+ if (!thing) {
404
+ warnings.push({ line: lnum, pattern: text, message: `Thing '${targetName}' not found for property declaration.` });
405
+ continue;
406
+ }
407
+ for (const prop of props) {
408
+ switch (prop) {
409
+ case "fixed":
410
+ thing.portable = false;
411
+ break;
412
+ case "portable":
413
+ thing.portable = true;
414
+ break;
415
+ case "openable":
416
+ thing.openable = true;
417
+ break;
418
+ case "open":
419
+ thing.open = true;
420
+ break;
421
+ case "closed":
422
+ thing.open = false;
423
+ break;
424
+ case "lockable":
425
+ thing.lockable = true;
426
+ break;
427
+ case "locked":
428
+ thing.locked = true;
429
+ break;
430
+ case "unlocked":
431
+ thing.locked = false;
432
+ break;
433
+ case "lit":
434
+ thing.lit = true;
435
+ break;
436
+ case "dark":
437
+ thing.lit = false;
438
+ break;
439
+ default:
440
+ warnings.push({ line: lnum, pattern: text, message: `Unknown property '${prop}'.` });
441
+ }
442
+ }
443
+ continue;
444
+ }
445
+ // Unrecognized
446
+ warnings.push({ line: lnum, pattern: text, message: `Unrecognized assertion pattern.` });
447
+ }
448
+ // Finalize: count all objects
449
+ const annotationCounts = { encounters: 0, npcs: 0, traps: 0, lore: 0 };
450
+ let exitCount = 0;
451
+ for (const [, room] of world.rooms) {
452
+ exitCount += room.exits.size;
453
+ }
454
+ return {
455
+ world,
456
+ result: {
457
+ rooms: world.rooms.size,
458
+ things: world.things.size,
459
+ exits: exitCount,
460
+ annotations: annotationCounts,
461
+ warnings,
462
+ },
463
+ };
464
+ }
465
+ function isDirection(s) {
466
+ return ROOM_DIRECTIONS.includes(s);
467
+ }
468
+ // ── World-model resources ─────────────────────────────────────────
469
+ export function worldMap(world) {
470
+ const lines = [];
471
+ for (const [, room] of world.rooms) {
472
+ const exitList = [];
473
+ for (const [dir, target] of room.exits) {
474
+ exitList.push(`${dir} → ${target}`);
475
+ }
476
+ lines.push(`${room.name}: ${exitList.join(", ") || "no exits"}`);
477
+ }
478
+ return lines.join("\n");
479
+ }
480
+ export function worldKinds() {
481
+ const lines = ["## Kind Hierarchy"];
482
+ for (const [kind, def] of Object.entries(WORLD_MODEL_KINDS)) {
483
+ const parent = def.parent ? ` (extends ${def.parent})` : "";
484
+ lines.push(`- **${kind}**${parent}: ${def.description}`);
485
+ }
486
+ lines.push("\n## Parser Commands");
487
+ for (const cmd of BASE_PARSER_COMMANDS) {
488
+ lines.push(`- \`${cmd.verb}\` [${cmd.category}]`);
489
+ }
490
+ return lines.join("\n");
491
+ }
492
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/world/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { WorldModel } from "./model.js";
2
+ export interface ParserContext {
3
+ world: WorldModel;
4
+ currentRoom: string | null;
5
+ inventory: string[];
6
+ badge: string | null;
7
+ }
8
+ export interface ParserResult {
9
+ prefix: "OK" | "WARNING" | "ERROR";
10
+ code?: string;
11
+ text: string;
12
+ correctiveAction?: string;
13
+ }
14
+ export declare function dispatchCommand(raw: string, ctx: ParserContext): ParserResult;
15
+ export declare function resolveGoMovement(command: string, ctx: ParserContext): {
16
+ newRoom: string | null;
17
+ result: ParserResult;
18
+ };