@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.
- package/README.md +244 -48
- package/ROADMAP.md +23 -34
- package/bin/tmct.mjs +117 -81
- package/corpus/LICENSES.json +118 -0
- package/corpus/README.md +17 -13
- package/corpus/conceptnet/README.md +5 -5
- package/corpus/conceptnet/fetch-slice.mjs +1 -1
- package/corpus/conceptnet/filter-dump.mjs +1 -1
- package/corpus/generated/README.md +9 -10
- package/corpus/namenet/README.md +39 -0
- package/corpus/seon/README.md +2 -2
- package/corpus/tier2/generate.mjs +58 -9
- package/corpus/tier2/manifest.json +44 -0
- package/corpus/wordnet/README.md +37 -0
- package/corpus/wordnet/generate.mjs +1 -1
- package/data/templates/constructions/agent-noun-relations.toml +2 -2
- package/data/templates/grammar-rules.toml +1 -1
- package/package.json +13 -22
- package/src/{ask-nlp.mjs → adapters/ask-nlp.mjs} +1 -1
- package/src/{config.mjs → adapters/config.mjs} +1 -1
- package/src/{corpus → adapters/corpus}/conceptnet-map.toml +4 -4
- package/src/{corpus → adapters/corpus}/conceptnet.mjs +3 -3
- package/src/adapters/corpus/construction-banks.mjs +43 -0
- package/src/{corpus → adapters/corpus}/templates.mjs +1 -1
- package/src/{embed.mjs → adapters/embed.mjs} +1 -11
- package/src/{graph-build.mjs → adapters/graph-build.mjs} +6 -6
- package/src/{memory → adapters/memory}/blocks.mjs +2 -2
- package/src/{memory → adapters/memory}/core.mjs +38 -94
- package/src/adapters/prose-tokens.mjs +98 -0
- package/src/{providers → adapters/providers}/bootstrap.mjs +2 -2
- package/src/{providers → adapters/providers}/fixture.mjs +3 -3
- package/src/{providers → adapters/providers}/graph-service.mjs +9 -4
- package/src/{source-slice.mjs → adapters/source-slice.mjs} +2 -2
- package/src/{source.mjs → adapters/source.mjs} +1 -1
- package/src/{toml-config.mjs → adapters/toml-config.mjs} +1 -1
- package/src/{answer-variants.json → domain/answer-variants.json} +1 -1
- package/src/domain/answer-variants.mjs +23 -0
- package/src/{ask-vocab.mjs → domain/ask-vocab.mjs} +37 -5
- package/src/{ask.mjs → domain/ask.mjs} +216 -52
- package/src/{codegraph.mjs → domain/codegraph.mjs} +31 -315
- package/src/{completions → domain/completions}/complete.mjs +16 -10
- package/src/{completions → domain/completions}/graph-adapter.mjs +10 -4
- package/src/{completions → domain/completions}/group.mjs +14 -6
- package/src/{completions → domain/completions}/infer.mjs +57 -39
- package/src/domain/completions/injected.mjs +21 -0
- package/src/{completions → domain/completions}/rank.mjs +15 -8
- package/src/{completions → domain/completions}/search.mjs +4 -2
- package/src/{grammar → domain/grammar}/ace.mjs +3 -3
- package/src/{grammar → domain/grammar}/assert.mjs +12 -8
- package/src/{grammar → domain/grammar}/lexicon-core.json +1 -1
- package/src/{grammar → domain/grammar}/lexicon.mjs +4 -6
- package/src/domain/hash.mjs +147 -0
- package/src/{interpret → domain/interpret}/fuzzy.mjs +42 -4
- package/src/domain/interpret/nlp-registry.mjs +20 -0
- package/src/{interpret → domain/interpret}/normalize.mjs +35 -5
- package/src/{interpret → domain/interpret}/pipeline.mjs +1 -5
- package/src/{interpret → domain/interpret}/strategies/ace.mjs +1 -1
- package/src/{interpret → domain/interpret}/strategies/constructions.mjs +30 -52
- package/src/{interpret → domain/interpret}/strategies/keywords.mjs +48 -26
- package/src/domain/memory/capability.mjs +235 -0
- package/src/domain/memory/fold.mjs +54 -0
- package/src/domain/memory/session-turns.mjs +7 -0
- package/src/{memory → domain/memory}/trust.mjs +48 -0
- package/src/{paraphrase.mjs → domain/paraphrase.mjs} +2 -2
- package/src/{prose.mjs → domain/prose.mjs} +1 -1
- package/src/domain/real-word-collisions.json +1 -0
- package/src/{router → domain/router}/call-validator.mjs +1 -1
- package/src/{router → domain/router}/drive.mjs +34 -25
- package/src/{router → domain/router}/goal-reasoner.mjs +1 -1
- package/src/{router → domain/router}/guardrail.mjs +1 -1
- package/src/{router → domain/router}/planner.mjs +1 -1
- package/src/{router → domain/router}/registry.mjs +5 -5
- package/src/{router → domain/router}/resolver.mjs +16 -13
- package/src/{router → domain/router}/results.mjs +1 -1
- package/src/{router → domain/router}/set-algebra.mjs +1 -1
- package/src/{router → domain/router}/taught.mjs +10 -9
- package/src/{syllogise.mjs → domain/syllogise.mjs} +21 -4
- package/src/domain/vector.mjs +12 -0
- package/src/services/chat-session.mjs +451 -0
- package/src/{chat.mjs → services/chat.mjs} +1238 -680
- package/src/{cli-args.mjs → services/cli-args.mjs} +2 -2
- package/src/services/completions.mjs +55 -0
- package/src/{extensions.mjs → services/extensions.mjs} +7 -7
- package/src/{finish.mjs → services/finish.mjs} +2 -2
- package/src/{memory → services}/fold.mjs +0 -0
- package/src/{import-file.mjs → services/import-file.mjs} +3 -3
- package/src/{index.mjs → services/index.mjs} +21 -12
- package/src/{init.mjs → services/init.mjs} +9 -9
- package/src/{ledger-viz.mjs → services/ledger-viz.mjs} +38 -7
- package/src/{plan-viz.mjs → services/plan-viz.mjs} +65 -26
- package/src/{sentences.mjs → services/sentences.mjs} +1 -1
- package/src/{sessions.mjs → services/sessions.mjs} +4 -5
- package/src/{telemetry.mjs → services/telemetry.mjs} +1 -1
- package/src/{server-http.mjs → surfaces/http/server-http.mjs} +11 -65
- package/src/{tui → surfaces/tui}/app.mjs +3 -3
- package/src/{memory-ask-browser-entry.mjs → surfaces/web/memory-ask-browser-entry.mjs} +5 -5
- package/src/{memory-ask-browser.bundle.js → surfaces/web/memory-ask-browser.bundle.js} +9465 -6366
- package/src/tools/catalog.mjs +29 -0
- package/src/{conformance.mjs → tools/conformance.mjs} +2 -2
- package/src/tools/definitions.mjs +288 -0
- package/src/tools/graph-load.mjs +20 -0
- package/src/tools/handlers/index.mjs +54 -0
- package/src/tools/handlers/kit.mjs +33 -0
- package/src/tools/handlers/tmct-architecture.mjs +7 -0
- package/src/tools/handlers/tmct-ask.mjs +14 -0
- package/src/tools/handlers/tmct-callees.mjs +6 -0
- package/src/tools/handlers/tmct-callers.mjs +6 -0
- package/src/tools/handlers/tmct-calls.mjs +6 -0
- package/src/tools/handlers/tmct-class-history.mjs +6 -0
- package/src/tools/handlers/tmct-cochanges.mjs +6 -0
- package/src/tools/handlers/tmct-context-more.mjs +9 -0
- package/src/tools/handlers/tmct-context.mjs +163 -0
- package/src/tools/handlers/tmct-describe.mjs +15 -0
- package/src/tools/handlers/tmct-exports.mjs +9 -0
- package/src/tools/handlers/tmct-file-history.mjs +6 -0
- package/src/tools/handlers/tmct-history.mjs +6 -0
- package/src/tools/handlers/tmct-impact.mjs +9 -0
- package/src/tools/handlers/tmct-members.mjs +16 -0
- package/src/tools/handlers/tmct-method-history.mjs +6 -0
- package/src/tools/handlers/tmct-search.mjs +22 -0
- package/src/tools/handlers/tmct-signature.mjs +6 -0
- package/src/tools/handlers/tmct-snippet.mjs +37 -0
- package/src/tools/handlers/tmct-subclasses.mjs +16 -0
- package/src/tools/handlers/tmct-tests-for.mjs +6 -0
- package/src/tools/handlers/tmct-untested.mjs +7 -0
- package/src/tools/memory-fallthrough.mjs +65 -0
- package/src/{schema-docs.mjs → tools/schema-docs.mjs} +1 -1
- package/src/tools/server.mjs +61 -0
- package/src/answer-variants.mjs +0 -39
- package/src/hash.mjs +0 -24
- package/src/server.mjs +0 -501
- /package/src/{corpus → adapters/corpus}/unknown-ingest.mjs +0 -0
- /package/src/{graph-merge.mjs → adapters/graph-merge.mjs} +0 -0
- /package/src/{memory → adapters/memory}/inspect.mjs +0 -0
- /package/src/{memory → adapters/memory}/shacl.mjs +0 -0
- /package/src/{prose-nlp.mjs → adapters/prose-nlp.mjs} +0 -0
- /package/src/{repository-interface.mjs → adapters/repository-interface.mjs} +0 -0
- /package/src/{uuid.mjs → adapters/uuid.mjs} +0 -0
- /package/src/{wink-model.mjs → adapters/wink-model.mjs} +0 -0
- /package/src/{completions → domain/completions}/prune.mjs +0 -0
- /package/src/{concept.mjs → domain/concept.mjs} +0 -0
- /package/src/{domain.mjs → domain/domain.mjs} +0 -0
- /package/src/{interpret → domain/interpret}/merge.mjs +0 -0
- /package/src/{interpret → domain/interpret}/strategies/grammar.mjs +0 -0
- /package/src/{interpret → domain/interpret}/strategies/noise-strip.mjs +0 -0
- /package/src/{memory → domain/memory}/bias.mjs +0 -0
- /package/src/{planning.mjs → domain/planning.mjs} +0 -0
- /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", "
|
|
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
|
-
|
|
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
|