wyrm-mcp 7.3.2 → 7.4.0
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 +12 -18
- package/dist/activation.js +59 -1
- package/dist/agent-daemon.js +281 -4
- package/dist/agent-loop.js +332 -7
- package/dist/analytics.js +236 -13
- package/dist/attribution.js +49 -1
- package/dist/audit.js +457 -2
- package/dist/auto-capture.js +138 -3
- package/dist/auto-orchestrator.js +325 -1
- package/dist/autoconfig.d.ts +51 -0
- package/dist/autoconfig.d.ts.map +1 -1
- package/dist/autoconfig.js +1121 -39
- package/dist/autoconfig.js.map +1 -1
- package/dist/buddy-runner.js +109 -1
- package/dist/buddy.js +564 -14
- package/dist/build-flags.js +15 -1
- package/dist/capabilities.js +183 -3
- package/dist/capture.js +56 -1
- package/dist/causality.js +148 -8
- package/dist/cli.js +281 -20
- package/dist/cloud/cli.js +541 -5
- package/dist/cloud/client.js +221 -1
- package/dist/cloud/crypto.js +85 -1
- package/dist/cloud/machine-id.js +113 -2
- package/dist/cloud/recovery.js +60 -1
- package/dist/cloud/sync-engine.js +543 -7
- package/dist/cloud-backup.js +579 -5
- package/dist/cloud-profile.js +138 -1
- package/dist/cloud-sync-entrypoint.js +47 -1
- package/dist/cloud-sync.js +309 -2
- package/dist/connectors/bridge-source.d.ts +46 -0
- package/dist/connectors/bridge-source.d.ts.map +1 -0
- package/dist/connectors/bridge-source.js +77 -0
- package/dist/connectors/bridge-source.js.map +1 -0
- package/dist/connectors/index.d.ts +24 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +69 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/ingest.d.ts +16 -0
- package/dist/connectors/ingest.d.ts.map +1 -0
- package/dist/connectors/ingest.js +116 -0
- package/dist/connectors/ingest.js.map +1 -0
- package/dist/connectors/types.d.ts +99 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +17 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/constellation.js +168 -12
- package/dist/content-signature.js +45 -1
- package/dist/context-build-budgeted.js +144 -4
- package/dist/context-ranking.js +69 -1
- package/dist/crypto.js +179 -1
- package/dist/daemon-write-endpoint.js +290 -1
- package/dist/daemon-writer.js +406 -2
- package/dist/database.js +1278 -53
- package/dist/deprecations.js +162 -2
- package/dist/design.js +141 -13
- package/dist/event-replication.js +112 -1
- package/dist/events-sse.js +43 -7
- package/dist/events.js +238 -6
- package/dist/failure-patterns.d.ts +107 -0
- package/dist/failure-patterns.d.ts.map +1 -1
- package/dist/failure-patterns.js +924 -43
- package/dist/failure-patterns.js.map +1 -1
- package/dist/federation.js +236 -12
- package/dist/goals.js +101 -13
- package/dist/golden.js +355 -3
- package/dist/handlers/agent.js +165 -4
- package/dist/handlers/alias-adapters.js +129 -1
- package/dist/handlers/aliases.js +171 -1
- package/dist/handlers/audit.js +87 -1
- package/dist/handlers/boundary.js +221 -1
- package/dist/handlers/capture.js +1114 -73
- package/dist/handlers/causality.js +119 -9
- package/dist/handlers/cloud.js +382 -85
- package/dist/handlers/companion.js +459 -28
- package/dist/handlers/datalake.js +187 -7
- package/dist/handlers/dispatch-context.js +22 -0
- package/dist/handlers/entity.js +256 -25
- package/dist/handlers/events.js +335 -16
- package/dist/handlers/failure.d.ts +1 -0
- package/dist/handlers/failure.d.ts.map +1 -1
- package/dist/handlers/failure.js +458 -13
- package/dist/handlers/failure.js.map +1 -1
- package/dist/handlers/goals.js +296 -4
- package/dist/handlers/intelligence.d.ts.map +1 -1
- package/dist/handlers/intelligence.js +690 -126
- package/dist/handlers/intelligence.js.map +1 -1
- package/dist/handlers/invoicing.js +70 -1
- package/dist/handlers/mcpclient.js +137 -6
- package/dist/handlers/orchestration.js +125 -40
- package/dist/handlers/output-schemas.js +24 -1
- package/dist/handlers/presence.js +99 -3
- package/dist/handlers/project.js +182 -28
- package/dist/handlers/prompts.js +157 -6
- package/dist/handlers/quest.js +224 -4
- package/dist/handlers/recall.js +237 -13
- package/dist/handlers/registry.js +167 -1
- package/dist/handlers/resources.js +288 -1
- package/dist/handlers/review.js +74 -11
- package/dist/handlers/run.js +498 -16
- package/dist/handlers/search.js +338 -15
- package/dist/handlers/session.js +643 -31
- package/dist/handlers/share.js +184 -8
- package/dist/handlers/shims.js +464 -1
- package/dist/handlers/skill.js +449 -67
- package/dist/handlers/survivors.js +120 -1
- package/dist/handlers/symbols.js +109 -8
- package/dist/handlers/syncops.js +302 -4
- package/dist/handlers/types.js +27 -1
- package/dist/harvest.js +191 -5
- package/dist/hours.js +156 -7
- package/dist/http-auth.js +321 -3
- package/dist/http-fast.d.ts.map +1 -1
- package/dist/http-fast.js +1308 -22
- package/dist/http-fast.js.map +1 -1
- package/dist/icons.js +47 -1
- package/dist/importers.js +268 -1
- package/dist/index.js +844 -2
- package/dist/index.js.map +1 -1
- package/dist/indexer.js +145 -4
- package/dist/intelligence.d.ts +16 -0
- package/dist/intelligence.d.ts.map +1 -1
- package/dist/intelligence.js +283 -31
- package/dist/intelligence.js.map +1 -1
- package/dist/internal-dispatch.js +212 -3
- package/dist/keyset.js +110 -1
- package/dist/knowledge-graph.js +176 -12
- package/dist/license.js +441 -2
- package/dist/logger.js +199 -2
- package/dist/maintenance.js +148 -2
- package/dist/mcp-client.js +262 -6
- package/dist/memory-artifacts.js +596 -32
- package/dist/migrate-prompt.js +124 -2
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +799 -42
- package/dist/migrations.js.map +1 -1
- package/dist/performance.js +228 -1
- package/dist/presence.js +140 -11
- package/dist/priority-embed.js +164 -5
- package/dist/providers/embedding-provider.js +196 -1
- package/dist/readonly-gate.js +29 -1
- package/dist/receipt.js +43 -1
- package/dist/rehydration.js +157 -9
- package/dist/reindex.js +88 -1
- package/dist/render-target.js +544 -21
- package/dist/render.js +280 -4
- package/dist/repl-guard.js +173 -1
- package/dist/replication-daemon-entrypoint.js +31 -1
- package/dist/replication-daemon.js +262 -2
- package/dist/rerank.js +142 -1
- package/dist/resilience.js +591 -1
- package/dist/reverse-bridge.js +360 -5
- package/dist/security.js +244 -1
- package/dist/session-seen.js +51 -3
- package/dist/setup.js +260 -1
- package/dist/skill-author.js +168 -5
- package/dist/spec-kit.js +191 -1
- package/dist/sqlite-busy.js +154 -1
- package/dist/statusline.js +315 -11
- package/dist/sub-agent.js +262 -13
- package/dist/summarizer.js +139 -13
- package/dist/symbols.js +283 -7
- package/dist/sync.js +359 -5
- package/dist/tasks-dispatch.js +84 -1
- package/dist/tasks.js +282 -1
- package/dist/token-budget.js +143 -1
- package/dist/tool-analytics.js +129 -7
- package/dist/tool-annotations.js +365 -1
- package/dist/tool-manifest-v2.json +1 -1
- package/dist/tool-manifest.json +1 -1
- package/dist/tool-profiles.js +75 -1
- package/dist/trace-harvest.js +244 -6
- package/dist/truth-cascade.d.ts +13 -0
- package/dist/truth-cascade.d.ts.map +1 -0
- package/dist/truth-cascade.js +4 -0
- package/dist/truth-cascade.js.map +1 -0
- package/dist/types.js +30 -1
- package/dist/ui-dashboard.js +50 -41
- package/dist/ulid.js +81 -1
- package/dist/usage-tracker.js +66 -1
- package/dist/validate.js +129 -1
- package/dist/vault.js +534 -1
- package/dist/vector-init.js +67 -1
- package/dist/vectors.js +184 -3
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +145 -4
- package/dist/version-check.js.map +1 -1
- package/dist/visibility.js +155 -19
- package/dist/wyrm-cli.js +2849 -101
- package/dist/wyrm-cli.js.map +1 -1
- package/dist/wyrm-guard.d.ts.map +1 -1
- package/dist/wyrm-guard.js +475 -14
- package/dist/wyrm-guard.js.map +1 -1
- package/dist/wyrm-loop.js +174 -3
- package/dist/wyrm-loop.js.map +1 -1
- package/dist/wyrm-manifest.json +1 -1
- package/dist/wyrm-statusline-daemon.js +11 -1
- package/dist/wyrm-statusline.js +56 -4
- package/dist/wyrm-ui.js +77 -9
- package/package.json +3 -2
package/dist/intelligence.js
CHANGED
|
@@ -1,70 +1,322 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Wyrm Intelligence Layer — Ground Truths & Reasoning Scaffolds.
|
|
3
|
+
*
|
|
4
|
+
* Ground Truths: authoritative, versioned project facts that AI models must
|
|
5
|
+
* treat as absolute rather than inferring from context. Eliminates hallucination
|
|
6
|
+
* of stack/architecture/constraint decisions.
|
|
7
|
+
*
|
|
8
|
+
* Reasoning Scaffolds: structured thinking templates for specific task types.
|
|
9
|
+
* Injected into AI context to force step-by-step reasoning on complex tasks —
|
|
10
|
+
* approximating Opus-level structured reasoning in smaller models.
|
|
11
|
+
*
|
|
12
|
+
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
13
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
14
|
+
*/
|
|
15
|
+
import { emitEvent } from './events.js';
|
|
16
|
+
import { getActor } from './handlers/boundary.js';
|
|
17
|
+
/** Max chars for the ground truths block in context_build */
|
|
18
|
+
const TRUTHS_BUDGET_CHARS = 1200;
|
|
19
|
+
/**
|
|
20
|
+
* Compute staleness score for a ground truth based on its TTL and last_verified_at.
|
|
21
|
+
* Returns null if no TTL is set. Returns 0.0–1.0 where 1.0 = fully expired.
|
|
22
|
+
*/
|
|
23
|
+
export function computeStaleness(truth) {
|
|
24
|
+
if (!truth.ttl_days || !truth.last_verified_at)
|
|
25
|
+
return null;
|
|
26
|
+
const verifiedMs = new Date(truth.last_verified_at).getTime();
|
|
27
|
+
const ageDays = (Date.now() - verifiedMs) / (1000 * 60 * 60 * 24);
|
|
28
|
+
return Math.min(1.0, ageDays / truth.ttl_days);
|
|
29
|
+
}
|
|
30
|
+
export class GroundTruths {
|
|
31
|
+
db;
|
|
32
|
+
cascadeHook;
|
|
33
|
+
/** Outcome of the auto-cascade fired by the most recent set() on THIS
|
|
34
|
+
* instance; null when no cascade ran (no supersede, same value, opted out,
|
|
35
|
+
* hook missing, or hook threw). */
|
|
36
|
+
lastCascade = null;
|
|
37
|
+
constructor(db) {
|
|
38
|
+
this.db = db;
|
|
39
|
+
}
|
|
40
|
+
/** Wire the supersede auto-cascade (see truth-cascade.ts). Composition
|
|
41
|
+
* roots call this; a bare GroundTruths behaves exactly as before. */
|
|
42
|
+
attachCascade(hook) { this.cascadeHook = hook; }
|
|
43
|
+
/**
|
|
44
|
+
* Upsert a ground truth for a project. If a current truth with the same key exists,
|
|
45
|
+
* it is superseded and a new current row is inserted (versioned history preserved).
|
|
46
|
+
* A value-changing supersede fires the attached auto-cascade hook (opt out with
|
|
47
|
+
* WYRM_NO_AUTO_CASCADE=1); cascade errors never break the write.
|
|
48
|
+
*/
|
|
49
|
+
set(projectId, opts) {
|
|
50
|
+
const setTruth = this.db.transaction(() => {
|
|
51
|
+
// Find current truth for this key
|
|
52
|
+
const existing = this.db.prepare(`
|
|
2
53
|
SELECT * FROM ground_truths
|
|
3
54
|
WHERE project_id = ? AND category = ? AND key = ? AND is_current = 1
|
|
4
55
|
ORDER BY id DESC LIMIT 1
|
|
5
|
-
`).get(
|
|
56
|
+
`).get(projectId, opts.category, opts.key);
|
|
57
|
+
// Mark the existing one as superseded
|
|
58
|
+
if (existing) {
|
|
59
|
+
this.db.prepare(`UPDATE ground_truths SET is_current = 0, updated_at = datetime('now') WHERE id = ?`).run(existing.id);
|
|
60
|
+
}
|
|
61
|
+
// Insert new current row
|
|
62
|
+
// v7 F2 (T009): stamp the writing actor (NULL outside a fleet context —
|
|
63
|
+
// reads as actor='legacy' per src/attribution.ts).
|
|
64
|
+
const ambient = getActor();
|
|
65
|
+
const result = this.db.prepare(`
|
|
6
66
|
INSERT INTO ground_truths (project_id, category, key, value, rationale, source, confidence, supersedes_id, ttl_days, agent_id, run_id)
|
|
7
67
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
8
|
-
`).run(
|
|
68
|
+
`).run(projectId, opts.category, opts.key.trim(), opts.value.trim(), opts.rationale?.trim() ?? null, opts.source?.trim() ?? null, opts.confidence ?? 1.0, existing?.id ?? null, opts.ttl_days ?? null, ambient.agent_id, ambient.run_id);
|
|
69
|
+
const fresh = this.db.prepare('SELECT * FROM ground_truths WHERE id = ?').get(result.lastInsertRowid);
|
|
70
|
+
return { fresh, superseded: existing ?? null };
|
|
71
|
+
});
|
|
72
|
+
const { fresh: truth, superseded } = setTruth();
|
|
73
|
+
// Live Memory: reference-only event (no payload → no content leak, token-lean).
|
|
74
|
+
emitEvent(this.db, {
|
|
75
|
+
projectId, kind: 'truth', refTable: 'ground_truths', refId: truth.id,
|
|
76
|
+
isShared: !!truth.is_shared,
|
|
77
|
+
});
|
|
78
|
+
// Auto-cascade (7.4.0): a value-changing supersede invalidates the decision
|
|
79
|
+
// edges downstream of the OLD truth, after the write committed. Fail-open —
|
|
80
|
+
// a cascade error must never break the truth write.
|
|
81
|
+
this.lastCascade = null;
|
|
82
|
+
if (superseded && this.cascadeHook && superseded.value !== truth.value
|
|
83
|
+
&& !/^(1|true|yes|on)$/i.test(process.env.WYRM_NO_AUTO_CASCADE ?? '')) {
|
|
84
|
+
try {
|
|
85
|
+
this.lastCascade = this.cascadeHook(superseded, truth);
|
|
86
|
+
}
|
|
87
|
+
catch { /* fail-open */ }
|
|
88
|
+
}
|
|
89
|
+
return truth;
|
|
90
|
+
}
|
|
91
|
+
/** Get all current ground truths for a project, optionally filtered by category. */
|
|
92
|
+
getCurrent(projectId, category) {
|
|
93
|
+
if (category) {
|
|
94
|
+
return this.db.prepare(`
|
|
9
95
|
SELECT * FROM ground_truths
|
|
10
96
|
WHERE project_id = ? AND category = ? AND is_current = 1
|
|
11
97
|
ORDER BY category, key
|
|
12
|
-
`).all(
|
|
98
|
+
`).all(projectId, category);
|
|
99
|
+
}
|
|
100
|
+
return this.db.prepare(`
|
|
13
101
|
SELECT * FROM ground_truths
|
|
14
102
|
WHERE project_id = ? AND is_current = 1
|
|
15
103
|
ORDER BY category, key
|
|
16
|
-
`).all(
|
|
104
|
+
`).all(projectId);
|
|
105
|
+
}
|
|
106
|
+
/** Get the full history for a specific key. */
|
|
107
|
+
getHistory(projectId, category, key) {
|
|
108
|
+
return this.db.prepare(`
|
|
17
109
|
SELECT * FROM ground_truths
|
|
18
110
|
WHERE project_id = ? AND category = ? AND key = ?
|
|
19
111
|
ORDER BY id DESC
|
|
20
|
-
`).all(
|
|
112
|
+
`).all(projectId, category, key);
|
|
113
|
+
}
|
|
114
|
+
/** Delete the current ground truth for a key (soft delete via is_current=0). */
|
|
115
|
+
revoke(projectId, category, key) {
|
|
116
|
+
const result = this.db.prepare(`
|
|
21
117
|
UPDATE ground_truths SET is_current = 0, updated_at = datetime('now')
|
|
22
118
|
WHERE project_id = ? AND category = ? AND key = ? AND is_current = 1
|
|
23
|
-
`).run(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
119
|
+
`).run(projectId, category, key);
|
|
120
|
+
return result.changes > 0;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Format current ground truths as a "Project Facts" block for context injection.
|
|
124
|
+
* Applies a character budget to avoid crowding out task-specific context.
|
|
125
|
+
*/
|
|
126
|
+
formatForContext(projectId, budgetChars = TRUTHS_BUDGET_CHARS) {
|
|
127
|
+
const truths = this.getCurrent(projectId);
|
|
128
|
+
if (truths.length === 0)
|
|
129
|
+
return '';
|
|
130
|
+
const CATEGORY_LABELS = {
|
|
131
|
+
tech_stack: '🛠️ Tech Stack',
|
|
132
|
+
architecture: '🏗️ Architecture',
|
|
133
|
+
constraint: '🚧 Constraints',
|
|
134
|
+
decision: '📋 Decisions',
|
|
135
|
+
contact: '👤 Contacts',
|
|
136
|
+
other: '📌 Other Facts',
|
|
137
|
+
};
|
|
138
|
+
// Group by category
|
|
139
|
+
const byCategory = new Map();
|
|
140
|
+
for (const t of truths) {
|
|
141
|
+
const existing = byCategory.get(t.category) ?? [];
|
|
142
|
+
existing.push(t);
|
|
143
|
+
byCategory.set(t.category, existing);
|
|
144
|
+
}
|
|
145
|
+
let text = '### 📚 Project Ground Truths _(treat as authoritative — do not infer or contradict)_\n';
|
|
146
|
+
let chars = text.length;
|
|
147
|
+
for (const [category, items] of byCategory) {
|
|
148
|
+
const label = CATEGORY_LABELS[category] ?? category;
|
|
149
|
+
const header = `**${label}:**\n`;
|
|
150
|
+
if (chars + header.length > budgetChars)
|
|
151
|
+
break;
|
|
152
|
+
text += header;
|
|
153
|
+
chars += header.length;
|
|
154
|
+
for (const t of items) {
|
|
155
|
+
const line = `- **${t.key}:** ${t.value}${t.rationale ? ` _(${t.rationale})_` : ''}\n`;
|
|
156
|
+
if (chars + line.length > budgetChars)
|
|
157
|
+
break;
|
|
158
|
+
text += line;
|
|
159
|
+
chars += line.length;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const truncNote = chars >= budgetChars ? '\n_(truncated — use wyrm_truth_get for full list)_\n' : '';
|
|
163
|
+
return text + truncNote;
|
|
164
|
+
}
|
|
165
|
+
getStats(projectId) {
|
|
166
|
+
const current = this.db.prepare('SELECT COUNT(*) as n FROM ground_truths WHERE project_id = ? AND is_current = 1').get(projectId).n;
|
|
167
|
+
const superseded = this.db.prepare('SELECT COUNT(*) as n FROM ground_truths WHERE project_id = ? AND is_current = 0').get(projectId).n;
|
|
168
|
+
const catRows = this.db.prepare(`
|
|
29
169
|
SELECT category, COUNT(*) as cnt FROM ground_truths
|
|
30
170
|
WHERE project_id = ? AND is_current = 1 GROUP BY category
|
|
31
|
-
`).all(
|
|
171
|
+
`).all(projectId);
|
|
172
|
+
const byCategory = {};
|
|
173
|
+
for (const r of catRows)
|
|
174
|
+
byCategory[r.category] = r.cnt;
|
|
175
|
+
return { current, superseded, byCategory };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Minimum FTS match confidence before injecting a scaffold */
|
|
179
|
+
const MIN_SCAFFOLD_CONFIDENCE = 0.3;
|
|
180
|
+
/** Max chars for scaffold block in context_build */
|
|
181
|
+
const SCAFFOLD_BUDGET_CHARS = 1500;
|
|
182
|
+
export class ReasoningScaffolds {
|
|
183
|
+
db;
|
|
184
|
+
constructor(db) {
|
|
185
|
+
this.db = db;
|
|
186
|
+
}
|
|
187
|
+
save(opts) {
|
|
188
|
+
const result = this.db.prepare(`
|
|
32
189
|
INSERT INTO reasoning_scaffolds
|
|
33
190
|
(project_id, problem_type, description, when_to_use, steps, verification_steps, do_not_apply_if, tags)
|
|
34
191
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
35
|
-
`).run(
|
|
192
|
+
`).run(opts.projectId ?? null, opts.problemType.trim(), opts.description?.trim() ?? null, opts.whenToUse?.trim() ?? null, JSON.stringify(opts.steps), opts.verificationSteps ? JSON.stringify(opts.verificationSteps) : null, opts.doNotApplyIf ? JSON.stringify(opts.doNotApplyIf) : null, opts.tags?.join(',') ?? null);
|
|
193
|
+
return this.get(result.lastInsertRowid);
|
|
194
|
+
}
|
|
195
|
+
get(id) {
|
|
196
|
+
return this.db.prepare('SELECT * FROM reasoning_scaffolds WHERE id = ?').get(id) ?? null;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Find the best matching scaffold for a given task description.
|
|
200
|
+
* Uses FTS for candidates, then applies confidence weighting.
|
|
201
|
+
* Returns null if no confident match found.
|
|
202
|
+
*/
|
|
203
|
+
findBest(task, projectId, minConfidence = MIN_SCAFFOLD_CONFIDENCE) {
|
|
204
|
+
const sanitized = task.replace(/['"*]/g, ' ').trim();
|
|
205
|
+
if (!sanitized)
|
|
206
|
+
return null;
|
|
207
|
+
const projectClause = projectId
|
|
208
|
+
? 'AND (s.project_id = ? OR s.project_id IS NULL)'
|
|
209
|
+
: 'AND s.project_id IS NULL';
|
|
210
|
+
const params = [sanitized];
|
|
211
|
+
if (projectId)
|
|
212
|
+
params.push(projectId);
|
|
213
|
+
params.push(10);
|
|
214
|
+
let candidates = [];
|
|
215
|
+
try {
|
|
216
|
+
candidates = this.db.prepare(`
|
|
36
217
|
SELECT s.* FROM reasoning_scaffolds s
|
|
37
218
|
JOIN scaffolds_fts fts ON s.id = fts.rowid
|
|
38
219
|
WHERE fts MATCH ?
|
|
39
|
-
${
|
|
220
|
+
${projectClause}
|
|
40
221
|
ORDER BY rank, s.confidence DESC
|
|
41
222
|
LIMIT ?
|
|
42
|
-
`).all(...
|
|
223
|
+
`).all(...params);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// FTS failed — fall back to keyword matching
|
|
227
|
+
candidates = this.fallbackSearch(task, projectId, 5);
|
|
228
|
+
}
|
|
229
|
+
if (candidates.length === 0)
|
|
230
|
+
return null;
|
|
231
|
+
// Score the best candidate
|
|
232
|
+
const best = candidates[0];
|
|
233
|
+
// Adjust score: FTS rank (position 0 = best) × stored confidence
|
|
234
|
+
const positionScore = candidates.length > 1 ? 0.7 : 1.0; // more confident if unambiguous
|
|
235
|
+
const matchScore = positionScore * best.confidence;
|
|
236
|
+
if (matchScore < minConfidence)
|
|
237
|
+
return null;
|
|
238
|
+
return { scaffold: best, matchScore };
|
|
239
|
+
}
|
|
240
|
+
fallbackSearch(task, projectId, limit = 5) {
|
|
241
|
+
const words = task.toLowerCase().split(/\s+/).filter(w => w.length > 3);
|
|
242
|
+
if (!words.length)
|
|
243
|
+
return [];
|
|
244
|
+
const likeOr = words.slice(0, 3).map(() => 'LOWER(problem_type) LIKE ? OR LOWER(tags) LIKE ?').join(' OR ');
|
|
245
|
+
const likeParams = words.slice(0, 3).flatMap(w => [`%${w}%`, `%${w}%`]);
|
|
246
|
+
const projectClause = projectId ? 'AND (project_id = ? OR project_id IS NULL)' : 'AND project_id IS NULL';
|
|
247
|
+
const params = [...likeParams];
|
|
248
|
+
if (projectId)
|
|
249
|
+
params.push(projectId);
|
|
250
|
+
params.push(limit);
|
|
251
|
+
return this.db.prepare(`
|
|
43
252
|
SELECT * FROM reasoning_scaffolds
|
|
44
|
-
WHERE (${
|
|
253
|
+
WHERE (${likeOr}) ${projectClause}
|
|
45
254
|
ORDER BY confidence DESC
|
|
46
255
|
LIMIT ?
|
|
47
|
-
`).all(...
|
|
256
|
+
`).all(...params);
|
|
257
|
+
}
|
|
258
|
+
recordOutcome(id, success) {
|
|
259
|
+
const col = success ? 'success_count' : 'usage_count';
|
|
260
|
+
this.db.prepare(`
|
|
48
261
|
UPDATE reasoning_scaffolds SET
|
|
49
262
|
usage_count = usage_count + 1,
|
|
50
|
-
${
|
|
263
|
+
${col} = ${col} + 1,
|
|
51
264
|
confidence = CASE
|
|
52
265
|
WHEN ? THEN MIN(1.0, confidence + 0.03)
|
|
53
266
|
ELSE MAX(0.1, confidence - 0.08)
|
|
54
267
|
END,
|
|
55
268
|
updated_at = datetime('now')
|
|
56
269
|
WHERE id = ?
|
|
57
|
-
`).run(
|
|
58
|
-
|
|
270
|
+
`).run(success ? 1 : 0, id);
|
|
271
|
+
}
|
|
272
|
+
list(projectId, limit = 20) {
|
|
273
|
+
const projectClause = projectId ? 'WHERE project_id = ? OR project_id IS NULL' : 'WHERE project_id IS NULL';
|
|
274
|
+
const params = [];
|
|
275
|
+
if (projectId)
|
|
276
|
+
params.push(projectId);
|
|
277
|
+
params.push(limit);
|
|
278
|
+
return this.db.prepare(`
|
|
279
|
+
SELECT * FROM reasoning_scaffolds ${projectClause}
|
|
59
280
|
ORDER BY confidence DESC, usage_count DESC
|
|
60
281
|
LIMIT ?
|
|
61
|
-
`).all(...
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
282
|
+
`).all(...params);
|
|
283
|
+
}
|
|
284
|
+
delete(id) {
|
|
285
|
+
return this.db.prepare('DELETE FROM reasoning_scaffolds WHERE id = ?').run(id).changes > 0;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Format a scaffold as a structured context block.
|
|
289
|
+
* Returns a plain checklist (not XML/CoT prompting) for model injection.
|
|
290
|
+
*/
|
|
291
|
+
formatForContext(match, budgetChars = SCAFFOLD_BUDGET_CHARS) {
|
|
292
|
+
const s = match.scaffold;
|
|
293
|
+
const steps = JSON.parse(s.steps || '[]');
|
|
294
|
+
const verifySteps = s.verification_steps ? JSON.parse(s.verification_steps) : [];
|
|
295
|
+
const dontApply = s.do_not_apply_if ? JSON.parse(s.do_not_apply_if) : [];
|
|
296
|
+
let text = `### 🧭 Reasoning Scaffold: "${s.problem_type}" _(confidence: ${(match.matchScore * 100).toFixed(0)}%)_\n`;
|
|
297
|
+
if (s.when_to_use) {
|
|
298
|
+
text += `**When to use:** ${s.when_to_use}\n`;
|
|
299
|
+
}
|
|
300
|
+
if (dontApply.length) {
|
|
301
|
+
text += `**Do NOT apply if:** ${dontApply.join(' · ')}\n`;
|
|
302
|
+
}
|
|
303
|
+
text += `\n**Execution steps:**\n`;
|
|
304
|
+
for (let i = 0; i < steps.length; i++) {
|
|
305
|
+
const line = `${i + 1}. ${steps[i]}\n`;
|
|
306
|
+
if (text.length + line.length > budgetChars)
|
|
307
|
+
break;
|
|
308
|
+
text += line;
|
|
309
|
+
}
|
|
310
|
+
if (verifySteps.length && text.length + 100 < budgetChars) {
|
|
311
|
+
text += `\n**Before finishing, verify:**\n`;
|
|
312
|
+
for (const v of verifySteps) {
|
|
313
|
+
const line = `- [ ] ${v}\n`;
|
|
314
|
+
if (text.length + line.length > budgetChars)
|
|
315
|
+
break;
|
|
316
|
+
text += line;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return text;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=intelligence.js.map
|
package/dist/intelligence.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../src/intelligence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../src/intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,217 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Internal tool dispatcher for the AgentLoop (v7 F4 T036 — extracted from the
|
|
3
|
+
* index.ts monolith). A curated subset of read-mostly + bounded-write tools the
|
|
4
|
+
* autonomous OODA loop is allowed to call; the whitelist itself is enforced in
|
|
5
|
+
* agent-loop.ts (SAFE_INTERNAL_TOOLS). Lifted VERBATIM out of index.ts behind a
|
|
6
|
+
* factory that captures the same subsystem singletons it always closed over —
|
|
7
|
+
* the single-quoted `case` labels here are what tests/tool-surface-integrity.ts
|
|
8
|
+
* scans to keep the whitelist and the dispatcher in lockstep.
|
|
9
|
+
*
|
|
10
|
+
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
11
|
+
* @license Proprietary — (c) 2026 Ghost Protocol (Pvt) Ltd. All rights reserved. See LICENSE.
|
|
12
|
+
*/
|
|
13
|
+
import { sanitizeFtsQuery } from "./security.js";
|
|
14
|
+
import { classifyCapture } from "./capture.js";
|
|
15
|
+
export function makeInternalDispatch(deps) {
|
|
16
|
+
const { db, failures, symbols, rehydration, causality, presence, federation, memory, groundTruths } = deps;
|
|
17
|
+
const internalDispatch = async (name, args) => {
|
|
18
|
+
try {
|
|
19
|
+
switch (name) {
|
|
20
|
+
case 'wyrm_search': {
|
|
21
|
+
const q = String(args.query ?? args.q ?? '').slice(0, 200);
|
|
22
|
+
if (!q)
|
|
23
|
+
return { ok: false, error: 'query required' };
|
|
24
|
+
const sanitized = sanitizeFtsQuery(q);
|
|
25
|
+
const rows = db.getDatabase().prepare(`
|
|
2
26
|
SELECT s.id, s.date, s.summary FROM sessions s
|
|
3
27
|
JOIN sessions_fts fts ON fts.rowid = s.id
|
|
4
28
|
WHERE sessions_fts MATCH ? LIMIT 10
|
|
5
|
-
`).all(
|
|
29
|
+
`).all(sanitized);
|
|
30
|
+
return { ok: true, result: rows };
|
|
31
|
+
}
|
|
32
|
+
case 'wyrm_all_quests': {
|
|
33
|
+
return { ok: true, result: db.getAllPendingQuests().slice(0, 30) };
|
|
34
|
+
}
|
|
35
|
+
case 'wyrm_truth_get': {
|
|
36
|
+
const projPath = args.projectPath;
|
|
37
|
+
const proj = projPath ? db.getProject(projPath) : null;
|
|
38
|
+
const rows = proj
|
|
39
|
+
? db.getDatabase().prepare(`
|
|
6
40
|
SELECT category, key, value, rationale FROM ground_truths
|
|
7
41
|
WHERE project_id = ? AND is_current = 1 ORDER BY confidence DESC LIMIT 30
|
|
8
|
-
`).all(
|
|
42
|
+
`).all(proj.id)
|
|
43
|
+
: [];
|
|
44
|
+
return { ok: true, result: rows };
|
|
45
|
+
}
|
|
46
|
+
case 'wyrm_failure_check': {
|
|
47
|
+
const a = args;
|
|
48
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
49
|
+
return { ok: true, result: failures.check(a.scope, a.target, a.description, proj?.id ?? null) };
|
|
50
|
+
}
|
|
51
|
+
case 'wyrm_failure_list': {
|
|
52
|
+
const a = args;
|
|
53
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
54
|
+
return { ok: true, result: failures.list(proj?.id ?? null, Math.min(50, a.limit ?? 20)) };
|
|
55
|
+
}
|
|
56
|
+
case 'wyrm_failure_record': {
|
|
57
|
+
const a = args;
|
|
58
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
59
|
+
return { ok: true, result: failures.record({ project_id: proj?.id ?? null, scope: a.scope, target: a.target, description: a.description, why_failed: a.why_failed, severity: a.severity }) };
|
|
60
|
+
}
|
|
61
|
+
case 'wyrm_symbol_search': {
|
|
62
|
+
const a = args;
|
|
63
|
+
if (!a.symbol)
|
|
64
|
+
return { ok: false, error: 'symbol required' };
|
|
65
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
66
|
+
return { ok: true, result: symbols.search(a.symbol, { projectId: proj?.id, kind: a.kind, language: a.language, exact: a.exact, limit: Math.min(50, a.limit ?? 20) }) };
|
|
67
|
+
}
|
|
68
|
+
case 'wyrm_symbol_callers': {
|
|
69
|
+
const a = args;
|
|
70
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
71
|
+
return { ok: true, result: symbols.callers(a.symbol, proj?.id).slice(0, 30) };
|
|
72
|
+
}
|
|
73
|
+
case 'wyrm_symbol_stats': {
|
|
74
|
+
const a = args;
|
|
75
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
76
|
+
return { ok: true, result: symbols.stats(proj?.id) };
|
|
77
|
+
}
|
|
78
|
+
case 'wyrm_session_rehydrate': {
|
|
79
|
+
const a = args;
|
|
80
|
+
const brief = rehydration.rehydrate(a.session_id);
|
|
81
|
+
return { ok: brief != null, result: brief, error: brief ? undefined : 'session not found' };
|
|
82
|
+
}
|
|
83
|
+
case 'wyrm_decision_upstream': {
|
|
84
|
+
const a = args;
|
|
85
|
+
return { ok: true, result: causality.upstreamOf(a.kind, a.id) };
|
|
86
|
+
}
|
|
87
|
+
case 'wyrm_decision_downstream': {
|
|
88
|
+
const a = args;
|
|
89
|
+
return { ok: true, result: causality.downstreamOf(a.kind, a.id) };
|
|
90
|
+
}
|
|
91
|
+
case 'wyrm_decided_because': {
|
|
92
|
+
const a = args;
|
|
93
|
+
const proj = db.getProject(a.projectPath);
|
|
94
|
+
if (!proj)
|
|
95
|
+
return { ok: false, error: 'project not found' };
|
|
96
|
+
return { ok: true, result: causality.link({ project_id: proj.id, ...a }) };
|
|
97
|
+
}
|
|
98
|
+
case 'wyrm_presence_list': {
|
|
99
|
+
const a = args;
|
|
100
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
101
|
+
return { ok: true, result: presence.liveAgents(proj?.id ?? null) };
|
|
102
|
+
}
|
|
103
|
+
case 'wyrm_sync_conflicts': {
|
|
104
|
+
return { ok: true, result: federation.unresolvedConflicts(20) };
|
|
105
|
+
}
|
|
106
|
+
case 'wyrm_quest_add': {
|
|
107
|
+
const a = args;
|
|
108
|
+
const proj = db.getProject(a.projectPath);
|
|
109
|
+
if (!proj)
|
|
110
|
+
return { ok: false, error: 'project not found' };
|
|
111
|
+
const q = db.addQuest(proj.id, a.title, a.description, a.priority || 'medium', a.tags);
|
|
112
|
+
return { ok: true, result: { id: q.id, title: q.title } };
|
|
113
|
+
}
|
|
114
|
+
case 'wyrm_quest_complete': {
|
|
115
|
+
const a = args;
|
|
116
|
+
const q = db.updateQuest(a.questId, 'completed');
|
|
117
|
+
return { ok: true, result: { id: q.id, status: 'completed' } };
|
|
118
|
+
}
|
|
119
|
+
case 'wyrm_project_context': {
|
|
120
|
+
const a = args;
|
|
121
|
+
const proj = db.getProject(a.projectPath);
|
|
122
|
+
if (!proj)
|
|
123
|
+
return { ok: false, error: 'project not found' };
|
|
124
|
+
// Summary: open quests + latest session
|
|
125
|
+
const ctx = {
|
|
126
|
+
project: proj.name,
|
|
127
|
+
quests: db.getAllPendingQuests().filter(q => q.project_id === proj.id).slice(0, 10),
|
|
128
|
+
last_session: db.getDatabase().prepare('SELECT id, date, summary FROM sessions WHERE project_id = ? ORDER BY date DESC LIMIT 1').get(proj.id),
|
|
129
|
+
};
|
|
130
|
+
return { ok: true, result: ctx };
|
|
131
|
+
}
|
|
132
|
+
// ── Memory ops the OODA loop is whitelisted for (SAFE_INTERNAL_TOOLS).
|
|
133
|
+
// These were promised by the whitelist but had no dispatch case until 6.8.1,
|
|
134
|
+
// so the loop silently failed on them. Kept in lockstep by
|
|
135
|
+
// tests/tool-surface-integrity.test.ts.
|
|
136
|
+
case 'wyrm_global_context': {
|
|
137
|
+
const a = args;
|
|
138
|
+
const projects = db.getAllProjects(a.maxProjects ?? 20).map((p) => ({
|
|
139
|
+
name: p.name, stack: p.stack ?? null, stats: db.getProjectStats(p.id),
|
|
140
|
+
}));
|
|
141
|
+
const result = { globalContext: db.getAllGlobalContext(), projects };
|
|
142
|
+
if (a.includeQuests)
|
|
143
|
+
result.quests = db.getAllPendingQuests().slice(0, 20);
|
|
144
|
+
return { ok: true, result };
|
|
145
|
+
}
|
|
146
|
+
case 'wyrm_recall': {
|
|
147
|
+
const a = args;
|
|
148
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
149
|
+
if (!proj)
|
|
150
|
+
return { ok: false, error: 'project not found' };
|
|
151
|
+
if (!a.query)
|
|
152
|
+
return { ok: false, error: 'query required' };
|
|
153
|
+
const results = memory.recall(proj.id, a.query, { kind: a.kind, limit: Math.min(20, a.limit ?? 10), minConfidence: a.minConfidence });
|
|
154
|
+
return { ok: true, result: results.map((r) => ({ id: r.artifact.id, kind: r.artifact.kind, problem: r.artifact.problem, validated_fix: r.artifact.validated_fix, relevance: r.relevance_score })) };
|
|
155
|
+
}
|
|
156
|
+
case 'wyrm_remember': {
|
|
157
|
+
const a = args;
|
|
158
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
159
|
+
if (!proj)
|
|
160
|
+
return { ok: false, error: 'project not found' };
|
|
161
|
+
if (!a.problem)
|
|
162
|
+
return { ok: false, error: 'problem required' };
|
|
163
|
+
const art = memory.add(proj.id, { kind: a.kind, problem: a.problem, constraints: a.constraints, validatedFix: a.validatedFix, whyItWorked: a.whyItWorked, outcome: a.outcome, tags: a.tags, confidence: a.confidence, sourceSessionId: a.sourceSessionId });
|
|
164
|
+
return { ok: true, result: { id: art.id, kind: art.kind } };
|
|
165
|
+
}
|
|
166
|
+
case 'wyrm_distill': {
|
|
167
|
+
const a = args;
|
|
168
|
+
const proj = a.projectPath ? db.getProject(a.projectPath) : null;
|
|
169
|
+
if (!proj)
|
|
170
|
+
return { ok: false, error: 'project not found' };
|
|
171
|
+
if (!a.candidates?.length)
|
|
172
|
+
return { ok: false, error: 'candidates required' };
|
|
173
|
+
const ids = a.candidates.map((c) => memory.add(proj.id, { kind: c.kind, problem: c.title, validatedFix: c.content, tags: c.tags ?? [], confidence: c.confidence ?? 0.7, needsReview: 1 }).id);
|
|
174
|
+
return { ok: true, result: { queued: ids.length, ids } };
|
|
175
|
+
}
|
|
176
|
+
case 'wyrm_capture': {
|
|
177
|
+
const a = args;
|
|
178
|
+
if (!a.content)
|
|
179
|
+
return { ok: false, error: 'content required' };
|
|
180
|
+
let cls = classifyCapture(a.content);
|
|
181
|
+
if (a.mode && a.mode !== 'auto') {
|
|
182
|
+
const sub = { quest: 'quest', truth: 'decision', memory: 'pattern' };
|
|
183
|
+
cls = { type: a.mode, subtype: sub[a.mode] ?? a.mode, confidence: 100, reasoning: `mode:${a.mode}` };
|
|
184
|
+
}
|
|
185
|
+
const pid = a.project_id ?? null;
|
|
186
|
+
if (cls.type === 'quest') {
|
|
187
|
+
if (pid === null)
|
|
188
|
+
return { ok: false, error: 'project_id required for quest' };
|
|
189
|
+
const q = db.addQuest(pid, a.content.slice(0, 200), '', 'medium', a.tags?.join(','));
|
|
190
|
+
return { ok: true, result: { type: 'quest', id: q.id } };
|
|
191
|
+
}
|
|
192
|
+
if (cls.type === 'truth') {
|
|
193
|
+
if (pid === null)
|
|
194
|
+
return { ok: false, error: 'project_id required for truth' };
|
|
195
|
+
if (a.mode === 'truth' || cls.confidence >= 100) {
|
|
196
|
+
const t = groundTruths.set(pid, { category: 'decision', key: a.content.slice(0, 60), value: a.content });
|
|
197
|
+
return { ok: true, result: { type: 'truth', id: t.id } };
|
|
198
|
+
}
|
|
199
|
+
const art = memory.add(pid, { kind: 'pattern', problem: a.content, tags: a.tags ?? [], confidence: cls.confidence / 100, needsReview: 1 });
|
|
200
|
+
return { ok: true, result: { type: 'memory_review', id: art.id } };
|
|
201
|
+
}
|
|
202
|
+
if (pid === null)
|
|
203
|
+
return { ok: false, error: 'project_id required for memory' };
|
|
204
|
+
const art = memory.add(pid, { kind: 'pattern', problem: a.content, tags: a.tags ?? [], confidence: (cls.confidence ?? 70) / 100, needsReview: 1 });
|
|
205
|
+
return { ok: true, result: { type: 'memory', id: art.id } };
|
|
206
|
+
}
|
|
207
|
+
default:
|
|
208
|
+
return { ok: false, error: `Internal tool '${name}' not implemented in dispatcher` };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
return { ok: false, error: err.message };
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
return internalDispatch;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=internal-dispatch.js.map
|