@polycode-projects/the-mechanical-code-talker 4.0.0 → 4.0.1

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 (68) hide show
  1. package/README.md +176 -8
  2. package/corpus/reference/index.json.gz +0 -0
  3. package/corpus/reference/manifest.json +8 -8
  4. package/corpus/reference/shards/ref-00.jsonl.gz +0 -0
  5. package/corpus/sprites/src/sprite-facts.jsonl +34 -0
  6. package/corpus/worlds/index.json.gz +0 -0
  7. package/corpus/worlds/manifest.json +49 -9
  8. package/corpus/worlds/shards/greyvale-museum.jsonl.gz +0 -0
  9. package/corpus/worlds/shards/lantern-cottage.jsonl.gz +0 -0
  10. package/corpus/worlds/shards/mud-hollow.jsonl.gz +0 -0
  11. package/corpus/worlds/shards/mud-warren.jsonl.gz +0 -0
  12. package/corpus/worlds/shards/spider-fly.jsonl.gz +0 -0
  13. package/corpus/worlds/src/greyvale-museum.jsonl +136 -0
  14. package/corpus/worlds/src/lantern-cottage.jsonl +60 -0
  15. package/corpus/worlds/src/mud-hollow.jsonl +82 -0
  16. package/corpus/worlds/src/mud-warren.jsonl +124 -0
  17. package/corpus/worlds/src/spider-fly.jsonl +1 -1
  18. package/data/sprites/animal-icon.toml +11 -5
  19. package/data/sprites/book-icon.toml +9 -5
  20. package/data/sprites/cabinet-icon.toml +10 -5
  21. package/data/sprites/cellar-icon.toml +16 -6
  22. package/data/sprites/container-icon.toml +7 -3
  23. package/data/sprites/desk-icon.toml +8 -5
  24. package/data/sprites/dog-icon.toml +8 -5
  25. package/data/sprites/dog-with-colour-icon.toml +13 -12
  26. package/data/sprites/drawing-room-icon.toml +14 -5
  27. package/data/sprites/egg-icon.toml +6 -3
  28. package/data/sprites/fly-icon.toml +10 -5
  29. package/data/sprites/furniture-icon.toml +5 -3
  30. package/data/sprites/garden-icon.toml +10 -3
  31. package/data/sprites/key-icon.toml +3 -1
  32. package/data/sprites/kitchen-icon.toml +15 -6
  33. package/data/sprites/lamp-icon.toml +9 -4
  34. package/data/sprites/letter-icon.toml +7 -4
  35. package/data/sprites/library-icon.toml +14 -3
  36. package/data/sprites/pan-icon.toml +7 -3
  37. package/data/sprites/person-icon.toml +6 -2
  38. package/data/sprites/poodle-icon.toml +1 -1
  39. package/data/sprites/portable-icon.toml +6 -4
  40. package/data/sprites/portrait-icon.toml +7 -4
  41. package/data/sprites/room-icon.toml +11 -2
  42. package/data/sprites/spider-icon.toml +9 -3
  43. package/data/sprites/study-icon.toml +10 -2
  44. package/package.json +5 -4
  45. package/src/domain/grammar/ace.mjs +40 -4
  46. package/src/domain/grammar/lexicon-core.json +2 -1
  47. package/src/domain/grammar/lexicon.mjs +18 -0
  48. package/src/domain/reference-pack.mjs +31 -7
  49. package/src/domain/spider-fly-world.mjs +1 -1
  50. package/src/domain/sprite-templates.mjs +8 -6
  51. package/src/services/adventure-viz.mjs +130 -47
  52. package/src/services/adventure.mjs +440 -367
  53. package/src/services/chat-page-viz.mjs +37 -9
  54. package/src/services/chat.mjs +99 -18
  55. package/src/services/code-explorer-viz.mjs +52 -14
  56. package/src/services/extract-facts.mjs +4 -7
  57. package/src/services/ingest-viz.mjs +54 -26
  58. package/src/services/ledger-viz.mjs +105 -56
  59. package/src/services/memory-panel-viz.mjs +24 -0
  60. package/src/services/mud-viz.mjs +940 -21
  61. package/src/services/plan-viz.mjs +119 -61
  62. package/src/services/research-viz.mjs +151 -57
  63. package/src/services/spider-fly-turn.mjs +1 -1
  64. package/src/services/spider-fly-viz.mjs +67 -43
  65. package/src/services/sprite-catalog-viz.mjs +175 -51
  66. package/src/services/viz-theme.mjs +15 -0
  67. package/src/surfaces/web/memory-ask-browser.bundle.js +107 -107
  68. package/src/surfaces/web/mud-browser-entry.mjs +44 -2
@@ -38,8 +38,9 @@ import {
38
38
  foldWorldState, worldActionRows, worldDigestRows, roomAffordances,
39
39
  personKnowledgeLines, personKnownFoodLines,
40
40
  diggableDirections, castInRoom, displayNameOf, isOutOfPlay, outOfPlayReasonOf, outOfPlayPhrase,
41
- roomKindOf,
41
+ roomKindOf, isMudStatePredicate,
42
42
  } from "../../services/adventure.mjs";
43
+ import { waveFact, playedByFact, P2P_PREDICATES } from "../../domain/p2p/facts.mjs";
43
44
  import { relatedForTerm } from "../../domain/skos-view.mjs";
44
45
  import { runMudTurn } from "../../services/mud-turn.mjs";
45
46
  import { parseMudEditorText, planMudEditorSync } from "../../services/mud-editor.mjs";
@@ -232,7 +233,44 @@ export async function createMudSession(worldPayload, { characters = [] } = {}) {
232
233
  return { unrecognized, added: toAppend.length, removed };
233
234
  }
234
235
 
235
- return { memoryDir, windows, snapshot, applyEdit };
236
+ // Wall-clock resolution is 1ms, and both writers below are content-addressed
237
+ // by (subject, predicate, object) — a second wave from the same character in
238
+ // the same room is the SAME fact id, so it only registers as a change if its
239
+ // provenance tag differs. Two writes inside one tick would share a timestamp,
240
+ // share a tag, and the second would silently vanish. p2p-room.mjs nudges its
241
+ // own clock for exactly this reason; this is the same nudge for the writes
242
+ // that happen before a room exists.
243
+ let lastWriteMs = -Infinity;
244
+ function stampNow() {
245
+ const nudged = Math.max(Date.now(), lastWriteMs + 1);
246
+ lastWriteMs = nudged;
247
+ return new Date(nudged).toISOString();
248
+ }
249
+
250
+ /** `character` waves in whichever room it currently stands in — an ordinary
251
+ * add-only fact, so a page with no network renders it exactly like a page
252
+ * sharing the world with three others. Returns the room waved in, or null
253
+ * when the character stands nowhere (out of play). Nothing is ever
254
+ * retracted: "currently waving" is a recency read over this fact's own
255
+ * provenance timestamp. */
256
+ async function wave(character) {
257
+ const here = await roomOf(character);
258
+ if (!here) return null;
259
+ await appendFacts(memoryDir, [waveFact(character, here, stampNow())]);
260
+ return here;
261
+ }
262
+
263
+ /** Claim `characters` for `peerId` — one add-only `mgx:playedBy` fact each.
264
+ * Claims never overwrite: two peers claiming the same animal both write,
265
+ * and every reader settles it the same way by taking the oldest claim. */
266
+ async function claimCharacters(characters, peerId) {
267
+ const at = stampNow();
268
+ const claims = (characters || []).map((character) => playedByFact(character, peerId, at));
269
+ if (claims.length) await appendFacts(memoryDir, claims);
270
+ return claims.length;
271
+ }
272
+
273
+ return { memoryDir, windows, snapshot, applyEdit, wave, claimCharacters };
236
274
  }
237
275
 
238
276
  /** `count` entries drawn at random from `roster`, in random order, without
@@ -324,6 +362,10 @@ globalThis.tmctMud = {
324
362
  personKnowledgeLines, personKnownFoodLines,
325
363
  diggableDirections, castInRoom, displayNameOf, isOutOfPlay, outOfPlayReasonOf, outOfPlayPhrase,
326
364
  roomKindOf,
365
+ // The shared-world reach-throughs: which predicates carry live world state,
366
+ // and the P2P layer's own four. mud.html hands both to `mudSyncableFacts`,
367
+ // which is written to take the check rather than import the engine itself.
368
+ isMudStatePredicate, P2P_PREDICATES,
327
369
  // The edit mode's own reach-throughs: the SKOS neighbourhood and the is-a
328
370
  // chain its cursor-suggestion pills read, neither of which is splice-safe.
329
371
  relatedForTerm,