oh-my-copilot 4.13.21 → 4.13.45
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/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +8 -0
- package/agents/code-reviewer.agent.md +24 -6
- package/agents/designer.agent.md +12 -0
- package/bridge/cli.cjs +1978 -1214
- package/bridge/mcp-server.cjs +678 -261
- package/bridge/runtime-cli.cjs +55 -8
- package/bridge/team.js +507 -38
- package/dist/__tests__/agent-registry.test.js +92 -1
- package/dist/__tests__/agent-registry.test.js.map +1 -1
- package/dist/__tests__/bedrock-model-routing.test.js +18 -17
- package/dist/__tests__/bedrock-model-routing.test.js.map +1 -1
- package/dist/__tests__/delegation-enforcer.test.js +46 -6
- package/dist/__tests__/delegation-enforcer.test.js.map +1 -1
- package/dist/__tests__/hooks/session-end-cleanup.test.d.ts +2 -0
- package/dist/__tests__/hooks/session-end-cleanup.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/session-end-cleanup.test.js +93 -0
- package/dist/__tests__/hooks/session-end-cleanup.test.js.map +1 -0
- package/dist/__tests__/hud/stdin.test.d.ts +2 -0
- package/dist/__tests__/hud/stdin.test.d.ts.map +1 -0
- package/dist/__tests__/hud/stdin.test.js +556 -0
- package/dist/__tests__/hud/stdin.test.js.map +1 -0
- package/dist/__tests__/model-routing-override-three-site-sync.test.d.ts +2 -0
- package/dist/__tests__/model-routing-override-three-site-sync.test.d.ts.map +1 -0
- package/dist/__tests__/model-routing-override-three-site-sync.test.js +75 -0
- package/dist/__tests__/model-routing-override-three-site-sync.test.js.map +1 -0
- package/dist/__tests__/non-claude-provider-detection.test.js +37 -0
- package/dist/__tests__/non-claude-provider-detection.test.js.map +1 -1
- package/dist/__tests__/package-dir-resolution-regression.test.js +25 -0
- package/dist/__tests__/package-dir-resolution-regression.test.js.map +1 -1
- package/dist/__tests__/pre-tool-enforcer.test.js +51 -0
- package/dist/__tests__/pre-tool-enforcer.test.js.map +1 -1
- package/dist/__tests__/session-start-script-context.test.js +121 -0
- package/dist/__tests__/session-start-script-context.test.js.map +1 -1
- package/dist/__tests__/setup-claude-md-script.test.js +44 -1
- package/dist/__tests__/setup-claude-md-script.test.js.map +1 -1
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +2 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/autoresearch/__tests__/decide-outcome.test.d.ts +2 -0
- package/dist/autoresearch/__tests__/decide-outcome.test.d.ts.map +1 -0
- package/dist/autoresearch/__tests__/decide-outcome.test.js +69 -0
- package/dist/autoresearch/__tests__/decide-outcome.test.js.map +1 -0
- package/dist/autoresearch/runtime.d.ts.map +1 -1
- package/dist/autoresearch/runtime.js +16 -2
- package/dist/autoresearch/runtime.js.map +1 -1
- package/dist/cli/__tests__/launch.test.js +23 -0
- package/dist/cli/__tests__/launch.test.js.map +1 -1
- package/dist/cli/__tests__/self-improve-paths.test.js +3 -2
- package/dist/cli/__tests__/self-improve-paths.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +100 -0
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/commands/__tests__/team-role-shorthand.test.js +30 -0
- package/dist/cli/commands/__tests__/team-role-shorthand.test.js.map +1 -1
- package/dist/cli/commands/__tests__/team.test.js +48 -1
- package/dist/cli/commands/__tests__/team.test.js.map +1 -1
- package/dist/cli/commands/team.d.ts +2 -0
- package/dist/cli/commands/team.d.ts.map +1 -1
- package/dist/cli/commands/team.js +9 -2
- package/dist/cli/commands/team.js.map +1 -1
- package/dist/cli/launch.d.ts.map +1 -1
- package/dist/cli/launch.js +7 -0
- package/dist/cli/launch.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +34 -3
- package/dist/cli/team.js.map +1 -1
- package/dist/config/__tests__/loader.test.js +35 -4
- package/dist/config/__tests__/loader.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +126 -3
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/models.d.ts +8 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +119 -8
- package/dist/config/models.js.map +1 -1
- package/dist/features/delegation-enforcer.d.ts.map +1 -1
- package/dist/features/delegation-enforcer.js +10 -9
- package/dist/features/delegation-enforcer.js.map +1 -1
- package/dist/hooks/__tests__/bridge-routing.test.js +1 -0
- package/dist/hooks/__tests__/bridge-routing.test.js.map +1 -1
- package/dist/hooks/autopilot/enforcement.d.ts.map +1 -1
- package/dist/hooks/autopilot/enforcement.js +19 -0
- package/dist/hooks/autopilot/enforcement.js.map +1 -1
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +26 -4
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/persistent-mode/stop-hook-blocking.test.js +37 -1
- package/dist/hooks/persistent-mode/stop-hook-blocking.test.js.map +1 -1
- package/dist/hooks/session-end/index.d.ts +9 -2
- package/dist/hooks/session-end/index.d.ts.map +1 -1
- package/dist/hooks/session-end/index.js +90 -35
- package/dist/hooks/session-end/index.js.map +1 -1
- package/dist/hud/stdin.d.ts +12 -1
- package/dist/hud/stdin.d.ts.map +1 -1
- package/dist/hud/stdin.js +123 -18
- package/dist/hud/stdin.js.map +1 -1
- package/dist/hud/types.d.ts +1 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/dist/installer/__tests__/session-start-template.test.d.ts +2 -0
- package/dist/installer/__tests__/session-start-template.test.d.ts.map +1 -0
- package/dist/installer/__tests__/session-start-template.test.js +174 -0
- package/dist/installer/__tests__/session-start-template.test.js.map +1 -0
- package/dist/lib/__tests__/mode-state-io.test.js +75 -12
- package/dist/lib/__tests__/mode-state-io.test.js.map +1 -1
- package/dist/lib/mode-state-io.d.ts +11 -0
- package/dist/lib/mode-state-io.d.ts.map +1 -1
- package/dist/lib/mode-state-io.js +64 -0
- package/dist/lib/mode-state-io.js.map +1 -1
- package/dist/lib/worktree-paths.d.ts +12 -0
- package/dist/lib/worktree-paths.d.ts.map +1 -1
- package/dist/lib/worktree-paths.js +75 -0
- package/dist/lib/worktree-paths.js.map +1 -1
- package/dist/planning/__tests__/artifacts.test.d.ts +2 -0
- package/dist/planning/__tests__/artifacts.test.d.ts.map +1 -0
- package/dist/planning/__tests__/artifacts.test.js +486 -0
- package/dist/planning/__tests__/artifacts.test.js.map +1 -0
- package/dist/planning/artifact-names.d.ts +13 -0
- package/dist/planning/artifact-names.d.ts.map +1 -0
- package/dist/planning/artifact-names.js +108 -0
- package/dist/planning/artifact-names.js.map +1 -0
- package/dist/planning/artifacts.d.ts +47 -0
- package/dist/planning/artifacts.d.ts.map +1 -0
- package/dist/planning/artifacts.js +221 -0
- package/dist/planning/artifacts.js.map +1 -0
- package/dist/team/__tests__/api-interop.compatibility.test.js +194 -5
- package/dist/team/__tests__/api-interop.compatibility.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +92 -2
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/runtime-v2.dispatch.test.js +30 -0
- package/dist/team/__tests__/runtime-v2.dispatch.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +39 -1
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +6 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +89 -2
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/delegation-evidence.d.ts +5 -0
- package/dist/team/delegation-evidence.d.ts.map +1 -0
- package/dist/team/delegation-evidence.js +29 -0
- package/dist/team/delegation-evidence.js.map +1 -0
- package/dist/team/model-contract.d.ts +8 -0
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +13 -0
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/runtime-v2.d.ts +2 -1
- package/dist/team/runtime-v2.d.ts.map +1 -1
- package/dist/team/runtime-v2.js +3 -1
- package/dist/team/runtime-v2.js.map +1 -1
- package/dist/team/state/tasks.d.ts +4 -1
- package/dist/team/state/tasks.d.ts.map +1 -1
- package/dist/team/state/tasks.js +38 -1
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/team-ops.d.ts +4 -1
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +2 -2
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/types.d.ts +22 -1
- package/dist/team/types.d.ts.map +1 -1
- package/dist/team/types.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +6 -1
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/tools/__tests__/state-tools.test.js +322 -5
- package/dist/tools/__tests__/state-tools.test.js.map +1 -1
- package/dist/tools/__tests__/wiki-tools-working-directory.test.d.ts +2 -0
- package/dist/tools/__tests__/wiki-tools-working-directory.test.d.ts.map +1 -0
- package/dist/tools/__tests__/wiki-tools-working-directory.test.js +66 -0
- package/dist/tools/__tests__/wiki-tools-working-directory.test.js.map +1 -0
- package/dist/tools/state-tools.d.ts +3 -10
- package/dist/tools/state-tools.d.ts.map +1 -1
- package/dist/tools/state-tools.js +393 -91
- package/dist/tools/state-tools.js.map +1 -1
- package/dist/tools/wiki-tools.js +8 -8
- package/dist/tools/wiki-tools.js.map +1 -1
- package/docs/GETTING-STARTED.md +7 -0
- package/docs/copilot-instructions.md +1 -1
- package/package.json +1 -1
- package/scripts/lib/model-routing-override-message.mjs +21 -0
- package/scripts/persistent-mode.cjs +36 -0
- package/scripts/persistent-mode.mjs +36 -0
- package/scripts/post-tool-verifier.mjs +1 -0
- package/scripts/pre-tool-enforcer.mjs +60 -0
- package/scripts/session-start.mjs +63 -0
- package/scripts/setup-copilot-instructions.sh +12 -2
- package/skills/configure-notifications/SKILL.md +3 -3
- package/skills/mcp-setup/SKILL.md +60 -45
- package/skills/omc-setup/SKILL.md +3 -3
- package/skills/omc-setup/phases/01-install-claude-md.md +1 -1
- package/skills/omc-setup/phases/04-welcome.md +8 -8
- package/skills/project-session-manager/SKILL.md +2 -2
- package/skills/project-session-manager/psm.sh +1 -1
- package/templates/hooks/lib/model-routing-override-message.mjs +21 -0
- package/templates/hooks/session-start.mjs +62 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, utimesSync, writeFileSync } from 'fs';
|
|
3
|
+
import { tmpdir } from 'os';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import { getContextPercent, getModelName, getRateLimitsFromStdin, readStdinCache, stabilizeContextPercent, writeStdinCache, } from '../../hud/stdin.js';
|
|
7
|
+
function makeStdin(overrides = {}) {
|
|
8
|
+
return {
|
|
9
|
+
cwd: '/tmp/worktree',
|
|
10
|
+
transcript_path: '/tmp/worktree/session.jsonl',
|
|
11
|
+
model: {
|
|
12
|
+
id: 'claude-sonnet',
|
|
13
|
+
display_name: 'Claude Sonnet',
|
|
14
|
+
},
|
|
15
|
+
context_window: {
|
|
16
|
+
context_window_size: 1000,
|
|
17
|
+
current_usage: {
|
|
18
|
+
input_tokens: 520,
|
|
19
|
+
cache_creation_input_tokens: 0,
|
|
20
|
+
cache_read_input_tokens: 0,
|
|
21
|
+
},
|
|
22
|
+
...overrides.context_window,
|
|
23
|
+
},
|
|
24
|
+
...overrides,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
describe('HUD stdin context percent', () => {
|
|
28
|
+
it('prefers the native percentage when available', () => {
|
|
29
|
+
const stdin = makeStdin({
|
|
30
|
+
context_window: {
|
|
31
|
+
used_percentage: 53.6,
|
|
32
|
+
context_window_size: 1000,
|
|
33
|
+
current_usage: {
|
|
34
|
+
input_tokens: 520,
|
|
35
|
+
cache_creation_input_tokens: 0,
|
|
36
|
+
cache_read_input_tokens: 0,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
expect(getContextPercent(stdin)).toBe(54);
|
|
41
|
+
});
|
|
42
|
+
it('reuses the previous native percentage when a transient fallback would cause ctx jitter', () => {
|
|
43
|
+
const previous = makeStdin({
|
|
44
|
+
context_window: {
|
|
45
|
+
used_percentage: 54,
|
|
46
|
+
context_window_size: 1000,
|
|
47
|
+
current_usage: {
|
|
48
|
+
input_tokens: 540,
|
|
49
|
+
cache_creation_input_tokens: 0,
|
|
50
|
+
cache_read_input_tokens: 0,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const current = makeStdin({
|
|
55
|
+
context_window: {
|
|
56
|
+
context_window_size: 1000,
|
|
57
|
+
current_usage: {
|
|
58
|
+
input_tokens: 520,
|
|
59
|
+
cache_creation_input_tokens: 0,
|
|
60
|
+
cache_read_input_tokens: 0,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
expect(getContextPercent(current)).toBe(52);
|
|
65
|
+
expect(getContextPercent(stabilizeContextPercent(current, previous))).toBe(54);
|
|
66
|
+
});
|
|
67
|
+
it('includes cache_read_input_tokens in the manual fallback calculation', () => {
|
|
68
|
+
const stdin = makeStdin({
|
|
69
|
+
context_window: {
|
|
70
|
+
context_window_size: 1000,
|
|
71
|
+
current_usage: {
|
|
72
|
+
input_tokens: 120,
|
|
73
|
+
cache_creation_input_tokens: 30,
|
|
74
|
+
cache_read_input_tokens: 50,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
expect(getContextPercent(stdin)).toBe(20);
|
|
79
|
+
});
|
|
80
|
+
it('keeps preferring positive native percentage even when fallback totals are higher', () => {
|
|
81
|
+
const stdin = makeStdin({
|
|
82
|
+
context_window: {
|
|
83
|
+
used_percentage: 54,
|
|
84
|
+
context_window_size: 1000,
|
|
85
|
+
total_input_tokens: 900,
|
|
86
|
+
current_usage: {
|
|
87
|
+
input_tokens: 120,
|
|
88
|
+
cache_creation_input_tokens: 30,
|
|
89
|
+
cache_read_input_tokens: 250_000,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
expect(getContextPercent(stdin)).toBe(54);
|
|
94
|
+
});
|
|
95
|
+
it('does not hide a real context jump when the fallback differs materially', () => {
|
|
96
|
+
const previous = makeStdin({
|
|
97
|
+
context_window: {
|
|
98
|
+
used_percentage: 80,
|
|
99
|
+
context_window_size: 1000,
|
|
100
|
+
current_usage: {
|
|
101
|
+
input_tokens: 800,
|
|
102
|
+
cache_creation_input_tokens: 0,
|
|
103
|
+
cache_read_input_tokens: 0,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
const current = makeStdin({
|
|
108
|
+
context_window: {
|
|
109
|
+
context_window_size: 1000,
|
|
110
|
+
current_usage: {
|
|
111
|
+
input_tokens: 200,
|
|
112
|
+
cache_creation_input_tokens: 0,
|
|
113
|
+
cache_read_input_tokens: 0,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
expect(getContextPercent(stabilizeContextPercent(current, previous))).toBe(20);
|
|
118
|
+
});
|
|
119
|
+
it('uses cache-read totals in stabilization decisions', () => {
|
|
120
|
+
const previous = makeStdin({
|
|
121
|
+
context_window: {
|
|
122
|
+
used_percentage: 54,
|
|
123
|
+
context_window_size: 1000,
|
|
124
|
+
current_usage: {
|
|
125
|
+
input_tokens: 540,
|
|
126
|
+
cache_creation_input_tokens: 0,
|
|
127
|
+
cache_read_input_tokens: 0,
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
const current = makeStdin({
|
|
132
|
+
context_window: {
|
|
133
|
+
context_window_size: 1000,
|
|
134
|
+
current_usage: {
|
|
135
|
+
input_tokens: 520,
|
|
136
|
+
cache_creation_input_tokens: 0,
|
|
137
|
+
cache_read_input_tokens: 250_000,
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
expect(getContextPercent(current)).toBe(100);
|
|
142
|
+
expect(getContextPercent(stabilizeContextPercent(current, previous))).toBe(100);
|
|
143
|
+
});
|
|
144
|
+
it('falls back to total_input_tokens when native and manual usage are zero', () => {
|
|
145
|
+
const stdin = makeStdin({
|
|
146
|
+
context_window: {
|
|
147
|
+
used_percentage: 0,
|
|
148
|
+
context_window_size: 1_000_000,
|
|
149
|
+
total_input_tokens: 325_291,
|
|
150
|
+
current_usage: {
|
|
151
|
+
input_tokens: 0,
|
|
152
|
+
cache_creation_input_tokens: 0,
|
|
153
|
+
cache_read_input_tokens: 0,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
expect(getContextPercent(stdin)).toBe(33);
|
|
158
|
+
});
|
|
159
|
+
it('keeps a legitimate all-zero session at zero', () => {
|
|
160
|
+
const stdin = makeStdin({
|
|
161
|
+
context_window: {
|
|
162
|
+
used_percentage: 0,
|
|
163
|
+
context_window_size: 1_000_000,
|
|
164
|
+
total_input_tokens: 0,
|
|
165
|
+
current_usage: {
|
|
166
|
+
input_tokens: 0,
|
|
167
|
+
cache_creation_input_tokens: 0,
|
|
168
|
+
cache_read_input_tokens: 0,
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
expect(getContextPercent(stdin)).toBe(0);
|
|
173
|
+
expect(getContextPercent(stabilizeContextPercent(stdin, makeStdin({
|
|
174
|
+
context_window: {
|
|
175
|
+
used_percentage: 1,
|
|
176
|
+
context_window_size: 1_000_000,
|
|
177
|
+
current_usage: {
|
|
178
|
+
input_tokens: 10_000,
|
|
179
|
+
cache_creation_input_tokens: 0,
|
|
180
|
+
cache_read_input_tokens: 0,
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
})))).toBe(0);
|
|
184
|
+
});
|
|
185
|
+
it('lets manual usage win over total_input_tokens when native usage is zero', () => {
|
|
186
|
+
const stdin = makeStdin({
|
|
187
|
+
context_window: {
|
|
188
|
+
used_percentage: 0,
|
|
189
|
+
context_window_size: 1000,
|
|
190
|
+
total_input_tokens: 900,
|
|
191
|
+
current_usage: {
|
|
192
|
+
input_tokens: 120,
|
|
193
|
+
cache_creation_input_tokens: 30,
|
|
194
|
+
cache_read_input_tokens: 50,
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
expect(getContextPercent(stdin)).toBe(20);
|
|
199
|
+
});
|
|
200
|
+
it('can stabilize a zero native percentage using a close total_input_tokens fallback', () => {
|
|
201
|
+
const previous = makeStdin({
|
|
202
|
+
context_window: {
|
|
203
|
+
used_percentage: 34,
|
|
204
|
+
context_window_size: 1_000_000,
|
|
205
|
+
current_usage: {
|
|
206
|
+
input_tokens: 340_000,
|
|
207
|
+
cache_creation_input_tokens: 0,
|
|
208
|
+
cache_read_input_tokens: 0,
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
const current = makeStdin({
|
|
213
|
+
context_window: {
|
|
214
|
+
used_percentage: 0,
|
|
215
|
+
context_window_size: 1_000_000,
|
|
216
|
+
total_input_tokens: 325_291,
|
|
217
|
+
current_usage: {
|
|
218
|
+
input_tokens: 0,
|
|
219
|
+
cache_creation_input_tokens: 0,
|
|
220
|
+
cache_read_input_tokens: 0,
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
expect(getContextPercent(current)).toBe(33);
|
|
225
|
+
expect(getContextPercent(stabilizeContextPercent(current, previous))).toBe(34);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe('HUD stdin model display', () => {
|
|
229
|
+
it('prefers the official display_name over the raw model id', () => {
|
|
230
|
+
expect(getModelName(makeStdin({
|
|
231
|
+
model: {
|
|
232
|
+
id: 'claude-sonnet-4-5-20250929',
|
|
233
|
+
display_name: 'Claude Sonnet 4.5',
|
|
234
|
+
},
|
|
235
|
+
}))).toBe('Claude Sonnet 4.5');
|
|
236
|
+
});
|
|
237
|
+
it('falls back to the raw model id when display_name is unavailable', () => {
|
|
238
|
+
expect(getModelName(makeStdin({
|
|
239
|
+
model: {
|
|
240
|
+
id: 'claude-sonnet-4-5-20250929',
|
|
241
|
+
},
|
|
242
|
+
}))).toBe('claude-sonnet-4-5-20250929');
|
|
243
|
+
});
|
|
244
|
+
it('returns Unknown when stdin omits the model block', () => {
|
|
245
|
+
expect(getModelName(makeStdin({ model: undefined }))).toBe('Unknown');
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe('HUD stdin rate limits', () => {
|
|
249
|
+
it('parses stdin rate_limits into the existing RateLimits shape', () => {
|
|
250
|
+
const result = getRateLimitsFromStdin(makeStdin({
|
|
251
|
+
rate_limits: {
|
|
252
|
+
five_hour: {
|
|
253
|
+
used_percentage: 11,
|
|
254
|
+
resets_at: 1776348000,
|
|
255
|
+
},
|
|
256
|
+
seven_day: {
|
|
257
|
+
used_percentage: 2,
|
|
258
|
+
resets_at: '2026-04-22T00:00:00.000Z',
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
}));
|
|
262
|
+
expect(result).toEqual({
|
|
263
|
+
fiveHourPercent: 11,
|
|
264
|
+
weeklyPercent: 2,
|
|
265
|
+
fiveHourResetsAt: new Date(1776348000 * 1000),
|
|
266
|
+
weeklyResetsAt: new Date('2026-04-22T00:00:00.000Z'),
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
it('returns null when stdin omits rate limits', () => {
|
|
270
|
+
expect(getRateLimitsFromStdin(makeStdin())).toBeNull();
|
|
271
|
+
});
|
|
272
|
+
it('tolerates invalid reset values without breaking the result', () => {
|
|
273
|
+
const result = getRateLimitsFromStdin(makeStdin({
|
|
274
|
+
rate_limits: {
|
|
275
|
+
five_hour: {
|
|
276
|
+
used_percentage: 140,
|
|
277
|
+
resets_at: 'not-a-date',
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
}));
|
|
281
|
+
expect(result).toEqual({
|
|
282
|
+
fiveHourPercent: 100,
|
|
283
|
+
weeklyPercent: undefined,
|
|
284
|
+
fiveHourResetsAt: null,
|
|
285
|
+
weeklyResetsAt: null,
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
describe('HUD stdin cache path is session-scoped', () => {
|
|
290
|
+
let tmpRoot;
|
|
291
|
+
let originalCwd;
|
|
292
|
+
const envKeys = ['CLAUDE_SESSION_ID', 'CLAUDECODE_SESSION_ID'];
|
|
293
|
+
const savedEnv = {};
|
|
294
|
+
beforeEach(() => {
|
|
295
|
+
tmpRoot = mkdtempSync(join(tmpdir(), 'omc-hud-stdin-cache-'));
|
|
296
|
+
// Make a real git repo so getWorktreeRoot() (which shells out to git
|
|
297
|
+
// rev-parse) deterministically returns tmpRoot instead of leaking into
|
|
298
|
+
// the surrounding workspace.
|
|
299
|
+
execSync('git init --quiet', { cwd: tmpRoot });
|
|
300
|
+
originalCwd = process.cwd();
|
|
301
|
+
process.chdir(tmpRoot);
|
|
302
|
+
for (const key of envKeys) {
|
|
303
|
+
savedEnv[key] = process.env[key];
|
|
304
|
+
delete process.env[key];
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
afterEach(() => {
|
|
308
|
+
process.chdir(originalCwd);
|
|
309
|
+
for (const key of envKeys) {
|
|
310
|
+
if (savedEnv[key] === undefined) {
|
|
311
|
+
delete process.env[key];
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
process.env[key] = savedEnv[key];
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
318
|
+
});
|
|
319
|
+
it('writes to a session-scoped path when CLAUDE_SESSION_ID is set', () => {
|
|
320
|
+
process.env.CLAUDE_SESSION_ID = 'test-session-aaa';
|
|
321
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
322
|
+
writeStdinCache(stdin);
|
|
323
|
+
const expected = join(tmpRoot, '.omcp', 'state', 'sessions', 'test-session-aaa', 'hud-stdin-cache.json');
|
|
324
|
+
expect(existsSync(expected)).toBe(true);
|
|
325
|
+
const loaded = JSON.parse(readFileSync(expected, 'utf-8'));
|
|
326
|
+
expect(loaded.cwd).toBe(tmpRoot);
|
|
327
|
+
});
|
|
328
|
+
it('falls back to the legacy flat path when no session env var is set', () => {
|
|
329
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
330
|
+
writeStdinCache(stdin);
|
|
331
|
+
const expected = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
|
|
332
|
+
expect(existsSync(expected)).toBe(true);
|
|
333
|
+
const sessionScoped = join(tmpRoot, '.omcp', 'state', 'sessions');
|
|
334
|
+
expect(existsSync(sessionScoped)).toBe(false);
|
|
335
|
+
});
|
|
336
|
+
it('accepts CLAUDECODE_SESSION_ID as the session id source', () => {
|
|
337
|
+
process.env.CLAUDECODE_SESSION_ID = 'test-session-bbb';
|
|
338
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
339
|
+
writeStdinCache(stdin);
|
|
340
|
+
const expected = join(tmpRoot, '.omcp', 'state', 'sessions', 'test-session-bbb', 'hud-stdin-cache.json');
|
|
341
|
+
expect(existsSync(expected)).toBe(true);
|
|
342
|
+
});
|
|
343
|
+
it('prevents two concurrent sessions from clobbering each other', () => {
|
|
344
|
+
process.env.CLAUDE_SESSION_ID = 'session-alpha';
|
|
345
|
+
const alpha = makeStdin({ cwd: tmpRoot, transcript_path: `${tmpRoot}/alpha.jsonl` });
|
|
346
|
+
writeStdinCache(alpha);
|
|
347
|
+
process.env.CLAUDE_SESSION_ID = 'session-beta';
|
|
348
|
+
const beta = makeStdin({ cwd: tmpRoot, transcript_path: `${tmpRoot}/beta.jsonl` });
|
|
349
|
+
writeStdinCache(beta);
|
|
350
|
+
// Reading back from each session must return its own snapshot.
|
|
351
|
+
process.env.CLAUDE_SESSION_ID = 'session-alpha';
|
|
352
|
+
expect(readStdinCache()?.transcript_path).toBe(`${tmpRoot}/alpha.jsonl`);
|
|
353
|
+
process.env.CLAUDE_SESSION_ID = 'session-beta';
|
|
354
|
+
expect(readStdinCache()?.transcript_path).toBe(`${tmpRoot}/beta.jsonl`);
|
|
355
|
+
});
|
|
356
|
+
it('readStdinCache ignores a legacy flat file when a session id is set', () => {
|
|
357
|
+
const stateDir = join(tmpRoot, '.omcp', 'state');
|
|
358
|
+
mkdirSync(stateDir, { recursive: true });
|
|
359
|
+
// Simulate a stale legacy cache written by an older build.
|
|
360
|
+
const legacy = makeStdin({ cwd: '/legacy/cwd' });
|
|
361
|
+
writeFileSync(join(stateDir, 'hud-stdin-cache.json'), JSON.stringify(legacy));
|
|
362
|
+
process.env.CLAUDE_SESSION_ID = 'fresh-session';
|
|
363
|
+
// Without a session file yet, read should miss rather than return the
|
|
364
|
+
// legacy (cross-session) value.
|
|
365
|
+
expect(readStdinCache()).toBeNull();
|
|
366
|
+
});
|
|
367
|
+
// ---------------------------------------------------------------------------
|
|
368
|
+
// Unsafe / malformed session ids must NOT escape the session-scoped directory.
|
|
369
|
+
//
|
|
370
|
+
// `getStdinCachePath` delegates validation to the shared `resolveSessionStatePath`
|
|
371
|
+
// helper (`validateSessionId`), so any id that fails the repo-wide contract
|
|
372
|
+
// should fall back to the legacy flat path rather than being interpolated into
|
|
373
|
+
// a filesystem path.
|
|
374
|
+
// ---------------------------------------------------------------------------
|
|
375
|
+
it.each([
|
|
376
|
+
['path traversal with ..', '../../../etc/passwd'],
|
|
377
|
+
['path traversal with parent only', '..'],
|
|
378
|
+
['forward slash', 'foo/bar'],
|
|
379
|
+
['backslash (Windows traversal)', 'foo\\bar'],
|
|
380
|
+
['leading underscore (regex first-char violation)', '_foo'],
|
|
381
|
+
['overlong id (>256 chars)', 'a'.repeat(300)],
|
|
382
|
+
])('rejects unsafe CLAUDE_SESSION_ID (%s) and falls back to the legacy path', (_label, unsafeId) => {
|
|
383
|
+
process.env.CLAUDE_SESSION_ID = unsafeId;
|
|
384
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
385
|
+
writeStdinCache(stdin);
|
|
386
|
+
// Nothing may be written to the session-scoped tree at all.
|
|
387
|
+
const sessionsDir = join(tmpRoot, '.omcp', 'state', 'sessions');
|
|
388
|
+
expect(existsSync(sessionsDir)).toBe(false);
|
|
389
|
+
// And in particular, nothing outside the intended state dir.
|
|
390
|
+
const etcProbe = join(tmpRoot, 'etc', 'passwd');
|
|
391
|
+
expect(existsSync(etcProbe)).toBe(false);
|
|
392
|
+
// Legacy flat fallback should be populated instead.
|
|
393
|
+
const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
|
|
394
|
+
expect(existsSync(legacy)).toBe(true);
|
|
395
|
+
});
|
|
396
|
+
it('treats whitespace-only CLAUDE_SESSION_ID as unset and falls back', () => {
|
|
397
|
+
process.env.CLAUDE_SESSION_ID = ' ';
|
|
398
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
399
|
+
writeStdinCache(stdin);
|
|
400
|
+
const sessionsDir = join(tmpRoot, '.omcp', 'state', 'sessions');
|
|
401
|
+
expect(existsSync(sessionsDir)).toBe(false);
|
|
402
|
+
const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
|
|
403
|
+
expect(existsSync(legacy)).toBe(true);
|
|
404
|
+
});
|
|
405
|
+
it('falls through to CLAUDECODE_SESSION_ID when CLAUDE_SESSION_ID is empty', () => {
|
|
406
|
+
// Regression for Codex review P2: `??` alone would accept "" as defined
|
|
407
|
+
// and never consult the secondary variable.
|
|
408
|
+
process.env.CLAUDE_SESSION_ID = '';
|
|
409
|
+
process.env.CLAUDECODE_SESSION_ID = 'secondary-session';
|
|
410
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
411
|
+
writeStdinCache(stdin);
|
|
412
|
+
const expected = join(tmpRoot, '.omcp', 'state', 'sessions', 'secondary-session', 'hud-stdin-cache.json');
|
|
413
|
+
expect(existsSync(expected)).toBe(true);
|
|
414
|
+
});
|
|
415
|
+
it('falls through to CLAUDECODE_SESSION_ID when CLAUDE_SESSION_ID is present but invalid', () => {
|
|
416
|
+
// Regression for Codex review P2 (v2): a non-empty-but-invalid primary
|
|
417
|
+
// must not silently bypass a valid secondary. The previous implementation
|
|
418
|
+
// resolved the primary first, then fell straight to the legacy path when
|
|
419
|
+
// validation threw, never giving the secondary a chance.
|
|
420
|
+
process.env.CLAUDE_SESSION_ID = '../../../etc/passwd';
|
|
421
|
+
process.env.CLAUDECODE_SESSION_ID = 'valid-secondary';
|
|
422
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
423
|
+
writeStdinCache(stdin);
|
|
424
|
+
const expectedSecondary = join(tmpRoot, '.omcp', 'state', 'sessions', 'valid-secondary', 'hud-stdin-cache.json');
|
|
425
|
+
expect(existsSync(expectedSecondary)).toBe(true);
|
|
426
|
+
// And in particular, the legacy flat path must NOT have been used —
|
|
427
|
+
// otherwise concurrent sessions could still clobber each other.
|
|
428
|
+
const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
|
|
429
|
+
expect(existsSync(legacy)).toBe(false);
|
|
430
|
+
// Safety probe: traversal from primary must not have escaped.
|
|
431
|
+
const etcProbe = join(tmpRoot, 'etc', 'passwd');
|
|
432
|
+
expect(existsSync(etcProbe)).toBe(false);
|
|
433
|
+
});
|
|
434
|
+
it('falls back to the legacy path only when every candidate is invalid', () => {
|
|
435
|
+
process.env.CLAUDE_SESSION_ID = '../traverse';
|
|
436
|
+
process.env.CLAUDECODE_SESSION_ID = 'foo/bar';
|
|
437
|
+
const stdin = makeStdin({ cwd: tmpRoot });
|
|
438
|
+
writeStdinCache(stdin);
|
|
439
|
+
const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
|
|
440
|
+
expect(existsSync(legacy)).toBe(true);
|
|
441
|
+
const sessionsDir = join(tmpRoot, '.omcp', 'state', 'sessions');
|
|
442
|
+
expect(existsSync(sessionsDir)).toBe(false);
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
describe('readStdinCache — env-less reader fallback to most recent session cache', () => {
|
|
446
|
+
let tmpRoot;
|
|
447
|
+
let originalCwd;
|
|
448
|
+
const envKeys = ['CLAUDE_SESSION_ID', 'CLAUDECODE_SESSION_ID'];
|
|
449
|
+
const savedEnv = {};
|
|
450
|
+
beforeEach(() => {
|
|
451
|
+
tmpRoot = mkdtempSync(join(tmpdir(), 'omc-hud-stdin-read-'));
|
|
452
|
+
execSync('git init --quiet', { cwd: tmpRoot });
|
|
453
|
+
originalCwd = process.cwd();
|
|
454
|
+
process.chdir(tmpRoot);
|
|
455
|
+
for (const key of envKeys) {
|
|
456
|
+
savedEnv[key] = process.env[key];
|
|
457
|
+
delete process.env[key];
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
afterEach(() => {
|
|
461
|
+
process.chdir(originalCwd);
|
|
462
|
+
for (const key of envKeys) {
|
|
463
|
+
if (savedEnv[key] === undefined) {
|
|
464
|
+
delete process.env[key];
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
process.env[key] = savedEnv[key];
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
471
|
+
});
|
|
472
|
+
it('returns the most recently updated session cache when no session env is set', () => {
|
|
473
|
+
// Simulate two concurrent sessions' writes by hand.
|
|
474
|
+
const stale = join(tmpRoot, '.omcp', 'state', 'sessions', 'session-old');
|
|
475
|
+
const fresh = join(tmpRoot, '.omcp', 'state', 'sessions', 'session-new');
|
|
476
|
+
mkdirSync(stale, { recursive: true });
|
|
477
|
+
mkdirSync(fresh, { recursive: true });
|
|
478
|
+
const stalePayload = makeStdin({ transcript_path: '/tmp/old.jsonl' });
|
|
479
|
+
const freshPayload = makeStdin({ transcript_path: '/tmp/new.jsonl' });
|
|
480
|
+
writeFileSync(join(stale, 'hud-stdin-cache.json'), JSON.stringify(stalePayload));
|
|
481
|
+
writeFileSync(join(fresh, 'hud-stdin-cache.json'), JSON.stringify(freshPayload));
|
|
482
|
+
// Ensure mtime ordering is unambiguous even on low-resolution filesystems.
|
|
483
|
+
const past = (Date.now() - 60_000) / 1000;
|
|
484
|
+
const future = (Date.now() + 1_000) / 1000;
|
|
485
|
+
utimesSync(join(stale, 'hud-stdin-cache.json'), past, past);
|
|
486
|
+
utimesSync(join(fresh, 'hud-stdin-cache.json'), future, future);
|
|
487
|
+
const got = readStdinCache();
|
|
488
|
+
expect(got?.transcript_path).toBe('/tmp/new.jsonl');
|
|
489
|
+
});
|
|
490
|
+
it('prefers the legacy flat cache over the session-scoped fallback when both exist', () => {
|
|
491
|
+
// A session wrote via the old (flat) path; an unrelated session dir
|
|
492
|
+
// also happens to sit under state/sessions/. The legacy file should
|
|
493
|
+
// win so callers that rely on the pre-session-scoping behavior keep
|
|
494
|
+
// their existing semantics.
|
|
495
|
+
const stateDir = join(tmpRoot, '.omcp', 'state');
|
|
496
|
+
mkdirSync(stateDir, { recursive: true });
|
|
497
|
+
writeFileSync(join(stateDir, 'hud-stdin-cache.json'), JSON.stringify(makeStdin({ transcript_path: '/tmp/legacy.jsonl' })));
|
|
498
|
+
const some = join(stateDir, 'sessions', 'session-xyz');
|
|
499
|
+
mkdirSync(some, { recursive: true });
|
|
500
|
+
writeFileSync(join(some, 'hud-stdin-cache.json'), JSON.stringify(makeStdin({ transcript_path: '/tmp/scoped.jsonl' })));
|
|
501
|
+
const got = readStdinCache();
|
|
502
|
+
expect(got?.transcript_path).toBe('/tmp/legacy.jsonl');
|
|
503
|
+
});
|
|
504
|
+
it('returns null when nothing has been cached yet', () => {
|
|
505
|
+
expect(readStdinCache()).toBeNull();
|
|
506
|
+
});
|
|
507
|
+
it('resolves the fallback directory through the same OMC_STATE_DIR helper as writers', () => {
|
|
508
|
+
// Regression: the env-less fallback previously assembled the sessions
|
|
509
|
+
// directory from `join(root, '.omcp', 'state', 'sessions')` directly,
|
|
510
|
+
// which bypasses `OMC_STATE_DIR`-backed centralized state and made
|
|
511
|
+
// `omc hud --watch` miss the active cache in that deployment shape.
|
|
512
|
+
const centralRoot = mkdtempSync(join(tmpdir(), 'omc-hud-stdin-central-'));
|
|
513
|
+
const prevStateDir = process.env.OMC_STATE_DIR;
|
|
514
|
+
process.env.OMC_STATE_DIR = centralRoot;
|
|
515
|
+
try {
|
|
516
|
+
// Writer pinned to a session id: must land under OMC_STATE_DIR/...,
|
|
517
|
+
// not under `tmpRoot/.omc/state/sessions/...`.
|
|
518
|
+
process.env.CLAUDE_SESSION_ID = 'central-session';
|
|
519
|
+
const payload = makeStdin({ transcript_path: '/tmp/central.jsonl' });
|
|
520
|
+
writeStdinCache(payload);
|
|
521
|
+
// Sanity: nothing was written into the worktree-local .omc/ tree.
|
|
522
|
+
expect(existsSync(join(tmpRoot, '.omcp', 'state', 'sessions', 'central-session'))).toBe(false);
|
|
523
|
+
// Env-less reader must still surface the same payload via the
|
|
524
|
+
// shared helper, not via a hard-coded worktree-local path.
|
|
525
|
+
delete process.env.CLAUDE_SESSION_ID;
|
|
526
|
+
delete process.env.CLAUDECODE_SESSION_ID;
|
|
527
|
+
const got = readStdinCache();
|
|
528
|
+
expect(got?.transcript_path).toBe('/tmp/central.jsonl');
|
|
529
|
+
}
|
|
530
|
+
finally {
|
|
531
|
+
if (prevStateDir === undefined) {
|
|
532
|
+
delete process.env.OMC_STATE_DIR;
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
process.env.OMC_STATE_DIR = prevStateDir;
|
|
536
|
+
}
|
|
537
|
+
rmSync(centralRoot, { recursive: true, force: true });
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
it('env-bound reader still reads from its own session-scoped path only', () => {
|
|
541
|
+
// Regression: the fallback must not fire when an env var pins a
|
|
542
|
+
// specific session — otherwise an unrelated session's cache could
|
|
543
|
+
// be surfaced when the current session has not written anything yet.
|
|
544
|
+
const mine = join(tmpRoot, '.omcp', 'state', 'sessions', 'me');
|
|
545
|
+
const theirs = join(tmpRoot, '.omcp', 'state', 'sessions', 'them');
|
|
546
|
+
mkdirSync(theirs, { recursive: true });
|
|
547
|
+
writeFileSync(join(theirs, 'hud-stdin-cache.json'), JSON.stringify(makeStdin({ transcript_path: '/tmp/theirs.jsonl' })));
|
|
548
|
+
process.env.CLAUDE_SESSION_ID = 'me';
|
|
549
|
+
expect(readStdinCache()).toBeNull();
|
|
550
|
+
// Once `me` writes, it gets its own snapshot.
|
|
551
|
+
mkdirSync(mine, { recursive: true });
|
|
552
|
+
writeFileSync(join(mine, 'hud-stdin-cache.json'), JSON.stringify(makeStdin({ transcript_path: '/tmp/mine.jsonl' })));
|
|
553
|
+
expect(readStdinCache()?.transcript_path).toBe('/tmp/mine.jsonl');
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
//# sourceMappingURL=stdin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.test.js","sourceRoot":"","sources":["../../../src/__tests__/hud/stdin.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-routing-override-three-site-sync.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/model-routing-override-three-site-sync.test.ts"],"names":[],"mappings":""}
|