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,263 @@
1
+ /**
2
+ * Dojo Policy Enforcement
3
+ *
4
+ * Loads and enforces role-based access control for Dojo tools.
5
+ * Ensures Mother and other AI callers can only access sandbox-safe operations.
6
+ */
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { parse as parseYaml } from 'yaml';
10
+ import { log } from '../config.js';
11
+ // ============================================================================
12
+ // Default Policy (fallback if file not found)
13
+ // ============================================================================
14
+ const DEFAULT_POLICY = {
15
+ roles: {
16
+ human: {
17
+ description: 'Full Dojo access',
18
+ allowed_tools: ['*'],
19
+ sandbox: {
20
+ fs_read: ['**'],
21
+ fs_write: ['**'],
22
+ exec_allowlist: ['*'],
23
+ net: true,
24
+ },
25
+ },
26
+ mother: {
27
+ description: 'Mother AI - sandbox-only',
28
+ allowed_tools: [
29
+ 'dojo_add_wish',
30
+ 'dojo_list_wishes',
31
+ 'dojo_create_proposal',
32
+ 'dojo_list',
33
+ 'dojo_scaffold_experiment',
34
+ 'dojo_run_experiment',
35
+ 'dojo_get_results',
36
+ 'dojo_can_graduate',
37
+ ],
38
+ denied_tools: [
39
+ 'dojo_enable_experiment',
40
+ 'dojo_disable_experiment',
41
+ 'dojo_graduate_experiment',
42
+ ],
43
+ sandbox: {
44
+ fs_read: ['{DOJO_ROOT}/**'],
45
+ fs_write: ['{DOJO_ROOT}/results/**', '{DOJO_ROOT}/wishes/**', '{DOJO_ROOT}/proposals/**'],
46
+ exec_allowlist: ['python', 'python3', 'node', 'rg', 'git'],
47
+ net: false,
48
+ },
49
+ },
50
+ ai: {
51
+ description: 'Generic AI caller',
52
+ allowed_tools: [],
53
+ inherits: 'mother',
54
+ sandbox: {
55
+ fs_read: [],
56
+ fs_write: [],
57
+ exec_allowlist: [],
58
+ net: false,
59
+ },
60
+ },
61
+ },
62
+ default_role: 'human',
63
+ safety: {
64
+ never_expose_to_ai: [
65
+ 'dojo_enable_experiment',
66
+ 'dojo_disable_experiment',
67
+ 'dojo_graduate_experiment',
68
+ ],
69
+ always_sandbox_run: true,
70
+ results_write_fence: '{DOJO_ROOT}/results/**',
71
+ },
72
+ };
73
+ // ============================================================================
74
+ // Policy Loader (singleton)
75
+ // ============================================================================
76
+ let cachedPolicy = null;
77
+ /**
78
+ * Load the Dojo policy from .decibel/dojo_policy.yaml
79
+ * Falls back to default policy if file not found
80
+ */
81
+ export function loadDojoPolicy(forceReload = false) {
82
+ if (cachedPolicy && !forceReload) {
83
+ return cachedPolicy;
84
+ }
85
+ const policyPaths = [
86
+ path.join(process.cwd(), '.decibel', 'dojo_policy.yaml'),
87
+ path.join(process.cwd(), 'dojo_policy.yaml'),
88
+ ];
89
+ for (const policyPath of policyPaths) {
90
+ try {
91
+ if (fs.existsSync(policyPath)) {
92
+ const content = fs.readFileSync(policyPath, 'utf-8');
93
+ const parsed = parseYaml(content);
94
+ cachedPolicy = mergeWithDefaults(parsed);
95
+ log(`dojoPolicy: Loaded policy from ${policyPath}`);
96
+ return cachedPolicy;
97
+ }
98
+ }
99
+ catch (err) {
100
+ const message = err instanceof Error ? err.message : String(err);
101
+ log(`dojoPolicy: Failed to load ${policyPath}: ${message}`);
102
+ }
103
+ }
104
+ log('dojoPolicy: Using default policy (no policy file found)');
105
+ cachedPolicy = DEFAULT_POLICY;
106
+ return cachedPolicy;
107
+ }
108
+ /**
109
+ * Merge loaded policy with defaults to ensure all fields exist
110
+ */
111
+ function mergeWithDefaults(loaded) {
112
+ return {
113
+ roles: { ...DEFAULT_POLICY.roles, ...loaded.roles },
114
+ default_role: loaded.default_role || DEFAULT_POLICY.default_role,
115
+ safety: { ...DEFAULT_POLICY.safety, ...loaded.safety },
116
+ };
117
+ }
118
+ // ============================================================================
119
+ // Policy Enforcement
120
+ // ============================================================================
121
+ /**
122
+ * Resolve a role, handling inheritance
123
+ */
124
+ function resolveRole(roleName, policy) {
125
+ const role = policy.roles[roleName];
126
+ if (!role) {
127
+ return null;
128
+ }
129
+ // Handle inheritance
130
+ if (role.inherits && policy.roles[role.inherits]) {
131
+ const parent = resolveRole(role.inherits, policy);
132
+ if (parent) {
133
+ return {
134
+ ...parent,
135
+ ...role,
136
+ allowed_tools: role.allowed_tools.length > 0 ? role.allowed_tools : parent.allowed_tools,
137
+ denied_tools: [...(parent.denied_tools || []), ...(role.denied_tools || [])],
138
+ sandbox: {
139
+ ...parent.sandbox,
140
+ ...role.sandbox,
141
+ },
142
+ };
143
+ }
144
+ }
145
+ return role;
146
+ }
147
+ /**
148
+ * Check if a caller role is allowed to use a specific tool
149
+ */
150
+ export function checkToolAccess(toolName, callerRole = 'human') {
151
+ const policy = loadDojoPolicy();
152
+ // Check safety: never expose certain tools to AI
153
+ if (callerRole !== 'human' && policy.safety.never_expose_to_ai.includes(toolName)) {
154
+ return {
155
+ allowed: false,
156
+ reason: `Tool "${toolName}" is never allowed for AI callers`,
157
+ };
158
+ }
159
+ // Get role policy
160
+ const role = resolveRole(callerRole, policy);
161
+ if (!role) {
162
+ // Unknown role - use default
163
+ const defaultRole = resolveRole(policy.default_role, policy);
164
+ if (!defaultRole) {
165
+ return { allowed: false, reason: 'Unknown role and no default role configured' };
166
+ }
167
+ }
168
+ const effectiveRole = role || resolveRole(policy.default_role, policy);
169
+ // Check denied list first
170
+ if (effectiveRole.denied_tools?.includes(toolName)) {
171
+ return {
172
+ allowed: false,
173
+ reason: `Tool "${toolName}" is explicitly denied for role "${callerRole}"`,
174
+ };
175
+ }
176
+ // Check allowed list
177
+ const isAllowed = effectiveRole.allowed_tools.includes('*') || effectiveRole.allowed_tools.includes(toolName);
178
+ if (!isAllowed) {
179
+ return {
180
+ allowed: false,
181
+ reason: `Tool "${toolName}" is not in allowed list for role "${callerRole}"`,
182
+ };
183
+ }
184
+ return {
185
+ allowed: true,
186
+ sandbox: effectiveRole.sandbox,
187
+ };
188
+ }
189
+ /**
190
+ * Get the sandbox policy for a caller role
191
+ */
192
+ export function getSandboxPolicy(callerRole = 'human') {
193
+ const policy = loadDojoPolicy();
194
+ const role = resolveRole(callerRole, policy);
195
+ if (!role) {
196
+ // Strictest sandbox for unknown roles
197
+ return {
198
+ fs_read: [],
199
+ fs_write: [],
200
+ exec_allowlist: [],
201
+ net: false,
202
+ };
203
+ }
204
+ return role.sandbox;
205
+ }
206
+ /**
207
+ * Expand sandbox path patterns with actual Dojo root
208
+ */
209
+ export function expandSandboxPaths(sandbox, dojoRoot) {
210
+ const expand = (patterns) => patterns.map((p) => p.replace('{DOJO_ROOT}', dojoRoot));
211
+ return {
212
+ fs_read: expand(sandbox.fs_read),
213
+ fs_write: expand(sandbox.fs_write),
214
+ exec_allowlist: sandbox.exec_allowlist,
215
+ net: sandbox.net,
216
+ };
217
+ }
218
+ /**
219
+ * Check if a path is allowed for writing under the sandbox policy
220
+ */
221
+ export function isWriteAllowed(targetPath, sandbox) {
222
+ const normalizedTarget = path.normalize(targetPath);
223
+ for (const pattern of sandbox.fs_write) {
224
+ // Simple glob matching (supports ** and *)
225
+ const regexPattern = pattern
226
+ .replace(/\*\*/g, '.*')
227
+ .replace(/\*/g, '[^/]*')
228
+ .replace(/\//g, '\\/');
229
+ const regex = new RegExp(`^${regexPattern}$`);
230
+ if (regex.test(normalizedTarget)) {
231
+ return true;
232
+ }
233
+ // Also check if target is under the pattern directory
234
+ const patternDir = pattern.replace(/\/\*\*$/, '').replace(/\/\*$/, '');
235
+ if (normalizedTarget.startsWith(path.normalize(patternDir))) {
236
+ return true;
237
+ }
238
+ }
239
+ return false;
240
+ }
241
+ /**
242
+ * Check if an executable is allowed under the sandbox policy
243
+ */
244
+ export function isExecAllowed(executable, sandbox) {
245
+ if (sandbox.exec_allowlist.includes('*')) {
246
+ return true;
247
+ }
248
+ const baseName = path.basename(executable);
249
+ return sandbox.exec_allowlist.includes(baseName) || sandbox.exec_allowlist.includes(executable);
250
+ }
251
+ // ============================================================================
252
+ // Convenience: Enforce or throw
253
+ // ============================================================================
254
+ /**
255
+ * Enforce tool access - throws if not allowed
256
+ */
257
+ export function enforceToolAccess(toolName, callerRole = 'human') {
258
+ const result = checkToolAccess(toolName, callerRole);
259
+ if (!result.allowed) {
260
+ throw new Error(`Access denied: ${result.reason}`);
261
+ }
262
+ }
263
+ //# sourceMappingURL=dojoPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dojoPolicy.js","sourceRoot":"","sources":["../../src/tools/dojoPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ToolSpec } from '../types.js';
2
+ export declare const frictionLogTool: ToolSpec;
3
+ export declare const frictionListTool: ToolSpec;
4
+ export declare const frictionResolveTool: ToolSpec;
5
+ export declare const frictionBumpTool: ToolSpec;
6
+ export declare const frictionTools: ToolSpec[];
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/friction/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA4BvC,eAAO,MAAM,eAAe,EAAE,QAiE7B,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,QAiD9B,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,QA8CjC,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,QA0C9B,CAAC;AAMF,eAAO,MAAM,aAAa,EAAE,QAAQ,EAKnC,CAAC"}
@@ -0,0 +1,239 @@
1
+ // ============================================================================
2
+ // Friction Domain Tools
3
+ // ============================================================================
4
+ // Tools for tracking persistent pain points and friction in workflows.
5
+ // ============================================================================
6
+ import { toolSuccess, toolError, requireFields } from '../shared/index.js';
7
+ import { logFriction, listFriction, resolveFriction, bumpFriction, } from '../friction.js';
8
+ // ============================================================================
9
+ // Types
10
+ // ============================================================================
11
+ const VALID_FREQUENCIES = ['once', 'occasional', 'frequent', 'constant'];
12
+ const VALID_IMPACTS = ['low', 'medium', 'high', 'blocking'];
13
+ const VALID_STATUSES = ['open', 'acknowledged', 'solving', 'resolved', 'wontfix'];
14
+ // ============================================================================
15
+ // Log Friction Tool
16
+ // ============================================================================
17
+ export const frictionLogTool = {
18
+ definition: {
19
+ name: 'friction_log',
20
+ description: 'Log a persistent friction point or pain point. Both humans and agents can call this to track recurring issues that erode productivity. Signal strength increases when similar friction is logged multiple times.',
21
+ inputSchema: {
22
+ type: 'object',
23
+ properties: {
24
+ projectId: {
25
+ type: 'string',
26
+ description: 'Optional project identifier. Uses default project if not specified.',
27
+ },
28
+ context: {
29
+ type: 'string',
30
+ description: 'Where the friction occurs (project name, repo, system, or workflow)',
31
+ },
32
+ description: {
33
+ type: 'string',
34
+ description: 'What the friction is - the pain point or recurring issue',
35
+ },
36
+ frequency: {
37
+ type: 'string',
38
+ enum: ['once', 'occasional', 'frequent', 'constant'],
39
+ description: 'How often this friction is encountered (default: occasional)',
40
+ },
41
+ impact: {
42
+ type: 'string',
43
+ enum: ['low', 'medium', 'high', 'blocking'],
44
+ description: 'How much this friction affects productivity (default: medium)',
45
+ },
46
+ source: {
47
+ type: 'string',
48
+ enum: ['human', 'agent'],
49
+ description: 'Who is logging this friction (default: human)',
50
+ },
51
+ tags: {
52
+ type: 'array',
53
+ items: { type: 'string' },
54
+ description: 'Tags for categorization and searchability',
55
+ },
56
+ workaround: {
57
+ type: 'string',
58
+ description: 'Any current workaround being used',
59
+ },
60
+ },
61
+ required: ['context', 'description'],
62
+ },
63
+ },
64
+ handler: async (args) => {
65
+ try {
66
+ const input = args;
67
+ requireFields(input, 'context', 'description');
68
+ if (input.frequency && !VALID_FREQUENCIES.includes(input.frequency)) {
69
+ throw new Error(`Invalid frequency. Must be one of: ${VALID_FREQUENCIES.join(', ')}`);
70
+ }
71
+ if (input.impact && !VALID_IMPACTS.includes(input.impact)) {
72
+ throw new Error(`Invalid impact. Must be one of: ${VALID_IMPACTS.join(', ')}`);
73
+ }
74
+ const result = await logFriction(input);
75
+ return toolSuccess(result);
76
+ }
77
+ catch (err) {
78
+ return toolError(err instanceof Error ? err.message : String(err));
79
+ }
80
+ },
81
+ };
82
+ // ============================================================================
83
+ // List Friction Tool
84
+ // ============================================================================
85
+ export const frictionListTool = {
86
+ definition: {
87
+ name: 'friction_list',
88
+ description: 'List friction points, sorted by impact and signal count. High-signal friction should be prioritized for resolution.',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ projectId: {
93
+ type: 'string',
94
+ description: 'Optional project identifier. Uses default project if not specified.',
95
+ },
96
+ context: {
97
+ type: 'string',
98
+ description: 'Filter by context (project, repo, system)',
99
+ },
100
+ status: {
101
+ type: 'string',
102
+ enum: ['open', 'acknowledged', 'solving', 'resolved', 'wontfix'],
103
+ description: 'Filter by status',
104
+ },
105
+ min_impact: {
106
+ type: 'string',
107
+ enum: ['low', 'medium', 'high', 'blocking'],
108
+ description: 'Minimum impact level to include',
109
+ },
110
+ limit: {
111
+ type: 'integer',
112
+ description: 'Maximum number of results (default: 20)',
113
+ },
114
+ },
115
+ },
116
+ },
117
+ handler: async (args) => {
118
+ try {
119
+ const input = args;
120
+ if (input.status && !VALID_STATUSES.includes(input.status)) {
121
+ throw new Error(`Invalid status. Must be one of: ${VALID_STATUSES.join(', ')}`);
122
+ }
123
+ if (input.min_impact && !VALID_IMPACTS.includes(input.min_impact)) {
124
+ throw new Error(`Invalid min_impact. Must be one of: ${VALID_IMPACTS.join(', ')}`);
125
+ }
126
+ const result = await listFriction(input);
127
+ return toolSuccess(result);
128
+ }
129
+ catch (err) {
130
+ return toolError(err instanceof Error ? err.message : String(err));
131
+ }
132
+ },
133
+ };
134
+ // ============================================================================
135
+ // Resolve Friction Tool
136
+ // ============================================================================
137
+ export const frictionResolveTool = {
138
+ definition: {
139
+ name: 'friction_resolve',
140
+ description: 'Mark a friction point as resolved. Can include a resolution note and reference to the solution (issue, ADR, commit).',
141
+ inputSchema: {
142
+ type: 'object',
143
+ properties: {
144
+ projectId: {
145
+ type: 'string',
146
+ description: 'Optional project identifier. Uses default project if not specified.',
147
+ },
148
+ friction_id: {
149
+ type: 'string',
150
+ description: 'The friction ID (filename or partial match)',
151
+ },
152
+ resolution: {
153
+ type: 'string',
154
+ description: 'How the friction was resolved',
155
+ },
156
+ solution_ref: {
157
+ type: 'string',
158
+ description: 'Optional reference to the solution (issue ID, ADR, commit SHA, PR)',
159
+ },
160
+ status: {
161
+ type: 'string',
162
+ enum: ['resolved', 'wontfix'],
163
+ description: 'Resolution status (default: resolved)',
164
+ },
165
+ },
166
+ required: ['friction_id', 'resolution'],
167
+ },
168
+ },
169
+ handler: async (args) => {
170
+ try {
171
+ const input = args;
172
+ requireFields(input, 'friction_id', 'resolution');
173
+ const result = await resolveFriction(input);
174
+ if ('error' in result) {
175
+ return toolError(JSON.stringify(result, null, 2));
176
+ }
177
+ return toolSuccess(result);
178
+ }
179
+ catch (err) {
180
+ return toolError(err instanceof Error ? err.message : String(err));
181
+ }
182
+ },
183
+ };
184
+ // ============================================================================
185
+ // Bump Friction Tool
186
+ // ============================================================================
187
+ export const frictionBumpTool = {
188
+ definition: {
189
+ name: 'friction_bump',
190
+ description: 'Bump the signal count on an existing friction point. Use when encountering the same friction again. Higher signal = higher priority.',
191
+ inputSchema: {
192
+ type: 'object',
193
+ properties: {
194
+ projectId: {
195
+ type: 'string',
196
+ description: 'Optional project identifier. Uses default project if not specified.',
197
+ },
198
+ friction_id: {
199
+ type: 'string',
200
+ description: 'The friction ID (filename or partial match)',
201
+ },
202
+ source: {
203
+ type: 'string',
204
+ enum: ['human', 'agent'],
205
+ description: 'Who is bumping this friction (default: human)',
206
+ },
207
+ note: {
208
+ type: 'string',
209
+ description: 'Optional note about this occurrence',
210
+ },
211
+ },
212
+ required: ['friction_id'],
213
+ },
214
+ },
215
+ handler: async (args) => {
216
+ try {
217
+ const input = args;
218
+ requireFields(input, 'friction_id');
219
+ const result = await bumpFriction(input);
220
+ if ('error' in result) {
221
+ return toolError(JSON.stringify(result, null, 2));
222
+ }
223
+ return toolSuccess(result);
224
+ }
225
+ catch (err) {
226
+ return toolError(err instanceof Error ? err.message : String(err));
227
+ }
228
+ },
229
+ };
230
+ // ============================================================================
231
+ // Export All Tools
232
+ // ============================================================================
233
+ export const frictionTools = [
234
+ frictionLogTool,
235
+ frictionListTool,
236
+ frictionResolveTool,
237
+ frictionBumpTool,
238
+ ];
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/friction/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ export interface ProjectResolutionError {
2
+ error: 'project_resolution_failed';
3
+ message: string;
4
+ hint: string;
5
+ }
6
+ export type FrictionSource = 'human' | 'agent';
7
+ export type FrictionFrequency = 'once' | 'occasional' | 'frequent' | 'constant';
8
+ export type FrictionImpact = 'low' | 'medium' | 'high' | 'blocking';
9
+ export type FrictionStatus = 'open' | 'acknowledged' | 'solving' | 'resolved' | 'wontfix';
10
+ export interface LogFrictionInput {
11
+ projectId?: string;
12
+ context: string;
13
+ description: string;
14
+ frequency?: FrictionFrequency;
15
+ impact?: FrictionImpact;
16
+ source?: FrictionSource;
17
+ tags?: string[];
18
+ workaround?: string;
19
+ }
20
+ export interface LogFrictionOutput {
21
+ id: string;
22
+ timestamp: string;
23
+ path: string;
24
+ context: string;
25
+ signal_strength: number;
26
+ }
27
+ export interface ListFrictionInput {
28
+ projectId?: string;
29
+ context?: string;
30
+ status?: FrictionStatus;
31
+ min_impact?: FrictionImpact;
32
+ source?: FrictionSource;
33
+ limit?: number;
34
+ }
35
+ export interface FrictionSummary {
36
+ id: string;
37
+ context: string;
38
+ description: string;
39
+ frequency: FrictionFrequency;
40
+ impact: FrictionImpact;
41
+ status: FrictionStatus;
42
+ signal_count: number;
43
+ last_reported: string;
44
+ tags: string[];
45
+ }
46
+ export interface ListFrictionOutput {
47
+ friction: FrictionSummary[];
48
+ total_count: number;
49
+ }
50
+ export interface ResolveFrictionInput {
51
+ projectId?: string;
52
+ friction_id: string;
53
+ resolution: string;
54
+ solution_ref?: string;
55
+ status?: 'resolved' | 'wontfix';
56
+ }
57
+ export interface ResolveFrictionOutput {
58
+ id: string;
59
+ path: string;
60
+ status: FrictionStatus;
61
+ resolved_at: string;
62
+ }
63
+ export interface BumpFrictionInput {
64
+ projectId?: string;
65
+ friction_id: string;
66
+ source?: FrictionSource;
67
+ note?: string;
68
+ }
69
+ export interface BumpFrictionOutput {
70
+ id: string;
71
+ signal_count: number;
72
+ last_reported: string;
73
+ }
74
+ export declare function logFriction(input: LogFrictionInput): Promise<LogFrictionOutput | ProjectResolutionError>;
75
+ export declare function listFriction(input: ListFrictionInput): Promise<ListFrictionOutput | ProjectResolutionError>;
76
+ export declare function resolveFriction(input: ResolveFrictionInput): Promise<ResolveFrictionOutput | ProjectResolutionError | {
77
+ error: string;
78
+ }>;
79
+ export declare function bumpFriction(input: BumpFrictionInput): Promise<BumpFrictionOutput | ProjectResolutionError | {
80
+ error: string;
81
+ }>;
82
+ //# sourceMappingURL=friction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friction.d.ts","sourceRoot":"","sources":["../../src/tools/friction.ts"],"names":[],"mappings":"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"}