@fractary/faber 1.1.0 → 1.2.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.
package/README.md CHANGED
@@ -6,6 +6,18 @@
6
6
  [![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](package.json)
7
7
  [![TypeScript](https://img.shields.io/badge/typescript-5.3.3-blue)](https://www.typescriptlang.org/)
8
8
 
9
+ ## ⚠️ Migration Notice
10
+
11
+ **Python agent/tool definitions are being migrated to [@fractary/forge](https://github.com/fractary/forge).**
12
+
13
+ Starting with FABER v1.x, agent and tool definitions will be managed by Forge:
14
+ - **v1.x**: Dual-mode support (legacy Python + Forge TypeScript)
15
+ - **v2.0**: Forge required, Python definitions removed
16
+
17
+ For migration instructions, see [docs/MIGRATION-FABER-FORGE.md](docs/MIGRATION-FABER-FORGE.md).
18
+
19
+ ---
20
+
9
21
  ## What is FABER?
10
22
 
11
23
  **FABER enables AI agents to do meaningful work autonomously while knowing exactly when to involve humans.**
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fractary/faber - Forge Integration Tests
3
+ *
4
+ * Integration tests for FABER + Forge workflow execution
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=forge-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/forge-integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,370 @@
1
+ "use strict";
2
+ /**
3
+ * @fractary/faber - Forge Integration Tests
4
+ *
5
+ * Integration tests for FABER + Forge workflow execution
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const faber_1 = require("../../workflow/faber");
9
+ const agent_executor_1 = require("../../workflow/agent-executor");
10
+ // Mock @fractary/forge
11
+ jest.mock('@fractary/forge', () => ({
12
+ AgentAPI: jest.fn().mockImplementation(() => ({
13
+ resolveAgent: jest.fn().mockResolvedValue({
14
+ name: 'test-agent',
15
+ version: '1.0.0',
16
+ invoke: jest.fn().mockResolvedValue({
17
+ output: 'Agent execution successful',
18
+ structured_output: {
19
+ workType: 'feature',
20
+ summary: 'Test summary',
21
+ },
22
+ messages: [],
23
+ usage: {
24
+ input_tokens: 100,
25
+ output_tokens: 50,
26
+ },
27
+ }),
28
+ }),
29
+ hasAgent: jest.fn().mockResolvedValue(true),
30
+ healthCheck: jest.fn().mockResolvedValue({
31
+ healthy: true,
32
+ agent: 'test-agent',
33
+ checks: {
34
+ definition: { passed: true },
35
+ tools: { passed: true },
36
+ llm: { passed: true, provider: 'anthropic' },
37
+ cache_sources: { passed: true },
38
+ },
39
+ duration_ms: 50,
40
+ }),
41
+ })),
42
+ }));
43
+ describe('FABER + Forge Integration', () => {
44
+ describe('Workflow Configuration', () => {
45
+ it('should create workflow with Forge enabled', () => {
46
+ const workflow = new faber_1.FaberWorkflow({
47
+ config: {
48
+ forge: { enabled: true, prefer_local: true },
49
+ },
50
+ });
51
+ // Workflow should be created successfully
52
+ expect(workflow).toBeInstanceOf(faber_1.FaberWorkflow);
53
+ });
54
+ it('should create workflow with Forge disabled (legacy mode)', () => {
55
+ const workflow = new faber_1.FaberWorkflow({
56
+ config: {
57
+ forge: { enabled: false, prefer_local: true },
58
+ },
59
+ });
60
+ expect(workflow).toBeInstanceOf(faber_1.FaberWorkflow);
61
+ });
62
+ it('should default to legacy mode for backward compatibility', () => {
63
+ const workflow = new faber_1.FaberWorkflow();
64
+ // Default config should have forge disabled
65
+ expect(workflow).toBeInstanceOf(faber_1.FaberWorkflow);
66
+ });
67
+ });
68
+ describe('Agent Resolution', () => {
69
+ it('should resolve agents from Forge when enabled', async () => {
70
+ const { AgentAPI } = require('@fractary/forge');
71
+ const mockResolveAgent = jest.fn().mockResolvedValue({
72
+ name: 'frame-agent',
73
+ version: '2.0.0',
74
+ invoke: jest.fn().mockResolvedValue({
75
+ output: 'Frame complete',
76
+ messages: [],
77
+ }),
78
+ });
79
+ AgentAPI.mockImplementation(() => ({
80
+ resolveAgent: mockResolveAgent,
81
+ }));
82
+ const executor = new agent_executor_1.AgentExecutor({
83
+ forge: { enabled: true, prefer_local: true },
84
+ });
85
+ const context = {
86
+ workflowId: 'wf-123',
87
+ workId: '456',
88
+ phase: 'frame',
89
+ autonomy: 'assisted',
90
+ issue: null,
91
+ spec: null,
92
+ branch: null,
93
+ previousOutputs: {},
94
+ };
95
+ await executor.executePhaseAgent('frame', 'Analyze requirements', context);
96
+ expect(mockResolveAgent).toHaveBeenCalledWith('frame-agent');
97
+ });
98
+ it('should handle agent not found gracefully', async () => {
99
+ const { AgentAPI } = require('@fractary/forge');
100
+ const error = new Error('Agent not found');
101
+ error.name = 'AgentNotFoundError';
102
+ AgentAPI.mockImplementation(() => ({
103
+ resolveAgent: jest.fn().mockRejectedValue(error),
104
+ }));
105
+ const executor = new agent_executor_1.AgentExecutor({
106
+ forge: { enabled: true, prefer_local: true },
107
+ });
108
+ const context = {
109
+ workflowId: 'wf-123',
110
+ workId: '456',
111
+ phase: 'frame',
112
+ autonomy: 'assisted',
113
+ issue: null,
114
+ spec: null,
115
+ branch: null,
116
+ previousOutputs: {},
117
+ };
118
+ await expect(executor.executePhaseAgent('frame', 'Task', context)).rejects.toThrow(/Agent 'frame-agent' not found/);
119
+ });
120
+ });
121
+ describe('Health Checks', () => {
122
+ it('should perform health check on all phase agents', async () => {
123
+ const { AgentAPI } = require('@fractary/forge');
124
+ const mockHealthCheck = jest.fn().mockResolvedValue({
125
+ healthy: true,
126
+ agent: 'test-agent',
127
+ checks: {
128
+ definition: { passed: true },
129
+ tools: { passed: true },
130
+ llm: { passed: true, provider: 'anthropic' },
131
+ cache_sources: { passed: true },
132
+ },
133
+ duration_ms: 50,
134
+ });
135
+ AgentAPI.mockImplementation(() => ({
136
+ healthCheck: mockHealthCheck,
137
+ }));
138
+ const executor = new agent_executor_1.AgentExecutor({
139
+ forge: { enabled: true, prefer_local: true },
140
+ });
141
+ const result = await executor.healthCheck();
142
+ expect(result.healthy).toBe(true);
143
+ expect(mockHealthCheck).toHaveBeenCalledTimes(5); // 5 FABER phases
144
+ expect(result.phases).toHaveProperty('frame');
145
+ expect(result.phases).toHaveProperty('architect');
146
+ expect(result.phases).toHaveProperty('build');
147
+ expect(result.phases).toHaveProperty('evaluate');
148
+ expect(result.phases).toHaveProperty('release');
149
+ });
150
+ it('should report unhealthy if any agent fails health check', async () => {
151
+ const { AgentAPI } = require('@fractary/forge');
152
+ const mockHealthCheck = jest.fn()
153
+ .mockResolvedValueOnce({ healthy: true })
154
+ .mockResolvedValueOnce({ healthy: false })
155
+ .mockResolvedValueOnce({ healthy: true })
156
+ .mockResolvedValueOnce({ healthy: true })
157
+ .mockResolvedValueOnce({ healthy: true });
158
+ AgentAPI.mockImplementation(() => ({
159
+ healthCheck: mockHealthCheck,
160
+ }));
161
+ const executor = new agent_executor_1.AgentExecutor({
162
+ forge: { enabled: true, prefer_local: true },
163
+ });
164
+ const result = await executor.healthCheck();
165
+ expect(result.healthy).toBe(false);
166
+ expect(result.phases.architect.healthy).toBe(false);
167
+ });
168
+ });
169
+ describe('Custom Agent Override', () => {
170
+ it('should allow custom agent override for specific phases', async () => {
171
+ const { AgentAPI } = require('@fractary/forge');
172
+ const mockResolveAgent = jest.fn().mockResolvedValue({
173
+ name: 'custom-frame-agent',
174
+ version: '1.0.0',
175
+ invoke: jest.fn().mockResolvedValue({
176
+ output: 'Custom agent result',
177
+ messages: [],
178
+ }),
179
+ });
180
+ AgentAPI.mockImplementation(() => ({
181
+ resolveAgent: mockResolveAgent,
182
+ }));
183
+ const workflow = new faber_1.FaberWorkflow({
184
+ config: {
185
+ forge: { enabled: true, prefer_local: true },
186
+ phases: {
187
+ frame: { enabled: true, agent: 'custom-frame-agent@1.0.0' },
188
+ architect: { enabled: true, refineSpec: true },
189
+ build: { enabled: true },
190
+ evaluate: { enabled: true, maxRetries: 3 },
191
+ release: { enabled: true, requestReviews: true, reviewers: [] },
192
+ },
193
+ },
194
+ });
195
+ expect(workflow).toBeInstanceOf(faber_1.FaberWorkflow);
196
+ // Configuration should be set correctly
197
+ });
198
+ it('should resolve custom agent name when executing phase with override', async () => {
199
+ const { AgentAPI } = require('@fractary/forge');
200
+ const mockInvoke = jest.fn().mockResolvedValue({
201
+ output: 'Custom agent executed successfully',
202
+ messages: [],
203
+ structured_output: { customResult: true },
204
+ });
205
+ const mockResolveAgent = jest.fn().mockResolvedValue({
206
+ name: 'my-special-frame-agent',
207
+ version: '2.0.0',
208
+ invoke: mockInvoke,
209
+ });
210
+ AgentAPI.mockImplementation(() => ({
211
+ resolveAgent: mockResolveAgent,
212
+ }));
213
+ const executor = new agent_executor_1.AgentExecutor({
214
+ forge: { enabled: true, prefer_local: true },
215
+ });
216
+ const context = {
217
+ workflowId: 'wf-123',
218
+ workId: '456',
219
+ phase: 'frame',
220
+ autonomy: 'assisted',
221
+ issue: null,
222
+ spec: null,
223
+ branch: null,
224
+ previousOutputs: {},
225
+ };
226
+ // Execute with custom agent name (as would happen when config has agent override)
227
+ await executor.executePhaseAgent('my-special-frame-agent@2.0.0', 'Analyze task', context);
228
+ // Verify the custom agent name was resolved directly, not mapped to 'frame-agent'
229
+ expect(mockResolveAgent).toHaveBeenCalledWith('my-special-frame-agent@2.0.0');
230
+ expect(mockResolveAgent).not.toHaveBeenCalledWith('frame-agent');
231
+ expect(mockInvoke).toHaveBeenCalled();
232
+ });
233
+ it('should use default agent when no custom override is specified', async () => {
234
+ const { AgentAPI } = require('@fractary/forge');
235
+ const mockResolveAgent = jest.fn().mockResolvedValue({
236
+ name: 'frame-agent',
237
+ version: '2.0.0',
238
+ invoke: jest.fn().mockResolvedValue({
239
+ output: 'Default agent result',
240
+ messages: [],
241
+ }),
242
+ });
243
+ AgentAPI.mockImplementation(() => ({
244
+ resolveAgent: mockResolveAgent,
245
+ }));
246
+ const executor = new agent_executor_1.AgentExecutor({
247
+ forge: { enabled: true, prefer_local: true },
248
+ });
249
+ const context = {
250
+ workflowId: 'wf-123',
251
+ workId: '456',
252
+ phase: 'frame',
253
+ autonomy: 'assisted',
254
+ issue: null,
255
+ spec: null,
256
+ branch: null,
257
+ previousOutputs: {},
258
+ };
259
+ // Execute with phase name (no custom override)
260
+ await executor.executePhaseAgent('frame', 'Analyze task', context);
261
+ // Verify the default agent mapping was used
262
+ expect(mockResolveAgent).toHaveBeenCalledWith('frame-agent');
263
+ });
264
+ });
265
+ describe('Dual-Mode Support', () => {
266
+ it('should support switching between Forge and legacy modes', async () => {
267
+ // Create with Forge enabled
268
+ const forgeWorkflow = new faber_1.FaberWorkflow({
269
+ config: {
270
+ forge: { enabled: true, prefer_local: true },
271
+ },
272
+ });
273
+ expect(forgeWorkflow).toBeInstanceOf(faber_1.FaberWorkflow);
274
+ // Create with legacy mode
275
+ const legacyWorkflow = new faber_1.FaberWorkflow({
276
+ config: {
277
+ forge: { enabled: false, prefer_local: true },
278
+ },
279
+ });
280
+ expect(legacyWorkflow).toBeInstanceOf(faber_1.FaberWorkflow);
281
+ });
282
+ it('should execute legacy mode when Forge disabled', async () => {
283
+ const executor = new agent_executor_1.AgentExecutor({
284
+ forge: { enabled: false, prefer_local: true },
285
+ });
286
+ const context = {
287
+ workflowId: 'wf-123',
288
+ workId: '456',
289
+ phase: 'frame',
290
+ autonomy: 'assisted',
291
+ issue: null,
292
+ spec: null,
293
+ branch: null,
294
+ previousOutputs: {},
295
+ };
296
+ const result = await executor.executePhaseAgent('frame', 'Task', context);
297
+ // Should return legacy result
298
+ expect(result.metadata?.legacy).toBe(true);
299
+ expect(result.output).toBe('Legacy phase execution: frame');
300
+ });
301
+ });
302
+ describe('Performance', () => {
303
+ it('should cache agents for improved performance', async () => {
304
+ const { AgentAPI } = require('@fractary/forge');
305
+ const mockResolveAgent = jest.fn().mockResolvedValue({
306
+ name: 'frame-agent',
307
+ version: '2.0.0',
308
+ invoke: jest.fn().mockResolvedValue({
309
+ output: 'Result',
310
+ messages: [],
311
+ }),
312
+ });
313
+ AgentAPI.mockImplementation(() => ({
314
+ resolveAgent: mockResolveAgent,
315
+ }));
316
+ const executor = new agent_executor_1.AgentExecutor({
317
+ forge: { enabled: true, prefer_local: true },
318
+ });
319
+ const context = {
320
+ workflowId: 'wf-123',
321
+ workId: '456',
322
+ phase: 'frame',
323
+ autonomy: 'assisted',
324
+ issue: null,
325
+ spec: null,
326
+ branch: null,
327
+ previousOutputs: {},
328
+ };
329
+ // Execute same agent multiple times
330
+ await executor.executePhaseAgent('frame', 'Task 1', context);
331
+ await executor.executePhaseAgent('frame', 'Task 2', context);
332
+ await executor.executePhaseAgent('frame', 'Task 3', context);
333
+ // Should only resolve once, then use cache
334
+ expect(mockResolveAgent).toHaveBeenCalledTimes(1);
335
+ });
336
+ });
337
+ describe('Error Handling', () => {
338
+ it('should provide helpful error messages when agent not found', async () => {
339
+ const { AgentAPI } = require('@fractary/forge');
340
+ const error = new Error('Agent not found');
341
+ error.name = 'AgentNotFoundError';
342
+ AgentAPI.mockImplementation(() => ({
343
+ resolveAgent: jest.fn().mockRejectedValue(error),
344
+ }));
345
+ const executor = new agent_executor_1.AgentExecutor({
346
+ forge: { enabled: true, prefer_local: true },
347
+ });
348
+ const context = {
349
+ workflowId: 'wf-123',
350
+ workId: '456',
351
+ phase: 'frame',
352
+ autonomy: 'assisted',
353
+ issue: null,
354
+ spec: null,
355
+ branch: null,
356
+ previousOutputs: {},
357
+ };
358
+ try {
359
+ await executor.executePhaseAgent('frame', 'Task', context);
360
+ fail('Should have thrown error');
361
+ }
362
+ catch (err) {
363
+ expect(err.message).toContain("Agent 'frame-agent' not found");
364
+ expect(err.message).toContain('forge install frame-agent');
365
+ expect(err.message).toContain('.fractary/agents/');
366
+ }
367
+ });
368
+ });
369
+ });
370
+ //# sourceMappingURL=forge-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/forge-integration.test.ts"],"names":[],"mappings":"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"}