attocode 0.2.1 → 0.2.3

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 (219) hide show
  1. package/CHANGELOG.md +191 -1
  2. package/README.md +7 -0
  3. package/dist/src/adapters.d.ts +6 -1
  4. package/dist/src/adapters.d.ts.map +1 -1
  5. package/dist/src/adapters.js +8 -1
  6. package/dist/src/adapters.js.map +1 -1
  7. package/dist/src/agent.d.ts +41 -4
  8. package/dist/src/agent.d.ts.map +1 -1
  9. package/dist/src/agent.js +846 -75
  10. package/dist/src/agent.js.map +1 -1
  11. package/dist/src/cli.d.ts.map +1 -1
  12. package/dist/src/cli.js +23 -2
  13. package/dist/src/cli.js.map +1 -1
  14. package/dist/src/core/protocol/types.d.ts +8 -8
  15. package/dist/src/defaults.d.ts +7 -2
  16. package/dist/src/defaults.d.ts.map +1 -1
  17. package/dist/src/defaults.js +38 -2
  18. package/dist/src/defaults.js.map +1 -1
  19. package/dist/src/integrations/agent-registry.d.ts +13 -0
  20. package/dist/src/integrations/agent-registry.d.ts.map +1 -1
  21. package/dist/src/integrations/agent-registry.js.map +1 -1
  22. package/dist/src/integrations/async-subagent.d.ts +135 -0
  23. package/dist/src/integrations/async-subagent.d.ts.map +1 -0
  24. package/dist/src/integrations/async-subagent.js +213 -0
  25. package/dist/src/integrations/async-subagent.js.map +1 -0
  26. package/dist/src/integrations/auto-checkpoint.d.ts +98 -0
  27. package/dist/src/integrations/auto-checkpoint.d.ts.map +1 -0
  28. package/dist/src/integrations/auto-checkpoint.js +252 -0
  29. package/dist/src/integrations/auto-checkpoint.js.map +1 -0
  30. package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
  31. package/dist/src/integrations/auto-compaction.js +5 -1
  32. package/dist/src/integrations/auto-compaction.js.map +1 -1
  33. package/dist/src/integrations/bash-policy.d.ts +33 -0
  34. package/dist/src/integrations/bash-policy.d.ts.map +1 -0
  35. package/dist/src/integrations/bash-policy.js +142 -0
  36. package/dist/src/integrations/bash-policy.js.map +1 -0
  37. package/dist/src/integrations/codebase-context.d.ts +5 -0
  38. package/dist/src/integrations/codebase-context.d.ts.map +1 -1
  39. package/dist/src/integrations/codebase-context.js +33 -0
  40. package/dist/src/integrations/codebase-context.js.map +1 -1
  41. package/dist/src/integrations/complexity-classifier.d.ts +86 -0
  42. package/dist/src/integrations/complexity-classifier.d.ts.map +1 -0
  43. package/dist/src/integrations/complexity-classifier.js +233 -0
  44. package/dist/src/integrations/complexity-classifier.js.map +1 -0
  45. package/dist/src/integrations/delegation-protocol.d.ts +86 -0
  46. package/dist/src/integrations/delegation-protocol.d.ts.map +1 -0
  47. package/dist/src/integrations/delegation-protocol.js +127 -0
  48. package/dist/src/integrations/delegation-protocol.js.map +1 -0
  49. package/dist/src/integrations/dynamic-budget.d.ts +81 -0
  50. package/dist/src/integrations/dynamic-budget.d.ts.map +1 -0
  51. package/dist/src/integrations/dynamic-budget.js +151 -0
  52. package/dist/src/integrations/dynamic-budget.js.map +1 -0
  53. package/dist/src/integrations/economics.d.ts +86 -1
  54. package/dist/src/integrations/economics.d.ts.map +1 -1
  55. package/dist/src/integrations/economics.js +306 -11
  56. package/dist/src/integrations/economics.js.map +1 -1
  57. package/dist/src/integrations/environment-facts.d.ts +52 -0
  58. package/dist/src/integrations/environment-facts.d.ts.map +1 -0
  59. package/dist/src/integrations/environment-facts.js +84 -0
  60. package/dist/src/integrations/environment-facts.js.map +1 -0
  61. package/dist/src/integrations/hierarchical-config.d.ts.map +1 -1
  62. package/dist/src/integrations/hierarchical-config.js +17 -0
  63. package/dist/src/integrations/hierarchical-config.js.map +1 -1
  64. package/dist/src/integrations/index.d.ts +19 -2
  65. package/dist/src/integrations/index.d.ts.map +1 -1
  66. package/dist/src/integrations/index.js +34 -2
  67. package/dist/src/integrations/index.js.map +1 -1
  68. package/dist/src/integrations/injection-budget.d.ts +71 -0
  69. package/dist/src/integrations/injection-budget.d.ts.map +1 -0
  70. package/dist/src/integrations/injection-budget.js +136 -0
  71. package/dist/src/integrations/injection-budget.js.map +1 -0
  72. package/dist/src/integrations/mcp-client.d.ts.map +1 -1
  73. package/dist/src/integrations/mcp-client.js +14 -0
  74. package/dist/src/integrations/mcp-client.js.map +1 -1
  75. package/dist/src/integrations/mcp-custom-tools.d.ts +102 -0
  76. package/dist/src/integrations/mcp-custom-tools.d.ts.map +1 -0
  77. package/dist/src/integrations/mcp-custom-tools.js +232 -0
  78. package/dist/src/integrations/mcp-custom-tools.js.map +1 -0
  79. package/dist/src/integrations/mcp-tool-validator.d.ts +60 -0
  80. package/dist/src/integrations/mcp-tool-validator.d.ts.map +1 -0
  81. package/dist/src/integrations/mcp-tool-validator.js +141 -0
  82. package/dist/src/integrations/mcp-tool-validator.js.map +1 -0
  83. package/dist/src/integrations/policy-engine.d.ts +55 -0
  84. package/dist/src/integrations/policy-engine.d.ts.map +1 -0
  85. package/dist/src/integrations/policy-engine.js +247 -0
  86. package/dist/src/integrations/policy-engine.js.map +1 -0
  87. package/dist/src/integrations/safety.d.ts +5 -4
  88. package/dist/src/integrations/safety.d.ts.map +1 -1
  89. package/dist/src/integrations/safety.js +32 -7
  90. package/dist/src/integrations/safety.js.map +1 -1
  91. package/dist/src/integrations/sandbox/basic.d.ts +7 -0
  92. package/dist/src/integrations/sandbox/basic.d.ts.map +1 -1
  93. package/dist/src/integrations/sandbox/basic.js +27 -2
  94. package/dist/src/integrations/sandbox/basic.js.map +1 -1
  95. package/dist/src/integrations/sandbox/index.d.ts +6 -0
  96. package/dist/src/integrations/sandbox/index.d.ts.map +1 -1
  97. package/dist/src/integrations/sandbox/index.js +3 -0
  98. package/dist/src/integrations/sandbox/index.js.map +1 -1
  99. package/dist/src/integrations/sandbox/landlock.d.ts.map +1 -1
  100. package/dist/src/integrations/sandbox/landlock.js +3 -0
  101. package/dist/src/integrations/sandbox/landlock.js.map +1 -1
  102. package/dist/src/integrations/self-improvement.d.ts +90 -0
  103. package/dist/src/integrations/self-improvement.d.ts.map +1 -0
  104. package/dist/src/integrations/self-improvement.js +229 -0
  105. package/dist/src/integrations/self-improvement.js.map +1 -0
  106. package/dist/src/integrations/smart-decomposer.d.ts +22 -1
  107. package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
  108. package/dist/src/integrations/smart-decomposer.js +127 -28
  109. package/dist/src/integrations/smart-decomposer.js.map +1 -1
  110. package/dist/src/integrations/subagent-output-store.d.ts +91 -0
  111. package/dist/src/integrations/subagent-output-store.d.ts.map +1 -0
  112. package/dist/src/integrations/subagent-output-store.js +257 -0
  113. package/dist/src/integrations/subagent-output-store.js.map +1 -0
  114. package/dist/src/integrations/swarm/index.d.ts +2 -2
  115. package/dist/src/integrations/swarm/index.d.ts.map +1 -1
  116. package/dist/src/integrations/swarm/index.js +1 -1
  117. package/dist/src/integrations/swarm/index.js.map +1 -1
  118. package/dist/src/integrations/swarm/model-selector.d.ts +16 -0
  119. package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
  120. package/dist/src/integrations/swarm/model-selector.js +123 -10
  121. package/dist/src/integrations/swarm/model-selector.js.map +1 -1
  122. package/dist/src/integrations/swarm/swarm-budget.d.ts +4 -0
  123. package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -1
  124. package/dist/src/integrations/swarm/swarm-budget.js +6 -0
  125. package/dist/src/integrations/swarm/swarm-budget.js.map +1 -1
  126. package/dist/src/integrations/swarm/swarm-config-loader.d.ts +10 -1
  127. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
  128. package/dist/src/integrations/swarm/swarm-config-loader.js +226 -13
  129. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
  130. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +12 -1
  131. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
  132. package/dist/src/integrations/swarm/swarm-event-bridge.js +178 -9
  133. package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
  134. package/dist/src/integrations/swarm/swarm-events.d.ts +66 -1
  135. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
  136. package/dist/src/integrations/swarm/swarm-events.js +26 -5
  137. package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
  138. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +127 -0
  139. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
  140. package/dist/src/integrations/swarm/swarm-orchestrator.js +1842 -47
  141. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
  142. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts +91 -3
  143. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -1
  144. package/dist/src/integrations/swarm/swarm-quality-gate.js +395 -19
  145. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
  146. package/dist/src/integrations/swarm/task-queue.d.ts +55 -1
  147. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
  148. package/dist/src/integrations/swarm/task-queue.js +389 -16
  149. package/dist/src/integrations/swarm/task-queue.js.map +1 -1
  150. package/dist/src/integrations/swarm/types.d.ts +247 -11
  151. package/dist/src/integrations/swarm/types.d.ts.map +1 -1
  152. package/dist/src/integrations/swarm/types.js +67 -9
  153. package/dist/src/integrations/swarm/types.js.map +1 -1
  154. package/dist/src/integrations/swarm/worker-pool.d.ts +18 -5
  155. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
  156. package/dist/src/integrations/swarm/worker-pool.js +236 -34
  157. package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
  158. package/dist/src/integrations/thinking-strategy.d.ts +52 -0
  159. package/dist/src/integrations/thinking-strategy.d.ts.map +1 -0
  160. package/dist/src/integrations/thinking-strategy.js +129 -0
  161. package/dist/src/integrations/thinking-strategy.js.map +1 -0
  162. package/dist/src/integrations/tool-recommendation.d.ts +61 -0
  163. package/dist/src/integrations/tool-recommendation.d.ts.map +1 -0
  164. package/dist/src/integrations/tool-recommendation.js +268 -0
  165. package/dist/src/integrations/tool-recommendation.js.map +1 -0
  166. package/dist/src/integrations/verification-gate.d.ts +80 -0
  167. package/dist/src/integrations/verification-gate.d.ts.map +1 -0
  168. package/dist/src/integrations/verification-gate.js +146 -0
  169. package/dist/src/integrations/verification-gate.js.map +1 -0
  170. package/dist/src/integrations/work-log.d.ts +87 -0
  171. package/dist/src/integrations/work-log.d.ts.map +1 -0
  172. package/dist/src/integrations/work-log.js +275 -0
  173. package/dist/src/integrations/work-log.js.map +1 -0
  174. package/dist/src/main.js +31 -5
  175. package/dist/src/main.js.map +1 -1
  176. package/dist/src/modes/repl.d.ts.map +1 -1
  177. package/dist/src/modes/repl.js +10 -4
  178. package/dist/src/modes/repl.js.map +1 -1
  179. package/dist/src/modes/tui.d.ts.map +1 -1
  180. package/dist/src/modes/tui.js +5 -0
  181. package/dist/src/modes/tui.js.map +1 -1
  182. package/dist/src/modes.d.ts +6 -0
  183. package/dist/src/modes.d.ts.map +1 -1
  184. package/dist/src/modes.js +69 -21
  185. package/dist/src/modes.js.map +1 -1
  186. package/dist/src/tools/agent.d.ts.map +1 -1
  187. package/dist/src/tools/agent.js +11 -2
  188. package/dist/src/tools/agent.js.map +1 -1
  189. package/dist/src/tools/bash.d.ts +9 -3
  190. package/dist/src/tools/bash.d.ts.map +1 -1
  191. package/dist/src/tools/bash.js +12 -0
  192. package/dist/src/tools/bash.js.map +1 -1
  193. package/dist/src/tools/coercion.d.ts +6 -0
  194. package/dist/src/tools/coercion.d.ts.map +1 -1
  195. package/dist/src/tools/coercion.js +13 -0
  196. package/dist/src/tools/coercion.js.map +1 -1
  197. package/dist/src/tools/file.d.ts +2 -2
  198. package/dist/src/tools/file.js +2 -2
  199. package/dist/src/tools/file.js.map +1 -1
  200. package/dist/src/tools/permission.d.ts.map +1 -1
  201. package/dist/src/tools/permission.js +4 -111
  202. package/dist/src/tools/permission.js.map +1 -1
  203. package/dist/src/tools/standard.d.ts +17 -1
  204. package/dist/src/tools/standard.d.ts.map +1 -1
  205. package/dist/src/tools/standard.js +64 -11
  206. package/dist/src/tools/standard.js.map +1 -1
  207. package/dist/src/tracing/trace-collector.d.ts +167 -0
  208. package/dist/src/tracing/trace-collector.d.ts.map +1 -1
  209. package/dist/src/tracing/trace-collector.js +137 -0
  210. package/dist/src/tracing/trace-collector.js.map +1 -1
  211. package/dist/src/tracing/types.d.ts +105 -1
  212. package/dist/src/tracing/types.d.ts.map +1 -1
  213. package/dist/src/tracing/types.js.map +1 -1
  214. package/dist/src/tui/app.d.ts.map +1 -1
  215. package/dist/src/tui/app.js +34 -5
  216. package/dist/src/tui/app.js.map +1 -1
  217. package/dist/src/types.d.ts +89 -0
  218. package/dist/src/types.d.ts.map +1 -1
  219. package/package.json +6 -2
@@ -0,0 +1,141 @@
1
+ /**
2
+ * MCP Tool Description Validator
3
+ *
4
+ * Validates MCP tool descriptions for quality, helping ensure
5
+ * that LLMs can understand and correctly use the tools.
6
+ *
7
+ * Quality checks:
8
+ * 1. Description length (minimum useful length)
9
+ * 2. Input schema has property descriptions
10
+ * 3. Required parameters are marked
11
+ * 4. Description contains usage patterns
12
+ * 5. Naming conventions (snake_case, prefixed)
13
+ */
14
+ // =============================================================================
15
+ // CONSTANTS
16
+ // =============================================================================
17
+ const DEFAULT_CONFIG = {
18
+ minDescriptionLength: 20,
19
+ requirePropertyDescriptions: true,
20
+ requireExamples: false,
21
+ minimumPassScore: 40,
22
+ };
23
+ // =============================================================================
24
+ // VALIDATOR
25
+ // =============================================================================
26
+ /**
27
+ * Validate a single tool's description quality.
28
+ */
29
+ export function validateToolDescription(tool, config) {
30
+ const cfg = { ...DEFAULT_CONFIG, ...config };
31
+ const issues = [];
32
+ const suggestions = [];
33
+ let score = 100;
34
+ const description = tool.description || '';
35
+ // Check 1: Description exists and has minimum length
36
+ if (!description) {
37
+ issues.push('No description provided');
38
+ score -= 40;
39
+ }
40
+ else if (description.length < cfg.minDescriptionLength) {
41
+ issues.push(`Description too short (${description.length} chars, min: ${cfg.minDescriptionLength})`);
42
+ suggestions.push('Add more detail about what this tool does and when to use it');
43
+ score -= 20;
44
+ }
45
+ // Check 2: Description is informative (not just tool name restated)
46
+ if (description && tool.name) {
47
+ const nameWords = tool.name.replace(/[_-]/g, ' ').toLowerCase().split(/\s+/);
48
+ const descWords = description.toLowerCase().split(/\s+/);
49
+ const overlap = nameWords.filter(w => descWords.includes(w)).length;
50
+ if (overlap === nameWords.length && description.split(/\s+/).length < 5) {
51
+ issues.push('Description merely restates the tool name');
52
+ suggestions.push('Explain what the tool does, its purpose, and any important behavior');
53
+ score -= 15;
54
+ }
55
+ }
56
+ // Check 3: Input schema has property descriptions
57
+ if (cfg.requirePropertyDescriptions && tool.inputSchema) {
58
+ const properties = tool.inputSchema.properties;
59
+ if (properties) {
60
+ const undocumented = [];
61
+ for (const [propName, propSchema] of Object.entries(properties)) {
62
+ if (!propSchema.description) {
63
+ undocumented.push(propName);
64
+ }
65
+ }
66
+ if (undocumented.length > 0) {
67
+ issues.push(`Properties missing descriptions: ${undocumented.join(', ')}`);
68
+ suggestions.push('Add "description" to each property in the input schema');
69
+ score -= Math.min(undocumented.length * 5, 20);
70
+ }
71
+ }
72
+ }
73
+ // Check 4: Required parameters are specified
74
+ if (tool.inputSchema) {
75
+ const required = tool.inputSchema.required;
76
+ const properties = tool.inputSchema.properties;
77
+ if (properties && Object.keys(properties).length > 0 && (!required || required.length === 0)) {
78
+ suggestions.push('Consider marking required parameters in the schema');
79
+ score -= 5;
80
+ }
81
+ }
82
+ // Check 5: Description mentions examples or usage patterns
83
+ if (cfg.requireExamples && description) {
84
+ const hasExample = /example|e\.g\.|for instance|usage:|such as/i.test(description);
85
+ if (!hasExample) {
86
+ suggestions.push('Add a usage example to the description');
87
+ score -= 10;
88
+ }
89
+ }
90
+ // Check 6: Naming conventions
91
+ if (tool.name) {
92
+ const isSnakeCase = /^[a-z][a-z0-9_]*$/.test(tool.name);
93
+ const hasMCPPrefix = tool.name.startsWith('mcp_');
94
+ if (!isSnakeCase && !hasMCPPrefix) {
95
+ suggestions.push('Consider using snake_case for tool names');
96
+ score -= 5;
97
+ }
98
+ }
99
+ return {
100
+ toolName: tool.name,
101
+ score: Math.max(0, score),
102
+ issues,
103
+ suggestions,
104
+ };
105
+ }
106
+ /**
107
+ * Validate all tools and return results sorted by score (worst first).
108
+ */
109
+ export function validateAllTools(tools, config) {
110
+ return tools
111
+ .map(tool => validateToolDescription(tool, config))
112
+ .sort((a, b) => a.score - b.score);
113
+ }
114
+ /**
115
+ * Get a summary of validation results.
116
+ */
117
+ export function formatValidationSummary(results) {
118
+ const passed = results.filter(r => r.score >= (DEFAULT_CONFIG.minimumPassScore));
119
+ const failed = results.filter(r => r.score < (DEFAULT_CONFIG.minimumPassScore));
120
+ const lines = [
121
+ `Tool Description Quality: ${passed.length}/${results.length} passed`,
122
+ ];
123
+ if (failed.length > 0) {
124
+ lines.push('', 'Failed:');
125
+ for (const r of failed) {
126
+ lines.push(` ${r.toolName} (score: ${r.score}): ${r.issues.join('; ')}`);
127
+ }
128
+ }
129
+ return lines.join('\n');
130
+ }
131
+ /**
132
+ * Create a tool validator.
133
+ */
134
+ export function createToolValidator(config) {
135
+ return {
136
+ validate: (tool) => validateToolDescription(tool, config),
137
+ validateAll: (tools) => validateAllTools(tools, config),
138
+ formatSummary: formatValidationSummary,
139
+ };
140
+ }
141
+ //# sourceMappingURL=mcp-tool-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-validator.js","sourceRoot":"","sources":["../../../src/integrations/mcp-tool-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Unified policy engine.
3
+ *
4
+ * Resolves effective tool/bash/approval behavior from profiles plus
5
+ * compatibility mappings from legacy config fields.
6
+ */
7
+ import type { PolicyEngineConfig, PolicyProfile, SandboxConfig } from '../types.js';
8
+ import type { SwarmConfig, SwarmWorkerSpec } from './swarm/types.js';
9
+ export declare const DEFAULT_POLICY_PROFILES: Record<string, PolicyProfile>;
10
+ export declare const DEFAULT_POLICY_ENGINE_CONFIG: Required<Pick<PolicyEngineConfig, 'enabled' | 'legacyFallback' | 'defaultProfile' | 'defaultSwarmProfile'>>;
11
+ export interface ResolvePolicyProfileOptions {
12
+ policyEngine?: PolicyEngineConfig | false;
13
+ requestedProfile?: string;
14
+ swarmConfig?: SwarmConfig;
15
+ worker?: SwarmWorkerSpec;
16
+ taskType?: string;
17
+ sandboxConfig?: SandboxConfig;
18
+ isSwarmWorker?: boolean;
19
+ legacyAllowedTools?: string[];
20
+ legacyDeniedTools?: string[];
21
+ globalDeniedTools?: string[];
22
+ }
23
+ export interface ResolvedPolicyProfile {
24
+ profileName: string;
25
+ profile: PolicyProfile;
26
+ metadata: {
27
+ selectionSource: 'explicit' | 'worker-capability' | 'task-type' | 'default';
28
+ usedLegacyMappings: boolean;
29
+ legacyMappingSources: string[];
30
+ warnings: string[];
31
+ };
32
+ }
33
+ export declare function resolvePolicyProfile(options: ResolvePolicyProfileOptions): ResolvedPolicyProfile;
34
+ export declare function isToolAllowedByProfile(toolName: string, profile: PolicyProfile): {
35
+ allowed: boolean;
36
+ reason?: string;
37
+ };
38
+ export declare function evaluateBashCommandByProfile(command: string, profile: PolicyProfile, taskType?: string): {
39
+ allowed: boolean;
40
+ reason?: string;
41
+ };
42
+ export declare function mergeApprovalScopeWithProfile(scope: {
43
+ autoApprove: string[];
44
+ scopedApprove: Record<string, {
45
+ paths: string[];
46
+ }>;
47
+ requireApproval: string[];
48
+ }, profile: PolicyProfile): {
49
+ autoApprove: string[];
50
+ scopedApprove: Record<string, {
51
+ paths: string[];
52
+ }>;
53
+ requireApproval: string[];
54
+ };
55
+ //# sourceMappingURL=policy-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-engine.d.ts","sourceRoot":"","sources":["../../../src/integrations/policy-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIrE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA0BjE,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CACjD,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,qBAAqB,CAAC,CAMlG,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,YAAY,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE;QACR,eAAe,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,SAAS,CAAC;QAC5E,kBAAkB,EAAE,OAAO,CAAC;QAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAiHD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,qBAAqB,CAyFhG;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAevC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAevC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE;IACL,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,EACD,OAAO,EAAE,aAAa,GACrB;IACD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAMA"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Unified policy engine.
3
+ *
4
+ * Resolves effective tool/bash/approval behavior from profiles plus
5
+ * compatibility mappings from legacy config fields.
6
+ */
7
+ import { getTaskTypeConfig } from './swarm/types.js';
8
+ import { evaluateBashPolicy } from './bash-policy.js';
9
+ export const DEFAULT_POLICY_PROFILES = {
10
+ 'research-safe': {
11
+ toolAccessMode: 'whitelist',
12
+ allowedTools: ['read_file', 'list_files', 'glob', 'grep', 'web_search', 'write_file', 'bash', 'task_get', 'task_list'],
13
+ deniedTools: ['delete_file'],
14
+ bashMode: 'read_only',
15
+ bashWriteProtection: 'block_file_mutation',
16
+ },
17
+ 'code-strict-bash': {
18
+ toolAccessMode: 'whitelist',
19
+ allowedTools: ['read_file', 'write_file', 'edit_file', 'list_files', 'glob', 'grep', 'bash', 'web_search', 'task_create', 'task_update', 'task_get', 'task_list'],
20
+ bashMode: 'full',
21
+ bashWriteProtection: 'block_file_mutation',
22
+ },
23
+ 'code-full': {
24
+ toolAccessMode: 'all',
25
+ bashMode: 'full',
26
+ bashWriteProtection: 'off',
27
+ },
28
+ 'review-safe': {
29
+ toolAccessMode: 'whitelist',
30
+ allowedTools: ['read_file', 'list_files', 'glob', 'grep', 'web_search', 'task_get', 'task_list'],
31
+ deniedTools: ['write_file', 'edit_file', 'delete_file', 'bash'],
32
+ bashMode: 'disabled',
33
+ bashWriteProtection: 'block_file_mutation',
34
+ },
35
+ };
36
+ export const DEFAULT_POLICY_ENGINE_CONFIG = {
37
+ enabled: true,
38
+ legacyFallback: true,
39
+ defaultProfile: 'code-full',
40
+ defaultSwarmProfile: 'code-strict-bash',
41
+ };
42
+ function mergeProfiles(...profiles) {
43
+ const merged = {};
44
+ for (const p of profiles) {
45
+ if (!p)
46
+ continue;
47
+ merged.toolAccessMode = p.toolAccessMode ?? merged.toolAccessMode;
48
+ merged.allowedTools = p.allowedTools ?? merged.allowedTools;
49
+ merged.deniedTools = p.deniedTools ?? merged.deniedTools;
50
+ merged.bashMode = p.bashMode ?? merged.bashMode;
51
+ merged.bashWriteProtection = p.bashWriteProtection ?? merged.bashWriteProtection;
52
+ if (p.approval) {
53
+ merged.approval = {
54
+ autoApprove: p.approval.autoApprove ?? merged.approval?.autoApprove,
55
+ scopedApprove: p.approval.scopedApprove ?? merged.approval?.scopedApprove,
56
+ requireApproval: p.approval.requireApproval ?? merged.approval?.requireApproval,
57
+ };
58
+ }
59
+ }
60
+ return merged;
61
+ }
62
+ function inferSwarmProfileForTask(taskType, swarmConfig) {
63
+ if (!taskType)
64
+ return 'code-strict-bash';
65
+ // V7: Use configurable policyProfile from TaskTypeConfig
66
+ const typeConfig = getTaskTypeConfig(taskType, swarmConfig);
67
+ return typeConfig.policyProfile ?? 'code-strict-bash';
68
+ }
69
+ function inferSwarmProfileForWorker(worker) {
70
+ if (!worker?.capabilities || worker.capabilities.length === 0)
71
+ return undefined;
72
+ const caps = new Set(worker.capabilities);
73
+ if (caps.has('code') || caps.has('write') || caps.has('test') || caps.has('document')) {
74
+ return 'code-strict-bash';
75
+ }
76
+ if (caps.has('review')) {
77
+ return 'review-safe';
78
+ }
79
+ if (caps.has('research')) {
80
+ return 'research-safe';
81
+ }
82
+ return undefined;
83
+ }
84
+ function applyLegacyMappings(profile, options) {
85
+ const merged = { ...profile };
86
+ const metadata = {
87
+ selectionSource: 'default',
88
+ usedLegacyMappings: false,
89
+ legacyMappingSources: [],
90
+ warnings: [],
91
+ };
92
+ const legacyAllowed = options.legacyAllowedTools ?? options.worker?.allowedTools;
93
+ if (legacyAllowed && legacyAllowed.length > 0) {
94
+ merged.toolAccessMode = 'whitelist';
95
+ merged.allowedTools = [...legacyAllowed];
96
+ metadata.usedLegacyMappings = true;
97
+ metadata.legacyMappingSources.push('legacyAllowedTools');
98
+ metadata.warnings.push('Legacy tool whitelist is active. Migrate to policyProfiles + worker.policyProfile.');
99
+ }
100
+ const denied = [
101
+ ...(merged.deniedTools ?? []),
102
+ ...(options.legacyDeniedTools ?? options.worker?.deniedTools ?? []),
103
+ ...(options.globalDeniedTools ?? options.swarmConfig?.globalDeniedTools ?? []),
104
+ ];
105
+ if (denied.length > 0) {
106
+ merged.deniedTools = [...new Set(denied)];
107
+ metadata.usedLegacyMappings = true;
108
+ metadata.legacyMappingSources.push('legacyDeniedTools/globalDeniedTools');
109
+ metadata.warnings.push('Legacy denied tools are active. Migrate to policyProfiles[].deniedTools.');
110
+ }
111
+ if (options.sandboxConfig?.blockFileCreationViaBash) {
112
+ merged.bashWriteProtection = 'block_file_mutation';
113
+ metadata.usedLegacyMappings = true;
114
+ metadata.legacyMappingSources.push('sandbox.blockFileCreationViaBash');
115
+ metadata.warnings.push('sandbox.blockFileCreationViaBash is legacy compatibility behavior. Use policy profile bashWriteProtection.');
116
+ }
117
+ if (options.sandboxConfig?.bashMode) {
118
+ merged.bashMode = options.sandboxConfig.bashMode;
119
+ metadata.usedLegacyMappings = true;
120
+ metadata.legacyMappingSources.push('sandbox.bashMode');
121
+ metadata.warnings.push('sandbox.bashMode override is active. Prefer profile-level bashMode.');
122
+ }
123
+ if (options.sandboxConfig?.bashWriteProtection) {
124
+ merged.bashWriteProtection = options.sandboxConfig.bashWriteProtection;
125
+ metadata.usedLegacyMappings = true;
126
+ metadata.legacyMappingSources.push('sandbox.bashWriteProtection');
127
+ metadata.warnings.push('sandbox.bashWriteProtection override is active. Prefer profile-level bashWriteProtection.');
128
+ }
129
+ return { profile: merged, metadata };
130
+ }
131
+ export function resolvePolicyProfile(options) {
132
+ const policyEngine = options.policyEngine || undefined;
133
+ const legacyFallback = policyEngine?.legacyFallback ?? DEFAULT_POLICY_ENGINE_CONFIG.legacyFallback;
134
+ const mergedProfiles = {
135
+ ...DEFAULT_POLICY_PROFILES,
136
+ ...(policyEngine?.profiles ?? {}),
137
+ ...(options.swarmConfig?.policyProfiles ?? {}),
138
+ };
139
+ // Apply profileExtensions (additive patches from YAML)
140
+ const extensions = options.swarmConfig?.profileExtensions;
141
+ if (extensions) {
142
+ for (const [profileName, ext] of Object.entries(extensions)) {
143
+ const target = mergedProfiles[profileName];
144
+ if (!target)
145
+ continue;
146
+ if (ext.addTools?.length && target.allowedTools) {
147
+ target.allowedTools = [...new Set([...target.allowedTools, ...ext.addTools])];
148
+ // If you explicitly add a tool, remove it from deniedTools so it actually works
149
+ if (target.deniedTools) {
150
+ target.deniedTools = target.deniedTools.filter(t => !ext.addTools.includes(t));
151
+ }
152
+ }
153
+ if (ext.removeTools?.length) {
154
+ if (target.allowedTools) {
155
+ target.allowedTools = target.allowedTools.filter(t => !ext.removeTools.includes(t));
156
+ }
157
+ // Also add removed tools to deniedTools for belt-and-suspenders
158
+ target.deniedTools = [...new Set([...(target.deniedTools ?? []), ...ext.removeTools])];
159
+ }
160
+ }
161
+ }
162
+ const defaultProfileName = options.isSwarmWorker
163
+ ? (policyEngine?.defaultSwarmProfile ?? DEFAULT_POLICY_ENGINE_CONFIG.defaultSwarmProfile)
164
+ : (policyEngine?.defaultProfile ?? DEFAULT_POLICY_ENGINE_CONFIG.defaultProfile);
165
+ let selectionSource = 'default';
166
+ let requestedProfile = defaultProfileName;
167
+ if (options.requestedProfile || options.worker?.policyProfile) {
168
+ requestedProfile = options.requestedProfile ?? options.worker?.policyProfile ?? defaultProfileName;
169
+ selectionSource = 'explicit';
170
+ }
171
+ else if (options.isSwarmWorker) {
172
+ const workerInferred = inferSwarmProfileForWorker(options.worker);
173
+ if (workerInferred) {
174
+ requestedProfile = workerInferred;
175
+ selectionSource = 'worker-capability';
176
+ }
177
+ else if (options.taskType) {
178
+ requestedProfile = inferSwarmProfileForTask(options.taskType, options.swarmConfig);
179
+ selectionSource = 'task-type';
180
+ }
181
+ else {
182
+ requestedProfile = defaultProfileName;
183
+ selectionSource = 'default';
184
+ }
185
+ }
186
+ const base = mergedProfiles[defaultProfileName] ?? DEFAULT_POLICY_PROFILES['code-full'];
187
+ const requested = mergedProfiles[requestedProfile] ?? base;
188
+ const merged = mergeProfiles(base, requested);
189
+ const { profile: effective, metadata } = legacyFallback
190
+ ? applyLegacyMappings(merged, options)
191
+ : {
192
+ profile: merged,
193
+ metadata: {
194
+ selectionSource: 'default',
195
+ usedLegacyMappings: false,
196
+ legacyMappingSources: [],
197
+ warnings: [],
198
+ },
199
+ };
200
+ // Merge worker.extraTools into the profile whitelist (additive, overrides deniedTools)
201
+ if (options.worker?.extraTools?.length && effective.toolAccessMode === 'whitelist' && effective.allowedTools) {
202
+ effective.allowedTools = [...new Set([...effective.allowedTools, ...options.worker.extraTools])];
203
+ // If you explicitly add a tool via extraTools, remove it from deniedTools so it actually works
204
+ if (effective.deniedTools) {
205
+ effective.deniedTools = effective.deniedTools.filter(t => !options.worker.extraTools.includes(t));
206
+ }
207
+ }
208
+ return {
209
+ profileName: requestedProfile,
210
+ profile: effective,
211
+ metadata: {
212
+ ...metadata,
213
+ selectionSource,
214
+ },
215
+ };
216
+ }
217
+ export function isToolAllowedByProfile(toolName, profile) {
218
+ const mode = profile.toolAccessMode ?? 'all';
219
+ if (mode === 'whitelist') {
220
+ const allowed = profile.allowedTools ?? [];
221
+ if (!allowed.includes(toolName)) {
222
+ return { allowed: false, reason: `Tool '${toolName}' is not allowed by policy whitelist.` };
223
+ }
224
+ }
225
+ if ((profile.deniedTools ?? []).includes(toolName)) {
226
+ return { allowed: false, reason: `Tool '${toolName}' is denied by policy profile.` };
227
+ }
228
+ return { allowed: true };
229
+ }
230
+ export function evaluateBashCommandByProfile(command, profile, taskType) {
231
+ let mode = profile.bashMode ?? 'full';
232
+ if (mode === 'task_scoped') {
233
+ mode = ['implement', 'test', 'refactor', 'integrate', 'deploy', 'document'].includes(taskType ?? '')
234
+ ? 'read_only'
235
+ : 'disabled';
236
+ }
237
+ const decision = evaluateBashPolicy(command, mode, profile.bashWriteProtection ?? 'off');
238
+ return { allowed: decision.allowed, reason: decision.reason };
239
+ }
240
+ export function mergeApprovalScopeWithProfile(scope, profile) {
241
+ return {
242
+ autoApprove: [...new Set([...(scope.autoApprove ?? []), ...(profile.approval?.autoApprove ?? [])])],
243
+ scopedApprove: { ...(scope.scopedApprove ?? {}), ...(profile.approval?.scopedApprove ?? {}) },
244
+ requireApproval: [...new Set([...(scope.requireApproval ?? []), ...(profile.approval?.requireApproval ?? [])])],
245
+ };
246
+ }
247
+ //# sourceMappingURL=policy-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../../src/integrations/policy-engine.ts"],"names":[],"mappings":"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"}
@@ -4,13 +4,14 @@
4
4
  * Integrates sandboxing (Lesson 20) and human-in-the-loop (Lesson 21)
5
5
  * into the production agent. Provides execution safety and approval workflows.
6
6
  */
7
- import type { SandboxConfig, HumanInLoopConfig, ToolCall } from '../types.js';
7
+ import type { SandboxConfig, PolicyEngineConfig, HumanInLoopConfig, ToolCall } from '../types.js';
8
8
  /**
9
9
  * Manages sandboxed execution of tools.
10
10
  */
11
11
  export declare class SandboxManager {
12
12
  private config;
13
- constructor(config: SandboxConfig);
13
+ private policyEngineConfig?;
14
+ constructor(config: SandboxConfig, policyEngineConfig?: PolicyEngineConfig | false);
14
15
  /**
15
16
  * Check if a command is allowed.
16
17
  */
@@ -104,7 +105,7 @@ export declare class HumanInLoopManager {
104
105
  export declare class SafetyManager {
105
106
  sandbox: SandboxManager | null;
106
107
  humanInLoop: HumanInLoopManager | null;
107
- constructor(sandboxConfig: SandboxConfig | false, hilConfig: HumanInLoopConfig | false);
108
+ constructor(sandboxConfig: SandboxConfig | false, hilConfig: HumanInLoopConfig | false, policyEngineConfig?: PolicyEngineConfig | false);
108
109
  /**
109
110
  * Validate a tool call against all safety rules.
110
111
  */
@@ -168,6 +169,6 @@ interface AuditSummary {
168
169
  high: number;
169
170
  };
170
171
  }
171
- export declare function createSafetyManager(sandboxConfig: SandboxConfig | false, hilConfig: HumanInLoopConfig | false): SafetyManager;
172
+ export declare function createSafetyManager(sandboxConfig: SandboxConfig | false, hilConfig: HumanInLoopConfig | false, policyEngineConfig?: PolicyEngineConfig | false): SafetyManager;
172
173
  export {};
173
174
  //# sourceMappingURL=safety.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/integrations/safety.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/integrations/safety.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import { resolve, isAbsolute, dirname } from 'node:path';
8
8
  import { realpathSync, existsSync, lstatSync } from 'node:fs';
9
+ import { evaluateBashCommandByProfile, isToolAllowedByProfile, resolvePolicyProfile, } from './policy-engine.js';
10
+ import { stripCdPrefix } from './bash-policy.js';
9
11
  // =============================================================================
10
12
  // SANDBOX MANAGER
11
13
  // =============================================================================
@@ -14,13 +16,23 @@ import { realpathSync, existsSync, lstatSync } from 'node:fs';
14
16
  */
15
17
  export class SandboxManager {
16
18
  config;
17
- constructor(config) {
19
+ policyEngineConfig;
20
+ constructor(config, policyEngineConfig) {
18
21
  this.config = config;
22
+ this.policyEngineConfig = policyEngineConfig || undefined;
19
23
  }
20
24
  /**
21
25
  * Check if a command is allowed.
22
26
  */
23
27
  isCommandAllowed(command) {
28
+ const { profile } = resolvePolicyProfile({
29
+ policyEngine: this.policyEngineConfig,
30
+ sandboxConfig: this.config,
31
+ });
32
+ const policyDecision = evaluateBashCommandByProfile(command, profile);
33
+ if (!policyDecision.allowed) {
34
+ return { allowed: false, reason: policyDecision.reason };
35
+ }
24
36
  // Check blocked patterns first
25
37
  for (const blocked of this.config.blockedCommands || []) {
26
38
  if (command.includes(blocked)) {
@@ -29,9 +41,14 @@ export class SandboxManager {
29
41
  }
30
42
  // Check allowed commands
31
43
  const allowedCommands = this.config.allowedCommands || [];
32
- const commandBase = command.split(' ')[0];
44
+ const effective = stripCdPrefix(command);
45
+ const commandBase = effective.split(' ')[0];
33
46
  if (allowedCommands.length > 0 && !allowedCommands.includes(commandBase)) {
34
- return { allowed: false, reason: `Command not in allowlist: ${commandBase}` };
47
+ const suggestions = allowedCommands.slice(0, 10).join(', ');
48
+ return {
49
+ allowed: false,
50
+ reason: `Command '${commandBase}' is not in the sandbox allowlist. Use built-in tools (read_file, write_file, edit_file, glob, grep) instead, or use bash with an allowed command: ${suggestions}...`,
51
+ };
35
52
  }
36
53
  return { allowed: true };
37
54
  }
@@ -131,6 +148,14 @@ export class SandboxManager {
131
148
  */
132
149
  validateToolCall(toolCall) {
133
150
  const args = toolCall.arguments;
151
+ const { profile } = resolvePolicyProfile({
152
+ policyEngine: this.policyEngineConfig,
153
+ sandboxConfig: this.config,
154
+ });
155
+ const toolDecision = isToolAllowedByProfile(toolCall.name, profile);
156
+ if (!toolDecision.allowed) {
157
+ return { valid: false, reason: toolDecision.reason };
158
+ }
134
159
  // Check for command execution tools
135
160
  if (toolCall.name === 'bash' || toolCall.name === 'shell' || toolCall.name === 'execute') {
136
161
  const command = String(args.command || args.cmd || '');
@@ -390,9 +415,9 @@ export class HumanInLoopManager {
390
415
  export class SafetyManager {
391
416
  sandbox = null;
392
417
  humanInLoop = null;
393
- constructor(sandboxConfig, hilConfig) {
418
+ constructor(sandboxConfig, hilConfig, policyEngineConfig) {
394
419
  if (sandboxConfig && sandboxConfig.enabled !== false) {
395
- this.sandbox = new SandboxManager(sandboxConfig);
420
+ this.sandbox = new SandboxManager(sandboxConfig, policyEngineConfig);
396
421
  }
397
422
  if (hilConfig && hilConfig.enabled !== false) {
398
423
  this.humanInLoop = new HumanInLoopManager(hilConfig);
@@ -439,7 +464,7 @@ export class SafetyManager {
439
464
  // =============================================================================
440
465
  // FACTORY
441
466
  // =============================================================================
442
- export function createSafetyManager(sandboxConfig, hilConfig) {
443
- return new SafetyManager(sandboxConfig, hilConfig);
467
+ export function createSafetyManager(sandboxConfig, hilConfig, policyEngineConfig) {
468
+ return new SafetyManager(sandboxConfig, hilConfig, policyEngineConfig);
444
469
  }
445
470
  //# sourceMappingURL=safety.js.map