sessionlog 0.0.1

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +388 -0
  3. package/dist/agent/agents/claude-code.d.ts +76 -0
  4. package/dist/agent/agents/claude-code.d.ts.map +1 -0
  5. package/dist/agent/agents/claude-code.js +769 -0
  6. package/dist/agent/agents/claude-code.js.map +1 -0
  7. package/dist/agent/agents/cursor.d.ts +35 -0
  8. package/dist/agent/agents/cursor.d.ts.map +1 -0
  9. package/dist/agent/agents/cursor.js +294 -0
  10. package/dist/agent/agents/cursor.js.map +1 -0
  11. package/dist/agent/agents/gemini-cli.d.ts +62 -0
  12. package/dist/agent/agents/gemini-cli.d.ts.map +1 -0
  13. package/dist/agent/agents/gemini-cli.js +474 -0
  14. package/dist/agent/agents/gemini-cli.js.map +1 -0
  15. package/dist/agent/agents/opencode.d.ts +100 -0
  16. package/dist/agent/agents/opencode.d.ts.map +1 -0
  17. package/dist/agent/agents/opencode.js +423 -0
  18. package/dist/agent/agents/opencode.js.map +1 -0
  19. package/dist/agent/registry.d.ts +54 -0
  20. package/dist/agent/registry.d.ts.map +1 -0
  21. package/dist/agent/registry.js +123 -0
  22. package/dist/agent/registry.js.map +1 -0
  23. package/dist/agent/session-types.d.ts +45 -0
  24. package/dist/agent/session-types.d.ts.map +1 -0
  25. package/dist/agent/session-types.js +48 -0
  26. package/dist/agent/session-types.js.map +1 -0
  27. package/dist/agent/types.d.ts +126 -0
  28. package/dist/agent/types.d.ts.map +1 -0
  29. package/dist/agent/types.js +40 -0
  30. package/dist/agent/types.js.map +1 -0
  31. package/dist/cli.d.ts +12 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +425 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/commands/clean.d.ts +30 -0
  36. package/dist/commands/clean.d.ts.map +1 -0
  37. package/dist/commands/clean.js +98 -0
  38. package/dist/commands/clean.js.map +1 -0
  39. package/dist/commands/disable.d.ts +23 -0
  40. package/dist/commands/disable.d.ts.map +1 -0
  41. package/dist/commands/disable.js +57 -0
  42. package/dist/commands/disable.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +43 -0
  44. package/dist/commands/doctor.d.ts.map +1 -0
  45. package/dist/commands/doctor.js +97 -0
  46. package/dist/commands/doctor.js.map +1 -0
  47. package/dist/commands/enable.d.ts +37 -0
  48. package/dist/commands/enable.d.ts.map +1 -0
  49. package/dist/commands/enable.js +133 -0
  50. package/dist/commands/enable.js.map +1 -0
  51. package/dist/commands/explain.d.ts +68 -0
  52. package/dist/commands/explain.d.ts.map +1 -0
  53. package/dist/commands/explain.js +182 -0
  54. package/dist/commands/explain.js.map +1 -0
  55. package/dist/commands/reset.d.ts +23 -0
  56. package/dist/commands/reset.d.ts.map +1 -0
  57. package/dist/commands/reset.js +68 -0
  58. package/dist/commands/reset.js.map +1 -0
  59. package/dist/commands/resume.d.ts +42 -0
  60. package/dist/commands/resume.d.ts.map +1 -0
  61. package/dist/commands/resume.js +133 -0
  62. package/dist/commands/resume.js.map +1 -0
  63. package/dist/commands/rewind.d.ts +34 -0
  64. package/dist/commands/rewind.d.ts.map +1 -0
  65. package/dist/commands/rewind.js +155 -0
  66. package/dist/commands/rewind.js.map +1 -0
  67. package/dist/commands/status.d.ts +51 -0
  68. package/dist/commands/status.d.ts.map +1 -0
  69. package/dist/commands/status.js +112 -0
  70. package/dist/commands/status.js.map +1 -0
  71. package/dist/config.d.ts +40 -0
  72. package/dist/config.d.ts.map +1 -0
  73. package/dist/config.js +127 -0
  74. package/dist/config.js.map +1 -0
  75. package/dist/git-operations.d.ts +191 -0
  76. package/dist/git-operations.d.ts.map +1 -0
  77. package/dist/git-operations.js +462 -0
  78. package/dist/git-operations.js.map +1 -0
  79. package/dist/hooks/git-hooks.d.ts +22 -0
  80. package/dist/hooks/git-hooks.d.ts.map +1 -0
  81. package/dist/hooks/git-hooks.js +139 -0
  82. package/dist/hooks/git-hooks.js.map +1 -0
  83. package/dist/hooks/lifecycle.d.ts +21 -0
  84. package/dist/hooks/lifecycle.d.ts.map +1 -0
  85. package/dist/hooks/lifecycle.js +179 -0
  86. package/dist/hooks/lifecycle.js.map +1 -0
  87. package/dist/index.d.ts +76 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +166 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/security/redaction.d.ts +35 -0
  92. package/dist/security/redaction.d.ts.map +1 -0
  93. package/dist/security/redaction.js +239 -0
  94. package/dist/security/redaction.js.map +1 -0
  95. package/dist/session/state-machine.d.ts +90 -0
  96. package/dist/session/state-machine.d.ts.map +1 -0
  97. package/dist/session/state-machine.js +345 -0
  98. package/dist/session/state-machine.js.map +1 -0
  99. package/dist/store/checkpoint-store.d.ts +59 -0
  100. package/dist/store/checkpoint-store.d.ts.map +1 -0
  101. package/dist/store/checkpoint-store.js +321 -0
  102. package/dist/store/checkpoint-store.js.map +1 -0
  103. package/dist/store/native-store.d.ts +14 -0
  104. package/dist/store/native-store.d.ts.map +1 -0
  105. package/dist/store/native-store.js +159 -0
  106. package/dist/store/native-store.js.map +1 -0
  107. package/dist/store/provider-types.d.ts +78 -0
  108. package/dist/store/provider-types.d.ts.map +1 -0
  109. package/dist/store/provider-types.js +12 -0
  110. package/dist/store/provider-types.js.map +1 -0
  111. package/dist/store/session-store.d.ts +36 -0
  112. package/dist/store/session-store.d.ts.map +1 -0
  113. package/dist/store/session-store.js +193 -0
  114. package/dist/store/session-store.js.map +1 -0
  115. package/dist/strategy/attribution.d.ts +39 -0
  116. package/dist/strategy/attribution.d.ts.map +1 -0
  117. package/dist/strategy/attribution.js +225 -0
  118. package/dist/strategy/attribution.js.map +1 -0
  119. package/dist/strategy/common.d.ts +57 -0
  120. package/dist/strategy/common.d.ts.map +1 -0
  121. package/dist/strategy/common.js +156 -0
  122. package/dist/strategy/common.js.map +1 -0
  123. package/dist/strategy/content-overlap.d.ts +33 -0
  124. package/dist/strategy/content-overlap.d.ts.map +1 -0
  125. package/dist/strategy/content-overlap.js +176 -0
  126. package/dist/strategy/content-overlap.js.map +1 -0
  127. package/dist/strategy/manual-commit.d.ts +36 -0
  128. package/dist/strategy/manual-commit.d.ts.map +1 -0
  129. package/dist/strategy/manual-commit.js +717 -0
  130. package/dist/strategy/manual-commit.js.map +1 -0
  131. package/dist/strategy/types.d.ts +163 -0
  132. package/dist/strategy/types.d.ts.map +1 -0
  133. package/dist/strategy/types.js +48 -0
  134. package/dist/strategy/types.js.map +1 -0
  135. package/dist/summarize/claude-generator.d.ts +25 -0
  136. package/dist/summarize/claude-generator.d.ts.map +1 -0
  137. package/dist/summarize/claude-generator.js +87 -0
  138. package/dist/summarize/claude-generator.js.map +1 -0
  139. package/dist/summarize/summarize.d.ts +52 -0
  140. package/dist/summarize/summarize.d.ts.map +1 -0
  141. package/dist/summarize/summarize.js +335 -0
  142. package/dist/summarize/summarize.js.map +1 -0
  143. package/dist/types.d.ts +293 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +94 -0
  146. package/dist/types.js.map +1 -0
  147. package/dist/utils/chunk-files.d.ts +25 -0
  148. package/dist/utils/chunk-files.d.ts.map +1 -0
  149. package/dist/utils/chunk-files.js +47 -0
  150. package/dist/utils/chunk-files.js.map +1 -0
  151. package/dist/utils/commit-message.d.ts +11 -0
  152. package/dist/utils/commit-message.d.ts.map +1 -0
  153. package/dist/utils/commit-message.js +54 -0
  154. package/dist/utils/commit-message.js.map +1 -0
  155. package/dist/utils/detect-agent.d.ts +19 -0
  156. package/dist/utils/detect-agent.d.ts.map +1 -0
  157. package/dist/utils/detect-agent.js +34 -0
  158. package/dist/utils/detect-agent.js.map +1 -0
  159. package/dist/utils/hook-managers.d.ts +24 -0
  160. package/dist/utils/hook-managers.d.ts.map +1 -0
  161. package/dist/utils/hook-managers.js +96 -0
  162. package/dist/utils/hook-managers.js.map +1 -0
  163. package/dist/utils/ide-tags.d.ts +12 -0
  164. package/dist/utils/ide-tags.d.ts.map +1 -0
  165. package/dist/utils/ide-tags.js +30 -0
  166. package/dist/utils/ide-tags.js.map +1 -0
  167. package/dist/utils/paths.d.ts +32 -0
  168. package/dist/utils/paths.d.ts.map +1 -0
  169. package/dist/utils/paths.js +55 -0
  170. package/dist/utils/paths.js.map +1 -0
  171. package/dist/utils/preview-rewind.d.ts +23 -0
  172. package/dist/utils/preview-rewind.d.ts.map +1 -0
  173. package/dist/utils/preview-rewind.js +63 -0
  174. package/dist/utils/preview-rewind.js.map +1 -0
  175. package/dist/utils/rewind-conflict.d.ts +52 -0
  176. package/dist/utils/rewind-conflict.d.ts.map +1 -0
  177. package/dist/utils/rewind-conflict.js +79 -0
  178. package/dist/utils/rewind-conflict.js.map +1 -0
  179. package/dist/utils/shadow-branch.d.ts +44 -0
  180. package/dist/utils/shadow-branch.d.ts.map +1 -0
  181. package/dist/utils/shadow-branch.js +93 -0
  182. package/dist/utils/shadow-branch.js.map +1 -0
  183. package/dist/utils/string-utils.d.ts +24 -0
  184. package/dist/utils/string-utils.d.ts.map +1 -0
  185. package/dist/utils/string-utils.js +47 -0
  186. package/dist/utils/string-utils.js.map +1 -0
  187. package/dist/utils/todo-extract.d.ts +52 -0
  188. package/dist/utils/todo-extract.d.ts.map +1 -0
  189. package/dist/utils/todo-extract.js +167 -0
  190. package/dist/utils/todo-extract.js.map +1 -0
  191. package/dist/utils/trailers.d.ts +36 -0
  192. package/dist/utils/trailers.d.ts.map +1 -0
  193. package/dist/utils/trailers.js +148 -0
  194. package/dist/utils/trailers.js.map +1 -0
  195. package/dist/utils/transcript-parse.d.ts +57 -0
  196. package/dist/utils/transcript-parse.d.ts.map +1 -0
  197. package/dist/utils/transcript-parse.js +126 -0
  198. package/dist/utils/transcript-parse.js.map +1 -0
  199. package/dist/utils/transcript-timestamp.d.ts +22 -0
  200. package/dist/utils/transcript-timestamp.d.ts.map +1 -0
  201. package/dist/utils/transcript-timestamp.js +56 -0
  202. package/dist/utils/transcript-timestamp.js.map +1 -0
  203. package/dist/utils/tree-ops.d.ts +47 -0
  204. package/dist/utils/tree-ops.d.ts.map +1 -0
  205. package/dist/utils/tree-ops.js +145 -0
  206. package/dist/utils/tree-ops.js.map +1 -0
  207. package/dist/utils/tty.d.ts +25 -0
  208. package/dist/utils/tty.d.ts.map +1 -0
  209. package/dist/utils/tty.js +70 -0
  210. package/dist/utils/tty.js.map +1 -0
  211. package/dist/utils/validation.d.ts +31 -0
  212. package/dist/utils/validation.d.ts.map +1 -0
  213. package/dist/utils/validation.js +59 -0
  214. package/dist/utils/validation.js.map +1 -0
  215. package/dist/utils/worktree.d.ts +16 -0
  216. package/dist/utils/worktree.d.ts.map +1 -0
  217. package/dist/utils/worktree.js +50 -0
  218. package/dist/utils/worktree.js.map +1 -0
  219. package/package.json +64 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Explain Command
3
+ *
4
+ * Provides human-readable context about sessions, commits, and checkpoints.
5
+ * This is the library implementation - consumers (CLI, IDE plugins) handle
6
+ * their own output formatting and pager support.
7
+ */
8
+ import type { CheckpointID, Summary, AgentType, TokenUsage } from '../types.js';
9
+ export interface CheckpointDetail {
10
+ checkpointID: CheckpointID;
11
+ sessionID: string;
12
+ agent?: AgentType;
13
+ strategy: string;
14
+ createdAt: string;
15
+ branch?: string;
16
+ checkpointsCount: number;
17
+ filesTouched: string[];
18
+ tokenUsage?: TokenUsage;
19
+ summary?: Summary;
20
+ isTaskCheckpoint?: boolean;
21
+ turnID?: string;
22
+ transcriptIdentifierAtStart?: string;
23
+ checkpointTranscriptStart: number;
24
+ }
25
+ export interface CheckpointListItem {
26
+ checkpointID: CheckpointID;
27
+ sessionID: string;
28
+ message: string;
29
+ date: string;
30
+ isTaskCheckpoint: boolean;
31
+ agent?: AgentType;
32
+ sessionCount: number;
33
+ sessionIDs: string[];
34
+ }
35
+ export interface ExplainOptions {
36
+ cwd?: string;
37
+ sessionFilter?: string;
38
+ maxDepth?: number;
39
+ searchAll?: boolean;
40
+ }
41
+ export interface CommitExplainResult {
42
+ commitSHA: string;
43
+ commitMessage: string;
44
+ checkpointID: CheckpointID | null;
45
+ detail: CheckpointDetail | null;
46
+ }
47
+ /**
48
+ * List checkpoints on the current branch.
49
+ * Optionally filtered by session ID prefix.
50
+ */
51
+ export declare function listCheckpoints(options?: ExplainOptions): Promise<CheckpointListItem[]>;
52
+ /**
53
+ * Get detailed information about a specific checkpoint.
54
+ */
55
+ export declare function getCheckpointDetail(checkpointID: CheckpointID, options?: ExplainOptions): Promise<CheckpointDetail | null>;
56
+ /**
57
+ * Get the transcript content for a checkpoint.
58
+ */
59
+ export declare function getCheckpointTranscript(checkpointID: CheckpointID, options?: ExplainOptions): Promise<Buffer | null>;
60
+ /**
61
+ * Explain a specific commit by finding its associated checkpoint.
62
+ */
63
+ export declare function explainCommit(commitRef: string, options?: ExplainOptions): Promise<CommitExplainResult | null>;
64
+ /**
65
+ * Find a checkpoint by ID prefix (partial match).
66
+ */
67
+ export declare function findCheckpointByPrefix(prefix: string, options?: ExplainOptions): Promise<CheckpointID | null>;
68
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAqB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASnG,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC;AAMD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAiEjG;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA6BlC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUxB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAgCrC;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAyB9B"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Explain Command
3
+ *
4
+ * Provides human-readable context about sessions, commits, and checkpoints.
5
+ * This is the library implementation - consumers (CLI, IDE plugins) handle
6
+ * their own output formatting and pager support.
7
+ */
8
+ import { CHECKPOINTS_BRANCH, checkpointIDPath } from '../types.js';
9
+ import { git, catFile, lsTree } from '../git-operations.js';
10
+ import { parseCheckpoint, parseAllSessions } from '../utils/trailers.js';
11
+ // ============================================================================
12
+ // Public API
13
+ // ============================================================================
14
+ /**
15
+ * List checkpoints on the current branch.
16
+ * Optionally filtered by session ID prefix.
17
+ */
18
+ export async function listCheckpoints(options = {}) {
19
+ const cwd = options.cwd;
20
+ const maxDepth = options.searchAll ? 0 : (options.maxDepth ?? 500);
21
+ // Get commits on the current branch
22
+ const logArgs = ['log', '--format=%H %s'];
23
+ if (maxDepth > 0)
24
+ logArgs.push(`-n`, `${maxDepth}`);
25
+ let logOutput;
26
+ try {
27
+ logOutput = await git(logArgs, { cwd });
28
+ }
29
+ catch {
30
+ return [];
31
+ }
32
+ const items = [];
33
+ for (const line of logOutput.split('\n')) {
34
+ if (!line.trim())
35
+ continue;
36
+ const spaceIdx = line.indexOf(' ');
37
+ if (spaceIdx === -1)
38
+ continue;
39
+ const sha = line.slice(0, spaceIdx);
40
+ const message = line.slice(spaceIdx + 1);
41
+ // Get full commit message to check for trailers
42
+ let fullMessage;
43
+ try {
44
+ fullMessage = await git(['log', '-1', '--format=%B', sha], { cwd });
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ const [cpID, hasCp] = parseCheckpoint(fullMessage);
50
+ if (!hasCp || !cpID)
51
+ continue;
52
+ const sessionIDs = parseAllSessions(fullMessage);
53
+ // Apply session filter
54
+ if (options.sessionFilter) {
55
+ const hasMatch = sessionIDs.some((sid) => sid.startsWith(options.sessionFilter));
56
+ if (!hasMatch)
57
+ continue;
58
+ }
59
+ // Get commit date
60
+ let date;
61
+ try {
62
+ date = (await git(['log', '-1', '--format=%aI', sha], { cwd })).trim();
63
+ }
64
+ catch {
65
+ date = '';
66
+ }
67
+ items.push({
68
+ checkpointID: cpID,
69
+ sessionID: sessionIDs[0] ?? '',
70
+ message: message.trim(),
71
+ date,
72
+ isTaskCheckpoint: message.includes('[task]'),
73
+ sessionCount: sessionIDs.length,
74
+ sessionIDs,
75
+ });
76
+ }
77
+ return items;
78
+ }
79
+ /**
80
+ * Get detailed information about a specific checkpoint.
81
+ */
82
+ export async function getCheckpointDetail(checkpointID, options = {}) {
83
+ const cwd = options.cwd;
84
+ // Try to read committed metadata from the checkpoints branch
85
+ const metadataPath = `${checkpointIDPath(checkpointID)}/metadata.json`;
86
+ try {
87
+ const content = await catFile(`${CHECKPOINTS_BRANCH}:${metadataPath}`, cwd);
88
+ const metadata = JSON.parse(content);
89
+ return {
90
+ checkpointID: metadata.checkpointID,
91
+ sessionID: metadata.sessionID,
92
+ agent: metadata.agent,
93
+ strategy: metadata.strategy,
94
+ createdAt: metadata.createdAt,
95
+ branch: metadata.branch,
96
+ checkpointsCount: metadata.checkpointsCount,
97
+ filesTouched: metadata.filesTouched,
98
+ tokenUsage: metadata.tokenUsage,
99
+ summary: metadata.summary,
100
+ isTaskCheckpoint: metadata.isTask,
101
+ turnID: metadata.turnID,
102
+ transcriptIdentifierAtStart: metadata.transcriptIdentifierAtStart,
103
+ checkpointTranscriptStart: metadata.checkpointTranscriptStart,
104
+ };
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Get the transcript content for a checkpoint.
112
+ */
113
+ export async function getCheckpointTranscript(checkpointID, options = {}) {
114
+ const cwd = options.cwd;
115
+ const transcriptPath = `${checkpointIDPath(checkpointID)}/transcript`;
116
+ try {
117
+ const content = await catFile(`${CHECKPOINTS_BRANCH}:${transcriptPath}`, cwd);
118
+ return Buffer.from(content, 'utf-8');
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ }
124
+ /**
125
+ * Explain a specific commit by finding its associated checkpoint.
126
+ */
127
+ export async function explainCommit(commitRef, options = {}) {
128
+ const cwd = options.cwd;
129
+ let fullMessage;
130
+ try {
131
+ fullMessage = await git(['log', '-1', '--format=%B', commitRef], { cwd });
132
+ }
133
+ catch {
134
+ return null;
135
+ }
136
+ const [cpID] = parseCheckpoint(fullMessage);
137
+ let sha;
138
+ try {
139
+ sha = (await git(['rev-parse', commitRef], { cwd })).trim();
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ const message = fullMessage.split('\n')[0] ?? '';
145
+ let detail = null;
146
+ if (cpID) {
147
+ detail = await getCheckpointDetail(cpID, options);
148
+ }
149
+ return {
150
+ commitSHA: sha,
151
+ commitMessage: message,
152
+ checkpointID: cpID,
153
+ detail,
154
+ };
155
+ }
156
+ /**
157
+ * Find a checkpoint by ID prefix (partial match).
158
+ */
159
+ export async function findCheckpointByPrefix(prefix, options = {}) {
160
+ const cwd = options.cwd;
161
+ // For full IDs, just return directly
162
+ if (prefix.length === 12)
163
+ return prefix;
164
+ // Need at least 2 chars for shard prefix
165
+ if (prefix.length < 2)
166
+ return null;
167
+ const shardPrefix = prefix.slice(0, 2);
168
+ const remainder = prefix.slice(2);
169
+ try {
170
+ const entries = await lsTree(CHECKPOINTS_BRANCH, shardPrefix, cwd);
171
+ for (const entry of entries) {
172
+ if (entry.name.startsWith(remainder)) {
173
+ return `${shardPrefix}${entry.name}`;
174
+ }
175
+ }
176
+ }
177
+ catch {
178
+ // Shard doesn't exist
179
+ }
180
+ return null;
181
+ }
182
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Reset Command
3
+ *
4
+ * Deletes shadow branch and session state for the current HEAD.
5
+ * More targeted than clean — only affects the current commit's sessions.
6
+ */
7
+ export interface ResetOptions {
8
+ cwd?: string;
9
+ /** Reset a specific session instead of all */
10
+ sessionID?: string;
11
+ /** Skip confirmation (for programmatic use) */
12
+ force?: boolean;
13
+ }
14
+ export interface ResetResult {
15
+ sessionsReset: string[];
16
+ branchesDeleted: string[];
17
+ errors: string[];
18
+ }
19
+ /**
20
+ * Reset shadow branches and session state for the current HEAD
21
+ */
22
+ export declare function reset(options?: ResetOptions): Promise<ResetResult>;
23
+ //# sourceMappingURL=reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmE5E"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Reset Command
3
+ *
4
+ * Deletes shadow branch and session state for the current HEAD.
5
+ * More targeted than clean — only affects the current commit's sessions.
6
+ */
7
+ import { getHead } from '../git-operations.js';
8
+ import { createSessionStore } from '../store/session-store.js';
9
+ import { createCheckpointStore } from '../store/checkpoint-store.js';
10
+ // ============================================================================
11
+ // Implementation
12
+ // ============================================================================
13
+ /**
14
+ * Reset shadow branches and session state for the current HEAD
15
+ */
16
+ export async function reset(options = {}) {
17
+ const cwd = options.cwd;
18
+ const sessionStore = createSessionStore(cwd);
19
+ const checkpointStore = createCheckpointStore(cwd);
20
+ const head = await getHead(cwd);
21
+ const errors = [];
22
+ const sessionsReset = [];
23
+ const branchesDeleted = [];
24
+ const sessions = await sessionStore.list();
25
+ // Find sessions matching the current HEAD
26
+ let matchingSessions;
27
+ if (options.sessionID) {
28
+ matchingSessions = sessions.filter((s) => s.sessionID === options.sessionID);
29
+ if (matchingSessions.length === 0) {
30
+ errors.push(`Session not found: ${options.sessionID}`);
31
+ return { sessionsReset, branchesDeleted, errors };
32
+ }
33
+ }
34
+ else {
35
+ matchingSessions = sessions.filter((s) => s.baseCommit === head || head.startsWith(s.baseCommit));
36
+ }
37
+ // Safety check: warn about active sessions
38
+ if (!options.force) {
39
+ const activeSessions = matchingSessions.filter((s) => s.phase === 'active');
40
+ if (activeSessions.length > 0) {
41
+ errors.push(`${activeSessions.length} active session(s) found. Use --force to reset active sessions.`);
42
+ return { sessionsReset, branchesDeleted, errors };
43
+ }
44
+ }
45
+ for (const session of matchingSessions) {
46
+ // Delete shadow branch
47
+ if (session.baseCommit) {
48
+ const branchName = checkpointStore.getShadowBranchName(session.baseCommit, session.worktreeID);
49
+ try {
50
+ await checkpointStore.deleteShadowBranch(branchName);
51
+ branchesDeleted.push(branchName);
52
+ }
53
+ catch (e) {
54
+ errors.push(`Failed to delete branch ${branchName}: ${e instanceof Error ? e.message : String(e)}`);
55
+ }
56
+ }
57
+ // Delete session state
58
+ try {
59
+ await sessionStore.delete(session.sessionID);
60
+ sessionsReset.push(session.sessionID);
61
+ }
62
+ catch (e) {
63
+ errors.push(`Failed to delete session ${session.sessionID}: ${e instanceof Error ? e.message : String(e)}`);
64
+ }
65
+ }
66
+ return { sessionsReset, branchesDeleted, errors };
67
+ }
68
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAoBrE,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAAwB,EAAE;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAE3C,0CAA0C;IAC1C,IAAI,gBAAgC,CAAC;IAErC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAC9D,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;QAC5E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CACT,GAAG,cAAc,CAAC,MAAM,iEAAiE,CAC1F,CAAC;YACF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,uBAAuB;QACvB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,eAAe,CAAC,mBAAmB,CACpD,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,UAAU,CACnB,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBACrD,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CACT,2BAA2B,UAAU,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CACT,4BAA4B,OAAO,CAAC,SAAS,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Resume Command
3
+ *
4
+ * Library implementation for resuming agent sessions from branches.
5
+ * Handles branch checkout, session discovery from commit trailers,
6
+ * and transcript restoration.
7
+ */
8
+ import type { CheckpointID } from '../types.js';
9
+ export interface ResumeInfo {
10
+ branchName: string;
11
+ sessionID: string;
12
+ sessionIDs: string[];
13
+ checkpointID: CheckpointID | null;
14
+ resumeCommand: string;
15
+ commitSHA: string;
16
+ commitMessage: string;
17
+ needsReset: boolean;
18
+ resetTargetSHA?: string;
19
+ }
20
+ export interface ResumeOptions {
21
+ cwd?: string;
22
+ force?: boolean;
23
+ }
24
+ export interface ResumeResult {
25
+ success: boolean;
26
+ info?: ResumeInfo;
27
+ error?: string;
28
+ }
29
+ /**
30
+ * Discover resume information for a branch without performing any actions.
31
+ * This is useful for preview/dry-run scenarios.
32
+ */
33
+ export declare function discoverResumeInfo(branchName: string, options?: ResumeOptions): Promise<ResumeResult>;
34
+ /**
35
+ * Get a list of branches that have checkpointed sessions.
36
+ */
37
+ export declare function listResumableBranches(options?: ResumeOptions): Promise<Array<{
38
+ branch: string;
39
+ sessionID: string;
40
+ lastCommit: string;
41
+ }>>;
42
+ //# sourceMappingURL=resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA+BvB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA2C3E"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Resume Command
3
+ *
4
+ * Library implementation for resuming agent sessions from branches.
5
+ * Handles branch checkout, session discovery from commit trailers,
6
+ * and transcript restoration.
7
+ */
8
+ import { git, refExists } from '../git-operations.js';
9
+ import { parseCheckpoint, parseAllSessions } from '../utils/trailers.js';
10
+ // ============================================================================
11
+ // Public API
12
+ // ============================================================================
13
+ /**
14
+ * Discover resume information for a branch without performing any actions.
15
+ * This is useful for preview/dry-run scenarios.
16
+ */
17
+ export async function discoverResumeInfo(branchName, options = {}) {
18
+ const cwd = options.cwd;
19
+ // Check if branch exists locally
20
+ const localExists = await refExists(`refs/heads/${branchName}`, cwd);
21
+ if (!localExists) {
22
+ // Check remote
23
+ const remoteExists = await refExists(`refs/remotes/origin/${branchName}`, cwd);
24
+ if (!remoteExists) {
25
+ return {
26
+ success: false,
27
+ error: `Branch '${branchName}' not found locally or on origin`,
28
+ };
29
+ }
30
+ return {
31
+ success: false,
32
+ error: `Branch '${branchName}' exists on origin but not locally. Fetch it first.`,
33
+ };
34
+ }
35
+ // Find the most recent commit with a checkpoint trailer
36
+ const info = await findSessionInfo(branchName, cwd);
37
+ if (!info) {
38
+ return {
39
+ success: false,
40
+ error: `No checkpointed session found on branch '${branchName}'`,
41
+ };
42
+ }
43
+ return { success: true, info };
44
+ }
45
+ /**
46
+ * Get a list of branches that have checkpointed sessions.
47
+ */
48
+ export async function listResumableBranches(options = {}) {
49
+ const cwd = options.cwd;
50
+ const results = [];
51
+ let branchOutput;
52
+ try {
53
+ branchOutput = await git(['branch', '--format=%(refname:short)'], { cwd });
54
+ }
55
+ catch {
56
+ return [];
57
+ }
58
+ for (const branch of branchOutput.split('\n')) {
59
+ const trimmed = branch.trim();
60
+ if (!trimmed)
61
+ continue;
62
+ // Get the last few commits to check for checkpoint trailers
63
+ try {
64
+ const logOutput = await git(['log', '-10', '--format=%H', trimmed], { cwd });
65
+ for (const sha of logOutput.split('\n')) {
66
+ if (!sha.trim())
67
+ continue;
68
+ const fullMessage = await git(['log', '-1', '--format=%B', sha.trim()], { cwd });
69
+ const [cpID, hasCp] = parseCheckpoint(fullMessage);
70
+ if (hasCp && cpID) {
71
+ const sessionIDs = parseAllSessions(fullMessage);
72
+ if (sessionIDs.length > 0) {
73
+ results.push({
74
+ branch: trimmed,
75
+ sessionID: sessionIDs[0],
76
+ lastCommit: sha.trim().slice(0, 7),
77
+ });
78
+ break; // Only report first match per branch
79
+ }
80
+ }
81
+ }
82
+ }
83
+ catch {
84
+ continue;
85
+ }
86
+ }
87
+ return results;
88
+ }
89
+ // ============================================================================
90
+ // Internal Helpers
91
+ // ============================================================================
92
+ async function findSessionInfo(branchName, cwd) {
93
+ // Walk commits on the branch looking for one with a checkpoint trailer
94
+ let logOutput;
95
+ try {
96
+ logOutput = await git(['log', '-50', '--format=%H', branchName], { cwd });
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ const shas = logOutput.split('\n').filter(Boolean);
102
+ for (let i = 0; i < shas.length; i++) {
103
+ const sha = shas[i].trim();
104
+ if (!sha)
105
+ continue;
106
+ let fullMessage;
107
+ try {
108
+ fullMessage = await git(['log', '-1', '--format=%B', sha], { cwd });
109
+ }
110
+ catch {
111
+ continue;
112
+ }
113
+ const [cpID, hasCp] = parseCheckpoint(fullMessage);
114
+ if (!hasCp || !cpID)
115
+ continue;
116
+ const sessionIDs = parseAllSessions(fullMessage);
117
+ const message = fullMessage.split('\n')[0] ?? '';
118
+ const needsReset = i > 0; // If not the tip commit, needs reset
119
+ return {
120
+ branchName,
121
+ sessionID: sessionIDs[0] ?? '',
122
+ sessionIDs,
123
+ checkpointID: cpID,
124
+ resumeCommand: '', // To be filled by consumer with agent-specific command
125
+ commitSHA: sha,
126
+ commitMessage: message,
127
+ needsReset,
128
+ resetTargetSHA: needsReset ? sha : undefined,
129
+ };
130
+ }
131
+ return null;
132
+ }
133
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Rewind Command
3
+ *
4
+ * Browse checkpoints and restore session state to a previous point.
5
+ * Supports both shadow branch (temporary) and committed checkpoint rewind.
6
+ */
7
+ import type { RewindPoint } from '../types.js';
8
+ export interface RewindOptions {
9
+ cwd?: string;
10
+ /** Maximum number of rewind points to return */
11
+ limit?: number;
12
+ }
13
+ export interface RewindResult {
14
+ success: boolean;
15
+ message: string;
16
+ rewindPoint?: RewindPoint;
17
+ }
18
+ /**
19
+ * List available rewind points
20
+ */
21
+ export declare function listRewindPoints(options?: RewindOptions): Promise<RewindPoint[]>;
22
+ /**
23
+ * Rewind to a specific point (non-interactive)
24
+ */
25
+ export declare function rewindTo(pointID: string, options?: {
26
+ cwd?: string;
27
+ logsOnly?: boolean;
28
+ reset?: boolean;
29
+ }): Promise<RewindResult>;
30
+ /**
31
+ * List rewind points as JSON (for CLI --list flag)
32
+ */
33
+ export declare function listRewindPointsJSON(options?: RewindOptions): Promise<string>;
34
+ //# sourceMappingURL=rewind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind.d.ts","sourceRoot":"","sources":["../../src/commands/rewind.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/C,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8D1F;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,OAAO,CAAC,YAAY,CAAC,CAmEvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBvF"}