@polycode-projects/the-mechanical-code-talker 0.9.3 → 0.9.4
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/package.json +1 -1
- package/src/chat.mjs +40 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polycode-projects/the-mechanical-code-talker",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
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; no codebase index of its own.",
|
package/src/chat.mjs
CHANGED
|
@@ -2052,6 +2052,32 @@ function relationTermOf(query, envelope) {
|
|
|
2052
2052
|
return null;
|
|
2053
2053
|
}
|
|
2054
2054
|
|
|
2055
|
+
/** A closed "describe"-intent wrapper: "can you describe X for me", "could you
|
|
2056
|
+
* tell me about X", "tell me more about X" → attempt tmct_describe(X). Found
|
|
2057
|
+
* live (playtest sprint round 2, SKILL_PLAYTEST_SPRINT.md): a describe-intent
|
|
2058
|
+
* question wrapped in an ordinary polite request ("can you tell me more about
|
|
2059
|
+
* Controller") fell all the way to the generic wall despite naming a real,
|
|
2060
|
+
* just-listed entity — nothing recognized the wrapper at all. Same closed
|
|
2061
|
+
* lead-in-alternation discipline as GREETING_PREAMBLE_RE/THANKS_PREAMBLE_RE
|
|
2062
|
+
* (normalize.mjs). Deliberately used only as a LAST-RESORT lane (see its call
|
|
2063
|
+
* site below) — "tell me about X" is ALSO the relation/concept force's own
|
|
2064
|
+
* trigger phrase for enumerable concepts ("tell me about inheritance"), so
|
|
2065
|
+
* this must never run before those have had their chance. */
|
|
2066
|
+
const DESCRIBE_WRAPPER_RE =
|
|
2067
|
+
/^(?:(?:can|could|would)\s+you\s+(?:please\s+)?|please\s+)?(?:tell\s+me\s+(?:more\s+)?about|describe)\s+(.+?)(?:\s+for\s+me)?\s*\??$/i;
|
|
2068
|
+
|
|
2069
|
+
async function describeWrapperAnswer(query, { config, source }) {
|
|
2070
|
+
const m = DESCRIBE_WRAPPER_RE.exec(String(query || "").trim());
|
|
2071
|
+
const term = m?.[1]?.trim();
|
|
2072
|
+
if (!term) return null;
|
|
2073
|
+
try {
|
|
2074
|
+
const text = await dispatchTool("tmct_describe", { symbol: term }, { config, source });
|
|
2075
|
+
return text ? { text } : null;
|
|
2076
|
+
} catch {
|
|
2077
|
+
return null; // unresolvable term — decline, the ordinary wall stands unchanged
|
|
2078
|
+
}
|
|
2079
|
+
}
|
|
2080
|
+
|
|
2055
2081
|
/** THE RELATION CONCEPT FORCE — compose the three-band answer (curated relation
|
|
2056
2082
|
* definition + real example EDGES + pre-validated follow-ups) for a vague touch on a
|
|
2057
2083
|
* relation/edge kind ("what about imports", "what are the calls", "tell me about
|
|
@@ -2369,6 +2395,20 @@ async function runAsk(query, { config, source, graph, focus, last, templates, me
|
|
|
2369
2395
|
const nudged = nudgeAnswer(query, newFocus);
|
|
2370
2396
|
if (nudged) { answer = nudged; via = "miss"; }
|
|
2371
2397
|
}
|
|
2398
|
+
// (4d) DESCRIBE-WRAPPER RESCUE (playtest sprint round 2, SKILL_PLAYTEST_SPRINT.md)
|
|
2399
|
+
// — "can you describe X for me" / "tell me more about X": a closed wrapper
|
|
2400
|
+
// around an ordinary polite request naming a symbol. Tried ONLY here, after
|
|
2401
|
+
// EVERY other lane (concept force, relation force, teach, author,
|
|
2402
|
+
// presupposition, capability nudges) has already declined — "tell me about
|
|
2403
|
+
// inheritance" must keep reaching the relation force's richer answer
|
|
2404
|
+
// unmolested (that regression is exactly why this ISN'T inside asBareCommand,
|
|
2405
|
+
// which runs first and would preempt every lane above). A last-resort rescue
|
|
2406
|
+
// for what would otherwise become the generic wall, never a competing route:
|
|
2407
|
+
// it only claims the turn if /describe actually resolves the captured term.
|
|
2408
|
+
if (miss && recordMiss && via === "composed") {
|
|
2409
|
+
const described = await describeWrapperAnswer(query, { config, source });
|
|
2410
|
+
if (described) { answer = described.text; via = "describe"; recordMiss = false; }
|
|
2411
|
+
}
|
|
2372
2412
|
// (5) #1 SHORT TAILORED MISS — replace ONLY the engine's full grammar cheat-sheet
|
|
2373
2413
|
// wall (WALL_MISS_RE). Receipt-bearing misses keep their specific wording.
|
|
2374
2414
|
// WALL KINDNESS (0.8.2 WS4 (a)): when the PREVIOUS turn's answer was already a
|