@4da/mcp-server 3.2.0 → 4.1.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 (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -62
  3. package/dist/auth.d.ts +36 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +82 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/db.d.ts +100 -2
  8. package/dist/db.d.ts.map +1 -1
  9. package/dist/db.js +707 -1
  10. package/dist/db.js.map +1 -1
  11. package/dist/doctor.d.ts +15 -0
  12. package/dist/doctor.d.ts.map +1 -0
  13. package/dist/doctor.js +124 -0
  14. package/dist/doctor.js.map +1 -0
  15. package/dist/http-transport.d.ts +25 -0
  16. package/dist/http-transport.d.ts.map +1 -0
  17. package/dist/http-transport.js +143 -0
  18. package/dist/http-transport.js.map +1 -0
  19. package/dist/index.d.ts +15 -18
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +195 -250
  22. package/dist/index.js.map +1 -1
  23. package/dist/live/cache.d.ts +16 -0
  24. package/dist/live/cache.d.ts.map +1 -0
  25. package/dist/live/cache.js +61 -0
  26. package/dist/live/cache.js.map +1 -0
  27. package/dist/live/hn-fetcher.d.ts +19 -0
  28. package/dist/live/hn-fetcher.d.ts.map +1 -0
  29. package/dist/live/hn-fetcher.js +123 -0
  30. package/dist/live/hn-fetcher.js.map +1 -0
  31. package/dist/live/index.d.ts +55 -0
  32. package/dist/live/index.d.ts.map +1 -0
  33. package/dist/live/index.js +131 -0
  34. package/dist/live/index.js.map +1 -0
  35. package/dist/live/osv-scanner.d.ts +19 -0
  36. package/dist/live/osv-scanner.d.ts.map +1 -0
  37. package/dist/live/osv-scanner.js +197 -0
  38. package/dist/live/osv-scanner.js.map +1 -0
  39. package/dist/live/rate-limiter.d.ts +19 -0
  40. package/dist/live/rate-limiter.d.ts.map +1 -0
  41. package/dist/live/rate-limiter.js +52 -0
  42. package/dist/live/rate-limiter.js.map +1 -0
  43. package/dist/live/types.d.ts +89 -0
  44. package/dist/live/types.d.ts.map +1 -0
  45. package/dist/live/types.js +3 -0
  46. package/dist/live/types.js.map +1 -0
  47. package/dist/live/version-resolver.d.ts +11 -0
  48. package/dist/live/version-resolver.d.ts.map +1 -0
  49. package/dist/live/version-resolver.js +321 -0
  50. package/dist/live/version-resolver.js.map +1 -0
  51. package/dist/live-singleton.d.ts +9 -0
  52. package/dist/live-singleton.d.ts.map +1 -0
  53. package/dist/live-singleton.js +14 -0
  54. package/dist/live-singleton.js.map +1 -0
  55. package/dist/llm.d.ts +20 -2
  56. package/dist/llm.d.ts.map +1 -1
  57. package/dist/llm.js +80 -22
  58. package/dist/llm.js.map +1 -1
  59. package/dist/output-manager.d.ts.map +1 -1
  60. package/dist/output-manager.js +1 -0
  61. package/dist/output-manager.js.map +1 -1
  62. package/dist/project-scanner.d.ts +27 -0
  63. package/dist/project-scanner.d.ts.map +1 -0
  64. package/dist/project-scanner.js +366 -0
  65. package/dist/project-scanner.js.map +1 -0
  66. package/dist/schema-registry.d.ts +31 -13
  67. package/dist/schema-registry.d.ts.map +1 -1
  68. package/dist/schema-registry.js +208 -32
  69. package/dist/schema-registry.js.map +1 -1
  70. package/dist/schemas/agent-feedback-stats.json +14 -0
  71. package/dist/schemas/agent-memory.json +49 -0
  72. package/dist/schemas/agent-session-brief.json +25 -0
  73. package/dist/schemas/attention-report.json +13 -0
  74. package/dist/schemas/autophagy-status.json +13 -0
  75. package/dist/schemas/compound-advantage.json +14 -0
  76. package/dist/schemas/decision-enforcement.json +22 -0
  77. package/dist/schemas/decision-memory.json +54 -0
  78. package/dist/schemas/decision-windows.json +22 -0
  79. package/dist/schemas/delegation-score.json +18 -0
  80. package/dist/schemas/developer-dna.json +219 -0
  81. package/dist/schemas/export-context.json +17 -0
  82. package/dist/schemas/knowledge-gaps.json +14 -0
  83. package/dist/schemas/preemption-feed.json +18 -0
  84. package/dist/schemas/project-health.json +13 -0
  85. package/dist/schemas/record-agent-feedback.json +28 -0
  86. package/dist/schemas/reverse-mentions.json +13 -0
  87. package/dist/schemas/semantic-shifts.json +17 -0
  88. package/dist/schemas/signal-chains.json +19 -0
  89. package/dist/schemas/tech-radar.json +23 -0
  90. package/dist/schemas/trust-summary.json +13 -0
  91. package/dist/schemas/vulnerability-scan.json +26 -0
  92. package/dist/schemas/what-should-i-know.json +19 -0
  93. package/dist/setup.d.ts +18 -0
  94. package/dist/setup.d.ts.map +1 -0
  95. package/dist/setup.js +171 -0
  96. package/dist/setup.js.map +1 -0
  97. package/dist/tool-dispatch.d.ts +33 -0
  98. package/dist/tool-dispatch.d.ts.map +1 -0
  99. package/dist/tool-dispatch.js +87 -0
  100. package/dist/tool-dispatch.js.map +1 -0
  101. package/dist/tools/agent-feedback-stats.d.ts +30 -0
  102. package/dist/tools/agent-feedback-stats.d.ts.map +1 -0
  103. package/dist/tools/agent-feedback-stats.js +41 -0
  104. package/dist/tools/agent-feedback-stats.js.map +1 -0
  105. package/dist/tools/agent-memory.d.ts +94 -0
  106. package/dist/tools/agent-memory.d.ts.map +1 -0
  107. package/dist/tools/agent-memory.js +262 -0
  108. package/dist/tools/agent-memory.js.map +1 -0
  109. package/dist/tools/agent-session-brief.d.ts +44 -0
  110. package/dist/tools/agent-session-brief.d.ts.map +1 -0
  111. package/dist/tools/agent-session-brief.js +179 -0
  112. package/dist/tools/agent-session-brief.js.map +1 -0
  113. package/dist/tools/attention-report.d.ts +6 -5
  114. package/dist/tools/attention-report.d.ts.map +1 -1
  115. package/dist/tools/attention-report.js +1 -0
  116. package/dist/tools/attention-report.js.map +1 -1
  117. package/dist/tools/autophagy-status.d.ts +25 -0
  118. package/dist/tools/autophagy-status.d.ts.map +1 -0
  119. package/dist/tools/autophagy-status.js +56 -0
  120. package/dist/tools/autophagy-status.js.map +1 -0
  121. package/dist/tools/compound-advantage.d.ts +30 -0
  122. package/dist/tools/compound-advantage.d.ts.map +1 -0
  123. package/dist/tools/compound-advantage.js +133 -0
  124. package/dist/tools/compound-advantage.js.map +1 -0
  125. package/dist/tools/config-validator.d.ts.map +1 -1
  126. package/dist/tools/config-validator.js +31 -0
  127. package/dist/tools/config-validator.js.map +1 -1
  128. package/dist/tools/context-analysis.d.ts.map +1 -1
  129. package/dist/tools/context-analysis.js +1 -0
  130. package/dist/tools/context-analysis.js.map +1 -1
  131. package/dist/tools/daily-briefing.d.ts.map +1 -1
  132. package/dist/tools/daily-briefing.js +17 -1
  133. package/dist/tools/daily-briefing.js.map +1 -1
  134. package/dist/tools/decision-enforcement.d.ts +59 -0
  135. package/dist/tools/decision-enforcement.d.ts.map +1 -0
  136. package/dist/tools/decision-enforcement.js +185 -0
  137. package/dist/tools/decision-enforcement.js.map +1 -0
  138. package/dist/tools/decision-memory.d.ts +132 -0
  139. package/dist/tools/decision-memory.d.ts.map +1 -0
  140. package/dist/tools/decision-memory.js +345 -0
  141. package/dist/tools/decision-memory.js.map +1 -0
  142. package/dist/tools/decision-windows.d.ts +37 -0
  143. package/dist/tools/decision-windows.d.ts.map +1 -0
  144. package/dist/tools/decision-windows.js +67 -0
  145. package/dist/tools/decision-windows.js.map +1 -0
  146. package/dist/tools/delegation-score.d.ts +34 -0
  147. package/dist/tools/delegation-score.d.ts.map +1 -0
  148. package/dist/tools/delegation-score.js +251 -0
  149. package/dist/tools/delegation-score.js.map +1 -0
  150. package/dist/tools/developer-dna.d.ts +79 -0
  151. package/dist/tools/developer-dna.d.ts.map +1 -0
  152. package/dist/tools/developer-dna.js +378 -0
  153. package/dist/tools/developer-dna.js.map +1 -0
  154. package/dist/tools/explain-relevance.d.ts.map +1 -1
  155. package/dist/tools/explain-relevance.js +1 -0
  156. package/dist/tools/explain-relevance.js.map +1 -1
  157. package/dist/tools/export-context.d.ts +23 -6
  158. package/dist/tools/export-context.d.ts.map +1 -1
  159. package/dist/tools/export-context.js +58 -14
  160. package/dist/tools/export-context.js.map +1 -1
  161. package/dist/tools/get-actionable-signals.d.ts.map +1 -1
  162. package/dist/tools/get-actionable-signals.js +60 -9
  163. package/dist/tools/get-actionable-signals.js.map +1 -1
  164. package/dist/tools/get-context.d.ts.map +1 -1
  165. package/dist/tools/get-context.js +1 -0
  166. package/dist/tools/get-context.js.map +1 -1
  167. package/dist/tools/get-relevant-content.d.ts.map +1 -1
  168. package/dist/tools/get-relevant-content.js +3 -0
  169. package/dist/tools/get-relevant-content.js.map +1 -1
  170. package/dist/tools/index.d.ts +26 -16
  171. package/dist/tools/index.d.ts.map +1 -1
  172. package/dist/tools/index.js +35 -16
  173. package/dist/tools/index.js.map +1 -1
  174. package/dist/tools/knowledge-gaps.d.ts +11 -1
  175. package/dist/tools/knowledge-gaps.d.ts.map +1 -1
  176. package/dist/tools/knowledge-gaps.js +9 -3
  177. package/dist/tools/knowledge-gaps.js.map +1 -1
  178. package/dist/tools/llm-status.d.ts.map +1 -1
  179. package/dist/tools/llm-status.js +1 -0
  180. package/dist/tools/llm-status.js.map +1 -1
  181. package/dist/tools/muse-context.d.ts +195 -0
  182. package/dist/tools/muse-context.d.ts.map +1 -0
  183. package/dist/tools/muse-context.js +284 -0
  184. package/dist/tools/muse-context.js.map +1 -0
  185. package/dist/tools/preemption-feed.d.ts +55 -0
  186. package/dist/tools/preemption-feed.d.ts.map +1 -0
  187. package/dist/tools/preemption-feed.js +124 -0
  188. package/dist/tools/preemption-feed.js.map +1 -0
  189. package/dist/tools/project-health.d.ts +12 -6
  190. package/dist/tools/project-health.d.ts.map +1 -1
  191. package/dist/tools/project-health.js +49 -10
  192. package/dist/tools/project-health.js.map +1 -1
  193. package/dist/tools/record-agent-feedback.d.ts +46 -0
  194. package/dist/tools/record-agent-feedback.d.ts.map +1 -0
  195. package/dist/tools/record-agent-feedback.js +71 -0
  196. package/dist/tools/record-agent-feedback.js.map +1 -0
  197. package/dist/tools/record-feedback.d.ts.map +1 -1
  198. package/dist/tools/record-feedback.js +1 -0
  199. package/dist/tools/record-feedback.js.map +1 -1
  200. package/dist/tools/reverse-mentions.d.ts +8 -8
  201. package/dist/tools/reverse-mentions.d.ts.map +1 -1
  202. package/dist/tools/reverse-mentions.js +1 -0
  203. package/dist/tools/reverse-mentions.js.map +1 -1
  204. package/dist/tools/score-autopsy.d.ts.map +1 -1
  205. package/dist/tools/score-autopsy.js +1 -0
  206. package/dist/tools/score-autopsy.js.map +1 -1
  207. package/dist/tools/semantic-shifts.d.ts +17 -1
  208. package/dist/tools/semantic-shifts.d.ts.map +1 -1
  209. package/dist/tools/semantic-shifts.js +1 -0
  210. package/dist/tools/semantic-shifts.js.map +1 -1
  211. package/dist/tools/signal-chains.d.ts +14 -7
  212. package/dist/tools/signal-chains.d.ts.map +1 -1
  213. package/dist/tools/signal-chains.js +5 -2
  214. package/dist/tools/signal-chains.js.map +1 -1
  215. package/dist/tools/source-health.d.ts.map +1 -1
  216. package/dist/tools/source-health.js +1 -0
  217. package/dist/tools/source-health.js.map +1 -1
  218. package/dist/tools/tech-radar.d.ts +38 -0
  219. package/dist/tools/tech-radar.d.ts.map +1 -0
  220. package/dist/tools/tech-radar.js +249 -0
  221. package/dist/tools/tech-radar.js.map +1 -0
  222. package/dist/tools/topic-connections.d.ts.map +1 -1
  223. package/dist/tools/topic-connections.js +1 -0
  224. package/dist/tools/topic-connections.js.map +1 -1
  225. package/dist/tools/trend-analysis.d.ts.map +1 -1
  226. package/dist/tools/trend-analysis.js +1 -0
  227. package/dist/tools/trend-analysis.js.map +1 -1
  228. package/dist/tools/trust-summary.d.ts +38 -0
  229. package/dist/tools/trust-summary.d.ts.map +1 -0
  230. package/dist/tools/trust-summary.js +89 -0
  231. package/dist/tools/trust-summary.js.map +1 -0
  232. package/dist/tools/vulnerability-scan.d.ts +89 -0
  233. package/dist/tools/vulnerability-scan.d.ts.map +1 -0
  234. package/dist/tools/vulnerability-scan.js +127 -0
  235. package/dist/tools/vulnerability-scan.js.map +1 -0
  236. package/dist/tools/what-should-i-know.d.ts +79 -0
  237. package/dist/tools/what-should-i-know.d.ts.map +1 -0
  238. package/dist/tools/what-should-i-know.js +376 -0
  239. package/dist/tools/what-should-i-know.js.map +1 -0
  240. package/dist/types.d.ts +221 -0
  241. package/dist/types.d.ts.map +1 -1
  242. package/dist/types.js +1 -0
  243. package/dist/types.js.map +1 -1
  244. package/package.json +53 -24
@@ -0,0 +1,345 @@
1
+ // SPDX-License-Identifier: FSL-1.1-Apache-2.0
2
+ /**
3
+ * decision_memory tool
4
+ *
5
+ * Manage developer decisions - record, list, check alignment, update, and supersede.
6
+ * Decisions persist and inform signal classification, tech radar, and agent context.
7
+ */
8
+ import { execFile } from "node:child_process";
9
+ import { existsSync } from "node:fs";
10
+ import { homedir, platform } from "node:os";
11
+ import { join } from "node:path";
12
+ // ============================================================================
13
+ // Tool Definition
14
+ // ============================================================================
15
+ export const decisionMemoryTool = {
16
+ name: "decision_memory",
17
+ description: "Manage developer decisions. Actions: record (create new decision), list (query decisions), check_alignment (check if tech/pattern conflicts with decisions), update (modify a decision), supersede (replace old decision with new one).",
18
+ inputSchema: {
19
+ type: "object",
20
+ properties: {
21
+ action: {
22
+ type: "string",
23
+ enum: ["record", "list", "check_alignment", "update", "supersede"],
24
+ description: "Action to perform",
25
+ },
26
+ decision_type: {
27
+ type: "string",
28
+ enum: [
29
+ "tech_choice",
30
+ "architecture",
31
+ "workflow",
32
+ "pattern",
33
+ "dependency",
34
+ ],
35
+ description: "Type of decision (for record)",
36
+ },
37
+ subject: {
38
+ type: "string",
39
+ description: "Subject of the decision (for record, check_alignment)",
40
+ },
41
+ decision: {
42
+ type: "string",
43
+ description: "The decision text (for record)",
44
+ },
45
+ rationale: {
46
+ type: "string",
47
+ description: "Why this decision was made (for record)",
48
+ },
49
+ alternatives_rejected: {
50
+ type: "array",
51
+ items: { type: "string" },
52
+ description: "Alternatives that were considered and rejected (for record)",
53
+ },
54
+ context_tags: {
55
+ type: "array",
56
+ items: { type: "string" },
57
+ description: "Tags for categorization (for record)",
58
+ },
59
+ confidence: {
60
+ type: "number",
61
+ description: "Confidence level 0-1 (for record)",
62
+ },
63
+ filter_type: {
64
+ type: "string",
65
+ description: "Filter by decision type (for list)",
66
+ },
67
+ filter_status: {
68
+ type: "string",
69
+ description: "Filter by status: active, superseded, reconsidering (for list)",
70
+ },
71
+ limit: {
72
+ type: "number",
73
+ description: "Max results to return (for list)",
74
+ },
75
+ technology: {
76
+ type: "string",
77
+ description: "Technology to check alignment for",
78
+ },
79
+ pattern: {
80
+ type: "string",
81
+ description: "Pattern to check alignment for",
82
+ },
83
+ id: {
84
+ type: "number",
85
+ description: "Decision ID (for update)",
86
+ },
87
+ new_decision: {
88
+ type: "string",
89
+ description: "Updated decision text (for update)",
90
+ },
91
+ new_rationale: {
92
+ type: "string",
93
+ description: "Updated rationale (for update)",
94
+ },
95
+ new_status: {
96
+ type: "string",
97
+ enum: ["active", "superseded", "reconsidering"],
98
+ description: "Updated status (for update)",
99
+ },
100
+ new_confidence: {
101
+ type: "number",
102
+ description: "Updated confidence (for update)",
103
+ },
104
+ old_id: {
105
+ type: "number",
106
+ description: "ID of decision to supersede (for supersede)",
107
+ },
108
+ new_id: {
109
+ type: "number",
110
+ description: "ID of new decision that replaces old (for supersede)",
111
+ },
112
+ },
113
+ required: ["action"],
114
+ },
115
+ };
116
+ // ============================================================================
117
+ // Helpers
118
+ // ============================================================================
119
+ function parseDecisionRow(row) {
120
+ return {
121
+ ...row,
122
+ alternatives_rejected: JSON.parse(row.alternatives_rejected || "[]"),
123
+ context_tags: JSON.parse(row.context_tags || "[]"),
124
+ };
125
+ }
126
+ // ============================================================================
127
+ // Execute
128
+ // ============================================================================
129
+ export function executeDecisionMemory(db, params) {
130
+ const rawDb = db.getRawDb();
131
+ switch (params.action) {
132
+ case "record": {
133
+ if (!params.subject || !params.decision) {
134
+ return {
135
+ error: "subject and decision are required for record action",
136
+ };
137
+ }
138
+ const stmt = rawDb.prepare(`INSERT INTO developer_decisions
139
+ (decision_type, subject, decision, rationale,
140
+ alternatives_rejected, context_tags, confidence, status)
141
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'active')`);
142
+ const result = stmt.run(params.decision_type || "tech_choice", params.subject, params.decision, params.rationale || null, JSON.stringify(params.alternatives_rejected || []), JSON.stringify(params.context_tags || []), params.confidence ?? 0.8);
143
+ // Bridge to AWE Wisdom Graph: forward decision for wisdom tracking.
144
+ // Non-blocking — AWE sync is best-effort, doesn't affect 4DA recording.
145
+ try {
146
+ const aweBin = findAweBinary();
147
+ if (aweBin) {
148
+ // Sanitize inputs before passing to external process
149
+ const safeSubject = (params.subject || "").slice(0, 500).replace(/\0/g, '');
150
+ const safeDecision = (params.decision || "").slice(0, 2000).replace(/\0/g, '');
151
+ const query = `${safeSubject}: ${safeDecision}`;
152
+ const domain = mapDecisionTypeToDomain(params.decision_type || "tech_choice");
153
+ // AWE bridge: persist decisions to Wisdom Graph for compounding
154
+ // Context file auto-assembled by AWE MCP server's buildContextFile()
155
+ const contextFile = process.platform === "win32"
156
+ ? `${process.env.APPDATA || ""}\\awe\\identity.json`
157
+ : `${process.env.HOME || ""}/.local/share/awe/identity.json`;
158
+ const contextArgs = existsSync(contextFile) ? ["--context_file", contextFile] : [];
159
+ const child = execFile(aweBin, [
160
+ "transmute", query,
161
+ "--domain", domain,
162
+ "--json",
163
+ ...contextArgs,
164
+ ], { timeout: 30_000 }, () => {
165
+ // Callback required — ignore result (fire-and-forget)
166
+ });
167
+ child.unref();
168
+ }
169
+ }
170
+ catch {
171
+ // AWE bridge is optional
172
+ }
173
+ return {
174
+ success: true,
175
+ id: result.lastInsertRowid,
176
+ message: `Decision recorded: ${params.subject}`,
177
+ };
178
+ }
179
+ case "list": {
180
+ let sql = `SELECT id, decision_type, subject, decision, rationale,
181
+ alternatives_rejected, context_tags, confidence,
182
+ status, superseded_by, created_at, updated_at
183
+ FROM developer_decisions WHERE 1=1`;
184
+ const sqlParams = [];
185
+ if (params.filter_type) {
186
+ sql += ` AND decision_type = ?`;
187
+ sqlParams.push(params.filter_type);
188
+ }
189
+ if (params.filter_status) {
190
+ sql += ` AND status = ?`;
191
+ sqlParams.push(params.filter_status);
192
+ }
193
+ sql += ` ORDER BY updated_at DESC LIMIT ?`;
194
+ sqlParams.push(params.limit || 20);
195
+ const rows = rawDb
196
+ .prepare(sql)
197
+ .all(...sqlParams);
198
+ return {
199
+ decisions: rows.map(parseDecisionRow),
200
+ count: rows.length,
201
+ };
202
+ }
203
+ case "check_alignment": {
204
+ if (!params.technology) {
205
+ return {
206
+ error: "technology is required for check_alignment action",
207
+ };
208
+ }
209
+ const search = `%${params.technology.toLowerCase()}%`;
210
+ const rows = rawDb
211
+ .prepare(`SELECT id, decision_type, subject, decision, rationale,
212
+ alternatives_rejected, context_tags, confidence,
213
+ status, created_at
214
+ FROM developer_decisions
215
+ WHERE status = 'active'
216
+ AND (LOWER(subject) LIKE ?
217
+ OR LOWER(context_tags) LIKE ?
218
+ OR LOWER(alternatives_rejected) LIKE ?)`)
219
+ .all(search, search, search);
220
+ const conflicts = [];
221
+ const relevant = [];
222
+ for (const row of rows) {
223
+ const alts = JSON.parse(row.alternatives_rejected || "[]");
224
+ const isRejected = alts.some((alt) => alt.toLowerCase().includes(params.technology.toLowerCase()));
225
+ if (isRejected) {
226
+ conflicts.push({
227
+ decision_id: row.id,
228
+ subject: row.subject,
229
+ reason: `'${params.technology}' was rejected in favor of '${row.decision}' (rationale: ${row.rationale || "none"})`,
230
+ });
231
+ }
232
+ relevant.push(parseDecisionRow(row));
233
+ }
234
+ return {
235
+ aligned: conflicts.length === 0,
236
+ relevant_decisions: relevant,
237
+ conflicts,
238
+ confidence: relevant.length > 0
239
+ ? Math.max(...relevant.map((r) => r.confidence))
240
+ : 0.5,
241
+ };
242
+ }
243
+ case "update": {
244
+ if (!params.id) {
245
+ return { error: "id is required for update action" };
246
+ }
247
+ const sets = [];
248
+ const values = [];
249
+ if (params.new_decision) {
250
+ sets.push("decision = ?");
251
+ values.push(params.new_decision);
252
+ }
253
+ if (params.new_rationale) {
254
+ sets.push("rationale = ?");
255
+ values.push(params.new_rationale);
256
+ }
257
+ if (params.new_status) {
258
+ sets.push("status = ?");
259
+ values.push(params.new_status);
260
+ }
261
+ if (params.new_confidence !== undefined) {
262
+ sets.push("confidence = ?");
263
+ values.push(params.new_confidence);
264
+ }
265
+ if (sets.length === 0) {
266
+ return { error: "No fields to update" };
267
+ }
268
+ sets.push("updated_at = datetime('now')");
269
+ values.push(params.id);
270
+ rawDb
271
+ .prepare(`UPDATE developer_decisions SET ${sets.join(", ")} WHERE id = ?`)
272
+ .run(...values);
273
+ return {
274
+ success: true,
275
+ message: `Decision ${params.id} updated`,
276
+ };
277
+ }
278
+ case "supersede": {
279
+ if (!params.old_id || !params.new_id) {
280
+ return {
281
+ error: "old_id and new_id are required for supersede action",
282
+ };
283
+ }
284
+ rawDb
285
+ .prepare(`UPDATE developer_decisions
286
+ SET status = 'superseded',
287
+ superseded_by = ?,
288
+ updated_at = datetime('now')
289
+ WHERE id = ?`)
290
+ .run(params.new_id, params.old_id);
291
+ return {
292
+ success: true,
293
+ message: `Decision ${params.old_id} superseded by ${params.new_id}`,
294
+ };
295
+ }
296
+ default:
297
+ return { error: `Unknown action: ${params.action}` };
298
+ }
299
+ }
300
+ // ============================================================================
301
+ // AWE Bridge Helpers
302
+ // ============================================================================
303
+ /** Map 4DA decision types to AWE domains. */
304
+ function mapDecisionTypeToDomain(type) {
305
+ switch (type) {
306
+ case "architecture":
307
+ case "pattern":
308
+ return "software-engineering";
309
+ case "dependency":
310
+ return "software-engineering";
311
+ case "workflow":
312
+ return "workflow";
313
+ default:
314
+ return "software-engineering";
315
+ }
316
+ }
317
+ /** Find AWE binary — checks env var, platform defaults, then PATH fallback. */
318
+ export function findAweBinary() {
319
+ // 1. Explicit env var takes priority
320
+ const envPath = process.env.FOURDA_AWE_PATH || process.env.AWE_BIN;
321
+ if (envPath && existsSync(envPath))
322
+ return envPath;
323
+ // 2. Platform-specific default install locations
324
+ const home = homedir();
325
+ const os = platform();
326
+ const candidates = [];
327
+ if (os === "win32") {
328
+ const appData = process.env.APPDATA || join(home, "AppData", "Roaming");
329
+ candidates.push(join(appData, "awe", "awe.exe"));
330
+ }
331
+ else if (os === "darwin") {
332
+ candidates.push(join(home, "Library", "Application Support", "awe", "awe"));
333
+ }
334
+ else {
335
+ // Linux and other Unix
336
+ candidates.push(join(home, ".local", "share", "awe", "awe"));
337
+ }
338
+ for (const p of candidates) {
339
+ if (existsSync(p))
340
+ return p;
341
+ }
342
+ // 3. Fall back to bare command name (relies on PATH)
343
+ return "awe";
344
+ }
345
+ //# sourceMappingURL=decision-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-memory.js","sourceRoot":"","sources":["../../src/tools/decision-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * decision_windows tool
3
+ *
4
+ * View and manage decision windows — time-bounded opportunities
5
+ * detected from content intelligence requiring attention.
6
+ */
7
+ import type { FourDADatabase } from "../db.js";
8
+ export interface DecisionWindowsParams {
9
+ action?: string;
10
+ window_id?: number;
11
+ outcome?: string;
12
+ }
13
+ export declare const decisionWindowsTool: {
14
+ name: string;
15
+ description: string;
16
+ inputSchema: {
17
+ type: "object";
18
+ properties: {
19
+ action: {
20
+ type: string;
21
+ enum: string[];
22
+ description: string;
23
+ default: string;
24
+ };
25
+ window_id: {
26
+ type: string;
27
+ description: string;
28
+ };
29
+ outcome: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ };
34
+ };
35
+ };
36
+ export declare function executeDecisionWindows(db: FourDADatabase, params: DecisionWindowsParams): object;
37
+ //# sourceMappingURL=decision-windows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-windows.d.ts","sourceRoot":"","sources":["../../src/tools/decision-windows.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;CAuB/B,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,qBAAqB,GAAG,MAAM,CA8ChG"}
@@ -0,0 +1,67 @@
1
+ export const decisionWindowsTool = {
2
+ name: "decision_windows",
3
+ description: "View and manage decision windows — time-bounded opportunities detected from content intelligence. List open windows, mark as acted on, or close.",
4
+ inputSchema: {
5
+ type: "object",
6
+ properties: {
7
+ action: {
8
+ type: "string",
9
+ enum: ["list", "act", "close"],
10
+ description: "Action to perform. Default: list",
11
+ default: "list",
12
+ },
13
+ window_id: {
14
+ type: "number",
15
+ description: "Window ID (required for 'act' or 'close' actions)",
16
+ },
17
+ outcome: {
18
+ type: "string",
19
+ description: "Outcome description when acting on a window",
20
+ },
21
+ },
22
+ },
23
+ };
24
+ export function executeDecisionWindows(db, params) {
25
+ const rawDb = db.getRawDb();
26
+ const action = params.action ?? "list";
27
+ if (action === "act") {
28
+ if (!params.window_id)
29
+ return { error: "window_id is required for 'act' action" };
30
+ try {
31
+ rawDb.prepare(`UPDATE decision_windows SET status = 'acted', acted_at = datetime('now'), outcome = ? WHERE id = ?`).run(params.outcome ?? null, params.window_id);
32
+ }
33
+ catch (err) {
34
+ return { error: `Failed to act on window: ${err instanceof Error ? err.message : String(err)}` };
35
+ }
36
+ }
37
+ else if (action === "close") {
38
+ if (!params.window_id)
39
+ return { error: "window_id is required for 'close' action" };
40
+ try {
41
+ rawDb.prepare(`UPDATE decision_windows SET status = 'closed', closed_at = datetime('now') WHERE id = ?`).run(params.window_id);
42
+ }
43
+ catch (err) {
44
+ return { error: `Failed to close window: ${err instanceof Error ? err.message : String(err)}` };
45
+ }
46
+ }
47
+ // Always return open windows after any action
48
+ let openWindows = [];
49
+ try {
50
+ openWindows = rawDb.prepare(`SELECT id, title, description, urgency, source_item_id, status,
51
+ opens_at, closes_at, acted_at, closed_at, outcome, created_at
52
+ FROM decision_windows WHERE status = 'open'
53
+ ORDER BY urgency DESC, created_at DESC`).all();
54
+ }
55
+ catch { /* Table may not exist yet */ }
56
+ const actionMsg = action === "act" ? `Window ${params.window_id} marked as acted`
57
+ : action === "close" ? `Window ${params.window_id} closed` : null;
58
+ return {
59
+ ...(actionMsg ? { action_result: actionMsg } : {}),
60
+ open_windows: openWindows,
61
+ count: openWindows.length,
62
+ summary: openWindows.length === 0
63
+ ? "No open decision windows. The system will surface time-sensitive opportunities as they are detected."
64
+ : `${openWindows.length} open decision window${openWindows.length !== 1 ? "s" : ""} requiring attention`,
65
+ };
66
+ }
67
+ //# sourceMappingURL=decision-windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-windows.js","sourceRoot":"","sources":["../../src/tools/decision-windows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * delegation_score tool
3
+ *
4
+ * AI-delegatability assessment. AI agents use this to self-assess:
5
+ * "Should I proceed autonomously or ask the human?"
6
+ *
7
+ * Computes a composite score from pattern stability, security sensitivity,
8
+ * decision density, and AI track record to produce a delegation recommendation.
9
+ */
10
+ import type { FourDADatabase } from "../db.js";
11
+ export interface DelegationScoreParams {
12
+ subject: string;
13
+ task_description?: string;
14
+ }
15
+ export declare const delegationScoreTool: {
16
+ name: string;
17
+ description: string;
18
+ inputSchema: {
19
+ type: "object";
20
+ properties: {
21
+ subject: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ task_description: {
26
+ type: string;
27
+ description: string;
28
+ };
29
+ };
30
+ required: string[];
31
+ };
32
+ };
33
+ export declare function executeDelegationScore(db: FourDADatabase, params: DelegationScoreParams): object;
34
+ //# sourceMappingURL=delegation-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation-score.d.ts","sourceRoot":"","sources":["../../src/tools/delegation-score.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM/C,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAkCD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAoB/B,CAAC;AAiLF,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAgFR"}