oh-my-claude-sisyphus 3.3.10 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/README.md +3 -3
  2. package/agents/explore-high.md +195 -0
  3. package/agents/qa-tester-high.md +141 -0
  4. package/agents/templates/README.md +110 -0
  5. package/agents/templates/base-agent.md +54 -0
  6. package/agents/templates/tier-instructions.md +94 -0
  7. package/commands/ecomode.md +60 -0
  8. package/commands/help.md +1 -1
  9. package/commands/mcp-setup.md +7 -6
  10. package/commands/ralplan.md +8 -1
  11. package/commands/ultrapilot.md +158 -0
  12. package/commands/ultrawork.md +1 -0
  13. package/dist/__tests__/delegation-enforcer-integration.test.d.ts +6 -0
  14. package/dist/__tests__/delegation-enforcer-integration.test.d.ts.map +1 -0
  15. package/dist/__tests__/delegation-enforcer-integration.test.js +136 -0
  16. package/dist/__tests__/delegation-enforcer-integration.test.js.map +1 -0
  17. package/dist/__tests__/delegation-enforcer.test.d.ts +5 -0
  18. package/dist/__tests__/delegation-enforcer.test.d.ts.map +1 -0
  19. package/dist/__tests__/delegation-enforcer.test.js +208 -0
  20. package/dist/__tests__/delegation-enforcer.test.js.map +1 -0
  21. package/dist/__tests__/hooks.test.js +2 -2
  22. package/dist/__tests__/hooks.test.js.map +1 -1
  23. package/dist/__tests__/installer.test.js +4 -6
  24. package/dist/__tests__/installer.test.js.map +1 -1
  25. package/dist/__tests__/ralph-prd.test.js +1 -1
  26. package/dist/__tests__/ralph-prd.test.js.map +1 -1
  27. package/dist/__tests__/ralph-progress.test.js +1 -1
  28. package/dist/__tests__/ralph-progress.test.js.map +1 -1
  29. package/dist/__tests__/skills.test.js +31 -24
  30. package/dist/__tests__/skills.test.js.map +1 -1
  31. package/dist/agents/analyst.d.ts.map +1 -1
  32. package/dist/agents/analyst.js +1 -0
  33. package/dist/agents/analyst.js.map +1 -1
  34. package/dist/agents/architect.d.ts.map +1 -1
  35. package/dist/agents/architect.js +1 -0
  36. package/dist/agents/architect.js.map +1 -1
  37. package/dist/agents/critic.d.ts.map +1 -1
  38. package/dist/agents/critic.js +1 -0
  39. package/dist/agents/critic.js.map +1 -1
  40. package/dist/agents/definitions.d.ts +5 -1
  41. package/dist/agents/definitions.d.ts.map +1 -1
  42. package/dist/agents/definitions.js +53 -155
  43. package/dist/agents/definitions.js.map +1 -1
  44. package/dist/agents/designer.d.ts.map +1 -1
  45. package/dist/agents/designer.js +1 -0
  46. package/dist/agents/designer.js.map +1 -1
  47. package/dist/agents/executor.d.ts.map +1 -1
  48. package/dist/agents/executor.js +1 -0
  49. package/dist/agents/executor.js.map +1 -1
  50. package/dist/agents/explore.d.ts.map +1 -1
  51. package/dist/agents/explore.js +1 -0
  52. package/dist/agents/explore.js.map +1 -1
  53. package/dist/agents/planner.d.ts.map +1 -1
  54. package/dist/agents/planner.js +1 -0
  55. package/dist/agents/planner.js.map +1 -1
  56. package/dist/agents/qa-tester.d.ts.map +1 -1
  57. package/dist/agents/qa-tester.js +1 -0
  58. package/dist/agents/qa-tester.js.map +1 -1
  59. package/dist/agents/researcher.d.ts.map +1 -1
  60. package/dist/agents/researcher.js +1 -0
  61. package/dist/agents/researcher.js.map +1 -1
  62. package/dist/agents/scientist.d.ts.map +1 -1
  63. package/dist/agents/scientist.js +1 -0
  64. package/dist/agents/scientist.js.map +1 -1
  65. package/dist/agents/types.d.ts +2 -0
  66. package/dist/agents/types.d.ts.map +1 -1
  67. package/dist/agents/types.js.map +1 -1
  68. package/dist/agents/vision.d.ts.map +1 -1
  69. package/dist/agents/vision.js +1 -0
  70. package/dist/agents/vision.js.map +1 -1
  71. package/dist/agents/writer.d.ts.map +1 -1
  72. package/dist/agents/writer.js +1 -0
  73. package/dist/agents/writer.js.map +1 -1
  74. package/dist/cli/index.js +0 -3
  75. package/dist/cli/index.js.map +1 -1
  76. package/dist/config/loader.d.ts.map +1 -1
  77. package/dist/config/loader.js +1 -6
  78. package/dist/config/loader.js.map +1 -1
  79. package/dist/features/delegation-enforcer.d.ts +71 -0
  80. package/dist/features/delegation-enforcer.d.ts.map +1 -0
  81. package/dist/features/delegation-enforcer.js +128 -0
  82. package/dist/features/delegation-enforcer.js.map +1 -0
  83. package/dist/features/index.d.ts +3 -0
  84. package/dist/features/index.d.ts.map +1 -1
  85. package/dist/features/index.js +18 -0
  86. package/dist/features/index.js.map +1 -1
  87. package/dist/features/state-manager/index.d.ts +100 -0
  88. package/dist/features/state-manager/index.d.ts.map +1 -0
  89. package/dist/features/state-manager/index.js +407 -0
  90. package/dist/features/state-manager/index.js.map +1 -0
  91. package/dist/features/state-manager/types.d.ts +147 -0
  92. package/dist/features/state-manager/types.d.ts.map +1 -0
  93. package/dist/features/state-manager/types.js +30 -0
  94. package/dist/features/state-manager/types.js.map +1 -0
  95. package/dist/features/task-decomposer/index.d.ts +33 -0
  96. package/dist/features/task-decomposer/index.d.ts.map +1 -0
  97. package/dist/features/task-decomposer/index.js +698 -0
  98. package/dist/features/task-decomposer/index.js.map +1 -0
  99. package/dist/features/task-decomposer/types.d.ts +133 -0
  100. package/dist/features/task-decomposer/types.d.ts.map +1 -0
  101. package/dist/features/task-decomposer/types.js +8 -0
  102. package/dist/features/task-decomposer/types.js.map +1 -0
  103. package/dist/features/verification/example.d.ts +49 -0
  104. package/dist/features/verification/example.d.ts.map +1 -0
  105. package/dist/features/verification/example.js +235 -0
  106. package/dist/features/verification/example.js.map +1 -0
  107. package/dist/features/verification/index.d.ts +97 -0
  108. package/dist/features/verification/index.d.ts.map +1 -0
  109. package/dist/features/verification/index.js +439 -0
  110. package/dist/features/verification/index.js.map +1 -0
  111. package/dist/features/verification/types.d.ts +142 -0
  112. package/dist/features/verification/types.d.ts.map +1 -0
  113. package/dist/features/verification/types.js +7 -0
  114. package/dist/features/verification/types.js.map +1 -0
  115. package/dist/hooks/agent-usage-reminder/constants.d.ts.map +1 -1
  116. package/dist/hooks/agent-usage-reminder/constants.js +0 -1
  117. package/dist/hooks/agent-usage-reminder/constants.js.map +1 -1
  118. package/dist/hooks/autopilot/__tests__/cancel.test.js +4 -4
  119. package/dist/hooks/autopilot/__tests__/cancel.test.js.map +1 -1
  120. package/dist/hooks/autopilot/__tests__/summary.test.js +1 -1
  121. package/dist/hooks/autopilot/__tests__/summary.test.js.map +1 -1
  122. package/dist/hooks/autopilot/__tests__/transition.test.js +1 -2
  123. package/dist/hooks/autopilot/__tests__/transition.test.js.map +1 -1
  124. package/dist/hooks/autopilot/cancel.js +2 -2
  125. package/dist/hooks/autopilot/cancel.js.map +1 -1
  126. package/dist/hooks/autopilot/enforcement.d.ts +16 -2
  127. package/dist/hooks/autopilot/enforcement.d.ts.map +1 -1
  128. package/dist/hooks/autopilot/enforcement.js +78 -4
  129. package/dist/hooks/autopilot/enforcement.js.map +1 -1
  130. package/dist/hooks/autopilot/index.d.ts +3 -6
  131. package/dist/hooks/autopilot/index.d.ts.map +1 -1
  132. package/dist/hooks/autopilot/index.js +6 -12
  133. package/dist/hooks/autopilot/index.js.map +1 -1
  134. package/dist/hooks/autopilot/state.d.ts +36 -2
  135. package/dist/hooks/autopilot/state.d.ts.map +1 -1
  136. package/dist/hooks/autopilot/state.js +216 -2
  137. package/dist/hooks/autopilot/state.js.map +1 -1
  138. package/dist/hooks/autopilot/validation.d.ts +23 -2
  139. package/dist/hooks/autopilot/validation.d.ts.map +1 -1
  140. package/dist/hooks/autopilot/validation.js +158 -1
  141. package/dist/hooks/autopilot/validation.js.map +1 -1
  142. package/dist/hooks/bridge.js +3 -3
  143. package/dist/hooks/bridge.js.map +1 -1
  144. package/dist/hooks/index.d.ts +5 -9
  145. package/dist/hooks/index.d.ts.map +1 -1
  146. package/dist/hooks/index.js +31 -21
  147. package/dist/hooks/index.js.map +1 -1
  148. package/dist/hooks/learner/promotion.js +1 -1
  149. package/dist/hooks/learner/promotion.js.map +1 -1
  150. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  151. package/dist/hooks/persistent-mode/index.js +2 -3
  152. package/dist/hooks/persistent-mode/index.js.map +1 -1
  153. package/dist/hooks/ralph/index.d.ts +11 -0
  154. package/dist/hooks/ralph/index.d.ts.map +1 -0
  155. package/dist/hooks/ralph/index.js +53 -0
  156. package/dist/hooks/ralph/index.js.map +1 -0
  157. package/dist/hooks/ralph/loop.d.ts +116 -0
  158. package/dist/hooks/ralph/loop.d.ts.map +1 -0
  159. package/dist/hooks/ralph/loop.js +322 -0
  160. package/dist/hooks/ralph/loop.js.map +1 -0
  161. package/dist/hooks/ralph/prd.d.ts +130 -0
  162. package/dist/hooks/ralph/prd.d.ts.map +1 -0
  163. package/dist/hooks/ralph/prd.js +310 -0
  164. package/dist/hooks/ralph/prd.js.map +1 -0
  165. package/dist/hooks/ralph/progress.d.ts +102 -0
  166. package/dist/hooks/ralph/progress.d.ts.map +1 -0
  167. package/dist/hooks/ralph/progress.js +408 -0
  168. package/dist/hooks/ralph/progress.js.map +1 -0
  169. package/dist/hooks/ralph/verifier.d.ts +72 -0
  170. package/dist/hooks/ralph/verifier.d.ts.map +1 -0
  171. package/dist/hooks/ralph/verifier.js +223 -0
  172. package/dist/hooks/ralph/verifier.js.map +1 -0
  173. package/dist/hooks/recovery/constants.d.ts +114 -0
  174. package/dist/hooks/recovery/constants.d.ts.map +1 -0
  175. package/dist/hooks/recovery/constants.js +227 -0
  176. package/dist/hooks/recovery/constants.js.map +1 -0
  177. package/dist/hooks/recovery/context-window.d.ts +24 -0
  178. package/dist/hooks/recovery/context-window.d.ts.map +1 -0
  179. package/dist/hooks/recovery/context-window.js +321 -0
  180. package/dist/hooks/recovery/context-window.js.map +1 -0
  181. package/dist/hooks/recovery/edit-error.d.ts +24 -0
  182. package/dist/hooks/recovery/edit-error.d.ts.map +1 -0
  183. package/dist/hooks/recovery/edit-error.js +56 -0
  184. package/dist/hooks/recovery/edit-error.js.map +1 -0
  185. package/dist/hooks/recovery/index.d.ts +102 -0
  186. package/dist/hooks/recovery/index.d.ts.map +1 -0
  187. package/dist/hooks/recovery/index.js +166 -0
  188. package/dist/hooks/recovery/index.js.map +1 -0
  189. package/dist/hooks/recovery/session-recovery.d.ts +24 -0
  190. package/dist/hooks/recovery/session-recovery.d.ts.map +1 -0
  191. package/dist/hooks/recovery/session-recovery.js +281 -0
  192. package/dist/hooks/recovery/session-recovery.js.map +1 -0
  193. package/dist/hooks/recovery/storage.d.ts +75 -0
  194. package/dist/hooks/recovery/storage.d.ts.map +1 -0
  195. package/dist/hooks/recovery/storage.js +382 -0
  196. package/dist/hooks/recovery/storage.js.map +1 -0
  197. package/dist/hooks/recovery/types.d.ts +196 -0
  198. package/dist/hooks/recovery/types.d.ts.map +1 -0
  199. package/dist/hooks/recovery/types.js +32 -0
  200. package/dist/hooks/recovery/types.js.map +1 -0
  201. package/dist/hooks/ultrapilot/index.d.ts +90 -0
  202. package/dist/hooks/ultrapilot/index.d.ts.map +1 -0
  203. package/dist/hooks/ultrapilot/index.js +310 -0
  204. package/dist/hooks/ultrapilot/index.js.map +1 -0
  205. package/dist/hooks/ultrapilot/state.d.ts +72 -0
  206. package/dist/hooks/ultrapilot/state.d.ts.map +1 -0
  207. package/dist/hooks/ultrapilot/state.js +258 -0
  208. package/dist/hooks/ultrapilot/state.js.map +1 -0
  209. package/dist/hooks/ultrapilot/types.d.ts +113 -0
  210. package/dist/hooks/ultrapilot/types.d.ts.map +1 -0
  211. package/dist/hooks/ultrapilot/types.js +36 -0
  212. package/dist/hooks/ultrapilot/types.js.map +1 -0
  213. package/dist/hooks/ultraqa/index.d.ts +94 -0
  214. package/dist/hooks/ultraqa/index.d.ts.map +1 -0
  215. package/dist/hooks/ultraqa/index.js +216 -0
  216. package/dist/hooks/ultraqa/index.js.map +1 -0
  217. package/dist/hooks/ultrawork/index.d.ts +62 -0
  218. package/dist/hooks/ultrawork/index.d.ts.map +1 -0
  219. package/dist/hooks/ultrawork/index.js +208 -0
  220. package/dist/hooks/ultrawork/index.js.map +1 -0
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +1 -2
  223. package/dist/index.js.map +1 -1
  224. package/dist/installer/index.d.ts +1 -1
  225. package/dist/installer/index.d.ts.map +1 -1
  226. package/dist/installer/index.js +1 -1
  227. package/dist/installer/index.js.map +1 -1
  228. package/dist/mcp/index.d.ts +1 -1
  229. package/dist/mcp/index.d.ts.map +1 -1
  230. package/dist/mcp/index.js +1 -1
  231. package/dist/mcp/index.js.map +1 -1
  232. package/dist/mcp/servers.d.ts +2 -18
  233. package/dist/mcp/servers.d.ts.map +1 -1
  234. package/dist/mcp/servers.js +4 -36
  235. package/dist/mcp/servers.js.map +1 -1
  236. package/dist/shared/types.d.ts +1 -3
  237. package/dist/shared/types.d.ts.map +1 -1
  238. package/docs/CLAUDE.md +170 -44
  239. package/docs/DELEGATION-ENFORCER.md +282 -0
  240. package/docs/FULL-README.md +1 -1
  241. package/docs/LOCAL_PLUGIN_INSTALL.md +1 -1
  242. package/docs/MIGRATION.md +298 -104
  243. package/package.json +2 -2
  244. package/scripts/test-mutual-exclusion.ts +1 -1
  245. package/skills/analyze/SKILL.md +0 -1
  246. package/skills/autopilot/SKILL.md +0 -1
  247. package/skills/cancel/SKILL.md +580 -0
  248. package/skills/cancel-autopilot/SKILL.md +0 -1
  249. package/skills/cancel-ecomode/SKILL.md +41 -0
  250. package/skills/cancel-ralph/SKILL.md +0 -1
  251. package/skills/cancel-ultraqa/SKILL.md +0 -1
  252. package/skills/cancel-ultrawork/SKILL.md +0 -1
  253. package/skills/deepinit/SKILL.md +0 -1
  254. package/skills/deepsearch/SKILL.md +0 -1
  255. package/skills/doctor/SKILL.md +0 -1
  256. package/skills/ecomode/SKILL.md +128 -0
  257. package/skills/frontend-ui-ux/SKILL.md +0 -1
  258. package/skills/git-master/SKILL.md +0 -1
  259. package/skills/help/SKILL.md +1 -2
  260. package/skills/hud/SKILL.md +0 -1
  261. package/skills/learner/SKILL.md +0 -1
  262. package/skills/mcp-setup/SKILL.md +8 -7
  263. package/skills/note/SKILL.md +0 -1
  264. package/skills/omc-default/SKILL.md +0 -1
  265. package/skills/omc-default-global/SKILL.md +0 -1
  266. package/skills/omc-setup/SKILL.md +176 -10
  267. package/skills/orchestrate/SKILL.md +0 -1
  268. package/skills/pipeline/SKILL.md +417 -0
  269. package/skills/plan/SKILL.md +138 -21
  270. package/skills/planner/SKILL.md +0 -1
  271. package/skills/ralph/SKILL.md +65 -1
  272. package/skills/ralph-init/SKILL.md +0 -1
  273. package/skills/ralplan/SKILL.md +0 -1
  274. package/skills/release/SKILL.md +0 -1
  275. package/skills/research/SKILL.md +0 -1
  276. package/skills/review/SKILL.md +0 -1
  277. package/skills/swarm/SKILL.md +349 -0
  278. package/skills/tdd/SKILL.md +0 -1
  279. package/skills/ultrapilot/SKILL.md +563 -0
  280. package/skills/ultraqa/SKILL.md +0 -1
  281. package/skills/ultrawork/SKILL.md +0 -1
  282. package/docs/MIGRATION-v3.md +0 -186
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Session Recovery Storage Operations
3
+ *
4
+ * Functions for reading and manipulating stored session data.
5
+ */
6
+ import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync, } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { MESSAGE_STORAGE, PART_STORAGE, THINKING_TYPES, META_TYPES, PLACEHOLDER_TEXT, } from './constants.js';
9
+ /**
10
+ * Generate a unique part ID
11
+ */
12
+ export function generatePartId() {
13
+ const timestamp = Date.now().toString(16);
14
+ const random = Math.random().toString(36).substring(2, 10);
15
+ return `prt_${timestamp}${random}`;
16
+ }
17
+ /**
18
+ * Get the directory containing messages for a session
19
+ */
20
+ export function getMessageDir(sessionID) {
21
+ if (!existsSync(MESSAGE_STORAGE))
22
+ return '';
23
+ const directPath = join(MESSAGE_STORAGE, sessionID);
24
+ if (existsSync(directPath)) {
25
+ return directPath;
26
+ }
27
+ for (const dir of readdirSync(MESSAGE_STORAGE)) {
28
+ const sessionPath = join(MESSAGE_STORAGE, dir, sessionID);
29
+ if (existsSync(sessionPath)) {
30
+ return sessionPath;
31
+ }
32
+ }
33
+ return '';
34
+ }
35
+ /**
36
+ * Read all messages for a session
37
+ */
38
+ export function readMessages(sessionID) {
39
+ const messageDir = getMessageDir(sessionID);
40
+ if (!messageDir || !existsSync(messageDir))
41
+ return [];
42
+ const messages = [];
43
+ for (const file of readdirSync(messageDir)) {
44
+ if (!file.endsWith('.json'))
45
+ continue;
46
+ try {
47
+ const content = readFileSync(join(messageDir, file), 'utf-8');
48
+ messages.push(JSON.parse(content));
49
+ }
50
+ catch {
51
+ continue;
52
+ }
53
+ }
54
+ return messages.sort((a, b) => {
55
+ const aTime = a.time?.created ?? 0;
56
+ const bTime = b.time?.created ?? 0;
57
+ if (aTime !== bTime)
58
+ return aTime - bTime;
59
+ return a.id.localeCompare(b.id);
60
+ });
61
+ }
62
+ /**
63
+ * Read all parts for a message
64
+ */
65
+ export function readParts(messageID) {
66
+ const partDir = join(PART_STORAGE, messageID);
67
+ if (!existsSync(partDir))
68
+ return [];
69
+ const parts = [];
70
+ for (const file of readdirSync(partDir)) {
71
+ if (!file.endsWith('.json'))
72
+ continue;
73
+ try {
74
+ const content = readFileSync(join(partDir, file), 'utf-8');
75
+ parts.push(JSON.parse(content));
76
+ }
77
+ catch {
78
+ continue;
79
+ }
80
+ }
81
+ return parts;
82
+ }
83
+ /**
84
+ * Check if a part has content (not thinking/meta)
85
+ */
86
+ export function hasContent(part) {
87
+ if (THINKING_TYPES.has(part.type))
88
+ return false;
89
+ if (META_TYPES.has(part.type))
90
+ return false;
91
+ if (part.type === 'text') {
92
+ const textPart = part;
93
+ return !!(textPart.text?.trim());
94
+ }
95
+ if (part.type === 'tool' || part.type === 'tool_use') {
96
+ return true;
97
+ }
98
+ if (part.type === 'tool_result') {
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+ /**
104
+ * Check if a message has content
105
+ */
106
+ export function messageHasContent(messageID) {
107
+ const parts = readParts(messageID);
108
+ return parts.some(hasContent);
109
+ }
110
+ /**
111
+ * Inject a text part into a message
112
+ */
113
+ export function injectTextPart(sessionID, messageID, text) {
114
+ const partDir = join(PART_STORAGE, messageID);
115
+ if (!existsSync(partDir)) {
116
+ mkdirSync(partDir, { recursive: true });
117
+ }
118
+ const partId = generatePartId();
119
+ const part = {
120
+ id: partId,
121
+ sessionID,
122
+ messageID,
123
+ type: 'text',
124
+ text,
125
+ synthetic: true,
126
+ };
127
+ try {
128
+ writeFileSync(join(partDir, `${partId}.json`), JSON.stringify(part, null, 2));
129
+ return true;
130
+ }
131
+ catch {
132
+ return false;
133
+ }
134
+ }
135
+ /**
136
+ * Find all messages with empty content
137
+ */
138
+ export function findEmptyMessages(sessionID) {
139
+ const messages = readMessages(sessionID);
140
+ const emptyIds = [];
141
+ for (const msg of messages) {
142
+ if (!messageHasContent(msg.id)) {
143
+ emptyIds.push(msg.id);
144
+ }
145
+ }
146
+ return emptyIds;
147
+ }
148
+ /**
149
+ * Find empty message by index (with fuzzy matching)
150
+ */
151
+ export function findEmptyMessageByIndex(sessionID, targetIndex) {
152
+ const messages = readMessages(sessionID);
153
+ // Try nearby indices in case of system messages causing offset
154
+ const indicesToTry = [
155
+ targetIndex,
156
+ targetIndex - 1,
157
+ targetIndex + 1,
158
+ targetIndex - 2,
159
+ targetIndex + 2,
160
+ targetIndex - 3,
161
+ targetIndex - 4,
162
+ targetIndex - 5,
163
+ ];
164
+ for (const idx of indicesToTry) {
165
+ if (idx < 0 || idx >= messages.length)
166
+ continue;
167
+ const targetMsg = messages[idx];
168
+ if (!messageHasContent(targetMsg.id)) {
169
+ return targetMsg.id;
170
+ }
171
+ }
172
+ return null;
173
+ }
174
+ /**
175
+ * Find messages that have thinking blocks
176
+ */
177
+ export function findMessagesWithThinkingBlocks(sessionID) {
178
+ const messages = readMessages(sessionID);
179
+ const result = [];
180
+ for (const msg of messages) {
181
+ if (msg.role !== 'assistant')
182
+ continue;
183
+ const parts = readParts(msg.id);
184
+ const hasThinking = parts.some((p) => THINKING_TYPES.has(p.type));
185
+ if (hasThinking) {
186
+ result.push(msg.id);
187
+ }
188
+ }
189
+ return result;
190
+ }
191
+ /**
192
+ * Find messages that have thinking but no content
193
+ */
194
+ export function findMessagesWithThinkingOnly(sessionID) {
195
+ const messages = readMessages(sessionID);
196
+ const result = [];
197
+ for (const msg of messages) {
198
+ if (msg.role !== 'assistant')
199
+ continue;
200
+ const parts = readParts(msg.id);
201
+ if (parts.length === 0)
202
+ continue;
203
+ const hasThinking = parts.some((p) => THINKING_TYPES.has(p.type));
204
+ const hasTextContent = parts.some(hasContent);
205
+ if (hasThinking && !hasTextContent) {
206
+ result.push(msg.id);
207
+ }
208
+ }
209
+ return result;
210
+ }
211
+ /**
212
+ * Find messages with orphan thinking (thinking not first)
213
+ */
214
+ export function findMessagesWithOrphanThinking(sessionID) {
215
+ const messages = readMessages(sessionID);
216
+ const result = [];
217
+ for (const msg of messages) {
218
+ if (msg.role !== 'assistant')
219
+ continue;
220
+ const parts = readParts(msg.id);
221
+ if (parts.length === 0)
222
+ continue;
223
+ const sortedParts = [...parts].sort((a, b) => a.id.localeCompare(b.id));
224
+ const firstPart = sortedParts[0];
225
+ const firstIsThinking = THINKING_TYPES.has(firstPart.type);
226
+ if (!firstIsThinking) {
227
+ result.push(msg.id);
228
+ }
229
+ }
230
+ return result;
231
+ }
232
+ /**
233
+ * Find the most recent thinking content from previous assistant messages
234
+ */
235
+ function findLastThinkingContent(sessionID, beforeMessageID) {
236
+ const messages = readMessages(sessionID);
237
+ const currentIndex = messages.findIndex((m) => m.id === beforeMessageID);
238
+ if (currentIndex === -1)
239
+ return '';
240
+ for (let i = currentIndex - 1; i >= 0; i--) {
241
+ const msg = messages[i];
242
+ if (msg.role !== 'assistant')
243
+ continue;
244
+ const parts = readParts(msg.id);
245
+ for (const part of parts) {
246
+ if (THINKING_TYPES.has(part.type)) {
247
+ const thinking = part.thinking;
248
+ const reasoning = part.text;
249
+ const content = thinking || reasoning;
250
+ if (content && content.trim().length > 0) {
251
+ return content;
252
+ }
253
+ }
254
+ }
255
+ }
256
+ return '';
257
+ }
258
+ /**
259
+ * Prepend a thinking part to a message
260
+ */
261
+ export function prependThinkingPart(sessionID, messageID) {
262
+ const partDir = join(PART_STORAGE, messageID);
263
+ if (!existsSync(partDir)) {
264
+ mkdirSync(partDir, { recursive: true });
265
+ }
266
+ const previousThinking = findLastThinkingContent(sessionID, messageID);
267
+ const partId = `prt_0000000000_thinking`;
268
+ const part = {
269
+ id: partId,
270
+ sessionID,
271
+ messageID,
272
+ type: 'thinking',
273
+ thinking: previousThinking || '[Continuing from previous reasoning]',
274
+ synthetic: true,
275
+ };
276
+ try {
277
+ writeFileSync(join(partDir, `${partId}.json`), JSON.stringify(part, null, 2));
278
+ return true;
279
+ }
280
+ catch {
281
+ return false;
282
+ }
283
+ }
284
+ /**
285
+ * Strip all thinking parts from a message
286
+ */
287
+ export function stripThinkingParts(messageID) {
288
+ const partDir = join(PART_STORAGE, messageID);
289
+ if (!existsSync(partDir))
290
+ return false;
291
+ let anyRemoved = false;
292
+ for (const file of readdirSync(partDir)) {
293
+ if (!file.endsWith('.json'))
294
+ continue;
295
+ try {
296
+ const filePath = join(partDir, file);
297
+ const content = readFileSync(filePath, 'utf-8');
298
+ const part = JSON.parse(content);
299
+ if (THINKING_TYPES.has(part.type)) {
300
+ unlinkSync(filePath);
301
+ anyRemoved = true;
302
+ }
303
+ }
304
+ catch {
305
+ continue;
306
+ }
307
+ }
308
+ return anyRemoved;
309
+ }
310
+ /**
311
+ * Replace empty text parts with placeholder text
312
+ */
313
+ export function replaceEmptyTextParts(messageID, replacementText = PLACEHOLDER_TEXT) {
314
+ const partDir = join(PART_STORAGE, messageID);
315
+ if (!existsSync(partDir))
316
+ return false;
317
+ let anyReplaced = false;
318
+ for (const file of readdirSync(partDir)) {
319
+ if (!file.endsWith('.json'))
320
+ continue;
321
+ try {
322
+ const filePath = join(partDir, file);
323
+ const content = readFileSync(filePath, 'utf-8');
324
+ const part = JSON.parse(content);
325
+ if (part.type === 'text') {
326
+ const textPart = part;
327
+ if (!textPart.text?.trim()) {
328
+ textPart.text = replacementText;
329
+ textPart.synthetic = true;
330
+ writeFileSync(filePath, JSON.stringify(textPart, null, 2));
331
+ anyReplaced = true;
332
+ }
333
+ }
334
+ }
335
+ catch {
336
+ continue;
337
+ }
338
+ }
339
+ return anyReplaced;
340
+ }
341
+ /**
342
+ * Find messages with empty text parts
343
+ */
344
+ export function findMessagesWithEmptyTextParts(sessionID) {
345
+ const messages = readMessages(sessionID);
346
+ const result = [];
347
+ for (const msg of messages) {
348
+ const parts = readParts(msg.id);
349
+ const hasEmptyTextPart = parts.some((p) => {
350
+ if (p.type !== 'text')
351
+ return false;
352
+ const textPart = p;
353
+ return !textPart.text?.trim();
354
+ });
355
+ if (hasEmptyTextPart) {
356
+ result.push(msg.id);
357
+ }
358
+ }
359
+ return result;
360
+ }
361
+ /**
362
+ * Find message by index that needs thinking block
363
+ */
364
+ export function findMessageByIndexNeedingThinking(sessionID, targetIndex) {
365
+ const messages = readMessages(sessionID);
366
+ if (targetIndex < 0 || targetIndex >= messages.length)
367
+ return null;
368
+ const targetMsg = messages[targetIndex];
369
+ if (targetMsg.role !== 'assistant')
370
+ return null;
371
+ const parts = readParts(targetMsg.id);
372
+ if (parts.length === 0)
373
+ return null;
374
+ const sortedParts = [...parts].sort((a, b) => a.id.localeCompare(b.id));
375
+ const firstPart = sortedParts[0];
376
+ const firstIsThinking = THINKING_TYPES.has(firstPart.type);
377
+ if (!firstIsThinking) {
378
+ return targetMsg.id;
379
+ }
380
+ return null;
381
+ }
382
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/hooks/recovery/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Unified Recovery Types
3
+ *
4
+ * Type definitions for all recovery mechanisms in Claude Code.
5
+ */
6
+ /**
7
+ * Recovery error types
8
+ */
9
+ export type RecoveryErrorType = 'context_window_limit' | 'edit_error' | 'tool_result_missing' | 'thinking_block_order' | 'thinking_disabled_violation' | 'empty_content' | null;
10
+ /**
11
+ * Recovery result
12
+ */
13
+ export interface RecoveryResult {
14
+ /** Whether recovery was attempted */
15
+ attempted: boolean;
16
+ /** Whether recovery was successful */
17
+ success: boolean;
18
+ /** Recovery message to inject */
19
+ message?: string;
20
+ /** Error type detected */
21
+ errorType?: string;
22
+ }
23
+ /**
24
+ * Parsed token limit error information
25
+ */
26
+ export interface ParsedTokenLimitError {
27
+ /** Current number of tokens in the conversation */
28
+ currentTokens: number;
29
+ /** Maximum allowed tokens */
30
+ maxTokens: number;
31
+ /** Request ID from the API response */
32
+ requestId?: string;
33
+ /** Type of error detected */
34
+ errorType: string;
35
+ /** Provider ID (e.g., 'anthropic') */
36
+ providerID?: string;
37
+ /** Model ID (e.g., 'claude-3-opus-20240229') */
38
+ modelID?: string;
39
+ /** Index of the problematic message */
40
+ messageIndex?: number;
41
+ }
42
+ /**
43
+ * Retry state for recovery attempts
44
+ */
45
+ export interface RetryState {
46
+ /** Number of retry attempts made */
47
+ attempt: number;
48
+ /** Timestamp of last retry attempt */
49
+ lastAttemptTime: number;
50
+ }
51
+ /**
52
+ * Truncation state for progressive truncation
53
+ */
54
+ export interface TruncateState {
55
+ /** Number of truncation attempts made */
56
+ truncateAttempt: number;
57
+ /** ID of the last truncated part */
58
+ lastTruncatedPartId?: string;
59
+ }
60
+ /**
61
+ * Message data structure
62
+ */
63
+ export interface MessageData {
64
+ info?: {
65
+ id?: string;
66
+ role?: string;
67
+ sessionID?: string;
68
+ parentID?: string;
69
+ error?: unknown;
70
+ agent?: string;
71
+ model?: {
72
+ providerID: string;
73
+ modelID: string;
74
+ };
75
+ system?: string;
76
+ tools?: Record<string, boolean>;
77
+ };
78
+ parts?: Array<{
79
+ type: string;
80
+ id?: string;
81
+ text?: string;
82
+ thinking?: string;
83
+ name?: string;
84
+ input?: Record<string, unknown>;
85
+ callID?: string;
86
+ }>;
87
+ }
88
+ /**
89
+ * Stored message metadata
90
+ */
91
+ export interface StoredMessageMeta {
92
+ id: string;
93
+ sessionID: string;
94
+ role: 'user' | 'assistant';
95
+ parentID?: string;
96
+ time?: {
97
+ created: number;
98
+ completed?: number;
99
+ };
100
+ error?: unknown;
101
+ }
102
+ /**
103
+ * Stored text part
104
+ */
105
+ export interface StoredTextPart {
106
+ id: string;
107
+ sessionID: string;
108
+ messageID: string;
109
+ type: 'text';
110
+ text: string;
111
+ synthetic?: boolean;
112
+ ignored?: boolean;
113
+ }
114
+ /**
115
+ * Stored tool part
116
+ */
117
+ export interface StoredToolPart {
118
+ id: string;
119
+ sessionID: string;
120
+ messageID: string;
121
+ type: 'tool';
122
+ callID: string;
123
+ tool: string;
124
+ state: {
125
+ status: 'pending' | 'running' | 'completed' | 'error';
126
+ input: Record<string, unknown>;
127
+ output?: string;
128
+ error?: string;
129
+ };
130
+ }
131
+ /**
132
+ * Stored reasoning/thinking part
133
+ */
134
+ export interface StoredReasoningPart {
135
+ id: string;
136
+ sessionID: string;
137
+ messageID: string;
138
+ type: 'reasoning';
139
+ text: string;
140
+ }
141
+ /**
142
+ * Union of all stored part types
143
+ */
144
+ export type StoredPart = StoredTextPart | StoredToolPart | StoredReasoningPart | {
145
+ id: string;
146
+ sessionID: string;
147
+ messageID: string;
148
+ type: string;
149
+ [key: string]: unknown;
150
+ };
151
+ /**
152
+ * Unified recovery configuration
153
+ */
154
+ export interface RecoveryConfig {
155
+ /** Whether to enable context window limit recovery */
156
+ contextWindowRecovery?: boolean;
157
+ /** Whether to enable edit error recovery */
158
+ editErrorRecovery?: boolean;
159
+ /** Whether to enable session recovery */
160
+ sessionRecovery?: boolean;
161
+ /** Whether to show detailed recovery messages */
162
+ detailed?: boolean;
163
+ /** Custom recovery messages */
164
+ customMessages?: Partial<Record<RecoveryErrorType & string, string>>;
165
+ /** Whether to enable auto-resume after recovery */
166
+ autoResume?: boolean;
167
+ /** Whether to enable detailed logging */
168
+ debug?: boolean;
169
+ }
170
+ /**
171
+ * Configuration for retry behavior
172
+ */
173
+ export declare const RETRY_CONFIG: {
174
+ /** Maximum retry attempts */
175
+ readonly maxAttempts: 2;
176
+ /** Initial delay between retries in ms */
177
+ readonly initialDelayMs: 2000;
178
+ /** Backoff factor for exponential backoff */
179
+ readonly backoffFactor: 2;
180
+ /** Maximum delay between retries in ms */
181
+ readonly maxDelayMs: 30000;
182
+ };
183
+ /**
184
+ * Configuration for truncation behavior
185
+ */
186
+ export declare const TRUNCATE_CONFIG: {
187
+ /** Maximum truncation attempts */
188
+ readonly maxTruncateAttempts: 20;
189
+ /** Minimum output size (chars) to attempt truncation */
190
+ readonly minOutputSizeToTruncate: 500;
191
+ /** Target token ratio after truncation */
192
+ readonly targetTokenRatio: 0.5;
193
+ /** Average characters per token estimate */
194
+ readonly charsPerToken: 4;
195
+ };
196
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hooks/recovery/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Unified Recovery Types
3
+ *
4
+ * Type definitions for all recovery mechanisms in Claude Code.
5
+ */
6
+ /**
7
+ * Configuration for retry behavior
8
+ */
9
+ export const RETRY_CONFIG = {
10
+ /** Maximum retry attempts */
11
+ maxAttempts: 2,
12
+ /** Initial delay between retries in ms */
13
+ initialDelayMs: 2000,
14
+ /** Backoff factor for exponential backoff */
15
+ backoffFactor: 2,
16
+ /** Maximum delay between retries in ms */
17
+ maxDelayMs: 30000,
18
+ };
19
+ /**
20
+ * Configuration for truncation behavior
21
+ */
22
+ export const TRUNCATE_CONFIG = {
23
+ /** Maximum truncation attempts */
24
+ maxTruncateAttempts: 20,
25
+ /** Minimum output size (chars) to attempt truncation */
26
+ minOutputSizeToTruncate: 500,
27
+ /** Target token ratio after truncation */
28
+ targetTokenRatio: 0.5,
29
+ /** Average characters per token estimate */
30
+ charsPerToken: 4,
31
+ };
32
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/recovery/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6LH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,CAAC;IACd,0CAA0C;IAC1C,cAAc,EAAE,IAAI;IACpB,6CAA6C;IAC7C,aAAa,EAAE,CAAC;IAChB,0CAA0C;IAC1C,UAAU,EAAE,KAAK;CACT,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,kCAAkC;IAClC,mBAAmB,EAAE,EAAE;IACvB,wDAAwD;IACxD,uBAAuB,EAAE,GAAG;IAC5B,0CAA0C;IAC1C,gBAAgB,EAAE,GAAG;IACrB,4CAA4C;IAC5C,aAAa,EAAE,CAAC;CACR,CAAC"}