olympus-ai 2.4.1 → 2.5.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 (147) hide show
  1. package/dist/__tests__/hooks/bundle.test.d.ts +2 -0
  2. package/dist/__tests__/hooks/bundle.test.d.ts.map +1 -0
  3. package/dist/__tests__/hooks/bundle.test.js +120 -0
  4. package/dist/__tests__/hooks/bundle.test.js.map +1 -0
  5. package/dist/__tests__/hooks/integration.test.d.ts +2 -0
  6. package/dist/__tests__/hooks/integration.test.d.ts.map +1 -0
  7. package/dist/__tests__/hooks/integration.test.js +132 -0
  8. package/dist/__tests__/hooks/integration.test.js.map +1 -0
  9. package/dist/__tests__/hooks/performance.test.d.ts +2 -0
  10. package/dist/__tests__/hooks/performance.test.d.ts.map +1 -0
  11. package/dist/__tests__/hooks/performance.test.js +266 -0
  12. package/dist/__tests__/hooks/performance.test.js.map +1 -0
  13. package/dist/__tests__/hooks/router.test.d.ts +2 -0
  14. package/dist/__tests__/hooks/router.test.d.ts.map +1 -0
  15. package/dist/__tests__/hooks/router.test.js +793 -0
  16. package/dist/__tests__/hooks/router.test.js.map +1 -0
  17. package/dist/hooks/config.d.ts +47 -0
  18. package/dist/hooks/config.d.ts.map +1 -0
  19. package/dist/hooks/config.js +120 -0
  20. package/dist/hooks/config.js.map +1 -0
  21. package/dist/hooks/entry.d.ts +17 -0
  22. package/dist/hooks/entry.d.ts.map +1 -0
  23. package/dist/hooks/entry.js +66 -0
  24. package/dist/hooks/entry.js.map +1 -0
  25. package/dist/hooks/index.d.ts +3 -0
  26. package/dist/hooks/index.d.ts.map +1 -1
  27. package/dist/hooks/index.js +6 -0
  28. package/dist/hooks/index.js.map +1 -1
  29. package/dist/hooks/olympus-hooks.cjs +653 -0
  30. package/dist/hooks/registrations/index.d.ts +25 -0
  31. package/dist/hooks/registrations/index.d.ts.map +1 -0
  32. package/dist/hooks/registrations/index.js +43 -0
  33. package/dist/hooks/registrations/index.js.map +1 -0
  34. package/dist/hooks/registrations/messages-transform.d.ts +8 -0
  35. package/dist/hooks/registrations/messages-transform.d.ts.map +1 -0
  36. package/dist/hooks/registrations/messages-transform.js +63 -0
  37. package/dist/hooks/registrations/messages-transform.js.map +1 -0
  38. package/dist/hooks/registrations/notification.d.ts +7 -0
  39. package/dist/hooks/registrations/notification.d.ts.map +1 -0
  40. package/dist/hooks/registrations/notification.js +34 -0
  41. package/dist/hooks/registrations/notification.js.map +1 -0
  42. package/dist/hooks/registrations/post-tool-use.d.ts +18 -0
  43. package/dist/hooks/registrations/post-tool-use.d.ts.map +1 -0
  44. package/dist/hooks/registrations/post-tool-use.js +198 -0
  45. package/dist/hooks/registrations/post-tool-use.js.map +1 -0
  46. package/dist/hooks/registrations/pre-tool-use.d.ts +11 -0
  47. package/dist/hooks/registrations/pre-tool-use.d.ts.map +1 -0
  48. package/dist/hooks/registrations/pre-tool-use.js +102 -0
  49. package/dist/hooks/registrations/pre-tool-use.js.map +1 -0
  50. package/dist/hooks/registrations/session-start.d.ts +7 -0
  51. package/dist/hooks/registrations/session-start.d.ts.map +1 -0
  52. package/dist/hooks/registrations/session-start.js +60 -0
  53. package/dist/hooks/registrations/session-start.js.map +1 -0
  54. package/dist/hooks/registrations/stop.d.ts +8 -0
  55. package/dist/hooks/registrations/stop.d.ts.map +1 -0
  56. package/dist/hooks/registrations/stop.js +28 -0
  57. package/dist/hooks/registrations/stop.js.map +1 -0
  58. package/dist/hooks/registrations/user-prompt-submit.d.ts +7 -0
  59. package/dist/hooks/registrations/user-prompt-submit.d.ts.map +1 -0
  60. package/dist/hooks/registrations/user-prompt-submit.js +114 -0
  61. package/dist/hooks/registrations/user-prompt-submit.js.map +1 -0
  62. package/dist/hooks/registry.d.ts +39 -0
  63. package/dist/hooks/registry.d.ts.map +1 -0
  64. package/dist/hooks/registry.js +58 -0
  65. package/dist/hooks/registry.js.map +1 -0
  66. package/dist/hooks/router.d.ts +31 -0
  67. package/dist/hooks/router.d.ts.map +1 -0
  68. package/dist/hooks/router.js +155 -0
  69. package/dist/hooks/router.js.map +1 -0
  70. package/dist/hooks/types.d.ts +102 -0
  71. package/dist/hooks/types.d.ts.map +1 -0
  72. package/dist/hooks/types.js +8 -0
  73. package/dist/hooks/types.js.map +1 -0
  74. package/dist/installer/default-config.d.ts +112 -0
  75. package/dist/installer/default-config.d.ts.map +1 -0
  76. package/dist/installer/default-config.js +153 -0
  77. package/dist/installer/default-config.js.map +1 -0
  78. package/dist/installer/hooks.d.ts +104 -0
  79. package/dist/installer/hooks.d.ts.map +1 -1
  80. package/dist/installer/hooks.js +80 -0
  81. package/dist/installer/hooks.js.map +1 -1
  82. package/dist/installer/index.d.ts +5 -1
  83. package/dist/installer/index.d.ts.map +1 -1
  84. package/dist/installer/index.js +2108 -2064
  85. package/dist/installer/index.js.map +1 -1
  86. package/dist/installer/migrate.d.ts +28 -0
  87. package/dist/installer/migrate.d.ts.map +1 -0
  88. package/dist/installer/migrate.js +99 -0
  89. package/dist/installer/migrate.js.map +1 -0
  90. package/dist/shared/types.d.ts +60 -0
  91. package/dist/shared/types.d.ts.map +1 -1
  92. package/package.json +3 -1
  93. package/.claude/agents/document-writer.md +0 -152
  94. package/.claude/agents/explore-medium.md +0 -25
  95. package/.claude/agents/explore.md +0 -86
  96. package/.claude/agents/frontend-engineer-high.md +0 -24
  97. package/.claude/agents/frontend-engineer-low.md +0 -23
  98. package/.claude/agents/frontend-engineer.md +0 -89
  99. package/.claude/agents/librarian-low.md +0 -22
  100. package/.claude/agents/librarian.md +0 -70
  101. package/.claude/agents/metis.md +0 -85
  102. package/.claude/agents/momus.md +0 -97
  103. package/.claude/agents/multimodal-looker.md +0 -39
  104. package/.claude/agents/olympian-high.md +0 -39
  105. package/.claude/agents/olympian-low.md +0 -29
  106. package/.claude/agents/olympian.md +0 -71
  107. package/.claude/agents/oracle-low.md +0 -23
  108. package/.claude/agents/oracle-medium.md +0 -28
  109. package/.claude/agents/oracle.md +0 -77
  110. package/.claude/agents/prometheus.md +0 -126
  111. package/.claude/agents/qa-tester.md +0 -220
  112. package/.claude/commands/analyze/skill.md +0 -14
  113. package/.claude/commands/analyze.md +0 -14
  114. package/.claude/commands/ascent/skill.md +0 -152
  115. package/.claude/commands/ascent.md +0 -152
  116. package/.claude/commands/cancel-ascent.md +0 -9
  117. package/.claude/commands/complete-plan.md +0 -101
  118. package/.claude/commands/deepinit.md +0 -114
  119. package/.claude/commands/deepsearch/skill.md +0 -15
  120. package/.claude/commands/deepsearch.md +0 -15
  121. package/.claude/commands/doctor.md +0 -190
  122. package/.claude/commands/olympus/skill.md +0 -82
  123. package/.claude/commands/olympus-default.md +0 -26
  124. package/.claude/commands/plan.md +0 -37
  125. package/.claude/commands/prometheus/skill.md +0 -41
  126. package/.claude/commands/prometheus.md +0 -41
  127. package/.claude/commands/review/skill.md +0 -40
  128. package/.claude/commands/review.md +0 -40
  129. package/.claude/commands/ultrawork/skill.md +0 -90
  130. package/.claude/commands/ultrawork.md +0 -90
  131. package/.claude/commands/update.md +0 -38
  132. package/dist/features/boulder-state/constants.d.ts +0 -20
  133. package/dist/features/boulder-state/constants.d.ts.map +0 -1
  134. package/dist/features/boulder-state/constants.js +0 -20
  135. package/dist/features/boulder-state/constants.js.map +0 -1
  136. package/dist/features/boulder-state/index.d.ts +0 -12
  137. package/dist/features/boulder-state/index.d.ts.map +0 -1
  138. package/dist/features/boulder-state/index.js +0 -13
  139. package/dist/features/boulder-state/index.js.map +0 -1
  140. package/dist/features/boulder-state/storage.d.ts +0 -58
  141. package/dist/features/boulder-state/storage.d.ts.map +0 -1
  142. package/dist/features/boulder-state/storage.js +0 -174
  143. package/dist/features/boulder-state/storage.js.map +0 -1
  144. package/dist/features/boulder-state/types.d.ts +0 -48
  145. package/dist/features/boulder-state/types.d.ts.map +0 -1
  146. package/dist/features/boulder-state/types.js +0 -10
  147. package/dist/features/boulder-state/types.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bundle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/hooks/bundle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Hook Bundle Integration Tests
3
+ *
4
+ * Tests that the bundled hook file can be built and executed.
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { execSync } from 'child_process';
8
+ import { existsSync, statSync } from 'fs';
9
+ import { join } from 'path';
10
+ const PROJECT_ROOT = join(__dirname, '..', '..', '..');
11
+ const BUNDLE_PATH = join(PROJECT_ROOT, 'dist', 'hooks', 'olympus-hooks.cjs');
12
+ describe('Hook Bundle', () => {
13
+ describe('Bundle File', () => {
14
+ it('bundle file exists', () => {
15
+ // Skip if bundle doesn't exist (CI might not have built it)
16
+ if (!existsSync(BUNDLE_PATH)) {
17
+ console.log('Bundle not found, skipping bundle tests. Run npm run build:hooks first.');
18
+ return;
19
+ }
20
+ expect(existsSync(BUNDLE_PATH)).toBe(true);
21
+ });
22
+ it('bundle size is reasonable (<500KB)', () => {
23
+ if (!existsSync(BUNDLE_PATH)) {
24
+ console.log('Bundle not found, skipping size test.');
25
+ return;
26
+ }
27
+ const stats = statSync(BUNDLE_PATH);
28
+ const sizeKB = stats.size / 1024;
29
+ console.log(`Bundle size: ${sizeKB.toFixed(2)} KB`);
30
+ expect(sizeKB).toBeLessThan(500);
31
+ });
32
+ });
33
+ describe('Bundle Execution', () => {
34
+ it('can be executed without import errors', () => {
35
+ if (!existsSync(BUNDLE_PATH)) {
36
+ console.log('Bundle not found, skipping execution test.');
37
+ return;
38
+ }
39
+ try {
40
+ const result = execSync(`echo '{}' | node "${BUNDLE_PATH}" --event=UserPromptSubmit`, {
41
+ encoding: 'utf-8',
42
+ timeout: 5000,
43
+ cwd: PROJECT_ROOT
44
+ });
45
+ // Should return valid JSON
46
+ const parsed = JSON.parse(result.trim());
47
+ expect(parsed).toHaveProperty('continue');
48
+ }
49
+ catch (error) {
50
+ // Check if it's a runtime error vs import error
51
+ const stderr = error.stderr?.toString() || '';
52
+ const stdout = error.stdout?.toString() || '';
53
+ // Import errors should fail the test
54
+ expect(stderr).not.toContain('Cannot find module');
55
+ expect(stderr).not.toContain('SyntaxError');
56
+ expect(stderr).not.toContain('is not defined');
57
+ // If stdout has valid JSON, that's also acceptable
58
+ if (stdout.trim()) {
59
+ const parsed = JSON.parse(stdout.trim());
60
+ expect(parsed).toHaveProperty('continue');
61
+ }
62
+ }
63
+ });
64
+ it('returns valid JSON for all event types', () => {
65
+ if (!existsSync(BUNDLE_PATH)) {
66
+ console.log('Bundle not found, skipping event types test.');
67
+ return;
68
+ }
69
+ const events = [
70
+ 'UserPromptSubmit',
71
+ 'SessionStart',
72
+ 'Stop',
73
+ 'PreToolUse',
74
+ 'PostToolUse',
75
+ 'Notification',
76
+ 'MessagesTransform'
77
+ ];
78
+ for (const event of events) {
79
+ try {
80
+ const result = execSync(`echo '{"sessionId":"test"}' | node "${BUNDLE_PATH}" --event=${event}`, {
81
+ encoding: 'utf-8',
82
+ timeout: 5000,
83
+ cwd: PROJECT_ROOT
84
+ });
85
+ const parsed = JSON.parse(result.trim());
86
+ expect(parsed).toHaveProperty('continue');
87
+ }
88
+ catch (error) {
89
+ // Allow timeout but not import errors
90
+ if (!error.message.includes('ETIMEDOUT')) {
91
+ const stderr = error.stderr?.toString() || '';
92
+ expect(stderr).not.toContain('Cannot find module');
93
+ expect(stderr).not.toContain('SyntaxError');
94
+ }
95
+ }
96
+ }
97
+ });
98
+ it('handles missing event argument gracefully', () => {
99
+ if (!existsSync(BUNDLE_PATH)) {
100
+ console.log('Bundle not found, skipping error handling test.');
101
+ return;
102
+ }
103
+ try {
104
+ execSync(`echo '{}' | node "${BUNDLE_PATH}"`, {
105
+ encoding: 'utf-8',
106
+ timeout: 5000,
107
+ cwd: PROJECT_ROOT
108
+ });
109
+ // Should fail without --event
110
+ expect(true).toBe(false); // Force fail if we get here
111
+ }
112
+ catch (error) {
113
+ // Expected to fail with usage message
114
+ const stderr = error.stderr?.toString() || '';
115
+ expect(stderr).toContain('--event');
116
+ }
117
+ });
118
+ });
119
+ });
120
+ //# sourceMappingURL=bundle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.test.js","sourceRoot":"","sources":["../../../src/__tests__/hooks/bundle.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/hooks/integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Hook Integration Tests
3
+ *
4
+ * Tests that all hooks are properly registered and assigned to correct events.
5
+ */
6
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
7
+ import { registerAllHooks, resetRegistration } from '../../hooks/registrations/index.js';
8
+ import { getAllHooks, getHooksForEvent, clearHooks } from '../../hooks/registry.js';
9
+ describe('Hook Integration', () => {
10
+ beforeAll(() => {
11
+ clearHooks();
12
+ registerAllHooks();
13
+ });
14
+ afterAll(() => {
15
+ clearHooks();
16
+ resetRegistration();
17
+ });
18
+ describe('Hook Registration', () => {
19
+ it('registers all expected hooks', () => {
20
+ const hooks = getAllHooks();
21
+ const hookNames = hooks.map(h => h.name);
22
+ const expectedHooks = [
23
+ // UserPromptSubmit
24
+ 'keywordDetector',
25
+ 'autoSlashCommand',
26
+ 'thinkMode',
27
+ // SessionStart
28
+ 'sessionStart',
29
+ // Stop
30
+ 'persistentMode',
31
+ // PreToolUse
32
+ 'rulesInjector',
33
+ 'directoryReadmeInjector',
34
+ 'nonInteractiveEnv',
35
+ 'olympusOrchestratorPre',
36
+ // PostToolUse
37
+ 'editErrorRecovery',
38
+ 'commentChecker',
39
+ 'contextWindowLimitRecovery',
40
+ 'preemptiveCompaction',
41
+ 'agentUsageReminder',
42
+ 'olympusOrchestratorPost',
43
+ // Notification
44
+ 'backgroundNotification',
45
+ // MessagesTransform
46
+ 'thinkingBlockValidator',
47
+ 'emptyMessageSanitizer'
48
+ ];
49
+ for (const expected of expectedHooks) {
50
+ expect(hookNames).toContain(expected);
51
+ }
52
+ });
53
+ it('has no duplicate hook names', () => {
54
+ const hooks = getAllHooks();
55
+ const names = hooks.map(h => h.name);
56
+ const uniqueNames = [...new Set(names)];
57
+ expect(names.length).toBe(uniqueNames.length);
58
+ });
59
+ });
60
+ describe('Event Assignment', () => {
61
+ it('has UserPromptSubmit hooks', () => {
62
+ const hooks = getHooksForEvent('UserPromptSubmit');
63
+ expect(hooks.length).toBeGreaterThanOrEqual(3);
64
+ const names = hooks.map(h => h.name);
65
+ expect(names).toContain('keywordDetector');
66
+ expect(names).toContain('autoSlashCommand');
67
+ expect(names).toContain('thinkMode');
68
+ });
69
+ it('has SessionStart hooks', () => {
70
+ const hooks = getHooksForEvent('SessionStart');
71
+ expect(hooks.length).toBeGreaterThanOrEqual(1);
72
+ const names = hooks.map(h => h.name);
73
+ expect(names).toContain('sessionStart');
74
+ });
75
+ it('has Stop hooks', () => {
76
+ const hooks = getHooksForEvent('Stop');
77
+ expect(hooks.length).toBeGreaterThanOrEqual(1);
78
+ const names = hooks.map(h => h.name);
79
+ expect(names).toContain('persistentMode');
80
+ });
81
+ it('has PreToolUse hooks', () => {
82
+ const hooks = getHooksForEvent('PreToolUse');
83
+ expect(hooks.length).toBeGreaterThanOrEqual(4);
84
+ const names = hooks.map(h => h.name);
85
+ expect(names).toContain('rulesInjector');
86
+ expect(names).toContain('directoryReadmeInjector');
87
+ expect(names).toContain('nonInteractiveEnv');
88
+ expect(names).toContain('olympusOrchestratorPre');
89
+ });
90
+ it('has PostToolUse hooks', () => {
91
+ const hooks = getHooksForEvent('PostToolUse');
92
+ expect(hooks.length).toBeGreaterThanOrEqual(6);
93
+ const names = hooks.map(h => h.name);
94
+ expect(names).toContain('editErrorRecovery');
95
+ expect(names).toContain('commentChecker');
96
+ expect(names).toContain('contextWindowLimitRecovery');
97
+ expect(names).toContain('preemptiveCompaction');
98
+ expect(names).toContain('agentUsageReminder');
99
+ expect(names).toContain('olympusOrchestratorPost');
100
+ });
101
+ it('has Notification hooks', () => {
102
+ const hooks = getHooksForEvent('Notification');
103
+ expect(hooks.length).toBeGreaterThanOrEqual(1);
104
+ const names = hooks.map(h => h.name);
105
+ expect(names).toContain('backgroundNotification');
106
+ });
107
+ it('has MessagesTransform hooks', () => {
108
+ const hooks = getHooksForEvent('MessagesTransform');
109
+ expect(hooks.length).toBeGreaterThanOrEqual(2);
110
+ const names = hooks.map(h => h.name);
111
+ expect(names).toContain('emptyMessageSanitizer');
112
+ expect(names).toContain('thinkingBlockValidator');
113
+ });
114
+ });
115
+ describe('Priority Ordering', () => {
116
+ it('sorts UserPromptSubmit hooks by priority', () => {
117
+ const hooks = getHooksForEvent('UserPromptSubmit');
118
+ const priorities = hooks.map(h => h.priority ?? 100);
119
+ for (let i = 1; i < priorities.length; i++) {
120
+ expect(priorities[i]).toBeGreaterThanOrEqual(priorities[i - 1]);
121
+ }
122
+ });
123
+ it('sorts PostToolUse hooks by priority', () => {
124
+ const hooks = getHooksForEvent('PostToolUse');
125
+ const priorities = hooks.map(h => h.priority ?? 100);
126
+ for (let i = 1; i < priorities.length; i++) {
127
+ expect(priorities[i]).toBeGreaterThanOrEqual(priorities[i - 1]);
128
+ }
129
+ });
130
+ });
131
+ });
132
+ //# sourceMappingURL=integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/hooks/integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=performance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/hooks/performance.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Hook Performance Tests
3
+ *
4
+ * Verifies that hook execution stays within the 200ms latency budget.
5
+ */
6
+ import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest';
7
+ import { registerAllHooks, resetRegistration } from '../../hooks/registrations/index.js';
8
+ import { routeHook } from '../../hooks/router.js';
9
+ import { clearHooks } from '../../hooks/registry.js';
10
+ // Mock config to avoid file system IO
11
+ vi.mock('../../config/loader.js', () => ({
12
+ loadConfig: vi.fn().mockReturnValue({
13
+ hooks: {
14
+ enabled: true,
15
+ timeoutMs: 100
16
+ }
17
+ }),
18
+ DEFAULT_CONFIG: {
19
+ hooks: {
20
+ enabled: true,
21
+ timeoutMs: 100
22
+ }
23
+ }
24
+ }));
25
+ describe('Hook Performance', () => {
26
+ beforeAll(() => {
27
+ clearHooks();
28
+ registerAllHooks();
29
+ });
30
+ afterAll(() => {
31
+ clearHooks();
32
+ resetRegistration();
33
+ });
34
+ describe('Latency Budget (200ms per event)', () => {
35
+ it('UserPromptSubmit completes within 200ms', async () => {
36
+ const start = performance.now();
37
+ await routeHook('UserPromptSubmit', {
38
+ prompt: 'test prompt with ultrawork keyword',
39
+ sessionId: 'perf-test-session',
40
+ directory: process.cwd()
41
+ });
42
+ const elapsed = performance.now() - start;
43
+ expect(elapsed).toBeLessThan(200);
44
+ });
45
+ it('SessionStart completes within 200ms', async () => {
46
+ const start = performance.now();
47
+ await routeHook('SessionStart', {
48
+ sessionId: 'perf-test-session',
49
+ directory: process.cwd()
50
+ });
51
+ const elapsed = performance.now() - start;
52
+ expect(elapsed).toBeLessThan(200);
53
+ });
54
+ it('Stop completes within 200ms', async () => {
55
+ const start = performance.now();
56
+ await routeHook('Stop', {
57
+ sessionId: 'perf-test-session',
58
+ directory: process.cwd()
59
+ });
60
+ const elapsed = performance.now() - start;
61
+ expect(elapsed).toBeLessThan(200);
62
+ });
63
+ it('PreToolUse completes within 200ms', async () => {
64
+ const start = performance.now();
65
+ await routeHook('PreToolUse', {
66
+ toolName: 'read',
67
+ toolInput: { file_path: '/test/file.ts' },
68
+ sessionId: 'perf-test-session',
69
+ directory: process.cwd()
70
+ });
71
+ const elapsed = performance.now() - start;
72
+ expect(elapsed).toBeLessThan(200);
73
+ });
74
+ it('PostToolUse completes within 200ms', async () => {
75
+ const start = performance.now();
76
+ await routeHook('PostToolUse', {
77
+ toolName: 'edit',
78
+ toolInput: { file_path: '/test/file.ts' },
79
+ toolOutput: { output: 'Success' },
80
+ sessionId: 'perf-test-session',
81
+ directory: process.cwd()
82
+ });
83
+ const elapsed = performance.now() - start;
84
+ expect(elapsed).toBeLessThan(200);
85
+ });
86
+ it('Notification completes within 200ms', async () => {
87
+ const start = performance.now();
88
+ await routeHook('Notification', {
89
+ sessionId: 'perf-test-session',
90
+ event: { type: 'background_task_complete', properties: {} }
91
+ });
92
+ const elapsed = performance.now() - start;
93
+ expect(elapsed).toBeLessThan(200);
94
+ });
95
+ it('MessagesTransform completes within 200ms', async () => {
96
+ const start = performance.now();
97
+ await routeHook('MessagesTransform', {
98
+ sessionId: 'perf-test-session',
99
+ messages: [
100
+ { role: 'user', content: 'test' },
101
+ { role: 'assistant', content: 'response' }
102
+ ]
103
+ });
104
+ const elapsed = performance.now() - start;
105
+ expect(elapsed).toBeLessThan(200);
106
+ });
107
+ });
108
+ describe('Repeated Execution', () => {
109
+ it('maintains performance over 10 consecutive calls', async () => {
110
+ const times = [];
111
+ for (let i = 0; i < 10; i++) {
112
+ const start = performance.now();
113
+ await routeHook('UserPromptSubmit', { prompt: `test ${i}` });
114
+ times.push(performance.now() - start);
115
+ }
116
+ // Average should be well under 200ms
117
+ const avg = times.reduce((a, b) => a + b, 0) / times.length;
118
+ expect(avg).toBeLessThan(150);
119
+ // No single call should exceed 200ms
120
+ for (const time of times) {
121
+ expect(time).toBeLessThan(200);
122
+ }
123
+ });
124
+ });
125
+ describe('Stress Testing', () => {
126
+ it('handles 50 rapid consecutive calls efficiently', async () => {
127
+ const times = [];
128
+ const iterations = 50;
129
+ for (let i = 0; i < iterations; i++) {
130
+ const start = performance.now();
131
+ await routeHook('UserPromptSubmit', {
132
+ prompt: `stress test iteration ${i}`,
133
+ sessionId: 'stress-test-session'
134
+ });
135
+ times.push(performance.now() - start);
136
+ }
137
+ // Average should still be reasonable
138
+ const avg = times.reduce((a, b) => a + b, 0) / times.length;
139
+ expect(avg).toBeLessThan(150);
140
+ // 95th percentile should be under 200ms
141
+ const sorted = times.slice().sort((a, b) => a - b);
142
+ const p95Index = Math.floor(iterations * 0.95);
143
+ expect(sorted[p95Index]).toBeLessThan(200);
144
+ });
145
+ });
146
+ describe('Performance Under Load', () => {
147
+ it('maintains latency with complex prompts', async () => {
148
+ const longPrompt = 'ultrawork '.repeat(100) + 'search and analyze this complex task with many keywords';
149
+ const start = performance.now();
150
+ await routeHook('UserPromptSubmit', {
151
+ prompt: longPrompt,
152
+ sessionId: 'load-test-session'
153
+ });
154
+ const elapsed = performance.now() - start;
155
+ expect(elapsed).toBeLessThan(200);
156
+ });
157
+ it('maintains latency with multiple tool inputs', async () => {
158
+ const complexInput = {
159
+ file_path: '/very/long/path/to/some/deeply/nested/file.ts',
160
+ old_string: 'x'.repeat(1000),
161
+ new_string: 'y'.repeat(1000)
162
+ };
163
+ const start = performance.now();
164
+ await routeHook('PreToolUse', {
165
+ toolName: 'edit',
166
+ toolInput: complexInput,
167
+ sessionId: 'load-test-session'
168
+ });
169
+ const elapsed = performance.now() - start;
170
+ expect(elapsed).toBeLessThan(200);
171
+ });
172
+ it('maintains latency with many messages', async () => {
173
+ const manyMessages = Array.from({ length: 100 }, (_, i) => ({
174
+ role: i % 2 === 0 ? 'user' : 'assistant',
175
+ content: `Message ${i}`
176
+ }));
177
+ const start = performance.now();
178
+ await routeHook('MessagesTransform', {
179
+ sessionId: 'load-test-session',
180
+ messages: manyMessages
181
+ });
182
+ const elapsed = performance.now() - start;
183
+ expect(elapsed).toBeLessThan(200);
184
+ });
185
+ });
186
+ describe('Performance Baseline Metrics', () => {
187
+ it('tracks and reports performance statistics', async () => {
188
+ const iterations = 100;
189
+ const times = [];
190
+ for (let i = 0; i < iterations; i++) {
191
+ const start = performance.now();
192
+ await routeHook('UserPromptSubmit', {
193
+ prompt: `baseline test ${i}`,
194
+ sessionId: 'baseline-session'
195
+ });
196
+ times.push(performance.now() - start);
197
+ }
198
+ const sorted = times.slice().sort((a, b) => a - b);
199
+ const min = sorted[0];
200
+ const max = sorted[sorted.length - 1];
201
+ const avg = times.reduce((a, b) => a + b, 0) / times.length;
202
+ const median = sorted[Math.floor(iterations / 2)];
203
+ const p95 = sorted[Math.floor(iterations * 0.95)];
204
+ const p99 = sorted[Math.floor(iterations * 0.99)];
205
+ // Report statistics (useful for CI monitoring)
206
+ console.log('Performance Baseline Stats:');
207
+ console.log(` Min: ${min.toFixed(2)}ms`);
208
+ console.log(` Median: ${median.toFixed(2)}ms`);
209
+ console.log(` Avg: ${avg.toFixed(2)}ms`);
210
+ console.log(` P95: ${p95.toFixed(2)}ms`);
211
+ console.log(` P99: ${p99.toFixed(2)}ms`);
212
+ console.log(` Max: ${max.toFixed(2)}ms`);
213
+ // All metrics should be well under budget
214
+ expect(min).toBeLessThan(200);
215
+ expect(median).toBeLessThan(150);
216
+ expect(avg).toBeLessThan(150);
217
+ expect(p95).toBeLessThan(200);
218
+ expect(p99).toBeLessThan(200);
219
+ expect(max).toBeLessThan(250); // Allow some margin for CI variance
220
+ });
221
+ });
222
+ describe('Hook Timeout Protection', () => {
223
+ it('respects timeout configuration', async () => {
224
+ // This test verifies that the timeout mechanism itself doesn't add significant overhead
225
+ const start = performance.now();
226
+ await routeHook('UserPromptSubmit', {
227
+ prompt: 'test prompt',
228
+ sessionId: 'timeout-test-session'
229
+ });
230
+ const elapsed = performance.now() - start;
231
+ // Even with timeout protection, should complete quickly
232
+ expect(elapsed).toBeLessThan(200);
233
+ });
234
+ });
235
+ describe('Event Type Performance Comparison', () => {
236
+ it('compares latency across all event types', async () => {
237
+ const eventTests = [
238
+ { event: 'UserPromptSubmit', context: { prompt: 'test' } },
239
+ { event: 'SessionStart', context: { sessionId: 'test' } },
240
+ { event: 'Stop', context: { sessionId: 'test' } },
241
+ { event: 'PreToolUse', context: { toolName: 'read' } },
242
+ { event: 'PostToolUse', context: { toolName: 'edit' } },
243
+ { event: 'Notification', context: { event: { type: 'test' } } },
244
+ { event: 'MessagesTransform', context: { messages: [] } }
245
+ ];
246
+ const results = {};
247
+ for (const test of eventTests) {
248
+ const times = [];
249
+ for (let i = 0; i < 10; i++) {
250
+ const start = performance.now();
251
+ await routeHook(test.event, test.context);
252
+ times.push(performance.now() - start);
253
+ }
254
+ const avg = times.reduce((a, b) => a + b, 0) / times.length;
255
+ results[test.event] = avg;
256
+ // Each event type should be under budget
257
+ expect(avg).toBeLessThan(200);
258
+ }
259
+ console.log('Event Type Performance:');
260
+ Object.entries(results).forEach(([event, time]) => {
261
+ console.log(` ${event}: ${time.toFixed(2)}ms avg`);
262
+ });
263
+ });
264
+ });
265
+ });
266
+ //# sourceMappingURL=performance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.test.js","sourceRoot":"","sources":["../../../src/__tests__/hooks/performance.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=router.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/hooks/router.test.ts"],"names":[],"mappings":""}