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.
Files changed (200) hide show
  1. package/README.md +12 -18
  2. package/dist/activation.js +59 -1
  3. package/dist/agent-daemon.js +281 -4
  4. package/dist/agent-loop.js +332 -7
  5. package/dist/analytics.js +236 -13
  6. package/dist/attribution.js +49 -1
  7. package/dist/audit.js +457 -2
  8. package/dist/auto-capture.js +138 -3
  9. package/dist/auto-orchestrator.js +325 -1
  10. package/dist/autoconfig.d.ts +51 -0
  11. package/dist/autoconfig.d.ts.map +1 -1
  12. package/dist/autoconfig.js +1121 -39
  13. package/dist/autoconfig.js.map +1 -1
  14. package/dist/buddy-runner.js +109 -1
  15. package/dist/buddy.js +564 -14
  16. package/dist/build-flags.js +15 -1
  17. package/dist/capabilities.js +183 -3
  18. package/dist/capture.js +56 -1
  19. package/dist/causality.js +148 -8
  20. package/dist/cli.js +281 -20
  21. package/dist/cloud/cli.js +541 -5
  22. package/dist/cloud/client.js +221 -1
  23. package/dist/cloud/crypto.js +85 -1
  24. package/dist/cloud/machine-id.js +113 -2
  25. package/dist/cloud/recovery.js +60 -1
  26. package/dist/cloud/sync-engine.js +543 -7
  27. package/dist/cloud-backup.js +579 -5
  28. package/dist/cloud-profile.js +138 -1
  29. package/dist/cloud-sync-entrypoint.js +47 -1
  30. package/dist/cloud-sync.js +309 -2
  31. package/dist/connectors/bridge-source.d.ts +46 -0
  32. package/dist/connectors/bridge-source.d.ts.map +1 -0
  33. package/dist/connectors/bridge-source.js +77 -0
  34. package/dist/connectors/bridge-source.js.map +1 -0
  35. package/dist/connectors/index.d.ts +24 -0
  36. package/dist/connectors/index.d.ts.map +1 -0
  37. package/dist/connectors/index.js +69 -0
  38. package/dist/connectors/index.js.map +1 -0
  39. package/dist/connectors/ingest.d.ts +16 -0
  40. package/dist/connectors/ingest.d.ts.map +1 -0
  41. package/dist/connectors/ingest.js +116 -0
  42. package/dist/connectors/ingest.js.map +1 -0
  43. package/dist/connectors/types.d.ts +99 -0
  44. package/dist/connectors/types.d.ts.map +1 -0
  45. package/dist/connectors/types.js +17 -0
  46. package/dist/connectors/types.js.map +1 -0
  47. package/dist/constellation.js +168 -12
  48. package/dist/content-signature.js +45 -1
  49. package/dist/context-build-budgeted.js +144 -4
  50. package/dist/context-ranking.js +69 -1
  51. package/dist/crypto.js +179 -1
  52. package/dist/daemon-write-endpoint.js +290 -1
  53. package/dist/daemon-writer.js +406 -2
  54. package/dist/database.js +1278 -53
  55. package/dist/deprecations.js +162 -2
  56. package/dist/design.js +141 -13
  57. package/dist/event-replication.js +112 -1
  58. package/dist/events-sse.js +43 -7
  59. package/dist/events.js +238 -6
  60. package/dist/failure-patterns.d.ts +107 -0
  61. package/dist/failure-patterns.d.ts.map +1 -1
  62. package/dist/failure-patterns.js +924 -43
  63. package/dist/failure-patterns.js.map +1 -1
  64. package/dist/federation.js +236 -12
  65. package/dist/goals.js +101 -13
  66. package/dist/golden.js +355 -3
  67. package/dist/handlers/agent.js +165 -4
  68. package/dist/handlers/alias-adapters.js +129 -1
  69. package/dist/handlers/aliases.js +171 -1
  70. package/dist/handlers/audit.js +87 -1
  71. package/dist/handlers/boundary.js +221 -1
  72. package/dist/handlers/capture.js +1114 -73
  73. package/dist/handlers/causality.js +119 -9
  74. package/dist/handlers/cloud.js +382 -85
  75. package/dist/handlers/companion.js +459 -28
  76. package/dist/handlers/datalake.js +187 -7
  77. package/dist/handlers/dispatch-context.js +22 -0
  78. package/dist/handlers/entity.js +256 -25
  79. package/dist/handlers/events.js +335 -16
  80. package/dist/handlers/failure.d.ts +1 -0
  81. package/dist/handlers/failure.d.ts.map +1 -1
  82. package/dist/handlers/failure.js +458 -13
  83. package/dist/handlers/failure.js.map +1 -1
  84. package/dist/handlers/goals.js +296 -4
  85. package/dist/handlers/intelligence.d.ts.map +1 -1
  86. package/dist/handlers/intelligence.js +690 -126
  87. package/dist/handlers/intelligence.js.map +1 -1
  88. package/dist/handlers/invoicing.js +70 -1
  89. package/dist/handlers/mcpclient.js +137 -6
  90. package/dist/handlers/orchestration.js +125 -40
  91. package/dist/handlers/output-schemas.js +24 -1
  92. package/dist/handlers/presence.js +99 -3
  93. package/dist/handlers/project.js +182 -28
  94. package/dist/handlers/prompts.js +157 -6
  95. package/dist/handlers/quest.js +224 -4
  96. package/dist/handlers/recall.js +237 -13
  97. package/dist/handlers/registry.js +167 -1
  98. package/dist/handlers/resources.js +288 -1
  99. package/dist/handlers/review.js +74 -11
  100. package/dist/handlers/run.js +498 -16
  101. package/dist/handlers/search.js +338 -15
  102. package/dist/handlers/session.js +643 -31
  103. package/dist/handlers/share.js +184 -8
  104. package/dist/handlers/shims.js +464 -1
  105. package/dist/handlers/skill.js +449 -67
  106. package/dist/handlers/survivors.js +120 -1
  107. package/dist/handlers/symbols.js +109 -8
  108. package/dist/handlers/syncops.js +302 -4
  109. package/dist/handlers/types.js +27 -1
  110. package/dist/harvest.js +191 -5
  111. package/dist/hours.js +156 -7
  112. package/dist/http-auth.js +321 -3
  113. package/dist/http-fast.d.ts.map +1 -1
  114. package/dist/http-fast.js +1308 -22
  115. package/dist/http-fast.js.map +1 -1
  116. package/dist/icons.js +47 -1
  117. package/dist/importers.js +268 -1
  118. package/dist/index.js +844 -2
  119. package/dist/index.js.map +1 -1
  120. package/dist/indexer.js +145 -4
  121. package/dist/intelligence.d.ts +16 -0
  122. package/dist/intelligence.d.ts.map +1 -1
  123. package/dist/intelligence.js +283 -31
  124. package/dist/intelligence.js.map +1 -1
  125. package/dist/internal-dispatch.js +212 -3
  126. package/dist/keyset.js +110 -1
  127. package/dist/knowledge-graph.js +176 -12
  128. package/dist/license.js +441 -2
  129. package/dist/logger.js +199 -2
  130. package/dist/maintenance.js +148 -2
  131. package/dist/mcp-client.js +262 -6
  132. package/dist/memory-artifacts.js +596 -32
  133. package/dist/migrate-prompt.js +124 -2
  134. package/dist/migrations.d.ts.map +1 -1
  135. package/dist/migrations.js +799 -42
  136. package/dist/migrations.js.map +1 -1
  137. package/dist/performance.js +228 -1
  138. package/dist/presence.js +140 -11
  139. package/dist/priority-embed.js +164 -5
  140. package/dist/providers/embedding-provider.js +196 -1
  141. package/dist/readonly-gate.js +29 -1
  142. package/dist/receipt.js +43 -1
  143. package/dist/rehydration.js +157 -9
  144. package/dist/reindex.js +88 -1
  145. package/dist/render-target.js +544 -21
  146. package/dist/render.js +280 -4
  147. package/dist/repl-guard.js +173 -1
  148. package/dist/replication-daemon-entrypoint.js +31 -1
  149. package/dist/replication-daemon.js +262 -2
  150. package/dist/rerank.js +142 -1
  151. package/dist/resilience.js +591 -1
  152. package/dist/reverse-bridge.js +360 -5
  153. package/dist/security.js +244 -1
  154. package/dist/session-seen.js +51 -3
  155. package/dist/setup.js +260 -1
  156. package/dist/skill-author.js +168 -5
  157. package/dist/spec-kit.js +191 -1
  158. package/dist/sqlite-busy.js +154 -1
  159. package/dist/statusline.js +315 -11
  160. package/dist/sub-agent.js +262 -13
  161. package/dist/summarizer.js +139 -13
  162. package/dist/symbols.js +283 -7
  163. package/dist/sync.js +359 -5
  164. package/dist/tasks-dispatch.js +84 -1
  165. package/dist/tasks.js +282 -1
  166. package/dist/token-budget.js +143 -1
  167. package/dist/tool-analytics.js +129 -7
  168. package/dist/tool-annotations.js +365 -1
  169. package/dist/tool-manifest-v2.json +1 -1
  170. package/dist/tool-manifest.json +1 -1
  171. package/dist/tool-profiles.js +75 -1
  172. package/dist/trace-harvest.js +244 -6
  173. package/dist/truth-cascade.d.ts +13 -0
  174. package/dist/truth-cascade.d.ts.map +1 -0
  175. package/dist/truth-cascade.js +4 -0
  176. package/dist/truth-cascade.js.map +1 -0
  177. package/dist/types.js +30 -1
  178. package/dist/ui-dashboard.js +50 -41
  179. package/dist/ulid.js +81 -1
  180. package/dist/usage-tracker.js +66 -1
  181. package/dist/validate.js +129 -1
  182. package/dist/vault.js +534 -1
  183. package/dist/vector-init.js +67 -1
  184. package/dist/vectors.js +184 -3
  185. package/dist/version-check.d.ts.map +1 -1
  186. package/dist/version-check.js +145 -4
  187. package/dist/version-check.js.map +1 -1
  188. package/dist/visibility.js +155 -19
  189. package/dist/wyrm-cli.js +2849 -101
  190. package/dist/wyrm-cli.js.map +1 -1
  191. package/dist/wyrm-guard.d.ts.map +1 -1
  192. package/dist/wyrm-guard.js +475 -14
  193. package/dist/wyrm-guard.js.map +1 -1
  194. package/dist/wyrm-loop.js +174 -3
  195. package/dist/wyrm-loop.js.map +1 -1
  196. package/dist/wyrm-manifest.json +1 -1
  197. package/dist/wyrm-statusline-daemon.js +11 -1
  198. package/dist/wyrm-statusline.js +56 -4
  199. package/dist/wyrm-ui.js +77 -9
  200. package/package.json +3 -2
@@ -1,70 +1,322 @@
1
- import{emitEvent as E}from"./events.js";import{getActor as p}from"./handlers/boundary.js";const h=1200;function O(u){if(!u.ttl_days||!u.last_verified_at)return null;const t=new Date(u.last_verified_at).getTime(),e=(Date.now()-t)/(1e3*60*60*24);return Math.min(1,e/u.ttl_days)}class T{db;constructor(t){this.db=t}set(t,e){const s=this.db.transaction(()=>{const c=this.db.prepare(`
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(t,e.category,e.key);c&&this.db.prepare("UPDATE ground_truths SET is_current = 0, updated_at = datetime('now') WHERE id = ?").run(c.id);const o=p(),n=this.db.prepare(`
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(t,e.category,e.key.trim(),e.value.trim(),e.rationale?.trim()??null,e.source?.trim()??null,e.confidence??1,c?.id??null,e.ttl_days??null,o.agent_id,o.run_id);return this.db.prepare("SELECT * FROM ground_truths WHERE id = ?").get(n.lastInsertRowid)})();return E(this.db,{projectId:t,kind:"truth",refTable:"ground_truths",refId:s.id,isShared:!!s.is_shared}),s}getCurrent(t,e){return e?this.db.prepare(`
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(t,e):this.db.prepare(`
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(t)}getHistory(t,e,r){return this.db.prepare(`
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(t,e,r)}revoke(t,e,r){return this.db.prepare(`
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(t,e,r).changes>0}formatForContext(t,e=h){const r=this.getCurrent(t);if(r.length===0)return"";const s={tech_stack:"\u{1F6E0}\uFE0F Tech Stack",architecture:"\u{1F3D7}\uFE0F Architecture",constraint:"\u{1F6A7} Constraints",decision:"\u{1F4CB} Decisions",contact:"\u{1F464} Contacts",other:"\u{1F4CC} Other Facts"},c=new Map;for(const i of r){const l=c.get(i.category)??[];l.push(i),c.set(i.category,l)}let o=`### \u{1F4DA} Project Ground Truths _(treat as authoritative \u2014 do not infer or contradict)_
24
- `,n=o.length;for(const[i,l]of c){const _=`**${s[i]??i}:**
25
- `;if(n+_.length>e)break;o+=_,n+=_.length;for(const d of l){const f=`- **${d.key}:** ${d.value}${d.rationale?` _(${d.rationale})_`:""}
26
- `;if(n+f.length>e)break;o+=f,n+=f.length}}const a=n>=e?`
27
- _(truncated \u2014 use wyrm_truth_get for full list)_
28
- `:"";return o+a}getStats(t){const e=this.db.prepare("SELECT COUNT(*) as n FROM ground_truths WHERE project_id = ? AND is_current = 1").get(t).n,r=this.db.prepare("SELECT COUNT(*) as n FROM ground_truths WHERE project_id = ? AND is_current = 0").get(t).n,s=this.db.prepare(`
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(t),c={};for(const o of s)c[o.category]=o.cnt;return{current:e,superseded:r,byCategory:c}}}const g=.3,R=1500;class D{db;constructor(t){this.db=t}save(t){const e=this.db.prepare(`
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(t.projectId??null,t.problemType.trim(),t.description?.trim()??null,t.whenToUse?.trim()??null,JSON.stringify(t.steps),t.verificationSteps?JSON.stringify(t.verificationSteps):null,t.doNotApplyIf?JSON.stringify(t.doNotApplyIf):null,t.tags?.join(",")??null);return this.get(e.lastInsertRowid)}get(t){return this.db.prepare("SELECT * FROM reasoning_scaffolds WHERE id = ?").get(t)??null}findBest(t,e,r=g){const s=t.replace(/['"*]/g," ").trim();if(!s)return null;const c=e?"AND (s.project_id = ? OR s.project_id IS NULL)":"AND s.project_id IS NULL",o=[s];e&&o.push(e),o.push(10);let n=[];try{n=this.db.prepare(`
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
- ${c}
220
+ ${projectClause}
40
221
  ORDER BY rank, s.confidence DESC
41
222
  LIMIT ?
42
- `).all(...o)}catch{n=this.fallbackSearch(t,e,5)}if(n.length===0)return null;const a=n[0],l=(n.length>1?.7:1)*a.confidence;return l<r?null:{scaffold:a,matchScore:l}}fallbackSearch(t,e,r=5){const s=t.toLowerCase().split(/\s+/).filter(i=>i.length>3);if(!s.length)return[];const c=s.slice(0,3).map(()=>"LOWER(problem_type) LIKE ? OR LOWER(tags) LIKE ?").join(" OR "),o=s.slice(0,3).flatMap(i=>[`%${i}%`,`%${i}%`]),n=e?"AND (project_id = ? OR project_id IS NULL)":"AND project_id IS NULL",a=[...o];return e&&a.push(e),a.push(r),this.db.prepare(`
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 (${c}) ${n}
253
+ WHERE (${likeOr}) ${projectClause}
45
254
  ORDER BY confidence DESC
46
255
  LIMIT ?
47
- `).all(...a)}recordOutcome(t,e){const r=e?"success_count":"usage_count";this.db.prepare(`
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
- ${r} = ${r} + 1,
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(e?1:0,t)}list(t,e=20){const r=t?"WHERE project_id = ? OR project_id IS NULL":"WHERE project_id IS NULL",s=[];return t&&s.push(t),s.push(e),this.db.prepare(`
58
- SELECT * FROM reasoning_scaffolds ${r}
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(...s)}delete(t){return this.db.prepare("DELETE FROM reasoning_scaffolds WHERE id = ?").run(t).changes>0}formatForContext(t,e=R){const r=t.scaffold,s=JSON.parse(r.steps||"[]"),c=r.verification_steps?JSON.parse(r.verification_steps):[],o=r.do_not_apply_if?JSON.parse(r.do_not_apply_if):[];let n=`### \u{1F9ED} Reasoning Scaffold: "${r.problem_type}" _(confidence: ${(t.matchScore*100).toFixed(0)}%)_
62
- `;r.when_to_use&&(n+=`**When to use:** ${r.when_to_use}
63
- `),o.length&&(n+=`**Do NOT apply if:** ${o.join(" \xB7 ")}
64
- `),n+=`
65
- **Execution steps:**
66
- `;for(let a=0;a<s.length;a++){const i=`${a+1}. ${s[a]}
67
- `;if(n.length+i.length>e)break;n+=i}if(c.length&&n.length+100<e){n+=`
68
- **Before finishing, verify:**
69
- `;for(const a of c){const i=`- [ ] ${a}
70
- `;if(n.length+i.length>e)break;n+=i}}return n}}export{T as GroundTruths,D as ReasoningScaffolds,O as computeStaleness};
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
@@ -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
- import{sanitizeFtsQuery as k}from"./security.js";import{classifyCapture as _}from"./capture.js";function q(p){const{db:r,failures:i,symbols:a,rehydration:m,causality:u,presence:f,federation:j,memory:c,groundTruths:y}=p;return async(d,s)=>{try{switch(d){case"wyrm_search":{const e=String(s.query??s.q??"").slice(0,200);if(!e)return{ok:!1,error:"query required"};const t=k(e);return{ok:!0,result:r.getDatabase().prepare(`
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(t)}}case"wyrm_all_quests":return{ok:!0,result:r.getAllPendingQuests().slice(0,30)};case"wyrm_truth_get":{const e=s.projectPath,t=e?r.getProject(e):null;return{ok:!0,result:t?r.getDatabase().prepare(`
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(t.id):[]}}case"wyrm_failure_check":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;return{ok:!0,result:i.check(e.scope,e.target,e.description,t?.id??null)}}case"wyrm_failure_list":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;return{ok:!0,result:i.list(t?.id??null,Math.min(50,e.limit??20))}}case"wyrm_failure_record":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;return{ok:!0,result:i.record({project_id:t?.id??null,scope:e.scope,target:e.target,description:e.description,why_failed:e.why_failed,severity:e.severity})}}case"wyrm_symbol_search":{const e=s;if(!e.symbol)return{ok:!1,error:"symbol required"};const t=e.projectPath?r.getProject(e.projectPath):null;return{ok:!0,result:a.search(e.symbol,{projectId:t?.id,kind:e.kind,language:e.language,exact:e.exact,limit:Math.min(50,e.limit??20)})}}case"wyrm_symbol_callers":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;return{ok:!0,result:a.callers(e.symbol,t?.id).slice(0,30)}}case"wyrm_symbol_stats":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;return{ok:!0,result:a.stats(t?.id)}}case"wyrm_session_rehydrate":{const e=s,t=m.rehydrate(e.session_id);return{ok:t!=null,result:t,error:t?void 0:"session not found"}}case"wyrm_decision_upstream":{const e=s;return{ok:!0,result:u.upstreamOf(e.kind,e.id)}}case"wyrm_decision_downstream":{const e=s;return{ok:!0,result:u.downstreamOf(e.kind,e.id)}}case"wyrm_decided_because":{const e=s,t=r.getProject(e.projectPath);return t?{ok:!0,result:u.link({project_id:t.id,...e})}:{ok:!1,error:"project not found"}}case"wyrm_presence_list":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;return{ok:!0,result:f.liveAgents(t?.id??null)}}case"wyrm_sync_conflicts":return{ok:!0,result:j.unresolvedConflicts(20)};case"wyrm_quest_add":{const e=s,t=r.getProject(e.projectPath);if(!t)return{ok:!1,error:"project not found"};const o=r.addQuest(t.id,e.title,e.description,e.priority||"medium",e.tags);return{ok:!0,result:{id:o.id,title:o.title}}}case"wyrm_quest_complete":{const e=s;return{ok:!0,result:{id:r.updateQuest(e.questId,"completed").id,status:"completed"}}}case"wyrm_project_context":{const e=s,t=r.getProject(e.projectPath);return t?{ok:!0,result:{project:t.name,quests:r.getAllPendingQuests().filter(n=>n.project_id===t.id).slice(0,10),last_session:r.getDatabase().prepare("SELECT id, date, summary FROM sessions WHERE project_id = ? ORDER BY date DESC LIMIT 1").get(t.id)}}:{ok:!1,error:"project not found"}}case"wyrm_global_context":{const e=s,t=r.getAllProjects(e.maxProjects??20).map(n=>({name:n.name,stack:n.stack??null,stats:r.getProjectStats(n.id)})),o={globalContext:r.getAllGlobalContext(),projects:t};return e.includeQuests&&(o.quests=r.getAllPendingQuests().slice(0,20)),{ok:!0,result:o}}case"wyrm_recall":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;return t?e.query?{ok:!0,result:c.recall(t.id,e.query,{kind:e.kind,limit:Math.min(20,e.limit??10),minConfidence:e.minConfidence}).map(n=>({id:n.artifact.id,kind:n.artifact.kind,problem:n.artifact.problem,validated_fix:n.artifact.validated_fix,relevance:n.relevance_score}))}:{ok:!1,error:"query required"}:{ok:!1,error:"project not found"}}case"wyrm_remember":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;if(!t)return{ok:!1,error:"project not found"};if(!e.problem)return{ok:!1,error:"problem required"};const o=c.add(t.id,{kind:e.kind,problem:e.problem,constraints:e.constraints,validatedFix:e.validatedFix,whyItWorked:e.whyItWorked,outcome:e.outcome,tags:e.tags,confidence:e.confidence,sourceSessionId:e.sourceSessionId});return{ok:!0,result:{id:o.id,kind:o.kind}}}case"wyrm_distill":{const e=s,t=e.projectPath?r.getProject(e.projectPath):null;if(!t)return{ok:!1,error:"project not found"};if(!e.candidates?.length)return{ok:!1,error:"candidates required"};const o=e.candidates.map(n=>c.add(t.id,{kind:n.kind,problem:n.title,validatedFix:n.content,tags:n.tags??[],confidence:n.confidence??.7,needsReview:1}).id);return{ok:!0,result:{queued:o.length,ids:o}}}case"wyrm_capture":{const e=s;if(!e.content)return{ok:!1,error:"content required"};let t=_(e.content);if(e.mode&&e.mode!=="auto"){const l={quest:"quest",truth:"decision",memory:"pattern"};t={type:e.mode,subtype:l[e.mode]??e.mode,confidence:100,reasoning:`mode:${e.mode}`}}const o=e.project_id??null;return t.type==="quest"?o===null?{ok:!1,error:"project_id required for quest"}:{ok:!0,result:{type:"quest",id:r.addQuest(o,e.content.slice(0,200),"","medium",e.tags?.join(",")).id}}:t.type==="truth"?o===null?{ok:!1,error:"project_id required for truth"}:e.mode==="truth"||t.confidence>=100?{ok:!0,result:{type:"truth",id:y.set(o,{category:"decision",key:e.content.slice(0,60),value:e.content}).id}}:{ok:!0,result:{type:"memory_review",id:c.add(o,{kind:"pattern",problem:e.content,tags:e.tags??[],confidence:t.confidence/100,needsReview:1}).id}}:o===null?{ok:!1,error:"project_id required for memory"}:{ok:!0,result:{type:"memory",id:c.add(o,{kind:"pattern",problem:e.content,tags:e.tags??[],confidence:(t.confidence??70)/100,needsReview:1}).id}}}default:return{ok:!1,error:`Internal tool '${d}' not implemented in dispatcher`}}}catch(e){return{ok:!1,error:e.message}}}}export{q as makeInternalDispatch};
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