@polycode-projects/the-mechanical-code-talker 3.0.5 → 3.0.7

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 +41 -16
  2. package/bin/tmct.mjs +1 -1
  3. package/corpus/child/README.md +2 -2
  4. package/corpus/child/index.json.gz +0 -0
  5. package/corpus/child/manifest.json +74 -74
  6. package/corpus/child/shards/child-00.jsonl.gz +0 -0
  7. package/corpus/child/shards/child-01.jsonl.gz +0 -0
  8. package/corpus/child/shards/child-02.jsonl.gz +0 -0
  9. package/corpus/child/shards/child-03.jsonl.gz +0 -0
  10. package/corpus/child/shards/child-04.jsonl.gz +0 -0
  11. package/corpus/child/shards/child-05.jsonl.gz +0 -0
  12. package/corpus/child/shards/child-06.jsonl.gz +0 -0
  13. package/corpus/child/shards/child-07.jsonl.gz +0 -0
  14. package/corpus/child/shards/child-08.jsonl.gz +0 -0
  15. package/corpus/child/shards/child-09.jsonl.gz +0 -0
  16. package/corpus/child/shards/child-0a.jsonl.gz +0 -0
  17. package/corpus/child/shards/child-0b.jsonl.gz +0 -0
  18. package/corpus/child/shards/child-0c.jsonl.gz +0 -0
  19. package/corpus/child/shards/child-0d.jsonl.gz +0 -0
  20. package/corpus/child/shards/child-0e.jsonl.gz +0 -0
  21. package/corpus/child/shards/child-0f.jsonl.gz +0 -0
  22. package/corpus/child/shards/child-10.jsonl.gz +0 -0
  23. package/corpus/child/shards/child-11.jsonl.gz +0 -0
  24. package/corpus/child/shards/child-12.jsonl.gz +0 -0
  25. package/corpus/child/shards/child-13.jsonl.gz +0 -0
  26. package/corpus/child/shards/child-14.jsonl.gz +0 -0
  27. package/corpus/child/shards/child-15.jsonl.gz +0 -0
  28. package/corpus/child/shards/child-16.jsonl.gz +0 -0
  29. package/corpus/child/shards/child-17.jsonl.gz +0 -0
  30. package/corpus/child/shards/child-18.jsonl.gz +0 -0
  31. package/corpus/child/shards/child-19.jsonl.gz +0 -0
  32. package/corpus/child/shards/child-1a.jsonl.gz +0 -0
  33. package/corpus/child/shards/child-1b.jsonl.gz +0 -0
  34. package/corpus/child/shards/child-1c.jsonl.gz +0 -0
  35. package/corpus/child/shards/child-1d.jsonl.gz +0 -0
  36. package/corpus/child/shards/child-1e.jsonl.gz +0 -0
  37. package/corpus/child/shards/child-1f.jsonl.gz +0 -0
  38. package/corpus/conceptnet/quality-filter.mjs +28 -4
  39. package/corpus/tier2/generate.mjs +4 -8
  40. package/corpus/tier2/human-large.jsonl +0 -2
  41. package/corpus/tier2/human-medium.jsonl +0 -2
  42. package/corpus/tier2/manifest.json +6 -6
  43. package/data/templates/constructions/digest-sentence-structures.toml +146 -1
  44. package/package.json +18 -15
  45. package/src/adapters/corpus/digest-bank.mjs +15 -3
  46. package/src/domain/answer-variants.json +1 -1
  47. package/src/domain/ask-vocab.mjs +4 -0
  48. package/src/domain/ask.mjs +101 -12
  49. package/src/domain/codegraph.mjs +25 -8
  50. package/src/domain/digest/compose.mjs +142 -10
  51. package/src/domain/digest/config.json +5 -0
  52. package/src/domain/digest/structures.mjs +39 -14
  53. package/src/domain/interpret/normalize.mjs +2 -2
  54. package/src/domain/reference-pack.mjs +12 -3
  55. package/src/domain/router/call-validator.mjs +1 -1
  56. package/src/domain/router/drive.mjs +2 -2
  57. package/src/domain/router/set-algebra.mjs +1 -1
  58. package/src/services/adventure.mjs +34 -19
  59. package/src/services/chat-page-viz.mjs +16 -5
  60. package/src/services/chat.mjs +290 -88
  61. package/src/services/extract-facts.mjs +46 -4
  62. package/src/services/index.mjs +6 -3
  63. package/src/services/ledger-viz.mjs +1 -1
  64. package/src/services/research.mjs +80 -3
  65. package/src/surfaces/web/chat-browser-entry.mjs +23 -3
  66. package/src/surfaces/web/digest-client.mjs +8 -3
  67. package/src/surfaces/web/graph-ask-browser-entry.mjs +41 -0
  68. package/src/surfaces/web/memory-ask-browser.bundle.js +113 -113
@@ -719,7 +719,7 @@ export const CORPUSES = {
719
719
  nouns: [
720
720
  // human-core (+186 words: people, family, common roles)
721
721
  "draw", "set", "heavy", "stand", "free", "pack", "dead", "pick",
722
- "double", "straight", "cast", "dry", "bank", "stamp", "tender", "fair",
722
+ "double", "cast", "dry", "bank", "stamp", "tender", "fair",
723
723
  "active", "regular", "blue", "hack", "band", "brush", "guard", "master",
724
724
  "transfer", "firm", "side", "bull", "mate", "rank", "board", "brace",
725
725
  "grade", "better", "course", "natural", "butt", "camp", "crop", "date",
@@ -733,7 +733,7 @@ export const CORPUSES = {
733
733
  "steady", "stream", "combine", "company", "convert", "general", "moderate", "alternate",
734
734
  "ace", "crab", "flop", "fund", "pair", "rake", "rock", "sick",
735
735
  "blade", "cheat", "sport", "caller", "column", "couple", "divine", "pledge",
736
- "simple", "sponge", "system", "wanton", "sleeper", "business", "associate", "instrument",
736
+ "sponge", "system", "wanton", "sleeper", "business", "associate", "instrument",
737
737
  "substitute", "gun", "sum", "alto", "best", "buff", "dear", "mass",
738
738
  "cream", "creep", "giant", "labor", "pilot", "sneak", "stack", "staff",
739
739
  "world", "gutter", "jumper", "labour", "lather", "picket", "reader", "savage",
@@ -852,7 +852,6 @@ export const CORPUSES = {
852
852
  ["dead", "/r/HasA", "dead person"],
853
853
  ["pick", "/r/IsA", "elite"],
854
854
  ["double", "/r/IsA", "actor"],
855
- ["straight", "/r/IsA", "person"],
856
855
  ["cast", "/r/IsA", "gathering"],
857
856
  ["dry", "/r/IsA", "reformer"],
858
857
  ["bank", "/r/IsA", "financial institution"],
@@ -968,7 +967,6 @@ export const CORPUSES = {
968
967
  ["couple", "/r/IsA", "pair"],
969
968
  ["divine", "/r/IsA", "reverend"],
970
969
  ["pledge", "/r/IsA", "member"],
971
- ["simple", "/r/IsA", "person"],
972
970
  ["sponge", "/r/IsA", "learner"],
973
971
  ["system", "/r/IsA", "group"],
974
972
  ["system", "/r/HasA", "hierarchy"],
@@ -1845,7 +1843,7 @@ export const CORPUSES = {
1845
1843
  "ideal", "noble", "octet", "quack", "saint", "scrag", "shark", "shoal",
1846
1844
  "silly", "skunk", "super", "witch", "zombi", "agency", "anchor", "backup",
1847
1845
  "batter", "buster", "canary", "circus", "dealer", "domain", "doomed", "genius",
1848
- "gossip", "herald", "hoodoo", "hopper", "immune", "jockey", "legion", "member",
1846
+ "gossip", "herald", "hoodoo", "hopper", "jockey", "legion", "member",
1849
1847
  "nature", "orphan", "parade", "peanut", "pillar", "pirate", "player", "porter",
1850
1848
  "pusher", "putter", "senior", "septet", "sestet", "sextet", "surety", "tapper",
1851
1849
  "tiller", "zombie", "adjunct", "butcher", "captive", "cascade", "chapter", "charity",
@@ -1884,7 +1882,7 @@ export const CORPUSES = {
1884
1882
  "canvasser", "cockscomb", "collector", "comforter", "commander", "companion", "conductor", "crossover",
1885
1883
  "eccentric", "executive", "fledgling", "franchise", "freelance", "incumbent", "mercenary", "moderator",
1886
1884
  "neighbour", "newspaper", "patriarch", "patrician", "portfolio", "quartette", "quintette", "repertory",
1887
- "secretary", "segregate", "spearhead", "stigmatic", "summation", "transient", "trumpeter", "voluntary",
1885
+ "secretary", "segregate", "spearhead", "summation", "transient", "trumpeter", "voluntary",
1888
1886
  "absolutism", "anthropoid", "apparition", "assemblage", "collective", "contractor", "delinquent", "episcopate",
1889
1887
  "exaltation", "exposition", "illiterate", "judicature", "leadership", "lieutenant", "minimalist", "percussion",
1890
1888
  "profligate", "provincial", "rendezvous", "brotherhood", "determinant", "distributor", "interpreter", "stipendiary",
@@ -3267,7 +3265,6 @@ export const CORPUSES = {
3267
3265
  ["hoodoo", "/r/IsA", "priest"],
3268
3266
  ["priest", "/r/IsA", "spiritual leader"],
3269
3267
  ["hopper", "/r/IsA", "jumper"],
3270
- ["immune", "/r/IsA", "person"],
3271
3268
  ["jockey", "/r/IsA", "equestrian"],
3272
3269
  ["legion", "/r/IsA", "military unit"],
3273
3270
  ["legion", "/r/HasA", "legionnaire"],
@@ -3755,7 +3752,6 @@ export const CORPUSES = {
3755
3752
  ["friend", "/r/IsA", "actor"],
3756
3753
  ["segregate", "/r/IsA", "actor"],
3757
3754
  ["spearhead", "/r/IsA", "leader"],
3758
- ["stigmatic", "/r/IsA", "person"],
3759
3755
  ["summation", "/r/IsA", "collection"],
3760
3756
  ["transient", "/r/IsA", "traveler"],
3761
3757
  ["trumpeter", "/r/IsA", "messenger"],
@@ -438,7 +438,6 @@
438
438
  {"start":"/c/en/hoodoo","rel":"/r/IsA","end":"/c/en/priest","weight":1,"surfaceText":"[[hoodoo]] IsA [[priest]]"}
439
439
  {"start":"/c/en/priest","rel":"/r/IsA","end":"/c/en/spiritual leader","weight":1,"surfaceText":"[[priest]] IsA [[spiritual leader]]"}
440
440
  {"start":"/c/en/hopper","rel":"/r/IsA","end":"/c/en/jumper","weight":1,"surfaceText":"[[hopper]] IsA [[jumper]]"}
441
- {"start":"/c/en/immune","rel":"/r/IsA","end":"/c/en/person","weight":1,"surfaceText":"[[immune]] IsA [[person]]"}
442
441
  {"start":"/c/en/jockey","rel":"/r/IsA","end":"/c/en/equestrian","weight":1,"surfaceText":"[[jockey]] IsA [[equestrian]]"}
443
442
  {"start":"/c/en/legion","rel":"/r/IsA","end":"/c/en/military unit","weight":1,"surfaceText":"[[legion]] IsA [[military unit]]"}
444
443
  {"start":"/c/en/legion","rel":"/r/HasA","end":"/c/en/legionnaire","weight":1,"surfaceText":"[[legion]] HasA [[legionnaire]]"}
@@ -926,7 +925,6 @@
926
925
  {"start":"/c/en/friend","rel":"/r/IsA","end":"/c/en/actor","weight":1,"surfaceText":"[[friend]] IsA [[actor]]"}
927
926
  {"start":"/c/en/segregate","rel":"/r/IsA","end":"/c/en/actor","weight":1,"surfaceText":"[[segregate]] IsA [[actor]]"}
928
927
  {"start":"/c/en/spearhead","rel":"/r/IsA","end":"/c/en/leader","weight":1,"surfaceText":"[[spearhead]] IsA [[leader]]"}
929
- {"start":"/c/en/stigmatic","rel":"/r/IsA","end":"/c/en/person","weight":1,"surfaceText":"[[stigmatic]] IsA [[person]]"}
930
928
  {"start":"/c/en/summation","rel":"/r/IsA","end":"/c/en/collection","weight":1,"surfaceText":"[[summation]] IsA [[collection]]"}
931
929
  {"start":"/c/en/transient","rel":"/r/IsA","end":"/c/en/traveler","weight":1,"surfaceText":"[[transient]] IsA [[traveler]]"}
932
930
  {"start":"/c/en/trumpeter","rel":"/r/IsA","end":"/c/en/messenger","weight":1,"surfaceText":"[[trumpeter]] IsA [[messenger]]"}
@@ -9,7 +9,6 @@
9
9
  {"start":"/c/en/dead","rel":"/r/HasA","end":"/c/en/dead person","weight":1,"surfaceText":"[[dead]] HasA [[dead person]]"}
10
10
  {"start":"/c/en/pick","rel":"/r/IsA","end":"/c/en/elite","weight":1,"surfaceText":"[[pick]] IsA [[elite]]"}
11
11
  {"start":"/c/en/double","rel":"/r/IsA","end":"/c/en/actor","weight":1,"surfaceText":"[[double]] IsA [[actor]]"}
12
- {"start":"/c/en/straight","rel":"/r/IsA","end":"/c/en/person","weight":1,"surfaceText":"[[straight]] IsA [[person]]"}
13
12
  {"start":"/c/en/cast","rel":"/r/IsA","end":"/c/en/gathering","weight":1,"surfaceText":"[[cast]] IsA [[gathering]]"}
14
13
  {"start":"/c/en/dry","rel":"/r/IsA","end":"/c/en/reformer","weight":1,"surfaceText":"[[dry]] IsA [[reformer]]"}
15
14
  {"start":"/c/en/bank","rel":"/r/IsA","end":"/c/en/financial institution","weight":1,"surfaceText":"[[bank]] IsA [[financial institution]]"}
@@ -125,7 +124,6 @@
125
124
  {"start":"/c/en/couple","rel":"/r/IsA","end":"/c/en/pair","weight":1,"surfaceText":"[[couple]] IsA [[pair]]"}
126
125
  {"start":"/c/en/divine","rel":"/r/IsA","end":"/c/en/reverend","weight":1,"surfaceText":"[[divine]] IsA [[reverend]]"}
127
126
  {"start":"/c/en/pledge","rel":"/r/IsA","end":"/c/en/member","weight":1,"surfaceText":"[[pledge]] IsA [[member]]"}
128
- {"start":"/c/en/simple","rel":"/r/IsA","end":"/c/en/person","weight":1,"surfaceText":"[[simple]] IsA [[person]]"}
129
127
  {"start":"/c/en/sponge","rel":"/r/IsA","end":"/c/en/learner","weight":1,"surfaceText":"[[sponge]] IsA [[learner]]"}
130
128
  {"start":"/c/en/system","rel":"/r/IsA","end":"/c/en/group","weight":1,"surfaceText":"[[system]] IsA [[group]]"}
131
129
  {"start":"/c/en/system","rel":"/r/HasA","end":"/c/en/hierarchy","weight":1,"surfaceText":"[[system]] HasA [[hierarchy]]"}
@@ -81,9 +81,9 @@
81
81
  "tool": "corpus/tier2/generate.mjs"
82
82
  },
83
83
  "file": "human-medium.jsonl",
84
- "facts": 944,
85
- "bytes": 110796,
86
- "sha256": "63270a928f4d304489bd552c1e50704ff2d6f17841cf11a87a292418eaa572c0",
84
+ "facts": 942,
85
+ "bytes": 110564,
86
+ "sha256": "152df1c9026ace0ecf899e89b23dab77617e97fe0d7fafd50866e26a792f0454",
87
87
  "license": "MPL-2.0"
88
88
  },
89
89
  {
@@ -95,9 +95,9 @@
95
95
  "tool": "corpus/tier2/generate.mjs"
96
96
  },
97
97
  "file": "human-large.jsonl",
98
- "facts": 12001,
99
- "bytes": 1464850,
100
- "sha256": "754d9d4c046f92994a5f5fa0abde27af65a47ec546b3051bf972bfa76b642917",
98
+ "facts": 11999,
99
+ "bytes": 1464616,
100
+ "sha256": "fbbe8135d4915f2bc041bf577e7b0bd1a8fd1c1bab804c8215b1d05e39db27f9",
101
101
  "license": "MPL-2.0"
102
102
  }
103
103
  ],
@@ -10,19 +10,30 @@
10
10
  # reads only [[relation]] and [[construction]] tables, so it ignores this file's
11
11
  # [[structure]] rows; the digest layer reads them through its own path.
12
12
  #
13
- # Each row is one (family, form) pairing:
13
+ # Each row is one wording for a (family, form) pairing. A key may hold several
14
+ # rows: the renderer collects them all and picks one by a deterministic hash of
15
+ # term|family|form|variantSeed, so a key with one wording always renders that
16
+ # wording, while a key with several gives natural variety that stays stable
17
+ # across runs. An exact-string duplicate under a key is folded; a second, truly
18
+ # different wording is kept as another variant.
14
19
  # family one of the digest families (isa | location | partOf | capableOf |
15
20
  # usedFor) — the closed set stage 1 groups predicates under. Each is
16
21
  # verb-coherent: every predicate in it shares this frame's verb.
17
22
  # form single — one fact of the family
18
23
  # several — two or more facts of the family, merged into one clause
19
24
  # chained — one isa fact plus its rendered ancestry chain
25
+ # group — one body sentence of the multi-sentence isa digest: the
26
+ # facts that share an immediate parent class, named together
27
+ # closer — the closing sentence of the multi-sentence isa digest:
28
+ # the highest-level ontology roots the term sits under
20
29
  # template the skeleton. Placeholders the renderer fills (words.mjs supplies
21
30
  # the article, plural and casing):
22
31
  # {TERM} {TERM_CAP} the term, lower / sentence-leading
23
32
  # {A_TERM} {A_TERM_CAP} "an aardvark" / "An aardvark"
24
33
  # {TERMS} {TERMS_CAP} "aardvarks" / "Aardvarks"
25
34
  # {PRONOUN} {PRONOUN_CAP} "it" / "It" (after first mention)
35
+ # {PARENT} {A_PARENT} the shared immediate parent of a group
36
+ # — "mammal" / "a mammal"
26
37
  # {OBJECT} the first object, raw
27
38
  # {A_OBJECT} "a mammal" (article chosen per word)
28
39
  # {OBJECTS_A} "a mammal, a burrowing animal, and …"
@@ -48,6 +59,50 @@ family = "isa"
48
59
  form = "chained"
49
60
  template = "{A_TERM_CAP} is {CHAIN}."
50
61
 
62
+ # ---- isa group: one body sentence for facts under a shared parent class -----
63
+
64
+ [[structure]]
65
+ family = "isa"
66
+ form = "group"
67
+ template = "As a kind of {PARENT}, {PRONOUN} is also {OBJECTS_A}."
68
+
69
+ [[structure]]
70
+ family = "isa"
71
+ form = "group"
72
+ template = "Being {A_PARENT}, {PRONOUN} is {OBJECTS_A} too."
73
+
74
+ [[structure]]
75
+ family = "isa"
76
+ form = "group"
77
+ template = "Within the {PARENT} family, {PRONOUN} counts as {OBJECTS_A}."
78
+
79
+ [[structure]]
80
+ family = "isa"
81
+ form = "group"
82
+ template = "As {A_PARENT}, {PRONOUN} is {OBJECTS_A}."
83
+
84
+ # ---- isa closer: the highest-level roots the term sits under ----------------
85
+
86
+ [[structure]]
87
+ family = "isa"
88
+ form = "closer"
89
+ template = "More broadly, {TERMS} sit within {OBJECTS_A} in the wider hierarchy."
90
+
91
+ [[structure]]
92
+ family = "isa"
93
+ form = "closer"
94
+ template = "More generally, {TERMS} fall under {OBJECTS_A}."
95
+
96
+ [[structure]]
97
+ family = "isa"
98
+ form = "closer"
99
+ template = "Higher up, {TERMS} are kinds of {OBJECTS_PLURAL}."
100
+
101
+ [[structure]]
102
+ family = "isa"
103
+ form = "closer"
104
+ template = "Zooming out, {TERMS} belong among {OBJECTS_PLURAL}."
105
+
51
106
  # ---- location: where it is found (atLocation / locatedNear) ----------------
52
107
 
53
108
  [[structure]]
@@ -60,6 +115,21 @@ family = "location"
60
115
  form = "several"
61
116
  template = "{PRONOUN_CAP} is found in {OBJECTS_RAW}."
62
117
 
118
+ [[structure]]
119
+ family = "location"
120
+ form = "several"
121
+ template = "{PRONOUN_CAP} lives in {OBJECTS_RAW}."
122
+
123
+ [[structure]]
124
+ family = "location"
125
+ form = "several"
126
+ template = "You'll find {PRONOUN} in {OBJECTS_RAW}."
127
+
128
+ [[structure]]
129
+ family = "location"
130
+ form = "several"
131
+ template = "{PRONOUN_CAP} turns up in {OBJECTS_RAW}."
132
+
63
133
  # ---- partOf: what it belongs to -------------------------------------------
64
134
 
65
135
  [[structure]]
@@ -67,11 +137,41 @@ family = "partOf"
67
137
  form = "single"
68
138
  template = "{PRONOUN_CAP} is part of {A_OBJECT}."
69
139
 
140
+ [[structure]]
141
+ family = "partOf"
142
+ form = "single"
143
+ template = "{PRONOUN_CAP} belongs to {A_OBJECT}."
144
+
145
+ [[structure]]
146
+ family = "partOf"
147
+ form = "single"
148
+ template = "{PRONOUN_CAP} forms part of {A_OBJECT}."
149
+
150
+ [[structure]]
151
+ family = "partOf"
152
+ form = "single"
153
+ template = "{PRONOUN_CAP} makes up part of {A_OBJECT}."
154
+
70
155
  [[structure]]
71
156
  family = "partOf"
72
157
  form = "several"
73
158
  template = "{PRONOUN_CAP} is part of {OBJECTS_A}."
74
159
 
160
+ [[structure]]
161
+ family = "partOf"
162
+ form = "several"
163
+ template = "{PRONOUN_CAP} belongs to {OBJECTS_A}."
164
+
165
+ [[structure]]
166
+ family = "partOf"
167
+ form = "several"
168
+ template = "{PRONOUN_CAP} forms part of {OBJECTS_A}."
169
+
170
+ [[structure]]
171
+ family = "partOf"
172
+ form = "several"
173
+ template = "{PRONOUN_CAP} is one part of {OBJECTS_A}."
174
+
75
175
  # ---- capableOf: what it can do --------------------------------------------
76
176
 
77
177
  [[structure]]
@@ -84,6 +184,21 @@ family = "capableOf"
84
184
  form = "several"
85
185
  template = "{PRONOUN_CAP} can {OBJECTS_RAW}."
86
186
 
187
+ [[structure]]
188
+ family = "capableOf"
189
+ form = "several"
190
+ template = "{PRONOUN_CAP} is able to {OBJECTS_RAW}."
191
+
192
+ [[structure]]
193
+ family = "capableOf"
194
+ form = "several"
195
+ template = "{PRONOUN_CAP} knows how to {OBJECTS_RAW}."
196
+
197
+ [[structure]]
198
+ family = "capableOf"
199
+ form = "several"
200
+ template = "{PRONOUN_CAP} tends to {OBJECTS_RAW}."
201
+
87
202
  # ---- usedFor: what it is used for -----------------------------------------
88
203
 
89
204
  [[structure]]
@@ -91,7 +206,37 @@ family = "usedFor"
91
206
  form = "single"
92
207
  template = "{PRONOUN_CAP} is used for {OBJECT}."
93
208
 
209
+ [[structure]]
210
+ family = "usedFor"
211
+ form = "single"
212
+ template = "{PRONOUN_CAP} helps with {OBJECT}."
213
+
214
+ [[structure]]
215
+ family = "usedFor"
216
+ form = "single"
217
+ template = "People use {PRONOUN} for {OBJECT}."
218
+
219
+ [[structure]]
220
+ family = "usedFor"
221
+ form = "single"
222
+ template = "{PRONOUN_CAP} works for {OBJECT}."
223
+
94
224
  [[structure]]
95
225
  family = "usedFor"
96
226
  form = "several"
97
227
  template = "{PRONOUN_CAP} is used for {OBJECTS_RAW}."
228
+
229
+ [[structure]]
230
+ family = "usedFor"
231
+ form = "several"
232
+ template = "{PRONOUN_CAP} helps with {OBJECTS_RAW}."
233
+
234
+ [[structure]]
235
+ family = "usedFor"
236
+ form = "several"
237
+ template = "People use {PRONOUN} for {OBJECTS_RAW}."
238
+
239
+ [[structure]]
240
+ family = "usedFor"
241
+ form = "several"
242
+ template = "{PRONOUN_CAP} works for {OBJECTS_RAW}."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polycode-projects/the-mechanical-code-talker",
3
- "version": "3.0.5",
3
+ "version": "3.0.7",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "The Mechanical Code Talker (tmct) — a tolerant, offline, $0 chat surface that guides you toward precision queries about a software repository. ELIZA/PARRY-style but domain-obsessed with code. No model calls; indexes a repo on request (tmct index) or reads any producer's graph.",
@@ -47,7 +47,8 @@
47
47
  "./createCompletionsGraphAdapter": "./src/services/completions.mjs",
48
48
  "./ingest": "./src/services/extract-facts.mjs",
49
49
  "./repository-interface": "./src/adapters/repository-interface.mjs",
50
- "./conformance": "./src/tools/conformance.mjs"
50
+ "./conformance": "./src/tools/conformance.mjs",
51
+ "./ask-browser": "./src/surfaces/web/graph-ask-browser-entry.mjs"
51
52
  },
52
53
  "files": [
53
54
  "bin/",
@@ -87,9 +88,11 @@
87
88
  "test": "node --disable-warning=ExperimentalWarning --test --test-concurrency=8 \"test/**/*.test.mjs\"",
88
89
  "test:smoke": "node --disable-warning=ExperimentalWarning --test test/smoke/*.test.mjs",
89
90
  "test:fast": "node --disable-warning=ExperimentalWarning --test --test-concurrency=8 test/smoke/*.test.mjs test/fast/*.test.mjs test/tools/ask.test.mjs test/tools/server.test.mjs test/estate/import-layers.test.mjs",
90
- "test:e2e": "node --disable-warning=ExperimentalWarning --test \"e2e/*.test.mjs\"",
91
- "test:e2e:heavy": "node --disable-warning=ExperimentalWarning --test \"e2e/heavy/*.test.mjs\"",
92
- "check:readme": "TMCT_CHECK_README=1 node --disable-warning=ExperimentalWarning --test e2e/readme-examples.test.mjs",
91
+ "test:unit": "node --disable-warning=ExperimentalWarning --test --test-concurrency=8 $(node scripts/list-unit-test-files.mjs)",
92
+ "test:slow": "node --disable-warning=ExperimentalWarning --test test/bench/synthbench-code.test.mjs test/estate/generated-artifacts.test.mjs test/readme/readme.test.mjs test/corpus/bench-smoke.test.mjs test/corpus/inference.test.mjs",
93
+ "test:e2e": "node --disable-warning=ExperimentalWarning --test \"test-e2e/*.test.mjs\"",
94
+ "test:e2e:heavy": "node --disable-warning=ExperimentalWarning --test \"test-e2e/heavy/*.test.mjs\"",
95
+ "check:readme": "TMCT_CHECK_README=1 node --disable-warning=ExperimentalWarning --test test-e2e/readme-examples.test.mjs",
93
96
  "e2e:browsers": "playwright install chromium",
94
97
  "gen:screenshots": "node scripts/gen-screenshots.mjs",
95
98
  "check:links": "node scripts/check-links.mjs",
@@ -128,16 +131,16 @@
128
131
  "serve:public": "node --disable-warning=ExperimentalWarning bin/tmct.mjs serve --host 0.0.0.0 --port 8787",
129
132
  "example:mini": "node --disable-warning=ExperimentalWarning bin/tmct.mjs chat --repo examples/mini-webapp --ephemeral",
130
133
  "example:polyglot": "node --disable-warning=ExperimentalWarning bin/tmct.mjs chat --repo examples/polyglot --ephemeral",
131
- "chatbench:run": "node chatbench/run.mjs",
132
- "chatbench:judge": "node chatbench/judge.mjs",
133
- "chatbench:judge:cached": "node chatbench/judge.mjs --cache chatbench/verdict-cache.json",
134
- "agentbench:run": "node agentbench/run.mjs",
135
- "infbench": "node infbench/generate-cases.mjs && node infbench/run.mjs",
136
- "idxbench:run": "node idxbench/run.mjs",
137
- "researchbench:run": "node researchbench/run.mjs",
138
- "synthbench:code": "node synthbench/code/run.mjs",
139
- "ingestbench:run": "node ingestbench/run.mjs",
140
- "ingestbench:judge": "node ingestbench/judge.mjs",
134
+ "chatbench:run": "node test-benchmarks/chatbench/run.mjs",
135
+ "chatbench:judge": "node test-benchmarks/chatbench/judge.mjs",
136
+ "chatbench:judge:cached": "node test-benchmarks/chatbench/judge.mjs --cache test-benchmarks/chatbench/verdict-cache.json",
137
+ "agentbench:run": "node test-benchmarks/agentbench/run.mjs",
138
+ "infbench": "node test-benchmarks/infbench/generate-cases.mjs && node test-benchmarks/infbench/run.mjs",
139
+ "idxbench:run": "node test-benchmarks/idxbench/run.mjs",
140
+ "researchbench:run": "node test-benchmarks/researchbench/run.mjs",
141
+ "synthbench:code": "node test-benchmarks/synthbench/code/run.mjs",
142
+ "ingestbench:run": "node test-benchmarks/ingestbench/run.mjs",
143
+ "ingestbench:judge": "node test-benchmarks/ingestbench/judge.mjs",
141
144
  "corpus:matrix": "node scripts/corpus-matrix.mjs",
142
145
  "corpus:matrix:gaps": "node scripts/corpus-matrix.mjs --gaps",
143
146
  "template:coverage": "node scripts/template-coverage.mjs",
@@ -5,9 +5,15 @@
5
5
  // in src/domain/digest; only the TOML read lives here, so every node surface
6
6
  // (chat, `tmct digest`, the page generators) shares one seam.
7
7
  //
8
- // A browser bundle stubs this module out (the ask/chat dock never digests
9
- // in-page the pages digest client-side from a table embedded at build time),
10
- // so every consumer treats a null article as "fall back to the flat fact list".
8
+ // build-chat-bundle.mjs swaps this module for a live in-memory twin (the
9
+ // chat dock DOES digest in-page there chat-browser-entry.mjs feeds it the
10
+ // build-time-embedded [[structure]] rows via setDigestStructures); every
11
+ // other browser bundle (ask, ledger's static render) still stubs it out to
12
+ // null, so those consumers keep treating a null article as "fall back to the
13
+ // flat fact list". setDigestStructures below is a no-op on THIS, the real
14
+ // node-side module — kept only for interface parity with the live bundle
15
+ // twin, so a file that imports both under plain Node (as a chat-engine
16
+ // contract test does) resolves the same export set either way.
11
17
 
12
18
  import { readFileSync } from "node:fs";
13
19
  import { fileURLToPath } from "node:url";
@@ -19,6 +25,12 @@ import { digestStoreStats, chainsForObjects, isaObjectsOf } from "../../domain/d
19
25
  const HERE = dirname(fileURLToPath(import.meta.url));
20
26
  const BANK_FILE = join(HERE, "..", "..", "..", "data", "templates", "constructions", "digest-sentence-structures.toml");
21
27
 
28
+ /** No-op here — the node-side adapter always reads its structures from the
29
+ * committed TOML bank (below), never from an externally-supplied table. Only
30
+ * the browser bundle's live twin (build-chat-bundle.mjs's stub) actually
31
+ * holds state behind this setter. */
32
+ export function setDigestStructures() {}
33
+
22
34
  /** The raw [[structure]] rows parsed from the committed bank, once. A missing or
23
35
  * unparseable bank yields an empty list — the digest degrades to the caller's
24
36
  * flat fallback rather than throwing, the same posture the construction-bank
@@ -10,7 +10,7 @@
10
10
  "ask.mjs metaFallbackEntityAnswer (\"X is a Y in this codebase, defined in Z ...\")"
11
11
  ],
12
12
  "deliberatelyNotUsedBy": [
13
- "ask.mjs renderCore whereShape (\"X is defined in Y at line(s) Z\" / \"X is defined in Y (no line span...)\") -- chatbench/graded-pool-max.jsonl pins this exact substring as ground truth for 11 'where is X defined' cases (2 in the always-run promoted subset), and that pool is append-only/never-edited-mid-arc per SKILL_BENCHMARK_CEFR_ENGLISH.md."
13
+ "ask.mjs renderCore whereShape (\"X is defined in Y at line(s) Z\" / \"X is defined in Y (no line span...)\") -- test-benchmarks/chatbench/graded-pool-max.jsonl pins this exact substring as ground truth for 11 'where is X defined' cases (2 in the always-run promoted subset), and that pool is append-only/never-edited-mid-arc per SKILL_BENCHMARK_CEFR_ENGLISH.md."
14
14
  ]
15
15
  },
16
16
  "is-dated": {
@@ -287,6 +287,10 @@ export const ENTITY_TO_TYPE = Object.freeze({
287
287
  method: "Method", methods: "Method",
288
288
  class: "Class", classes: "Class",
289
289
  module: "Module", modules: "Module", mod: "Module", mods: "Module", file: "Module", files: "Module",
290
+ // "Package" is a pseudo-type like "Change" below: no node is ever stored
291
+ // with that class. ask.mjs derives packages from module labels, the same
292
+ // derivation the architecture map uses.
293
+ package: "Package", packages: "Package",
290
294
  attribute: "Attribute", attributes: "Attribute", field: "Attribute", fields: "Attribute",
291
295
  variable: "GlobalVariable", variables: "GlobalVariable", global: "GlobalVariable", globals: "GlobalVariable",
292
296
  // "Change" is a pseudo-type, not a node class: ask.mjs's traverse() reads it