@polycode-projects/the-mechanical-code-talker 1.11.6 → 2.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 (148) hide show
  1. package/README.md +244 -48
  2. package/ROADMAP.md +23 -34
  3. package/bin/tmct.mjs +117 -81
  4. package/corpus/LICENSES.json +118 -0
  5. package/corpus/README.md +17 -13
  6. package/corpus/conceptnet/README.md +5 -5
  7. package/corpus/conceptnet/fetch-slice.mjs +1 -1
  8. package/corpus/conceptnet/filter-dump.mjs +1 -1
  9. package/corpus/generated/README.md +9 -10
  10. package/corpus/namenet/README.md +39 -0
  11. package/corpus/seon/README.md +2 -2
  12. package/corpus/tier2/generate.mjs +58 -9
  13. package/corpus/tier2/manifest.json +44 -0
  14. package/corpus/wordnet/README.md +37 -0
  15. package/corpus/wordnet/generate.mjs +1 -1
  16. package/data/templates/constructions/agent-noun-relations.toml +2 -2
  17. package/data/templates/grammar-rules.toml +1 -1
  18. package/package.json +13 -22
  19. package/src/{ask-nlp.mjs → adapters/ask-nlp.mjs} +1 -1
  20. package/src/{config.mjs → adapters/config.mjs} +1 -1
  21. package/src/{corpus → adapters/corpus}/conceptnet-map.toml +4 -4
  22. package/src/{corpus → adapters/corpus}/conceptnet.mjs +3 -3
  23. package/src/adapters/corpus/construction-banks.mjs +43 -0
  24. package/src/{corpus → adapters/corpus}/templates.mjs +1 -1
  25. package/src/{embed.mjs → adapters/embed.mjs} +1 -11
  26. package/src/{graph-build.mjs → adapters/graph-build.mjs} +6 -6
  27. package/src/{memory → adapters/memory}/blocks.mjs +2 -2
  28. package/src/{memory → adapters/memory}/core.mjs +38 -94
  29. package/src/adapters/prose-tokens.mjs +98 -0
  30. package/src/{providers → adapters/providers}/bootstrap.mjs +2 -2
  31. package/src/{providers → adapters/providers}/fixture.mjs +3 -3
  32. package/src/{providers → adapters/providers}/graph-service.mjs +9 -4
  33. package/src/{source-slice.mjs → adapters/source-slice.mjs} +2 -2
  34. package/src/{source.mjs → adapters/source.mjs} +1 -1
  35. package/src/{toml-config.mjs → adapters/toml-config.mjs} +1 -1
  36. package/src/{answer-variants.json → domain/answer-variants.json} +1 -1
  37. package/src/domain/answer-variants.mjs +23 -0
  38. package/src/{ask-vocab.mjs → domain/ask-vocab.mjs} +37 -5
  39. package/src/{ask.mjs → domain/ask.mjs} +216 -52
  40. package/src/{codegraph.mjs → domain/codegraph.mjs} +31 -315
  41. package/src/{completions → domain/completions}/complete.mjs +16 -10
  42. package/src/{completions → domain/completions}/graph-adapter.mjs +10 -4
  43. package/src/{completions → domain/completions}/group.mjs +14 -6
  44. package/src/{completions → domain/completions}/infer.mjs +57 -39
  45. package/src/domain/completions/injected.mjs +21 -0
  46. package/src/{completions → domain/completions}/rank.mjs +15 -8
  47. package/src/{completions → domain/completions}/search.mjs +4 -2
  48. package/src/{grammar → domain/grammar}/ace.mjs +3 -3
  49. package/src/{grammar → domain/grammar}/assert.mjs +12 -8
  50. package/src/{grammar → domain/grammar}/lexicon-core.json +1 -1
  51. package/src/{grammar → domain/grammar}/lexicon.mjs +4 -6
  52. package/src/domain/hash.mjs +147 -0
  53. package/src/{interpret → domain/interpret}/fuzzy.mjs +42 -4
  54. package/src/domain/interpret/nlp-registry.mjs +20 -0
  55. package/src/{interpret → domain/interpret}/normalize.mjs +35 -5
  56. package/src/{interpret → domain/interpret}/pipeline.mjs +1 -5
  57. package/src/{interpret → domain/interpret}/strategies/ace.mjs +1 -1
  58. package/src/{interpret → domain/interpret}/strategies/constructions.mjs +30 -52
  59. package/src/{interpret → domain/interpret}/strategies/keywords.mjs +48 -26
  60. package/src/domain/memory/capability.mjs +235 -0
  61. package/src/domain/memory/fold.mjs +54 -0
  62. package/src/domain/memory/session-turns.mjs +7 -0
  63. package/src/{memory → domain/memory}/trust.mjs +48 -0
  64. package/src/{paraphrase.mjs → domain/paraphrase.mjs} +2 -2
  65. package/src/{prose.mjs → domain/prose.mjs} +1 -1
  66. package/src/domain/real-word-collisions.json +1 -0
  67. package/src/{router → domain/router}/call-validator.mjs +1 -1
  68. package/src/{router → domain/router}/drive.mjs +34 -25
  69. package/src/{router → domain/router}/goal-reasoner.mjs +1 -1
  70. package/src/{router → domain/router}/guardrail.mjs +1 -1
  71. package/src/{router → domain/router}/planner.mjs +1 -1
  72. package/src/{router → domain/router}/registry.mjs +5 -5
  73. package/src/{router → domain/router}/resolver.mjs +16 -13
  74. package/src/{router → domain/router}/results.mjs +1 -1
  75. package/src/{router → domain/router}/set-algebra.mjs +1 -1
  76. package/src/{router → domain/router}/taught.mjs +10 -9
  77. package/src/{syllogise.mjs → domain/syllogise.mjs} +21 -4
  78. package/src/domain/vector.mjs +12 -0
  79. package/src/services/chat-session.mjs +451 -0
  80. package/src/{chat.mjs → services/chat.mjs} +1238 -680
  81. package/src/{cli-args.mjs → services/cli-args.mjs} +2 -2
  82. package/src/services/completions.mjs +55 -0
  83. package/src/{extensions.mjs → services/extensions.mjs} +7 -7
  84. package/src/{finish.mjs → services/finish.mjs} +2 -2
  85. package/src/{memory → services}/fold.mjs +0 -0
  86. package/src/{import-file.mjs → services/import-file.mjs} +3 -3
  87. package/src/{index.mjs → services/index.mjs} +21 -12
  88. package/src/{init.mjs → services/init.mjs} +9 -9
  89. package/src/{ledger-viz.mjs → services/ledger-viz.mjs} +38 -7
  90. package/src/{plan-viz.mjs → services/plan-viz.mjs} +65 -26
  91. package/src/{sentences.mjs → services/sentences.mjs} +1 -1
  92. package/src/{sessions.mjs → services/sessions.mjs} +4 -5
  93. package/src/{telemetry.mjs → services/telemetry.mjs} +1 -1
  94. package/src/{server-http.mjs → surfaces/http/server-http.mjs} +11 -65
  95. package/src/{tui → surfaces/tui}/app.mjs +3 -3
  96. package/src/{memory-ask-browser-entry.mjs → surfaces/web/memory-ask-browser-entry.mjs} +5 -5
  97. package/src/{memory-ask-browser.bundle.js → surfaces/web/memory-ask-browser.bundle.js} +9465 -6366
  98. package/src/tools/catalog.mjs +29 -0
  99. package/src/{conformance.mjs → tools/conformance.mjs} +2 -2
  100. package/src/tools/definitions.mjs +288 -0
  101. package/src/tools/graph-load.mjs +20 -0
  102. package/src/tools/handlers/index.mjs +54 -0
  103. package/src/tools/handlers/kit.mjs +33 -0
  104. package/src/tools/handlers/tmct-architecture.mjs +7 -0
  105. package/src/tools/handlers/tmct-ask.mjs +14 -0
  106. package/src/tools/handlers/tmct-callees.mjs +6 -0
  107. package/src/tools/handlers/tmct-callers.mjs +6 -0
  108. package/src/tools/handlers/tmct-calls.mjs +6 -0
  109. package/src/tools/handlers/tmct-class-history.mjs +6 -0
  110. package/src/tools/handlers/tmct-cochanges.mjs +6 -0
  111. package/src/tools/handlers/tmct-context-more.mjs +9 -0
  112. package/src/tools/handlers/tmct-context.mjs +163 -0
  113. package/src/tools/handlers/tmct-describe.mjs +15 -0
  114. package/src/tools/handlers/tmct-exports.mjs +9 -0
  115. package/src/tools/handlers/tmct-file-history.mjs +6 -0
  116. package/src/tools/handlers/tmct-history.mjs +6 -0
  117. package/src/tools/handlers/tmct-impact.mjs +9 -0
  118. package/src/tools/handlers/tmct-members.mjs +16 -0
  119. package/src/tools/handlers/tmct-method-history.mjs +6 -0
  120. package/src/tools/handlers/tmct-search.mjs +22 -0
  121. package/src/tools/handlers/tmct-signature.mjs +6 -0
  122. package/src/tools/handlers/tmct-snippet.mjs +37 -0
  123. package/src/tools/handlers/tmct-subclasses.mjs +16 -0
  124. package/src/tools/handlers/tmct-tests-for.mjs +6 -0
  125. package/src/tools/handlers/tmct-untested.mjs +7 -0
  126. package/src/tools/memory-fallthrough.mjs +65 -0
  127. package/src/{schema-docs.mjs → tools/schema-docs.mjs} +1 -1
  128. package/src/tools/server.mjs +61 -0
  129. package/src/answer-variants.mjs +0 -39
  130. package/src/hash.mjs +0 -24
  131. package/src/server.mjs +0 -501
  132. /package/src/{corpus → adapters/corpus}/unknown-ingest.mjs +0 -0
  133. /package/src/{graph-merge.mjs → adapters/graph-merge.mjs} +0 -0
  134. /package/src/{memory → adapters/memory}/inspect.mjs +0 -0
  135. /package/src/{memory → adapters/memory}/shacl.mjs +0 -0
  136. /package/src/{prose-nlp.mjs → adapters/prose-nlp.mjs} +0 -0
  137. /package/src/{repository-interface.mjs → adapters/repository-interface.mjs} +0 -0
  138. /package/src/{uuid.mjs → adapters/uuid.mjs} +0 -0
  139. /package/src/{wink-model.mjs → adapters/wink-model.mjs} +0 -0
  140. /package/src/{completions → domain/completions}/prune.mjs +0 -0
  141. /package/src/{concept.mjs → domain/concept.mjs} +0 -0
  142. /package/src/{domain.mjs → domain/domain.mjs} +0 -0
  143. /package/src/{interpret → domain/interpret}/merge.mjs +0 -0
  144. /package/src/{interpret → domain/interpret}/strategies/grammar.mjs +0 -0
  145. /package/src/{interpret → domain/interpret}/strategies/noise-strip.mjs +0 -0
  146. /package/src/{memory → domain/memory}/bias.mjs +0 -0
  147. /package/src/{planning.mjs → domain/planning.mjs} +0 -0
  148. /package/src/{viz-theme.mjs → services/viz-theme.mjs} +0 -0
@@ -71,7 +71,7 @@ async function readOneGraphFile(file) {
71
71
  }
72
72
  }
73
73
 
74
- /** The multi-graph path (src/graph-merge.mjs): config.graphFiles names MORE
74
+ /** The multi-graph path (src/adapters/graph-merge.mjs): config.graphFiles names MORE
75
75
  * THAN ONE graph file. Reads each (same per-file ENOENT→bootstrap tolerance
76
76
  * as the single-graph path), merges them via mergeEntityPayloads, and caches
77
77
  * the merge under a composite key (the sorted, joined file list) — so
@@ -110,7 +110,7 @@ export async function normalizeConfig(raw, { configDir } = {}) {
110
110
  if (seed.limit !== undefined) seedCfg.limit = seed.limit;
111
111
  if (Object.keys(seedCfg).length) cfg.seed = seedCfg;
112
112
 
113
- // Extension-pack seam (src/extensions.mjs): sparse PASS-THROUGH only — the
113
+ // Extension-pack seam (src/services/extensions.mjs): sparse PASS-THROUGH only — the
114
114
  // raw `[extensions]`/`[bias]` tables ride through unmodified so a caller can
115
115
  // see they're present; validation happens one layer up, in
116
116
  // resolveExtensions() (never here — this module stays a plain raw reader).
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "curation": "Hand-curated. scripts/generate-answer-variants.mjs cross-checked each pool against real Open English WordNet synsets (scripts/lib/wordnet-synonyms.mjs) where a sense fit; most of these are domain-specific code-graph connector phrases WordNet's own sense-1 convention resolves to the wrong sense for -- e.g. 'locate' -> 'turn up', 'record' -> 'enter, put down', 'module' -> 'mental faculty' -- so every entry below was accepted or rejected by hand against the exact rendered sentence it replaces, never auto-accepted from a raw synset match. See src/answer-variants.mjs for how these are selected at render time.",
3
+ "curation": "Hand-curated. scripts/generate-answer-variants.mjs cross-checked each pool against real Open English WordNet synsets (scripts/lib/wordnet-synonyms.mjs) where a sense fit; most of these are domain-specific code-graph connector phrases WordNet's own sense-1 convention resolves to the wrong sense for -- e.g. 'locate' -> 'turn up', 'record' -> 'enter, put down', 'module' -> 'mental faculty' -- so every entry below was accepted or rejected by hand against the exact rendered sentence it replaces, never auto-accepted from a raw synset match. See src/domain/answer-variants.mjs for how these are selected at render time.",
4
4
  "pools": {
5
5
  "defined-in": {
6
6
  "base": "defined in",
@@ -0,0 +1,23 @@
1
+ // answer-variants.mjs — deterministic, committed answer-phrasing variety for
2
+ // a curated set of answer templates (answer-variants.json).
3
+ //
4
+ // Selection is a pure hash of (poolId, key), never Math.random/Date.now, so
5
+ // output is byte-identical across runs (pinnable in tests). The data rides in
6
+ // as a JSON module (no filesystem read at import or call time); the browser
7
+ // bundle stubs this whole module to the base-phrase identity, so the dock's
8
+ // wording never varies.
9
+
10
+ import variantData from "./answer-variants.json" with { type: "json" };
11
+ import { sha256Bytes } from "./hash.mjs";
12
+
13
+ /** Deterministically choose `base` or one of `poolId`'s committed variants,
14
+ * keyed on `key`. Any failure (unknown pool, missing data, falsy `key`)
15
+ * falls back to `base`. */
16
+ export function pickPhrase(poolId, key, base) {
17
+ if (!key) return base;
18
+ const variants = variantData?.pools?.[poolId]?.variants;
19
+ if (!Array.isArray(variants) || !variants.length) return base;
20
+ const forms = [base, ...variants];
21
+ const idx = sha256Bytes(`${poolId}:${String(key)}`)[0] % forms.length;
22
+ return forms[idx];
23
+ }
@@ -2,9 +2,15 @@
2
2
  // hint, and renderer noun forms derive from. No NLP library or lemmatiser:
3
3
  // plain phrase lists feeding the same fixed-precedence regex grammar.
4
4
 
5
- /** relation token -> { comment, verbs[] }. Each `verbs` list spans formal,
5
+ /** relation token -> { bare, comment, verbs[] }. Each `verbs` list spans formal,
6
6
  * neutral, and casual phrasings of the same relation; a misparse costs
7
- * nothing beyond an honest object-miss (resolveObject never guesses). */
7
+ * nothing beyond an honest object-miss (resolveObject never guesses).
8
+ *
9
+ * `bare` is the relation's base verb form, for frames that need an infinitive
10
+ * rather than the inflected relation token ("modules that do not IMPORT x",
11
+ * where the token would read "do not imports"). Hand-curated per relation, the
12
+ * same closed-vocabulary discipline as `verbs`: deriving it by stripping an
13
+ * "s" is a morphology rule that gets "touches" and "co-change with" wrong. */
8
14
  // Reverse `inherits` phrasings ("is X a superclass of Y") name the same
9
15
  // relation as the forward verbs above but with subject/object swapped, so
10
16
  // they're kept in INHERITS_REVERSE_VERB_LIST too: strategies that build "ask"
@@ -24,6 +30,7 @@ const INHERITS_REVERSE_VERB_LIST = [
24
30
 
25
31
  export const RELATIONS = {
26
32
  imports: {
33
+ bare: "import",
27
34
  comment: "Module -> Module: subject's import graph references object (usesComplexType).",
28
35
  verbs: [
29
36
  // formal/neutral ("uses code from" stays here: its phrasing is
@@ -41,14 +48,16 @@ export const RELATIONS = {
41
48
  // query-side union, not a stored predicate: ask.mjs traverses "uses" as
42
49
  // imports + calls + callsSymbol together (KIND_UNIONS).
43
50
  uses: {
51
+ bare: "use",
44
52
  comment: "query-side union: imports (Module->Module) + calls (Module->Module) + callsSymbol (fn->fn).",
45
53
  verbs: [
46
- "uses", "use", "used by", "makes use of", "make use of",
54
+ "uses", "use", "makes use of", "make use of",
47
55
  // gerund (g-drop normalization)
48
56
  "using",
49
57
  ],
50
58
  },
51
59
  calls: {
60
+ bare: "call",
52
61
  comment: "Function/Method -> Function/Class (symbol-grain) or Module -> Module (coarse): subject invokes object.",
53
62
  verbs: [
54
63
  // formal
@@ -62,6 +71,7 @@ export const RELATIONS = {
62
71
  ],
63
72
  },
64
73
  defines: {
74
+ bare: "define",
65
75
  comment: "Module -> top-level Function/Class/Method/Attribute: subject declares object.",
66
76
  verbs: [
67
77
  "defines", "define", "declares", "declare",
@@ -71,6 +81,7 @@ export const RELATIONS = {
71
81
  ],
72
82
  },
73
83
  contains: {
84
+ bare: "contain",
74
85
  comment: "Class -> Method/Attribute: subject's membership includes object.",
75
86
  verbs: [
76
87
  "contains", "contain", "lives in", "live in", "is defined in", "are defined in",
@@ -80,6 +91,7 @@ export const RELATIONS = {
80
91
  ],
81
92
  },
82
93
  tests: {
94
+ bare: "test",
83
95
  comment: "Module -> Module: subject is a test module importing/covering object.",
84
96
  verbs: [
85
97
  "tests", "test", "covers", "cover", "verifies", "verify", "exercises", "exercise",
@@ -89,6 +101,7 @@ export const RELATIONS = {
89
101
  ],
90
102
  },
91
103
  inherits: {
104
+ bare: "inherit from",
92
105
  comment: "Class -> Class: subject's declared base resolves to object (subclassOf).",
93
106
  verbs: [
94
107
  "inherits from", "inherit from",
@@ -104,6 +117,7 @@ export const RELATIONS = {
104
117
  ],
105
118
  },
106
119
  touches: {
120
+ bare: "touch",
107
121
  comment: "Commit -> Module (coarse) or Commit -> symbol (fine, touchesSymbol): a commit's changed-line-range intersects object.",
108
122
  verbs: [
109
123
  "touched", "touches", "changed", "change", "modified", "modifies",
@@ -111,8 +125,10 @@ export const RELATIONS = {
111
125
  "was modified by", "were modified by", "was tweaked in", "were tweaked in",
112
126
  "got changed in", "got edited in",
113
127
  // the same touch relation asked from the commit's side ("what did
114
- // commit <sha> touch")
115
- "touch", "touched by", "modified by", "changed by", "changed in",
128
+ // commit <sha> touch"). "touched by"/"modified by"/"changed by" are absent
129
+ // on purpose: they mark a passive AGENT, so swallowing the "by" here would
130
+ // hide the passive from the strategy that reads it and invert the operands.
131
+ "touch", "changed in",
116
132
  "landed in", "land in",
117
133
  // "was in"/"went into" only read as touch questions against a
118
134
  // sha-shaped object
@@ -123,6 +139,7 @@ export const RELATIONS = {
123
139
  ],
124
140
  },
125
141
  cochange: {
142
+ bare: "co-change with",
126
143
  comment: "Module -> Module: subject and object are frequently committed together (changeCoupledWith).",
127
144
  verbs: [
128
145
  "changed with", "co-changes with", "co-change with", "changes alongside",
@@ -135,6 +152,7 @@ export const RELATIONS = {
135
152
  ],
136
153
  },
137
154
  reexports: {
155
+ bare: "re-export",
138
156
  comment: "Module -> exported symbol: subject's public API surface (__all__/export list).",
139
157
  verbs: [
140
158
  "exports", "export", "re-exports", "re-export", "passes through", "pass through",
@@ -159,6 +177,12 @@ export const INHERITS_REVERSE_VERBS = Object.freeze([
159
177
  /** Definition-location markers: "where is X <marker>" (or bare "where is X"). */
160
178
  export const WHERE_MARKERS = Object.freeze(["defined", "declared", "located", "implemented"]);
161
179
 
180
+ /** Temporal adverbs a locative question may trail ("where is disk-1 now"). They
181
+ * carry no meaning the graph can read — the answer is the same with or without
182
+ * one — so they are stripped rather than bound as part of the term. A closed set:
183
+ * the term itself is free text, and only a listed word may be taken off it. */
184
+ export const TRAILING_TEMPORAL_ADVERBS = Object.freeze(["now", "currently", "right now", "at the moment", "these days", "today"]);
185
+
162
186
  /** Prose-mention markers: "where is X <marker>" -> the prose/mentions surface. */
163
187
  export const MENTION_MARKERS = Object.freeze(["mentioned", "referenced"]);
164
188
 
@@ -467,6 +491,14 @@ export const QUALIFIERS = Object.freeze({
467
491
  uncovered: { via: "tested", value: false },
468
492
  });
469
493
 
494
+ /** Agent words naming no particular thing, for the "is X <qualifier> by <agent>"
495
+ * tail. "is X covered by tests" and "is X tested by anything" are asking the
496
+ * plain coverage property, so they stay on the qualifier-check path; a NAMED
497
+ * agent ("…by logger.mjs") is asking about that agent's own edges instead. */
498
+ export const GENERIC_AGENT_WORDS = Object.freeze(new Set([
499
+ "tests", "test", "anything", "something", "anyone", "someone", "any",
500
+ ]));
501
+
470
502
  /** Aggregate/count triggers: "how many <kind> …", "count <kind>s", "number of
471
503
  * <kind>". Bare "tally"/"sum"/"total" are deliberately excluded — they're
472
504
  * identifier-fragment risks ("total price") and stay CASCADE_SYNONYMS-mapped