decibel-tools-mcp 1.0.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 (255) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +335 -0
  3. package/dist/agentic/compiler.d.ts +21 -0
  4. package/dist/agentic/compiler.d.ts.map +1 -0
  5. package/dist/agentic/compiler.js +267 -0
  6. package/dist/agentic/compiler.js.map +1 -0
  7. package/dist/agentic/golden.d.ts +25 -0
  8. package/dist/agentic/golden.d.ts.map +1 -0
  9. package/dist/agentic/golden.js +255 -0
  10. package/dist/agentic/golden.js.map +1 -0
  11. package/dist/agentic/index.d.ts +17 -0
  12. package/dist/agentic/index.d.ts.map +1 -0
  13. package/dist/agentic/index.js +153 -0
  14. package/dist/agentic/index.js.map +1 -0
  15. package/dist/agentic/linter.d.ts +20 -0
  16. package/dist/agentic/linter.d.ts.map +1 -0
  17. package/dist/agentic/linter.js +340 -0
  18. package/dist/agentic/linter.js.map +1 -0
  19. package/dist/agentic/renderer.d.ts +17 -0
  20. package/dist/agentic/renderer.d.ts.map +1 -0
  21. package/dist/agentic/renderer.js +277 -0
  22. package/dist/agentic/renderer.js.map +1 -0
  23. package/dist/agentic/types.d.ts +199 -0
  24. package/dist/agentic/types.d.ts.map +1 -0
  25. package/dist/agentic/types.js +8 -0
  26. package/dist/agentic/types.js.map +1 -0
  27. package/dist/architectAdrs.d.ts +19 -0
  28. package/dist/architectAdrs.d.ts.map +1 -0
  29. package/dist/architectAdrs.js +123 -0
  30. package/dist/architectAdrs.js.map +1 -0
  31. package/dist/config.d.ts +8 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +19 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/dataRoot.d.ts +45 -0
  36. package/dist/dataRoot.d.ts.map +1 -0
  37. package/dist/dataRoot.js +201 -0
  38. package/dist/dataRoot.js.map +1 -0
  39. package/dist/decibelPaths.d.ts +42 -0
  40. package/dist/decibelPaths.d.ts.map +1 -0
  41. package/dist/decibelPaths.js +150 -0
  42. package/dist/decibelPaths.js.map +1 -0
  43. package/dist/httpServer.d.ts +49 -0
  44. package/dist/httpServer.d.ts.map +1 -0
  45. package/dist/httpServer.js +1472 -0
  46. package/dist/httpServer.js.map +1 -0
  47. package/dist/lib/benchmark.d.ts +110 -0
  48. package/dist/lib/benchmark.d.ts.map +1 -0
  49. package/dist/lib/benchmark.js +338 -0
  50. package/dist/lib/benchmark.js.map +1 -0
  51. package/dist/lib/supabase.d.ts +123 -0
  52. package/dist/lib/supabase.d.ts.map +1 -0
  53. package/dist/lib/supabase.js +91 -0
  54. package/dist/lib/supabase.js.map +1 -0
  55. package/dist/projectPaths.d.ts +27 -0
  56. package/dist/projectPaths.d.ts.map +1 -0
  57. package/dist/projectPaths.js +86 -0
  58. package/dist/projectPaths.js.map +1 -0
  59. package/dist/projectRegistry.d.ts +97 -0
  60. package/dist/projectRegistry.d.ts.map +1 -0
  61. package/dist/projectRegistry.js +362 -0
  62. package/dist/projectRegistry.js.map +1 -0
  63. package/dist/sentinelIssues.d.ts +44 -0
  64. package/dist/sentinelIssues.d.ts.map +1 -0
  65. package/dist/sentinelIssues.js +213 -0
  66. package/dist/sentinelIssues.js.map +1 -0
  67. package/dist/server.d.ts +3 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +93 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/test.d.ts +7 -0
  72. package/dist/test.d.ts.map +1 -0
  73. package/dist/test.js +77 -0
  74. package/dist/test.js.map +1 -0
  75. package/dist/tools/agentic/index.d.ts +7 -0
  76. package/dist/tools/agentic/index.d.ts.map +1 -0
  77. package/dist/tools/agentic/index.js +180 -0
  78. package/dist/tools/agentic/index.js.map +1 -0
  79. package/dist/tools/architect/index.d.ts +9 -0
  80. package/dist/tools/architect/index.d.ts.map +1 -0
  81. package/dist/tools/architect/index.js +383 -0
  82. package/dist/tools/architect/index.js.map +1 -0
  83. package/dist/tools/architect.d.ts +19 -0
  84. package/dist/tools/architect.d.ts.map +1 -0
  85. package/dist/tools/architect.js +88 -0
  86. package/dist/tools/architect.js.map +1 -0
  87. package/dist/tools/bench.d.ts +89 -0
  88. package/dist/tools/bench.d.ts.map +1 -0
  89. package/dist/tools/bench.js +826 -0
  90. package/dist/tools/bench.js.map +1 -0
  91. package/dist/tools/context/index.d.ts +11 -0
  92. package/dist/tools/context/index.d.ts.map +1 -0
  93. package/dist/tools/context/index.js +439 -0
  94. package/dist/tools/context/index.js.map +1 -0
  95. package/dist/tools/context.d.ts +146 -0
  96. package/dist/tools/context.d.ts.map +1 -0
  97. package/dist/tools/context.js +481 -0
  98. package/dist/tools/context.js.map +1 -0
  99. package/dist/tools/crit.d.ts +63 -0
  100. package/dist/tools/crit.d.ts.map +1 -0
  101. package/dist/tools/crit.js +159 -0
  102. package/dist/tools/crit.js.map +1 -0
  103. package/dist/tools/data-inspector.d.ts +188 -0
  104. package/dist/tools/data-inspector.d.ts.map +1 -0
  105. package/dist/tools/data-inspector.js +650 -0
  106. package/dist/tools/data-inspector.js.map +1 -0
  107. package/dist/tools/deck.d.ts +11 -0
  108. package/dist/tools/deck.d.ts.map +1 -0
  109. package/dist/tools/deck.js +170 -0
  110. package/dist/tools/deck.js.map +1 -0
  111. package/dist/tools/designer/index.d.ts +6 -0
  112. package/dist/tools/designer/index.d.ts.map +1 -0
  113. package/dist/tools/designer/index.js +177 -0
  114. package/dist/tools/designer/index.js.map +1 -0
  115. package/dist/tools/designer.d.ts +20 -0
  116. package/dist/tools/designer.d.ts.map +1 -0
  117. package/dist/tools/designer.js +75 -0
  118. package/dist/tools/designer.js.map +1 -0
  119. package/dist/tools/dojo/index.d.ts +13 -0
  120. package/dist/tools/dojo/index.d.ts.map +1 -0
  121. package/dist/tools/dojo/index.js +547 -0
  122. package/dist/tools/dojo/index.js.map +1 -0
  123. package/dist/tools/dojo.d.ts +254 -0
  124. package/dist/tools/dojo.d.ts.map +1 -0
  125. package/dist/tools/dojo.js +933 -0
  126. package/dist/tools/dojo.js.map +1 -0
  127. package/dist/tools/dojoBench.d.ts +49 -0
  128. package/dist/tools/dojoBench.d.ts.map +1 -0
  129. package/dist/tools/dojoBench.js +205 -0
  130. package/dist/tools/dojoBench.js.map +1 -0
  131. package/dist/tools/dojoGraduated.d.ts +50 -0
  132. package/dist/tools/dojoGraduated.d.ts.map +1 -0
  133. package/dist/tools/dojoGraduated.js +174 -0
  134. package/dist/tools/dojoGraduated.js.map +1 -0
  135. package/dist/tools/dojoPolicy.d.ts +65 -0
  136. package/dist/tools/dojoPolicy.d.ts.map +1 -0
  137. package/dist/tools/dojoPolicy.js +263 -0
  138. package/dist/tools/dojoPolicy.js.map +1 -0
  139. package/dist/tools/friction/index.d.ts +7 -0
  140. package/dist/tools/friction/index.d.ts.map +1 -0
  141. package/dist/tools/friction/index.js +239 -0
  142. package/dist/tools/friction/index.js.map +1 -0
  143. package/dist/tools/friction.d.ts +82 -0
  144. package/dist/tools/friction.d.ts.map +1 -0
  145. package/dist/tools/friction.js +331 -0
  146. package/dist/tools/friction.js.map +1 -0
  147. package/dist/tools/index.d.ts +5 -0
  148. package/dist/tools/index.d.ts.map +1 -0
  149. package/dist/tools/index.js +52 -0
  150. package/dist/tools/index.js.map +1 -0
  151. package/dist/tools/learnings/index.d.ts +5 -0
  152. package/dist/tools/learnings/index.d.ts.map +1 -0
  153. package/dist/tools/learnings/index.js +123 -0
  154. package/dist/tools/learnings/index.js.map +1 -0
  155. package/dist/tools/learnings.d.ts +41 -0
  156. package/dist/tools/learnings.d.ts.map +1 -0
  157. package/dist/tools/learnings.js +149 -0
  158. package/dist/tools/learnings.js.map +1 -0
  159. package/dist/tools/oracle/index.d.ts +5 -0
  160. package/dist/tools/oracle/index.d.ts.map +1 -0
  161. package/dist/tools/oracle/index.js +97 -0
  162. package/dist/tools/oracle/index.js.map +1 -0
  163. package/dist/tools/oracle.d.ts +90 -0
  164. package/dist/tools/oracle.d.ts.map +1 -0
  165. package/dist/tools/oracle.js +529 -0
  166. package/dist/tools/oracle.js.map +1 -0
  167. package/dist/tools/policy.d.ts +119 -0
  168. package/dist/tools/policy.d.ts.map +1 -0
  169. package/dist/tools/policy.js +406 -0
  170. package/dist/tools/policy.js.map +1 -0
  171. package/dist/tools/provenance/index.d.ts +4 -0
  172. package/dist/tools/provenance/index.d.ts.map +1 -0
  173. package/dist/tools/provenance/index.js +58 -0
  174. package/dist/tools/provenance/index.js.map +1 -0
  175. package/dist/tools/provenance.d.ts +75 -0
  176. package/dist/tools/provenance.d.ts.map +1 -0
  177. package/dist/tools/provenance.js +197 -0
  178. package/dist/tools/provenance.js.map +1 -0
  179. package/dist/tools/rateLimiter.d.ts +45 -0
  180. package/dist/tools/rateLimiter.d.ts.map +1 -0
  181. package/dist/tools/rateLimiter.js +91 -0
  182. package/dist/tools/rateLimiter.js.map +1 -0
  183. package/dist/tools/registry/index.d.ts +10 -0
  184. package/dist/tools/registry/index.d.ts.map +1 -0
  185. package/dist/tools/registry/index.js +467 -0
  186. package/dist/tools/registry/index.js.map +1 -0
  187. package/dist/tools/registry.d.ts +3 -0
  188. package/dist/tools/registry.d.ts.map +1 -0
  189. package/dist/tools/registry.js +189 -0
  190. package/dist/tools/registry.js.map +1 -0
  191. package/dist/tools/roadmap/index.d.ts +9 -0
  192. package/dist/tools/roadmap/index.d.ts.map +1 -0
  193. package/dist/tools/roadmap/index.js +250 -0
  194. package/dist/tools/roadmap/index.js.map +1 -0
  195. package/dist/tools/roadmap.d.ts +88 -0
  196. package/dist/tools/roadmap.d.ts.map +1 -0
  197. package/dist/tools/roadmap.js +365 -0
  198. package/dist/tools/roadmap.js.map +1 -0
  199. package/dist/tools/sentinel/index.d.ts +19 -0
  200. package/dist/tools/sentinel/index.d.ts.map +1 -0
  201. package/dist/tools/sentinel/index.js +832 -0
  202. package/dist/tools/sentinel/index.js.map +1 -0
  203. package/dist/tools/sentinel-scan-data.d.ts +90 -0
  204. package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
  205. package/dist/tools/sentinel-scan-data.js +122 -0
  206. package/dist/tools/sentinel-scan-data.js.map +1 -0
  207. package/dist/tools/sentinel.d.ts +156 -0
  208. package/dist/tools/sentinel.d.ts.map +1 -0
  209. package/dist/tools/sentinel.js +603 -0
  210. package/dist/tools/sentinel.js.map +1 -0
  211. package/dist/tools/shared/index.d.ts +4 -0
  212. package/dist/tools/shared/index.d.ts.map +1 -0
  213. package/dist/tools/shared/index.js +7 -0
  214. package/dist/tools/shared/index.js.map +1 -0
  215. package/dist/tools/shared/project.d.ts +17 -0
  216. package/dist/tools/shared/project.d.ts.map +1 -0
  217. package/dist/tools/shared/project.js +36 -0
  218. package/dist/tools/shared/project.js.map +1 -0
  219. package/dist/tools/shared/response.d.ts +10 -0
  220. package/dist/tools/shared/response.d.ts.map +1 -0
  221. package/dist/tools/shared/response.js +36 -0
  222. package/dist/tools/shared/response.js.map +1 -0
  223. package/dist/tools/shared/validation.d.ts +10 -0
  224. package/dist/tools/shared/validation.d.ts.map +1 -0
  225. package/dist/tools/shared/validation.js +26 -0
  226. package/dist/tools/shared/validation.js.map +1 -0
  227. package/dist/tools/studio/cloud-spine.d.ts +27 -0
  228. package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
  229. package/dist/tools/studio/cloud-spine.js +773 -0
  230. package/dist/tools/studio/cloud-spine.js.map +1 -0
  231. package/dist/tools/studio/index.d.ts +154 -0
  232. package/dist/tools/studio/index.d.ts.map +1 -0
  233. package/dist/tools/studio/index.js +525 -0
  234. package/dist/tools/studio/index.js.map +1 -0
  235. package/dist/tools/testSpec.d.ts +122 -0
  236. package/dist/tools/testSpec.d.ts.map +1 -0
  237. package/dist/tools/testSpec.js +525 -0
  238. package/dist/tools/testSpec.js.map +1 -0
  239. package/dist/tools/toolsIndex.d.ts +5 -0
  240. package/dist/tools/toolsIndex.d.ts.map +1 -0
  241. package/dist/tools/toolsIndex.js +37 -0
  242. package/dist/tools/toolsIndex.js.map +1 -0
  243. package/dist/tools/types.d.ts +30 -0
  244. package/dist/tools/types.d.ts.map +1 -0
  245. package/dist/tools/types.js +7 -0
  246. package/dist/tools/types.js.map +1 -0
  247. package/dist/tools/voice/index.d.ts +8 -0
  248. package/dist/tools/voice/index.d.ts.map +1 -0
  249. package/dist/tools/voice/index.js +176 -0
  250. package/dist/tools/voice/index.js.map +1 -0
  251. package/dist/tools/voice.d.ts +291 -0
  252. package/dist/tools/voice.d.ts.map +1 -0
  253. package/dist/tools/voice.js +734 -0
  254. package/dist/tools/voice.js.map +1 -0
  255. package/package.json +54 -0
@@ -0,0 +1,481 @@
1
+ /**
2
+ * Context Pack MCP Tools
3
+ *
4
+ * Provides MCP tools for AI to:
5
+ * - Refresh context pack (compile full context)
6
+ * - Pin/unpin facts (persistent memory)
7
+ * - Append/search events (activity journal)
8
+ * - List/read artifacts (experiment outputs)
9
+ *
10
+ * Based on ADR-002: Context Pack
11
+ */
12
+ import fs from 'fs/promises';
13
+ import path from 'path';
14
+ import { log } from '../config.js';
15
+ import { resolveProjectPaths } from '../projectRegistry.js';
16
+ import { ensureDir } from '../dataRoot.js';
17
+ import { enforceToolAccess } from './dojoPolicy.js';
18
+ import { checkRateLimit, recordRequestStart, recordRequestEnd } from './rateLimiter.js';
19
+ // ============================================================================
20
+ // Helper Functions
21
+ // ============================================================================
22
+ function generateId() {
23
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
24
+ }
25
+ async function buildContext(projectId, callerRole = 'human', toolName, agentId) {
26
+ // Check rate limits
27
+ const rateLimitResult = checkRateLimit(callerRole);
28
+ if (!rateLimitResult.allowed) {
29
+ throw new Error(`Rate limit: ${rateLimitResult.reason}`);
30
+ }
31
+ // Enforce policy
32
+ enforceToolAccess(toolName, callerRole);
33
+ // Record request start
34
+ recordRequestStart(callerRole);
35
+ // Resolve paths
36
+ const resolved = resolveProjectPaths(projectId);
37
+ // Audit log for AI callers
38
+ if (callerRole !== 'human') {
39
+ log(`context-audit: [${new Date().toISOString()}] agent=${agentId || 'unknown'} role=${callerRole} tool=${toolName} project=${resolved.id}`);
40
+ }
41
+ return { resolved };
42
+ }
43
+ // ============================================================================
44
+ // Facts Storage
45
+ // ============================================================================
46
+ async function getFactsPath(resolved) {
47
+ const dir = resolved.subPath('context', 'facts');
48
+ ensureDir(dir);
49
+ return path.join(dir, 'facts.json');
50
+ }
51
+ async function loadFacts(resolved) {
52
+ const factsPath = await getFactsPath(resolved);
53
+ try {
54
+ const content = await fs.readFile(factsPath, 'utf-8');
55
+ return JSON.parse(content);
56
+ }
57
+ catch {
58
+ return [];
59
+ }
60
+ }
61
+ async function saveFacts(resolved, facts) {
62
+ const factsPath = await getFactsPath(resolved);
63
+ await fs.writeFile(factsPath, JSON.stringify(facts, null, 2), 'utf-8');
64
+ }
65
+ // ============================================================================
66
+ // Events Storage
67
+ // ============================================================================
68
+ async function getEventsPath(resolved) {
69
+ const dir = resolved.subPath('context', 'events');
70
+ ensureDir(dir);
71
+ return path.join(dir, 'events.json');
72
+ }
73
+ async function loadEvents(resolved) {
74
+ const eventsPath = await getEventsPath(resolved);
75
+ try {
76
+ const content = await fs.readFile(eventsPath, 'utf-8');
77
+ return JSON.parse(content);
78
+ }
79
+ catch {
80
+ return [];
81
+ }
82
+ }
83
+ async function saveEvents(resolved, events) {
84
+ const eventsPath = await getEventsPath(resolved);
85
+ await fs.writeFile(eventsPath, JSON.stringify(events, null, 2), 'utf-8');
86
+ }
87
+ // ============================================================================
88
+ // Context Pack Compilation
89
+ // ============================================================================
90
+ async function compileContextPack(resolved, sections) {
91
+ const pack = {
92
+ project_id: resolved.id,
93
+ compiled_at: new Date().toISOString(),
94
+ };
95
+ const includeSections = sections || ['facts', 'events', 'decisions', 'issues'];
96
+ // Load facts
97
+ if (includeSections.includes('facts')) {
98
+ pack.facts = await loadFacts(resolved);
99
+ }
100
+ // Load events (last 50)
101
+ if (includeSections.includes('events')) {
102
+ const events = await loadEvents(resolved);
103
+ pack.events = events.slice(-50);
104
+ }
105
+ // Load recent design decisions
106
+ if (includeSections.includes('decisions')) {
107
+ const designerDir = resolved.subPath('designer');
108
+ const decisions = [];
109
+ try {
110
+ const areas = await fs.readdir(designerDir);
111
+ for (const area of areas.slice(0, 5)) {
112
+ const areaPath = path.join(designerDir, area);
113
+ const stat = await fs.stat(areaPath);
114
+ if (stat.isDirectory()) {
115
+ const files = await fs.readdir(areaPath);
116
+ for (const file of files.slice(-3)) {
117
+ if (file.endsWith('.md')) {
118
+ decisions.push({ area, file });
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // Directory doesn't exist yet
126
+ }
127
+ pack.decisions = decisions;
128
+ }
129
+ // Load open issues
130
+ if (includeSections.includes('issues')) {
131
+ const issuesDir = resolved.subPath('sentinel', 'issues');
132
+ const issues = [];
133
+ try {
134
+ const files = await fs.readdir(issuesDir);
135
+ for (const file of files.slice(-10)) {
136
+ if (file.endsWith('.md')) {
137
+ issues.push({ file });
138
+ }
139
+ }
140
+ }
141
+ catch {
142
+ // Directory doesn't exist yet
143
+ }
144
+ pack.issues = issues;
145
+ }
146
+ return pack;
147
+ }
148
+ // ============================================================================
149
+ // Tool Implementations
150
+ // ============================================================================
151
+ /**
152
+ * Refresh context pack - compile full context
153
+ */
154
+ export async function contextRefresh(input) {
155
+ const callerRole = input.caller_role || 'human';
156
+ try {
157
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_context_refresh', input.agent_id);
158
+ log(`context: Compiling context pack for ${resolved.id}`);
159
+ const contextPack = await compileContextPack(resolved, input.sections);
160
+ return {
161
+ status: 'executed',
162
+ context_pack: contextPack,
163
+ };
164
+ }
165
+ catch (err) {
166
+ const message = err instanceof Error ? err.message : String(err);
167
+ log(`context: Error compiling context pack: ${message}`);
168
+ return {
169
+ status: 'error',
170
+ error: message,
171
+ exitCode: 1,
172
+ };
173
+ }
174
+ finally {
175
+ recordRequestEnd(callerRole);
176
+ }
177
+ }
178
+ /**
179
+ * Pin a fact to persistent memory
180
+ */
181
+ export async function contextPin(input) {
182
+ const callerRole = input.caller_role || 'human';
183
+ try {
184
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_context_pin', input.agent_id);
185
+ log(`context: Pinning fact "${input.title}" to ${resolved.id}`);
186
+ const facts = await loadFacts(resolved);
187
+ const newFact = {
188
+ id: generateId(),
189
+ title: input.title,
190
+ body: input.body,
191
+ trust: input.trust || 'medium',
192
+ refs: input.refs,
193
+ ts: new Date().toISOString(),
194
+ };
195
+ facts.push(newFact);
196
+ await saveFacts(resolved, facts);
197
+ return {
198
+ status: 'pinned',
199
+ id: newFact.id,
200
+ };
201
+ }
202
+ catch (err) {
203
+ const message = err instanceof Error ? err.message : String(err);
204
+ log(`context: Error pinning fact: ${message}`);
205
+ return {
206
+ status: 'error',
207
+ error: message,
208
+ exitCode: 1,
209
+ };
210
+ }
211
+ finally {
212
+ recordRequestEnd(callerRole);
213
+ }
214
+ }
215
+ /**
216
+ * Unpin a fact from persistent memory
217
+ */
218
+ export async function contextUnpin(input) {
219
+ const callerRole = input.caller_role || 'human';
220
+ try {
221
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_context_unpin', input.agent_id);
222
+ log(`context: Unpinning fact ${input.id} from ${resolved.id}`);
223
+ const facts = await loadFacts(resolved);
224
+ const index = facts.findIndex(f => f.id === input.id);
225
+ if (index === -1) {
226
+ return {
227
+ status: 'error',
228
+ error: `Fact ${input.id} not found`,
229
+ exitCode: 1,
230
+ };
231
+ }
232
+ facts.splice(index, 1);
233
+ await saveFacts(resolved, facts);
234
+ return { status: 'unpinned' };
235
+ }
236
+ catch (err) {
237
+ const message = err instanceof Error ? err.message : String(err);
238
+ log(`context: Error unpinning fact: ${message}`);
239
+ return {
240
+ status: 'error',
241
+ error: message,
242
+ exitCode: 1,
243
+ };
244
+ }
245
+ finally {
246
+ recordRequestEnd(callerRole);
247
+ }
248
+ }
249
+ /**
250
+ * List pinned facts
251
+ */
252
+ export async function contextList(input) {
253
+ const callerRole = input.caller_role || 'human';
254
+ try {
255
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_context_list', input.agent_id);
256
+ log(`context: Listing pinned facts from ${resolved.id}`);
257
+ const facts = await loadFacts(resolved);
258
+ // Map to output format
259
+ const mappedFacts = facts.map(f => ({
260
+ id: f.id,
261
+ title: f.title,
262
+ body: f.body,
263
+ trust: f.trust,
264
+ refs: f.refs,
265
+ pinned_at: f.ts,
266
+ }));
267
+ return {
268
+ status: 'executed',
269
+ facts: mappedFacts,
270
+ };
271
+ }
272
+ catch (err) {
273
+ const message = err instanceof Error ? err.message : String(err);
274
+ log(`context: Error listing facts: ${message}`);
275
+ return {
276
+ status: 'error',
277
+ error: message,
278
+ exitCode: 1,
279
+ };
280
+ }
281
+ finally {
282
+ recordRequestEnd(callerRole);
283
+ }
284
+ }
285
+ /**
286
+ * Append an event to the journal
287
+ */
288
+ export async function eventAppend(input) {
289
+ const callerRole = input.caller_role || 'human';
290
+ try {
291
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_event_append', input.agent_id);
292
+ log(`context: Appending event "${input.title}" to ${resolved.id}`);
293
+ const events = await loadEvents(resolved);
294
+ const newEvent = {
295
+ id: generateId(),
296
+ title: input.title,
297
+ body: input.body,
298
+ tags: input.tags,
299
+ ts: new Date().toISOString(),
300
+ };
301
+ events.push(newEvent);
302
+ await saveEvents(resolved, events);
303
+ return {
304
+ status: 'appended',
305
+ event_id: newEvent.id,
306
+ };
307
+ }
308
+ catch (err) {
309
+ const message = err instanceof Error ? err.message : String(err);
310
+ log(`context: Error appending event: ${message}`);
311
+ return {
312
+ status: 'error',
313
+ error: message,
314
+ exitCode: 1,
315
+ };
316
+ }
317
+ finally {
318
+ recordRequestEnd(callerRole);
319
+ }
320
+ }
321
+ /**
322
+ * Search events in the journal
323
+ */
324
+ export async function eventSearch(input) {
325
+ const callerRole = input.caller_role || 'human';
326
+ try {
327
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_event_search', input.agent_id);
328
+ log(`context: Searching events for "${input.query}" in ${resolved.id}`);
329
+ const events = await loadEvents(resolved);
330
+ const queryLower = input.query.toLowerCase();
331
+ // Simple text search across title, body, and tags
332
+ let results = events.filter(e => {
333
+ const titleMatch = e.title.toLowerCase().includes(queryLower);
334
+ const bodyMatch = e.body?.toLowerCase().includes(queryLower);
335
+ const tagMatch = e.tags?.some(t => t.toLowerCase().includes(queryLower));
336
+ return titleMatch || bodyMatch || tagMatch;
337
+ });
338
+ // Most recent first, apply limit
339
+ results = results.reverse();
340
+ if (input.limit && input.limit > 0) {
341
+ results = results.slice(0, input.limit);
342
+ }
343
+ // Map to output format
344
+ const mappedResults = results.map(e => ({
345
+ id: e.id,
346
+ title: e.title,
347
+ body: e.body,
348
+ tags: e.tags || [],
349
+ timestamp: e.ts,
350
+ }));
351
+ return {
352
+ status: 'executed',
353
+ results: mappedResults,
354
+ };
355
+ }
356
+ catch (err) {
357
+ const message = err instanceof Error ? err.message : String(err);
358
+ log(`context: Error searching events: ${message}`);
359
+ return {
360
+ status: 'error',
361
+ error: message,
362
+ exitCode: 1,
363
+ };
364
+ }
365
+ finally {
366
+ recordRequestEnd(callerRole);
367
+ }
368
+ }
369
+ /**
370
+ * List artifacts for a run
371
+ */
372
+ export async function artifactList(input) {
373
+ const callerRole = input.caller_role || 'human';
374
+ try {
375
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_artifact_list', input.agent_id);
376
+ log(`context: Listing artifacts for run ${input.run_id} in ${resolved.id}`);
377
+ const runDir = resolved.subPath('context', 'artifacts', input.run_id);
378
+ const artifacts = [];
379
+ try {
380
+ const files = await fs.readdir(runDir);
381
+ for (const file of files) {
382
+ const filePath = path.join(runDir, file);
383
+ const stat = await fs.stat(filePath);
384
+ if (stat.isFile()) {
385
+ artifacts.push({
386
+ name: file,
387
+ size: stat.size,
388
+ ref: filePath,
389
+ });
390
+ }
391
+ }
392
+ }
393
+ catch {
394
+ return {
395
+ status: 'error',
396
+ error: `Run ${input.run_id} not found`,
397
+ exitCode: 1,
398
+ };
399
+ }
400
+ return {
401
+ status: 'executed',
402
+ run_id: input.run_id,
403
+ artifacts,
404
+ };
405
+ }
406
+ catch (err) {
407
+ const message = err instanceof Error ? err.message : String(err);
408
+ log(`context: Error listing artifacts: ${message}`);
409
+ return {
410
+ status: 'error',
411
+ error: message,
412
+ exitCode: 1,
413
+ };
414
+ }
415
+ finally {
416
+ recordRequestEnd(callerRole);
417
+ }
418
+ }
419
+ /**
420
+ * Read an artifact by run_id and name
421
+ */
422
+ export async function artifactRead(input) {
423
+ const callerRole = input.caller_role || 'human';
424
+ try {
425
+ const { resolved } = await buildContext(input.projectId, callerRole, 'decibel_artifact_read', input.agent_id);
426
+ log(`context: Reading artifact ${input.name} from run ${input.run_id} in ${resolved.id}`);
427
+ const artifactPath = resolved.subPath('context', 'artifacts', input.run_id, input.name);
428
+ try {
429
+ const content = await fs.readFile(artifactPath, 'utf-8');
430
+ // Determine mime type from extension
431
+ const ext = path.extname(input.name).toLowerCase();
432
+ const mimeTypes = {
433
+ '.json': 'application/json',
434
+ '.txt': 'text/plain',
435
+ '.md': 'text/markdown',
436
+ '.html': 'text/html',
437
+ '.csv': 'text/csv',
438
+ '.xml': 'application/xml',
439
+ '.yaml': 'application/yaml',
440
+ '.yml': 'application/yaml',
441
+ };
442
+ const mimeType = mimeTypes[ext] || 'application/octet-stream';
443
+ return {
444
+ status: 'executed',
445
+ run_id: input.run_id,
446
+ name: input.name,
447
+ content,
448
+ mime_type: mimeType,
449
+ };
450
+ }
451
+ catch {
452
+ return {
453
+ status: 'error',
454
+ error: `Artifact ${input.name} not found in run ${input.run_id}`,
455
+ exitCode: 1,
456
+ };
457
+ }
458
+ }
459
+ catch (err) {
460
+ const message = err instanceof Error ? err.message : String(err);
461
+ log(`context: Error reading artifact: ${message}`);
462
+ return {
463
+ status: 'error',
464
+ error: message,
465
+ exitCode: 1,
466
+ };
467
+ }
468
+ finally {
469
+ recordRequestEnd(callerRole);
470
+ }
471
+ }
472
+ /**
473
+ * Type guard for ContextError
474
+ */
475
+ export function isContextError(result) {
476
+ return (typeof result === 'object' &&
477
+ result !== null &&
478
+ 'status' in result &&
479
+ result.status === 'error');
480
+ }
481
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export interface CritError {
2
+ error: string;
3
+ message: string;
4
+ hint?: string;
5
+ }
6
+ export declare function isCritError(result: unknown): result is CritError;
7
+ /**
8
+ * Crit - Early creative feedback before decisions crystallize
9
+ *
10
+ * Use for:
11
+ * - Gut reactions ("this feels sluggish")
12
+ * - Observations ("4-up runs at 45fps")
13
+ * - Questions ("should we use video fallback?")
14
+ * - Hunches ("spring physics might be overkill")
15
+ *
16
+ * NOT for:
17
+ * - Final decisions (use designer_record_design_decision)
18
+ * - Bugs/issues (use sentinel_create_issue)
19
+ * - Learnings after the fact (use learnings_append)
20
+ */
21
+ export type CritSentiment = 'positive' | 'negative' | 'neutral' | 'question';
22
+ export interface LogCritInput {
23
+ projectId?: string;
24
+ area: string;
25
+ observation: string;
26
+ sentiment?: CritSentiment;
27
+ context?: string;
28
+ tags?: string[];
29
+ }
30
+ export interface LogCritOutput {
31
+ id: string;
32
+ timestamp: string;
33
+ path: string;
34
+ sentiment: CritSentiment;
35
+ }
36
+ export interface ListCritsInput {
37
+ projectId?: string;
38
+ area?: string;
39
+ sentiment?: CritSentiment;
40
+ limit?: number;
41
+ }
42
+ export interface CritEntry {
43
+ timestamp: string;
44
+ area: string;
45
+ observation: string;
46
+ sentiment: CritSentiment;
47
+ context?: string;
48
+ tags?: string[];
49
+ }
50
+ export interface ListCritsOutput {
51
+ path: string;
52
+ entries: CritEntry[];
53
+ total_count: number;
54
+ }
55
+ /**
56
+ * Log a crit observation
57
+ */
58
+ export declare function logCrit(input: LogCritInput): Promise<LogCritOutput | CritError>;
59
+ /**
60
+ * List crits for a project
61
+ */
62
+ export declare function listCrits(input: ListCritsInput): Promise<ListCritsOutput | CritError>;
63
+ //# sourceMappingURL=crit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crit.d.ts","sourceRoot":"","sources":["../../src/tools/crit.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,SAAS,CAOhE;AAED;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAmBD;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAyDrF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA8E3F"}