olympus-ai 2.4.1 → 2.5.2

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 (149) 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 +116 -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 +267 -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/__tests__/installer.test.js +7 -3
  18. package/dist/__tests__/installer.test.js.map +1 -1
  19. package/dist/hooks/config.d.ts +47 -0
  20. package/dist/hooks/config.d.ts.map +1 -0
  21. package/dist/hooks/config.js +120 -0
  22. package/dist/hooks/config.js.map +1 -0
  23. package/dist/hooks/entry.d.ts +17 -0
  24. package/dist/hooks/entry.d.ts.map +1 -0
  25. package/dist/hooks/entry.js +66 -0
  26. package/dist/hooks/entry.js.map +1 -0
  27. package/dist/hooks/index.d.ts +3 -0
  28. package/dist/hooks/index.d.ts.map +1 -1
  29. package/dist/hooks/index.js +6 -0
  30. package/dist/hooks/index.js.map +1 -1
  31. package/dist/hooks/olympus-hooks.cjs +653 -0
  32. package/dist/hooks/registrations/index.d.ts +25 -0
  33. package/dist/hooks/registrations/index.d.ts.map +1 -0
  34. package/dist/hooks/registrations/index.js +43 -0
  35. package/dist/hooks/registrations/index.js.map +1 -0
  36. package/dist/hooks/registrations/messages-transform.d.ts +8 -0
  37. package/dist/hooks/registrations/messages-transform.d.ts.map +1 -0
  38. package/dist/hooks/registrations/messages-transform.js +63 -0
  39. package/dist/hooks/registrations/messages-transform.js.map +1 -0
  40. package/dist/hooks/registrations/notification.d.ts +7 -0
  41. package/dist/hooks/registrations/notification.d.ts.map +1 -0
  42. package/dist/hooks/registrations/notification.js +34 -0
  43. package/dist/hooks/registrations/notification.js.map +1 -0
  44. package/dist/hooks/registrations/post-tool-use.d.ts +18 -0
  45. package/dist/hooks/registrations/post-tool-use.d.ts.map +1 -0
  46. package/dist/hooks/registrations/post-tool-use.js +198 -0
  47. package/dist/hooks/registrations/post-tool-use.js.map +1 -0
  48. package/dist/hooks/registrations/pre-tool-use.d.ts +11 -0
  49. package/dist/hooks/registrations/pre-tool-use.d.ts.map +1 -0
  50. package/dist/hooks/registrations/pre-tool-use.js +102 -0
  51. package/dist/hooks/registrations/pre-tool-use.js.map +1 -0
  52. package/dist/hooks/registrations/session-start.d.ts +7 -0
  53. package/dist/hooks/registrations/session-start.d.ts.map +1 -0
  54. package/dist/hooks/registrations/session-start.js +60 -0
  55. package/dist/hooks/registrations/session-start.js.map +1 -0
  56. package/dist/hooks/registrations/stop.d.ts +8 -0
  57. package/dist/hooks/registrations/stop.d.ts.map +1 -0
  58. package/dist/hooks/registrations/stop.js +28 -0
  59. package/dist/hooks/registrations/stop.js.map +1 -0
  60. package/dist/hooks/registrations/user-prompt-submit.d.ts +7 -0
  61. package/dist/hooks/registrations/user-prompt-submit.d.ts.map +1 -0
  62. package/dist/hooks/registrations/user-prompt-submit.js +114 -0
  63. package/dist/hooks/registrations/user-prompt-submit.js.map +1 -0
  64. package/dist/hooks/registry.d.ts +39 -0
  65. package/dist/hooks/registry.d.ts.map +1 -0
  66. package/dist/hooks/registry.js +58 -0
  67. package/dist/hooks/registry.js.map +1 -0
  68. package/dist/hooks/router.d.ts +31 -0
  69. package/dist/hooks/router.d.ts.map +1 -0
  70. package/dist/hooks/router.js +155 -0
  71. package/dist/hooks/router.js.map +1 -0
  72. package/dist/hooks/types.d.ts +102 -0
  73. package/dist/hooks/types.d.ts.map +1 -0
  74. package/dist/hooks/types.js +8 -0
  75. package/dist/hooks/types.js.map +1 -0
  76. package/dist/installer/default-config.d.ts +112 -0
  77. package/dist/installer/default-config.d.ts.map +1 -0
  78. package/dist/installer/default-config.js +153 -0
  79. package/dist/installer/default-config.js.map +1 -0
  80. package/dist/installer/hooks.d.ts +104 -0
  81. package/dist/installer/hooks.d.ts.map +1 -1
  82. package/dist/installer/hooks.js +80 -0
  83. package/dist/installer/hooks.js.map +1 -1
  84. package/dist/installer/index.d.ts +5 -1
  85. package/dist/installer/index.d.ts.map +1 -1
  86. package/dist/installer/index.js +2108 -2064
  87. package/dist/installer/index.js.map +1 -1
  88. package/dist/installer/migrate.d.ts +28 -0
  89. package/dist/installer/migrate.d.ts.map +1 -0
  90. package/dist/installer/migrate.js +99 -0
  91. package/dist/installer/migrate.js.map +1 -0
  92. package/dist/shared/types.d.ts +60 -0
  93. package/dist/shared/types.d.ts.map +1 -1
  94. package/package.json +3 -1
  95. package/.claude/agents/document-writer.md +0 -152
  96. package/.claude/agents/explore-medium.md +0 -25
  97. package/.claude/agents/explore.md +0 -86
  98. package/.claude/agents/frontend-engineer-high.md +0 -24
  99. package/.claude/agents/frontend-engineer-low.md +0 -23
  100. package/.claude/agents/frontend-engineer.md +0 -89
  101. package/.claude/agents/librarian-low.md +0 -22
  102. package/.claude/agents/librarian.md +0 -70
  103. package/.claude/agents/metis.md +0 -85
  104. package/.claude/agents/momus.md +0 -97
  105. package/.claude/agents/multimodal-looker.md +0 -39
  106. package/.claude/agents/olympian-high.md +0 -39
  107. package/.claude/agents/olympian-low.md +0 -29
  108. package/.claude/agents/olympian.md +0 -71
  109. package/.claude/agents/oracle-low.md +0 -23
  110. package/.claude/agents/oracle-medium.md +0 -28
  111. package/.claude/agents/oracle.md +0 -77
  112. package/.claude/agents/prometheus.md +0 -126
  113. package/.claude/agents/qa-tester.md +0 -220
  114. package/.claude/commands/analyze/skill.md +0 -14
  115. package/.claude/commands/analyze.md +0 -14
  116. package/.claude/commands/ascent/skill.md +0 -152
  117. package/.claude/commands/ascent.md +0 -152
  118. package/.claude/commands/cancel-ascent.md +0 -9
  119. package/.claude/commands/complete-plan.md +0 -101
  120. package/.claude/commands/deepinit.md +0 -114
  121. package/.claude/commands/deepsearch/skill.md +0 -15
  122. package/.claude/commands/deepsearch.md +0 -15
  123. package/.claude/commands/doctor.md +0 -190
  124. package/.claude/commands/olympus/skill.md +0 -82
  125. package/.claude/commands/olympus-default.md +0 -26
  126. package/.claude/commands/plan.md +0 -37
  127. package/.claude/commands/prometheus/skill.md +0 -41
  128. package/.claude/commands/prometheus.md +0 -41
  129. package/.claude/commands/review/skill.md +0 -40
  130. package/.claude/commands/review.md +0 -40
  131. package/.claude/commands/ultrawork/skill.md +0 -90
  132. package/.claude/commands/ultrawork.md +0 -90
  133. package/.claude/commands/update.md +0 -38
  134. package/dist/features/boulder-state/constants.d.ts +0 -20
  135. package/dist/features/boulder-state/constants.d.ts.map +0 -1
  136. package/dist/features/boulder-state/constants.js +0 -20
  137. package/dist/features/boulder-state/constants.js.map +0 -1
  138. package/dist/features/boulder-state/index.d.ts +0 -12
  139. package/dist/features/boulder-state/index.d.ts.map +0 -1
  140. package/dist/features/boulder-state/index.js +0 -13
  141. package/dist/features/boulder-state/index.js.map +0 -1
  142. package/dist/features/boulder-state/storage.d.ts +0 -58
  143. package/dist/features/boulder-state/storage.d.ts.map +0 -1
  144. package/dist/features/boulder-state/storage.js +0 -174
  145. package/dist/features/boulder-state/storage.js.map +0 -1
  146. package/dist/features/boulder-state/types.d.ts +0 -48
  147. package/dist/features/boulder-state/types.d.ts.map +0 -1
  148. package/dist/features/boulder-state/types.js +0 -10
  149. 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,116 @@
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, spawnSync } 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
+ /**
13
+ * Execute bundle with stdin input (cross-platform)
14
+ */
15
+ function execBundleWithInput(event, input, timeout = 5000) {
16
+ try {
17
+ const result = spawnSync('node', [BUNDLE_PATH, `--event=${event}`], {
18
+ input,
19
+ encoding: 'utf-8',
20
+ timeout,
21
+ cwd: PROJECT_ROOT,
22
+ shell: true
23
+ });
24
+ return { stdout: result.stdout || '', stderr: result.stderr || '' };
25
+ }
26
+ catch (error) {
27
+ return { stdout: '', stderr: '', error: error };
28
+ }
29
+ }
30
+ describe('Hook Bundle', () => {
31
+ describe('Bundle File', () => {
32
+ it('bundle file exists', () => {
33
+ // Skip if bundle doesn't exist (CI might not have built it)
34
+ if (!existsSync(BUNDLE_PATH)) {
35
+ console.log('Bundle not found, skipping bundle tests. Run npm run build:hooks first.');
36
+ return;
37
+ }
38
+ expect(existsSync(BUNDLE_PATH)).toBe(true);
39
+ });
40
+ it('bundle size is reasonable (<500KB)', () => {
41
+ if (!existsSync(BUNDLE_PATH)) {
42
+ console.log('Bundle not found, skipping size test.');
43
+ return;
44
+ }
45
+ const stats = statSync(BUNDLE_PATH);
46
+ const sizeKB = stats.size / 1024;
47
+ console.log(`Bundle size: ${sizeKB.toFixed(2)} KB`);
48
+ expect(sizeKB).toBeLessThan(500);
49
+ });
50
+ });
51
+ describe('Bundle Execution', () => {
52
+ it('can be executed without import errors', { timeout: 10000 }, () => {
53
+ if (!existsSync(BUNDLE_PATH)) {
54
+ console.log('Bundle not found, skipping execution test.');
55
+ return;
56
+ }
57
+ const { stdout, stderr } = execBundleWithInput('UserPromptSubmit', '{}');
58
+ // Import errors should fail the test
59
+ expect(stderr).not.toContain('Cannot find module');
60
+ expect(stderr).not.toContain('SyntaxError');
61
+ expect(stderr).not.toContain('is not defined');
62
+ // Should return valid JSON
63
+ if (stdout.trim()) {
64
+ const parsed = JSON.parse(stdout.trim());
65
+ expect(parsed).toHaveProperty('continue');
66
+ }
67
+ });
68
+ it('returns valid JSON for all event types', { timeout: 60000 }, () => {
69
+ if (!existsSync(BUNDLE_PATH)) {
70
+ console.log('Bundle not found, skipping event types test.');
71
+ return;
72
+ }
73
+ const events = [
74
+ 'UserPromptSubmit',
75
+ 'SessionStart',
76
+ 'Stop',
77
+ 'PreToolUse',
78
+ 'PostToolUse',
79
+ 'Notification',
80
+ 'MessagesTransform'
81
+ ];
82
+ for (const event of events) {
83
+ const { stdout, stderr } = execBundleWithInput(event, '{"sessionId":"test"}');
84
+ // Import errors should fail
85
+ expect(stderr).not.toContain('Cannot find module');
86
+ expect(stderr).not.toContain('SyntaxError');
87
+ // Should return valid JSON
88
+ if (stdout.trim()) {
89
+ const parsed = JSON.parse(stdout.trim());
90
+ expect(parsed).toHaveProperty('continue');
91
+ }
92
+ }
93
+ });
94
+ it('handles missing event argument gracefully', () => {
95
+ if (!existsSync(BUNDLE_PATH)) {
96
+ console.log('Bundle not found, skipping error handling test.');
97
+ return;
98
+ }
99
+ try {
100
+ execSync(`echo '{}' | node "${BUNDLE_PATH}"`, {
101
+ encoding: 'utf-8',
102
+ timeout: 5000,
103
+ cwd: PROJECT_ROOT
104
+ });
105
+ // Should fail without --event
106
+ expect(true).toBe(false); // Force fail if we get here
107
+ }
108
+ catch (error) {
109
+ // Expected to fail with usage message
110
+ const stderr = error.stderr?.toString() || '';
111
+ expect(stderr).toContain('--event');
112
+ }
113
+ });
114
+ });
115
+ });
116
+ //# 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,267 @@
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
+ // Allow 400ms for stress test due to CI variance, cold cache, and hook timeout (100ms)
258
+ expect(avg).toBeLessThan(400);
259
+ }
260
+ console.log('Event Type Performance:');
261
+ Object.entries(results).forEach(([event, time]) => {
262
+ console.log(` ${event}: ${time.toFixed(2)}ms avg`);
263
+ });
264
+ });
265
+ });
266
+ });
267
+ //# 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":""}