olympus-ai 3.2.3 → 3.3.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/.claude-plugin/plugin.json +1 -1
- package/dist/__tests__/ascent-checkpoint.test.d.ts +2 -0
- package/dist/__tests__/ascent-checkpoint.test.d.ts.map +1 -0
- package/dist/__tests__/ascent-checkpoint.test.js +261 -0
- package/dist/__tests__/ascent-checkpoint.test.js.map +1 -0
- package/dist/__tests__/config-ascent.test.d.ts +2 -0
- package/dist/__tests__/config-ascent.test.d.ts.map +1 -0
- package/dist/__tests__/config-ascent.test.js +134 -0
- package/dist/__tests__/config-ascent.test.js.map +1 -0
- package/dist/__tests__/hook-blocking.test.d.ts +8 -0
- package/dist/__tests__/hook-blocking.test.d.ts.map +1 -0
- package/dist/__tests__/hook-blocking.test.js +277 -0
- package/dist/__tests__/hook-blocking.test.js.map +1 -0
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/metrics-cli.test.d.ts +5 -0
- package/dist/__tests__/metrics-cli.test.d.ts.map +1 -0
- package/dist/__tests__/metrics-cli.test.js +24 -0
- package/dist/__tests__/metrics-cli.test.js.map +1 -0
- package/dist/__tests__/skill-auto-detection.test.d.ts +2 -0
- package/dist/__tests__/skill-auto-detection.test.d.ts.map +1 -0
- package/dist/__tests__/skill-auto-detection.test.js +255 -0
- package/dist/__tests__/skill-auto-detection.test.js.map +1 -0
- package/dist/__tests__/token-estimator.test.d.ts +5 -0
- package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/token-estimator.test.js +192 -0
- package/dist/__tests__/token-estimator.test.js.map +1 -0
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +83 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/document-writer.d.ts.map +1 -1
- package/dist/agents/document-writer.js +38 -0
- package/dist/agents/document-writer.js.map +1 -1
- package/dist/agents/frontend-engineer.d.ts.map +1 -1
- package/dist/agents/frontend-engineer.js +16 -0
- package/dist/agents/frontend-engineer.js.map +1 -1
- package/dist/agents/olympian.d.ts.map +1 -1
- package/dist/agents/olympian.js +15 -0
- package/dist/agents/olympian.js.map +1 -1
- package/dist/cli/commands/metrics.d.ts +31 -0
- package/dist/cli/commands/metrics.d.ts.map +1 -0
- package/dist/cli/commands/metrics.js +266 -0
- package/dist/cli/commands/metrics.js.map +1 -0
- package/dist/cli/index.js +39 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +16 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/features/ascent-checkpoint/index.d.ts +48 -0
- package/dist/features/ascent-checkpoint/index.d.ts.map +1 -0
- package/dist/features/ascent-checkpoint/index.js +144 -0
- package/dist/features/ascent-checkpoint/index.js.map +1 -0
- package/dist/features/hook-logging/index.d.ts +37 -0
- package/dist/features/hook-logging/index.d.ts.map +1 -0
- package/dist/features/hook-logging/index.js +120 -0
- package/dist/features/hook-logging/index.js.map +1 -0
- package/dist/features/hook-logging/index.test.d.ts +5 -0
- package/dist/features/hook-logging/index.test.d.ts.map +1 -0
- package/dist/features/hook-logging/index.test.js +268 -0
- package/dist/features/hook-logging/index.test.js.map +1 -0
- package/dist/features/index.d.ts +3 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +8 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/magic-keywords.d.ts +51 -0
- package/dist/features/magic-keywords.d.ts.map +1 -1
- package/dist/features/magic-keywords.js +172 -0
- package/dist/features/magic-keywords.js.map +1 -1
- package/dist/features/session-state/index.d.ts +50 -0
- package/dist/features/session-state/index.d.ts.map +1 -0
- package/dist/features/session-state/index.js +64 -0
- package/dist/features/session-state/index.js.map +1 -0
- package/dist/features/session-state/index.test.d.ts +5 -0
- package/dist/features/session-state/index.test.d.ts.map +1 -0
- package/dist/features/session-state/index.test.js +221 -0
- package/dist/features/session-state/index.test.js.map +1 -0
- package/dist/features/token-metrics/index.d.ts +6 -0
- package/dist/features/token-metrics/index.d.ts.map +1 -0
- package/dist/features/token-metrics/index.js +5 -0
- package/dist/features/token-metrics/index.js.map +1 -0
- package/dist/features/token-metrics/storage.d.ts +16 -0
- package/dist/features/token-metrics/storage.d.ts.map +1 -0
- package/dist/features/token-metrics/storage.js +144 -0
- package/dist/features/token-metrics/storage.js.map +1 -0
- package/dist/features/token-metrics/token-estimator.d.ts +66 -0
- package/dist/features/token-metrics/token-estimator.d.ts.map +1 -0
- package/dist/features/token-metrics/token-estimator.js +230 -0
- package/dist/features/token-metrics/token-estimator.js.map +1 -0
- package/dist/features/token-metrics/types.d.ts +63 -0
- package/dist/features/token-metrics/types.d.ts.map +1 -0
- package/dist/features/token-metrics/types.js +5 -0
- package/dist/features/token-metrics/types.js.map +1 -0
- package/dist/hooks/olympus-orchestrator/constants.d.ts +2 -0
- package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/constants.js +41 -0
- package/dist/hooks/olympus-orchestrator/constants.js.map +1 -1
- package/dist/hooks/olympus-orchestrator/index.d.ts +10 -1
- package/dist/hooks/olympus-orchestrator/index.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/index.js +108 -14
- package/dist/hooks/olympus-orchestrator/index.js.map +1 -1
- package/dist/hooks/registrations/index.d.ts +2 -1
- package/dist/hooks/registrations/index.d.ts.map +1 -1
- package/dist/hooks/registrations/index.js +3 -1
- package/dist/hooks/registrations/index.js.map +1 -1
- package/dist/hooks/registrations/token-metrics.d.ts +11 -0
- package/dist/hooks/registrations/token-metrics.d.ts.map +1 -0
- package/dist/hooks/registrations/token-metrics.js +119 -0
- package/dist/hooks/registrations/token-metrics.js.map +1 -0
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +334 -9
- package/dist/installer/index.js.map +1 -1
- package/dist/shared/types.d.ts +16 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/scripts/.olympus/token-metrics.jsonl +1 -0
- package/scripts/dist/hooks/olympus-hooks.cjs +127 -128
- package/scripts/esbuild.hooks.mjs +1 -1
- package/.claude/CLAUDE.md +0 -66
- package/scripts/generate-logo-hybrid-v2.mjs +0 -213
- package/scripts/generate-logo-hybrid.mjs +0 -209
- package/scripts/generate-logo-infinity.mjs +0 -239
- package/scripts/generate-logo-mythology.mjs +0 -190
- package/scripts/generate-logo-orchestration.mjs +0 -228
- package/scripts/generate-logo-recraft.mjs +0 -147
- package/scripts/generate-logo-simple.mjs +0 -154
- package/scripts/generate-logo.mjs +0 -117
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation utilities for Olympus metrics
|
|
3
|
+
*
|
|
4
|
+
* Uses gpt-tokenizer for accurate token counting with fallback to character-based estimation.
|
|
5
|
+
* Token counts are approximations for tracking trends, not exact billing calculations.
|
|
6
|
+
*/
|
|
7
|
+
let encode = null;
|
|
8
|
+
let tokenizerInitialized = false;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the GPT tokenizer (lazy-loaded)
|
|
11
|
+
*/
|
|
12
|
+
async function initTokenizer() {
|
|
13
|
+
if (tokenizerInitialized)
|
|
14
|
+
return;
|
|
15
|
+
try {
|
|
16
|
+
// Dynamic import for gpt-tokenizer
|
|
17
|
+
const { encode: gptEncode } = await import('gpt-tokenizer');
|
|
18
|
+
encode = gptEncode;
|
|
19
|
+
tokenizerInitialized = true;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
// Tokenizer unavailable, will fall back to character counting
|
|
23
|
+
tokenizerInitialized = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Estimate token count using character-based heuristic
|
|
28
|
+
* Claude/GPT-4 average: ~1 token per 4 characters
|
|
29
|
+
*/
|
|
30
|
+
function estimateTokensByCharacters(text) {
|
|
31
|
+
return Math.ceil(text.length / 4);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Convert unknown input to string for token estimation
|
|
35
|
+
*/
|
|
36
|
+
function stringifyInput(input) {
|
|
37
|
+
if (input === null || input === undefined) {
|
|
38
|
+
return { text: '', inputType: 'unknown' };
|
|
39
|
+
}
|
|
40
|
+
if (typeof input === 'string') {
|
|
41
|
+
return { text: input, inputType: 'string' };
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(input)) {
|
|
44
|
+
return { text: JSON.stringify(input), inputType: 'array' };
|
|
45
|
+
}
|
|
46
|
+
if (typeof input === 'object') {
|
|
47
|
+
return { text: JSON.stringify(input), inputType: 'object' };
|
|
48
|
+
}
|
|
49
|
+
return { text: String(input), inputType: 'unknown' };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Main token estimation function
|
|
53
|
+
*
|
|
54
|
+
* @param text - Text to estimate tokens for
|
|
55
|
+
* @returns Estimated token count
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const tokens = await estimateTokens("Hello, world!");
|
|
60
|
+
* console.log(tokens); // ~4 tokens
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export async function estimateTokens(text) {
|
|
64
|
+
if (!text || text.length === 0) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
await initTokenizer();
|
|
68
|
+
try {
|
|
69
|
+
if (encode) {
|
|
70
|
+
const tokens = encode(text);
|
|
71
|
+
return tokens.length;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// Fall through to character-based estimation
|
|
76
|
+
}
|
|
77
|
+
return estimateTokensByCharacters(text);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Estimate tokens with detailed metadata
|
|
81
|
+
*
|
|
82
|
+
* @param input - Input to estimate (string, object, array, etc.)
|
|
83
|
+
* @returns Token estimate with method and input type
|
|
84
|
+
*/
|
|
85
|
+
export async function estimateTokensDetailed(input) {
|
|
86
|
+
const { text, inputType } = stringifyInput(input);
|
|
87
|
+
if (!text || text.length === 0) {
|
|
88
|
+
return {
|
|
89
|
+
tokens: 0,
|
|
90
|
+
method: 'character-fallback',
|
|
91
|
+
inputType,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
await initTokenizer();
|
|
95
|
+
try {
|
|
96
|
+
if (encode) {
|
|
97
|
+
const tokens = encode(text);
|
|
98
|
+
return {
|
|
99
|
+
tokens: tokens.length,
|
|
100
|
+
method: 'gpt-tokenizer',
|
|
101
|
+
inputType,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
// Fall through to character-based estimation
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
tokens: estimateTokensByCharacters(text),
|
|
110
|
+
method: 'character-fallback',
|
|
111
|
+
inputType,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Estimate tokens from tool output (handles various result formats)
|
|
116
|
+
*
|
|
117
|
+
* @param output - Tool output object (from Claude Code SDK)
|
|
118
|
+
* @returns Estimated token count
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```ts
|
|
122
|
+
* const readResult = { content: "file contents..." };
|
|
123
|
+
* const tokens = await estimateTokensFromToolOutput(readResult);
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export async function estimateTokensFromToolOutput(output) {
|
|
127
|
+
if (!output) {
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
// Handle common tool output formats
|
|
131
|
+
if (typeof output === 'object' && output !== null) {
|
|
132
|
+
// Check for common content fields
|
|
133
|
+
const obj = output;
|
|
134
|
+
if ('content' in obj && typeof obj.content === 'string') {
|
|
135
|
+
return estimateTokens(obj.content);
|
|
136
|
+
}
|
|
137
|
+
if ('output' in obj && typeof obj.output === 'string') {
|
|
138
|
+
return estimateTokens(obj.output);
|
|
139
|
+
}
|
|
140
|
+
if ('text' in obj && typeof obj.text === 'string') {
|
|
141
|
+
return estimateTokens(obj.text);
|
|
142
|
+
}
|
|
143
|
+
if ('result' in obj && typeof obj.result === 'string') {
|
|
144
|
+
return estimateTokens(obj.result);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Fallback: stringify entire object
|
|
148
|
+
const { text } = stringifyInput(output);
|
|
149
|
+
return estimateTokens(text);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Estimate total context size from conversation messages
|
|
153
|
+
*
|
|
154
|
+
* @param messages - Array of message objects (any format with text content)
|
|
155
|
+
* @returns Conversation metrics with total tokens and averages
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```ts
|
|
159
|
+
* const messages = [
|
|
160
|
+
* { role: "user", content: "Hello" },
|
|
161
|
+
* { role: "assistant", content: "Hi there!" }
|
|
162
|
+
* ];
|
|
163
|
+
* const metrics = await estimateContextSize(messages);
|
|
164
|
+
* console.log(metrics.totalTokens); // ~8 tokens
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
export async function estimateContextSize(messages) {
|
|
168
|
+
if (!messages || messages.length === 0) {
|
|
169
|
+
return {
|
|
170
|
+
totalTokens: 0,
|
|
171
|
+
messageCount: 0,
|
|
172
|
+
averageTokensPerMessage: 0,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
let totalTokens = 0;
|
|
176
|
+
for (const message of messages) {
|
|
177
|
+
if (!message)
|
|
178
|
+
continue;
|
|
179
|
+
// Handle various message formats
|
|
180
|
+
if (typeof message === 'string') {
|
|
181
|
+
totalTokens += await estimateTokens(message);
|
|
182
|
+
}
|
|
183
|
+
else if (typeof message === 'object') {
|
|
184
|
+
const obj = message;
|
|
185
|
+
// Check common message content fields
|
|
186
|
+
if ('content' in obj) {
|
|
187
|
+
if (typeof obj.content === 'string') {
|
|
188
|
+
totalTokens += await estimateTokens(obj.content);
|
|
189
|
+
}
|
|
190
|
+
else if (Array.isArray(obj.content)) {
|
|
191
|
+
// Handle multi-part content (e.g., Claude SDK format)
|
|
192
|
+
for (const part of obj.content) {
|
|
193
|
+
if (typeof part === 'string') {
|
|
194
|
+
totalTokens += await estimateTokens(part);
|
|
195
|
+
}
|
|
196
|
+
else if (part && typeof part === 'object' && 'text' in part && typeof part.text === 'string') {
|
|
197
|
+
totalTokens += await estimateTokens(part.text);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if ('text' in obj && typeof obj.text === 'string') {
|
|
203
|
+
totalTokens += await estimateTokens(obj.text);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// Fallback: entire message object
|
|
207
|
+
totalTokens += await estimateTokensFromToolOutput(message);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
totalTokens,
|
|
213
|
+
messageCount: messages.length,
|
|
214
|
+
averageTokensPerMessage: messages.length > 0 ? Math.round(totalTokens / messages.length) : 0,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Synchronous version of estimateTokens using only character-based estimation
|
|
219
|
+
* Useful when async operations aren't possible
|
|
220
|
+
*
|
|
221
|
+
* @param text - Text to estimate tokens for
|
|
222
|
+
* @returns Estimated token count (character-based)
|
|
223
|
+
*/
|
|
224
|
+
export function estimateTokensSync(text) {
|
|
225
|
+
if (!text || text.length === 0) {
|
|
226
|
+
return 0;
|
|
227
|
+
}
|
|
228
|
+
return estimateTokensByCharacters(text);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=token-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../../src/features/token-metrics/token-estimator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the Olympus token metrics tracking system
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Token metrics entry for JSONL storage
|
|
6
|
+
*/
|
|
7
|
+
export interface TokenMetricsEntry {
|
|
8
|
+
timestamp: string;
|
|
9
|
+
session_id: string;
|
|
10
|
+
event_type: 'prompt' | 'tool_use' | 'response';
|
|
11
|
+
input_tokens?: number;
|
|
12
|
+
output_tokens?: number;
|
|
13
|
+
model?: string;
|
|
14
|
+
tool_name?: string;
|
|
15
|
+
context_size?: number;
|
|
16
|
+
project_path?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Aggregated metrics for reporting
|
|
20
|
+
*/
|
|
21
|
+
export interface TokenMetricsReport {
|
|
22
|
+
total_input_tokens: number;
|
|
23
|
+
total_output_tokens: number;
|
|
24
|
+
total_tokens: number;
|
|
25
|
+
events_count: number;
|
|
26
|
+
session_count: number;
|
|
27
|
+
by_event_type: Record<string, {
|
|
28
|
+
input_tokens: number;
|
|
29
|
+
output_tokens: number;
|
|
30
|
+
count: number;
|
|
31
|
+
}>;
|
|
32
|
+
by_model: Record<string, {
|
|
33
|
+
input_tokens: number;
|
|
34
|
+
output_tokens: number;
|
|
35
|
+
count: number;
|
|
36
|
+
}>;
|
|
37
|
+
by_project: Record<string, {
|
|
38
|
+
input_tokens: number;
|
|
39
|
+
output_tokens: number;
|
|
40
|
+
count: number;
|
|
41
|
+
}>;
|
|
42
|
+
date_range: {
|
|
43
|
+
start: string;
|
|
44
|
+
end: string;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Token estimation result with metadata
|
|
49
|
+
*/
|
|
50
|
+
export interface TokenEstimate {
|
|
51
|
+
tokens: number;
|
|
52
|
+
method: 'gpt-tokenizer' | 'character-fallback';
|
|
53
|
+
inputType: 'string' | 'object' | 'array' | 'unknown';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Conversation-level token metrics
|
|
57
|
+
*/
|
|
58
|
+
export interface ConversationMetrics {
|
|
59
|
+
totalTokens: number;
|
|
60
|
+
messageCount: number;
|
|
61
|
+
averageTokensPerMessage: number;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/features/token-metrics/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAC5B,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAEH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAEH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAEH,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,GAAG,oBAAoB,CAAC;IAC/C,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/features/token-metrics/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -20,4 +20,6 @@ export declare const QUEST_CONTINUATION_PROMPT = "[SYSTEM REMINDER - QUEST CONTI
|
|
|
20
20
|
export declare const VERIFICATION_REMINDER = "**MANDATORY VERIFICATION - SUBAGENTS LIE**\n\nSubagents FREQUENTLY claim completion when:\n- Tests are actually FAILING\n- Code has type/lint ERRORS\n- Implementation is INCOMPLETE\n- Patterns were NOT followed\n\n**YOU MUST VERIFY EVERYTHING YOURSELF:**\n\n1. Run tests yourself - Must PASS (not \"agent said it passed\")\n2. Read the actual code - Must match requirements\n3. Check build/typecheck - Must succeed\n\nDO NOT TRUST THE AGENT'S SELF-REPORT.\nVERIFY EACH CLAIM WITH YOUR OWN TOOL CALLS.";
|
|
21
21
|
/** Directive for subagents to refuse multi-task requests */
|
|
22
22
|
export declare const SINGLE_TASK_DIRECTIVE = "\n\n[SYSTEM DIRECTIVE - SINGLE TASK ONLY]\n\n**STOP. READ THIS BEFORE PROCEEDING.**\n\nIf you were NOT given **exactly ONE atomic task**, you MUST:\n1. **IMMEDIATELY REFUSE** this request\n2. **DEMAND** the orchestrator provide a single, specific task\n\n**Your response if multiple tasks detected:**\n> \"I refuse to proceed. You provided multiple tasks. An orchestrator's impatience destroys work quality.\n>\n> PROVIDE EXACTLY ONE TASK. One file. One change. One verification.\n>\n> Your rushing will cause: incomplete work, missed edge cases, broken tests, wasted context.\"\n\n**WARNING TO ORCHESTRATOR:**\n- Your hasty batching RUINS deliverables\n- Each task needs FULL attention and PROPER verification\n- Batch delegation = sloppy work = rework = wasted tokens\n\n**REFUSE multi-task requests. DEMAND single-task clarity.**\n";
|
|
23
|
+
/** Hard block error for delegation requirement */
|
|
24
|
+
export declare const DELEGATION_REQUIRED_ERROR = "\n\n================================================================================\nHARD BLOCK: DELEGATION REQUIRED\n================================================================================\n\nYou attempted to directly modify a source file. This operation is BLOCKED.\n\nAs an ORCHESTRATOR, you MUST delegate implementation work to subagents.\n\nALLOWED operations:\n - Modify files in .olympus/ directory (plans, drafts, logs)\n - Create test files (*.test.ts, *.spec.ts, __tests__/*)\n - Verification edits (<10 lines on files from last 3 completed tasks)\n\nBLOCKED operations:\n - Direct source code modifications\n - Creating new implementation files\n - Large refactors\n\nTO PROCEED:\n 1. Use the Task tool to delegate to an appropriate subagent:\n - olympian: General implementation\n - frontend-engineer: UI/UX work\n - oracle: Debugging and architecture\n\n 2. Provide clear, atomic task with acceptance criteria\n\n 3. Verify subagent work after completion\n\nExample delegation:\n Task tool with subagent_type=\"olympian\", prompt=\"Implement X with Y constraints\"\n\n================================================================================\n\nThis is a HARD BLOCK. The operation will NOT be executed.\nDelegate to a subagent to proceed.\n\n================================================================================\n";
|
|
23
25
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,SAAS,yBAAyB,CAAC;AAEhD,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,UAAqC,CAAC;AAEnE,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,8tBA0BhC,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,gCAAgC,uoCA8C5C,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,yBAAyB,qZASuB,CAAC;AAE9D,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,yfAeU,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,u0BAuBjC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,SAAS,yBAAyB,CAAC;AAEhD,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,UAAqC,CAAC;AAEnE,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,8tBA0BhC,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,gCAAgC,uoCA8C5C,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,yBAAyB,qZASuB,CAAC;AAE9D,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,yfAeU,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,u0BAuBjC,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,yBAAyB,q2CAuCrC,CAAC"}
|
|
@@ -139,4 +139,45 @@ If you were NOT given **exactly ONE atomic task**, you MUST:
|
|
|
139
139
|
|
|
140
140
|
**REFUSE multi-task requests. DEMAND single-task clarity.**
|
|
141
141
|
`;
|
|
142
|
+
/** Hard block error for delegation requirement */
|
|
143
|
+
export const DELEGATION_REQUIRED_ERROR = `
|
|
144
|
+
|
|
145
|
+
================================================================================
|
|
146
|
+
HARD BLOCK: DELEGATION REQUIRED
|
|
147
|
+
================================================================================
|
|
148
|
+
|
|
149
|
+
You attempted to directly modify a source file. This operation is BLOCKED.
|
|
150
|
+
|
|
151
|
+
As an ORCHESTRATOR, you MUST delegate implementation work to subagents.
|
|
152
|
+
|
|
153
|
+
ALLOWED operations:
|
|
154
|
+
- Modify files in .olympus/ directory (plans, drafts, logs)
|
|
155
|
+
- Create test files (*.test.ts, *.spec.ts, __tests__/*)
|
|
156
|
+
- Verification edits (<10 lines on files from last 3 completed tasks)
|
|
157
|
+
|
|
158
|
+
BLOCKED operations:
|
|
159
|
+
- Direct source code modifications
|
|
160
|
+
- Creating new implementation files
|
|
161
|
+
- Large refactors
|
|
162
|
+
|
|
163
|
+
TO PROCEED:
|
|
164
|
+
1. Use the Task tool to delegate to an appropriate subagent:
|
|
165
|
+
- olympian: General implementation
|
|
166
|
+
- frontend-engineer: UI/UX work
|
|
167
|
+
- oracle: Debugging and architecture
|
|
168
|
+
|
|
169
|
+
2. Provide clear, atomic task with acceptance criteria
|
|
170
|
+
|
|
171
|
+
3. Verify subagent work after completion
|
|
172
|
+
|
|
173
|
+
Example delegation:
|
|
174
|
+
Task tool with subagent_type="olympian", prompt="Implement X with Y constraints"
|
|
175
|
+
|
|
176
|
+
================================================================================
|
|
177
|
+
|
|
178
|
+
This is a HARD BLOCK. The operation will NOT be executed.
|
|
179
|
+
Delegate to a subagent to proceed.
|
|
180
|
+
|
|
181
|
+
================================================================================
|
|
182
|
+
`;
|
|
142
183
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,sBAAsB,CAAC;AAEhD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE/C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BnC,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8C/C,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;6DASoB,CAAC;AAE9D,8CAA8C;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;4CAeO,CAAC;AAE7C,4DAA4D;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,sBAAsB,CAAC;AAEhD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE/C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BnC,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8C/C,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;6DASoB,CAAC;AAE9D,8CAA8C;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;4CAeO,CAAC;AAE7C,4DAA4D;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBpC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCxC,CAAC"}
|
|
@@ -41,6 +41,14 @@ interface GitFileStat {
|
|
|
41
41
|
* Check if a file path is allowed for direct orchestrator modification
|
|
42
42
|
*/
|
|
43
43
|
export declare function isAllowedPath(filePath: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Check if a file is a test file
|
|
46
|
+
*/
|
|
47
|
+
export declare function isTestFile(filePath: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Calculate lines changed from tool input
|
|
50
|
+
*/
|
|
51
|
+
export declare function calculateLinesChanged(toolName: string, toolInput?: Record<string, unknown>): number;
|
|
44
52
|
/**
|
|
45
53
|
* Check if a tool is a write/edit tool
|
|
46
54
|
*/
|
|
@@ -70,12 +78,13 @@ export declare function buildOrchestratorReminder(planName: string, progress: {
|
|
|
70
78
|
export declare function buildQuestContinuation(planName: string, remaining: number, total: number): string;
|
|
71
79
|
/**
|
|
72
80
|
* Process pre-tool-use hook for orchestrator
|
|
73
|
-
*
|
|
81
|
+
* Implements HARD BLOCKING for direct source file modifications
|
|
74
82
|
*/
|
|
75
83
|
export declare function processOrchestratorPreTool(input: ToolExecuteInput): ToolExecuteOutput;
|
|
76
84
|
/**
|
|
77
85
|
* Process post-tool-use hook for orchestrator
|
|
78
86
|
* Adds reminders after file modifications and Task delegations
|
|
87
|
+
* Records Task completions in session state
|
|
79
88
|
*/
|
|
80
89
|
export declare function processOrchestratorPostTool(input: ToolExecuteInput, output: string): ToolExecuteOutput;
|
|
81
90
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsBH,cAAc,gBAAgB,CAAC;AAK/B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIvD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAUpD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAqBR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAmDhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAkC9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAapE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9C,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAkFrF;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,MAAM,GACb,iBAAiB,CAiEnB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG;IACzD,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAmBA;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM;IAE3D;;OAEG;;IAGH;;OAEG;wBACiB,MAAM,aAAa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ9D;;OAEG;yBACkB,MAAM,aAAa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,MAAM;IAO/E;;OAEG;;wBAxDW,OAAO;kBACb,MAAM;;IA4Dd;;OAEG;;EAGN"}
|
|
@@ -11,17 +11,60 @@
|
|
|
11
11
|
* User Impact: Enforces "conductor mindset" - orchestrators delegate, not implement
|
|
12
12
|
*/
|
|
13
13
|
import { execSync } from 'child_process';
|
|
14
|
-
import { HOOK_NAME, ALLOWED_PATH_PREFIX, WRITE_EDIT_TOOLS, DIRECT_WORK_REMINDER,
|
|
14
|
+
import { HOOK_NAME, ALLOWED_PATH_PREFIX, WRITE_EDIT_TOOLS, DIRECT_WORK_REMINDER, QUEST_CONTINUATION_PROMPT, VERIFICATION_REMINDER, SINGLE_TASK_DIRECTIVE, DELEGATION_REQUIRED_ERROR, } from './constants.js';
|
|
15
15
|
import { readQuestState, getPlanProgress, } from '../../features/quest-state/index.js';
|
|
16
|
+
import { SessionState } from '../../features/session-state/index.js';
|
|
17
|
+
import { logViolation } from '../../features/hook-logging/index.js';
|
|
16
18
|
// Re-export constants
|
|
17
19
|
export * from './constants.js';
|
|
20
|
+
// Module-level session state instance
|
|
21
|
+
const sessionState = new SessionState();
|
|
18
22
|
/**
|
|
19
23
|
* Check if a file path is allowed for direct orchestrator modification
|
|
20
24
|
*/
|
|
21
25
|
export function isAllowedPath(filePath) {
|
|
22
26
|
if (!filePath)
|
|
23
27
|
return true;
|
|
24
|
-
|
|
28
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
29
|
+
return normalized.includes(ALLOWED_PATH_PREFIX);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if a file is a test file
|
|
33
|
+
*/
|
|
34
|
+
export function isTestFile(filePath) {
|
|
35
|
+
if (!filePath)
|
|
36
|
+
return false;
|
|
37
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
38
|
+
return (normalized.includes('__tests__/') ||
|
|
39
|
+
normalized.endsWith('.test.ts') ||
|
|
40
|
+
normalized.endsWith('.test.js') ||
|
|
41
|
+
normalized.endsWith('.spec.ts') ||
|
|
42
|
+
normalized.endsWith('.spec.js'));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Calculate lines changed from tool input
|
|
46
|
+
*/
|
|
47
|
+
export function calculateLinesChanged(toolName, toolInput) {
|
|
48
|
+
if (!toolInput)
|
|
49
|
+
return 0;
|
|
50
|
+
// For Edit tool, calculate based on old_string and new_string
|
|
51
|
+
if (toolName === 'Edit' || toolName === 'edit') {
|
|
52
|
+
const oldString = (toolInput.old_string ?? '');
|
|
53
|
+
const newString = (toolInput.new_string ?? '');
|
|
54
|
+
if (!oldString && !newString)
|
|
55
|
+
return 0;
|
|
56
|
+
const oldLines = oldString.split('\n').length;
|
|
57
|
+
const newLines = newString.split('\n').length;
|
|
58
|
+
return Math.abs(newLines - oldLines);
|
|
59
|
+
}
|
|
60
|
+
// For Write tool, calculate based on content
|
|
61
|
+
if (toolName === 'Write' || toolName === 'write') {
|
|
62
|
+
const content = (toolInput.content ?? '');
|
|
63
|
+
if (!content)
|
|
64
|
+
return 0;
|
|
65
|
+
return content.split('\n').length;
|
|
66
|
+
}
|
|
67
|
+
return 0;
|
|
25
68
|
}
|
|
26
69
|
/**
|
|
27
70
|
* Check if a tool is a write/edit tool
|
|
@@ -156,33 +199,77 @@ export function buildQuestContinuation(planName, remaining, total) {
|
|
|
156
199
|
}
|
|
157
200
|
/**
|
|
158
201
|
* Process pre-tool-use hook for orchestrator
|
|
159
|
-
*
|
|
202
|
+
* Implements HARD BLOCKING for direct source file modifications
|
|
160
203
|
*/
|
|
161
204
|
export function processOrchestratorPreTool(input) {
|
|
162
|
-
const { toolName, toolInput } = input;
|
|
205
|
+
const { toolName, toolInput, directory } = input;
|
|
206
|
+
const workDir = directory || process.cwd();
|
|
163
207
|
// Only check write/edit tools
|
|
164
208
|
if (!isWriteEditTool(toolName)) {
|
|
165
209
|
return { continue: true };
|
|
166
210
|
}
|
|
167
211
|
// Extract file path from tool input
|
|
168
212
|
const filePath = (toolInput?.filePath ?? toolInput?.path ?? toolInput?.file);
|
|
169
|
-
|
|
170
|
-
if (!filePath || isAllowedPath(filePath)) {
|
|
213
|
+
if (!filePath) {
|
|
171
214
|
return { continue: true };
|
|
172
215
|
}
|
|
173
|
-
|
|
174
|
-
|
|
216
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
217
|
+
// ALWAYS ALLOW: .olympus/ paths
|
|
218
|
+
if (isAllowedPath(normalizedPath)) {
|
|
219
|
+
logViolation({
|
|
220
|
+
timestamp: new Date().toISOString(),
|
|
221
|
+
filePath: normalizedPath,
|
|
222
|
+
toolName,
|
|
223
|
+
wasBlocked: false,
|
|
224
|
+
reason: 'Allowed: .olympus/ path',
|
|
225
|
+
}, workDir);
|
|
226
|
+
return { continue: true };
|
|
227
|
+
}
|
|
228
|
+
// ALWAYS ALLOW: Test file creation
|
|
229
|
+
if (isTestFile(normalizedPath)) {
|
|
230
|
+
logViolation({
|
|
231
|
+
timestamp: new Date().toISOString(),
|
|
232
|
+
filePath: normalizedPath,
|
|
233
|
+
toolName,
|
|
234
|
+
wasBlocked: false,
|
|
235
|
+
reason: 'Allowed: Test file',
|
|
236
|
+
}, workDir);
|
|
237
|
+
return { continue: true };
|
|
238
|
+
}
|
|
239
|
+
// Check for verification edit exception
|
|
240
|
+
const linesChanged = calculateLinesChanged(toolName, toolInput);
|
|
241
|
+
if (sessionState.isVerificationEdit(normalizedPath, linesChanged)) {
|
|
242
|
+
logViolation({
|
|
243
|
+
timestamp: new Date().toISOString(),
|
|
244
|
+
filePath: normalizedPath,
|
|
245
|
+
toolName,
|
|
246
|
+
linesChanged,
|
|
247
|
+
wasBlocked: false,
|
|
248
|
+
reason: `Allowed: Verification edit (${linesChanged} lines on recent task file)`,
|
|
249
|
+
}, workDir);
|
|
250
|
+
return { continue: true };
|
|
251
|
+
}
|
|
252
|
+
// HARD BLOCK: Direct source file modification
|
|
253
|
+
logViolation({
|
|
254
|
+
timestamp: new Date().toISOString(),
|
|
255
|
+
filePath: normalizedPath,
|
|
256
|
+
toolName,
|
|
257
|
+
linesChanged,
|
|
258
|
+
wasBlocked: true,
|
|
259
|
+
reason: 'Blocked: Direct source file modification (delegation required)',
|
|
260
|
+
}, workDir);
|
|
175
261
|
return {
|
|
176
|
-
continue:
|
|
177
|
-
message:
|
|
262
|
+
continue: false,
|
|
263
|
+
message: DELEGATION_REQUIRED_ERROR,
|
|
178
264
|
};
|
|
179
265
|
}
|
|
180
266
|
/**
|
|
181
267
|
* Process post-tool-use hook for orchestrator
|
|
182
268
|
* Adds reminders after file modifications and Task delegations
|
|
269
|
+
* Records Task completions in session state
|
|
183
270
|
*/
|
|
184
271
|
export function processOrchestratorPostTool(input, output) {
|
|
185
|
-
const { toolName, toolInput, directory } = input;
|
|
272
|
+
const { toolName, toolInput, directory, sessionId } = input;
|
|
186
273
|
const workDir = directory || process.cwd();
|
|
187
274
|
// Handle write/edit tools
|
|
188
275
|
if (isWriteEditTool(toolName)) {
|
|
@@ -201,8 +288,15 @@ export function processOrchestratorPostTool(input, output) {
|
|
|
201
288
|
if (isBackgroundLaunch) {
|
|
202
289
|
return { continue: true };
|
|
203
290
|
}
|
|
204
|
-
// Get git stats and
|
|
291
|
+
// Get git stats and record task completion
|
|
205
292
|
const gitStats = getGitDiffStats(workDir);
|
|
293
|
+
const filesModified = gitStats.map((stat) => stat.path);
|
|
294
|
+
// Record task completion in session state
|
|
295
|
+
sessionState.recordTaskCompletion({
|
|
296
|
+
timestamp: Date.now(),
|
|
297
|
+
filesModified,
|
|
298
|
+
taskId: sessionId || `task-${Date.now()}`,
|
|
299
|
+
});
|
|
206
300
|
const fileChanges = formatFileChanges(gitStats);
|
|
207
301
|
// Check for quest state
|
|
208
302
|
const questState = readQuestState(workDir);
|
|
@@ -213,7 +307,7 @@ export function processOrchestratorPostTool(input, output) {
|
|
|
213
307
|
|
|
214
308
|
${fileChanges}
|
|
215
309
|
<system-reminder>
|
|
216
|
-
${buildOrchestratorReminder(questState.plan_name, progress)}
|
|
310
|
+
${buildOrchestratorReminder(questState.plan_name, progress, sessionId)}
|
|
217
311
|
</system-reminder>`;
|
|
218
312
|
return {
|
|
219
313
|
continue: true,
|
|
@@ -223,7 +317,7 @@ ${buildOrchestratorReminder(questState.plan_name, progress)}
|
|
|
223
317
|
// No quest state - add standalone verification reminder
|
|
224
318
|
return {
|
|
225
319
|
continue: true,
|
|
226
|
-
modifiedOutput: output + `\n<system-reminder>\n${buildVerificationReminder()}\n</system-reminder>`,
|
|
320
|
+
modifiedOutput: output + `\n<system-reminder>\n${buildVerificationReminder(sessionId)}\n</system-reminder>`,
|
|
227
321
|
};
|
|
228
322
|
}
|
|
229
323
|
return { continue: true };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/olympus-orchestrator/index.ts"],"names":[],"mappings":"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"}
|