hippo-memory 0.36.0 → 0.37.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 (199) hide show
  1. package/README.md +16 -0
  2. package/dist/api.d.ts +20 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +23 -3
  5. package/dist/api.js.map +1 -1
  6. package/dist/benchmarks/e1.3/incident-recall-eval.js +74 -0
  7. package/dist/benchmarks/e1.3/incident-recall-eval.js.map +1 -0
  8. package/dist/benchmarks/e1.3/scenarios.json +2587 -0
  9. package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +102 -0
  10. package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +1 -0
  11. package/dist/cli.js +82 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/connectors/slack/backfill.d.ts +42 -0
  14. package/dist/connectors/slack/backfill.d.ts.map +1 -0
  15. package/dist/connectors/slack/backfill.js +76 -0
  16. package/dist/connectors/slack/backfill.js.map +1 -0
  17. package/dist/connectors/slack/deletion.d.ts +14 -0
  18. package/dist/connectors/slack/deletion.d.ts.map +1 -0
  19. package/dist/connectors/slack/deletion.js +46 -0
  20. package/dist/connectors/slack/deletion.js.map +1 -0
  21. package/dist/connectors/slack/dlq.d.ts +21 -0
  22. package/dist/connectors/slack/dlq.d.ts.map +1 -0
  23. package/dist/connectors/slack/dlq.js +23 -0
  24. package/dist/connectors/slack/dlq.js.map +1 -0
  25. package/dist/connectors/slack/idempotency.d.ts +5 -0
  26. package/dist/connectors/slack/idempotency.d.ts.map +1 -0
  27. package/dist/connectors/slack/idempotency.js +13 -0
  28. package/dist/connectors/slack/idempotency.js.map +1 -0
  29. package/dist/connectors/slack/ingest.d.ts +27 -0
  30. package/dist/connectors/slack/ingest.d.ts.map +1 -0
  31. package/dist/connectors/slack/ingest.js +48 -0
  32. package/dist/connectors/slack/ingest.js.map +1 -0
  33. package/dist/connectors/slack/ratelimit.d.ts +9 -0
  34. package/dist/connectors/slack/ratelimit.d.ts.map +1 -0
  35. package/dist/connectors/slack/ratelimit.js +18 -0
  36. package/dist/connectors/slack/ratelimit.js.map +1 -0
  37. package/dist/connectors/slack/scope.d.ts +16 -0
  38. package/dist/connectors/slack/scope.d.ts.map +1 -0
  39. package/dist/connectors/slack/scope.js +13 -0
  40. package/dist/connectors/slack/scope.js.map +1 -0
  41. package/dist/connectors/slack/signature.d.ts +12 -0
  42. package/dist/connectors/slack/signature.d.ts.map +1 -0
  43. package/dist/connectors/slack/signature.js +20 -0
  44. package/dist/connectors/slack/signature.js.map +1 -0
  45. package/dist/connectors/slack/tenant-routing.d.ts +13 -0
  46. package/dist/connectors/slack/tenant-routing.d.ts.map +1 -0
  47. package/dist/connectors/slack/tenant-routing.js +17 -0
  48. package/dist/connectors/slack/tenant-routing.js.map +1 -0
  49. package/dist/connectors/slack/transform.d.ts +20 -0
  50. package/dist/connectors/slack/transform.d.ts.map +1 -0
  51. package/dist/connectors/slack/transform.js +31 -0
  52. package/dist/connectors/slack/transform.js.map +1 -0
  53. package/dist/connectors/slack/types.d.ts +35 -0
  54. package/dist/connectors/slack/types.d.ts.map +1 -0
  55. package/dist/connectors/slack/types.js +23 -0
  56. package/dist/connectors/slack/types.js.map +1 -0
  57. package/dist/connectors/slack/web-client.d.ts +12 -0
  58. package/dist/connectors/slack/web-client.d.ts.map +1 -0
  59. package/dist/connectors/slack/web-client.js +43 -0
  60. package/dist/connectors/slack/web-client.js.map +1 -0
  61. package/dist/db.d.ts.map +1 -1
  62. package/dist/db.js +46 -1
  63. package/dist/db.js.map +1 -1
  64. package/dist/importers.js +3 -3
  65. package/dist/importers.js.map +1 -1
  66. package/dist/mcp/server.js +1 -1
  67. package/dist/server.d.ts.map +1 -1
  68. package/dist/server.js +174 -2
  69. package/dist/server.js.map +1 -1
  70. package/dist/src/ambient.js +147 -0
  71. package/dist/src/ambient.js.map +1 -0
  72. package/dist/src/api.js +343 -0
  73. package/dist/src/api.js.map +1 -0
  74. package/dist/src/audit.js +152 -0
  75. package/dist/src/audit.js.map +1 -0
  76. package/dist/src/auth.js +65 -0
  77. package/dist/src/auth.js.map +1 -0
  78. package/dist/src/autolearn.js +143 -0
  79. package/dist/src/autolearn.js.map +1 -0
  80. package/dist/src/capture.js +512 -0
  81. package/dist/src/capture.js.map +1 -0
  82. package/dist/src/cli.js +4971 -0
  83. package/dist/src/cli.js.map +1 -0
  84. package/dist/src/client.js +181 -0
  85. package/dist/src/client.js.map +1 -0
  86. package/dist/src/config.js +108 -0
  87. package/dist/src/config.js.map +1 -0
  88. package/dist/src/connectors/slack/backfill.js +76 -0
  89. package/dist/src/connectors/slack/backfill.js.map +1 -0
  90. package/dist/src/connectors/slack/deletion.js +46 -0
  91. package/dist/src/connectors/slack/deletion.js.map +1 -0
  92. package/dist/src/connectors/slack/dlq.js +23 -0
  93. package/dist/src/connectors/slack/dlq.js.map +1 -0
  94. package/dist/src/connectors/slack/idempotency.js +13 -0
  95. package/dist/src/connectors/slack/idempotency.js.map +1 -0
  96. package/dist/src/connectors/slack/ingest.js +48 -0
  97. package/dist/src/connectors/slack/ingest.js.map +1 -0
  98. package/dist/src/connectors/slack/ratelimit.js +18 -0
  99. package/dist/src/connectors/slack/ratelimit.js.map +1 -0
  100. package/dist/src/connectors/slack/scope.js +13 -0
  101. package/dist/src/connectors/slack/scope.js.map +1 -0
  102. package/dist/src/connectors/slack/signature.js +20 -0
  103. package/dist/src/connectors/slack/signature.js.map +1 -0
  104. package/dist/src/connectors/slack/tenant-routing.js +17 -0
  105. package/dist/src/connectors/slack/tenant-routing.js.map +1 -0
  106. package/dist/src/connectors/slack/transform.js +31 -0
  107. package/dist/src/connectors/slack/transform.js.map +1 -0
  108. package/dist/src/connectors/slack/types.js +23 -0
  109. package/dist/src/connectors/slack/types.js.map +1 -0
  110. package/dist/src/connectors/slack/web-client.js +43 -0
  111. package/dist/src/connectors/slack/web-client.js.map +1 -0
  112. package/dist/src/consolidate.js +517 -0
  113. package/dist/src/consolidate.js.map +1 -0
  114. package/dist/src/dag.js +104 -0
  115. package/dist/src/dag.js.map +1 -0
  116. package/dist/src/dashboard.js +409 -0
  117. package/dist/src/dashboard.js.map +1 -0
  118. package/dist/src/db.js +584 -0
  119. package/dist/src/db.js.map +1 -0
  120. package/dist/src/embeddings.js +344 -0
  121. package/dist/src/embeddings.js.map +1 -0
  122. package/dist/src/eval-suite.js +289 -0
  123. package/dist/src/eval-suite.js.map +1 -0
  124. package/dist/src/eval.js +187 -0
  125. package/dist/src/eval.js.map +1 -0
  126. package/dist/src/extract.js +87 -0
  127. package/dist/src/extract.js.map +1 -0
  128. package/dist/src/handoff.js +30 -0
  129. package/dist/src/handoff.js.map +1 -0
  130. package/dist/src/hooks.js +582 -0
  131. package/dist/src/hooks.js.map +1 -0
  132. package/dist/src/importers.js +399 -0
  133. package/dist/src/importers.js.map +1 -0
  134. package/dist/src/index.js +25 -0
  135. package/dist/src/index.js.map +1 -0
  136. package/dist/src/invalidation.js +94 -0
  137. package/dist/src/invalidation.js.map +1 -0
  138. package/dist/src/mcp/framing.js +45 -0
  139. package/dist/src/mcp/framing.js.map +1 -0
  140. package/dist/src/mcp/server.js +510 -0
  141. package/dist/src/mcp/server.js.map +1 -0
  142. package/dist/src/memory.js +280 -0
  143. package/dist/src/memory.js.map +1 -0
  144. package/dist/src/multihop.js +32 -0
  145. package/dist/src/multihop.js.map +1 -0
  146. package/dist/src/path-context.js +32 -0
  147. package/dist/src/path-context.js.map +1 -0
  148. package/dist/src/physics-config.js +26 -0
  149. package/dist/src/physics-config.js.map +1 -0
  150. package/dist/src/physics-state.js +163 -0
  151. package/dist/src/physics-state.js.map +1 -0
  152. package/dist/src/physics.js +361 -0
  153. package/dist/src/physics.js.map +1 -0
  154. package/dist/src/postinstall.js +68 -0
  155. package/dist/src/postinstall.js.map +1 -0
  156. package/dist/src/raw-archive.js +72 -0
  157. package/dist/src/raw-archive.js.map +1 -0
  158. package/dist/src/refine-llm.js +147 -0
  159. package/dist/src/refine-llm.js.map +1 -0
  160. package/dist/src/replay.js +117 -0
  161. package/dist/src/replay.js.map +1 -0
  162. package/dist/src/salience.js +74 -0
  163. package/dist/src/salience.js.map +1 -0
  164. package/dist/src/scheduler.js +67 -0
  165. package/dist/src/scheduler.js.map +1 -0
  166. package/dist/src/scope.js +35 -0
  167. package/dist/src/scope.js.map +1 -0
  168. package/dist/src/search.js +801 -0
  169. package/dist/src/search.js.map +1 -0
  170. package/dist/src/server-detect.js +70 -0
  171. package/dist/src/server-detect.js.map +1 -0
  172. package/dist/src/server.js +784 -0
  173. package/dist/src/server.js.map +1 -0
  174. package/dist/src/shared.js +309 -0
  175. package/dist/src/shared.js.map +1 -0
  176. package/dist/src/sso.js +22 -0
  177. package/dist/src/sso.js.map +1 -0
  178. package/dist/src/store.js +1390 -0
  179. package/dist/src/store.js.map +1 -0
  180. package/dist/src/tenant.js +17 -0
  181. package/dist/src/tenant.js.map +1 -0
  182. package/dist/src/trace.js +64 -0
  183. package/dist/src/trace.js.map +1 -0
  184. package/dist/src/working-memory.js +149 -0
  185. package/dist/src/working-memory.js.map +1 -0
  186. package/dist/src/yaml.js +98 -0
  187. package/dist/src/yaml.js.map +1 -0
  188. package/dist/store.d.ts +9 -1
  189. package/dist/store.d.ts.map +1 -1
  190. package/dist/store.js +30 -2
  191. package/dist/store.js.map +1 -1
  192. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  193. package/extensions/openclaw-plugin/package.json +1 -1
  194. package/openclaw.plugin.json +1 -1
  195. package/package.json +2 -2
  196. package/dist/import.d.ts +0 -31
  197. package/dist/import.d.ts.map +0 -1
  198. package/dist/import.js +0 -307
  199. package/dist/import.js.map +0 -1
@@ -0,0 +1,582 @@
1
+ /**
2
+ * JSON-hook install/uninstall for AI coding tools.
3
+ *
4
+ * Currently supports Claude Code and OpenCode, which share the same
5
+ * SessionStart/SessionEnd schema. Hippo installs two entries:
6
+ * - SessionEnd: `hippo session-end --log-file <path>` - spawns a detached
7
+ * child that runs `hippo sleep` then `hippo capture --last-session`
8
+ * in sequence, writing both outputs to the log file. The parent returns
9
+ * in <100ms so the TUI teardown can't kill the child before it finishes.
10
+ * - SessionStart: `hippo last-sleep --path <path>` - prints the log written
11
+ * by the previous session's detached worker and then clears it, so the
12
+ * user actually sees what was consolidated.
13
+ *
14
+ * Earlier forms are detected and migrated automatically:
15
+ * - < 0.20.2: `Stop` hook firing `hippo sleep` on every assistant turn.
16
+ * - < 0.21.0: bare `hippo sleep` in SessionEnd, no `--log-file`.
17
+ * - 0.22.x: separate sleep + capture SessionEnd entries. Ran in parallel
18
+ * and were both SIGTERM'd by TUI teardown, so completion lines rarely
19
+ * made it to the log. 0.23.0+ collapses them into the single
20
+ * `hippo session-end` entry above.
21
+ */
22
+ import * as fs from 'fs';
23
+ import * as os from 'os';
24
+ import * as path from 'path';
25
+ import { fileURLToPath } from 'url';
26
+ const HIPPO_SLEEP_MARKER = 'hippo sleep';
27
+ const HIPPO_LAST_SLEEP_MARKER = 'hippo last-sleep';
28
+ const HIPPO_CAPTURE_MARKER = 'hippo capture --last-session';
29
+ const HIPPO_SESSION_END_MARKER = 'hippo session-end';
30
+ const HIPPO_PINNED_INJECT_MARKER = 'hippo context --pinned-only';
31
+ const HIPPO_CODEX_WRAPPER_MARKER = 'hippo codex wrapper';
32
+ function homeDir() {
33
+ return process.env.HOME || process.env.USERPROFILE || os.homedir();
34
+ }
35
+ /**
36
+ * Default log path consumed by `hippo last-sleep`. Shared fallback when
37
+ * a caller doesn't pass --path explicitly.
38
+ */
39
+ export function defaultSleepLogPath() {
40
+ return path.join(homeDir(), '.hippo', 'logs', 'last-sleep.log');
41
+ }
42
+ export function resolveCodexWrapperPaths() {
43
+ const home = homeDir();
44
+ const codexHome = path.join(home, '.codex');
45
+ const wrapperDir = path.join(home, '.hippo', 'bin');
46
+ return {
47
+ wrapperDir,
48
+ metadataPath: path.join(home, '.hippo', 'integrations', 'codex.json'),
49
+ wrapperCmdPath: path.join(wrapperDir, 'codex.cmd'),
50
+ wrapperPs1Path: path.join(wrapperDir, 'codex.ps1'),
51
+ wrapperShPath: path.join(wrapperDir, 'codex'),
52
+ logFile: path.join(home, '.hippo', 'logs', 'codex-sleep.log'),
53
+ runsDir: path.join(home, '.hippo', 'runs', 'codex'),
54
+ historyPath: path.join(codexHome, 'history.jsonl'),
55
+ sessionsDir: path.join(codexHome, 'sessions'),
56
+ };
57
+ }
58
+ function pathEquals(a, b) {
59
+ return path.resolve(a).toLowerCase() === path.resolve(b).toLowerCase();
60
+ }
61
+ function readCodexWrapperMetadata() {
62
+ const { metadataPath } = resolveCodexWrapperPaths();
63
+ if (!fs.existsSync(metadataPath))
64
+ return null;
65
+ try {
66
+ return JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ function readTextFile(filePath) {
73
+ try {
74
+ return fs.readFileSync(filePath, 'utf8');
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ function isHippoCodexWrapperFile(filePath) {
81
+ if (!fs.existsSync(filePath))
82
+ return false;
83
+ const text = readTextFile(filePath);
84
+ return typeof text === 'string' && text.includes(HIPPO_CODEX_WRAPPER_MARKER);
85
+ }
86
+ function isCodexWrapperMetadataValid(metadata) {
87
+ if (!metadata)
88
+ return false;
89
+ return (typeof metadata.originalCodexPath === 'string' &&
90
+ typeof metadata.realCodexPath === 'string' &&
91
+ typeof metadata.commandPath === 'string' &&
92
+ typeof metadata.backupPath === 'string' &&
93
+ fs.existsSync(metadata.realCodexPath) &&
94
+ fs.existsSync(metadata.backupPath) &&
95
+ isHippoCodexWrapperFile(metadata.commandPath));
96
+ }
97
+ function resolveHippoCliPath() {
98
+ return fileURLToPath(new URL('../bin/hippo.js', import.meta.url));
99
+ }
100
+ function quoteForShell(value) {
101
+ return `"${value.replace(/(["\\$`])/g, '\\$1')}"`;
102
+ }
103
+ function quoteForPowerShell(value) {
104
+ return `'${value.replace(/'/g, "''")}'`;
105
+ }
106
+ function quoteForCmd(value) {
107
+ return `"${value.replace(/"/g, '""')}"`;
108
+ }
109
+ function resolveCodexInstallPlan(originalCodexPath) {
110
+ const dir = path.dirname(originalCodexPath);
111
+ const ext = path.extname(originalCodexPath).toLowerCase();
112
+ const name = path.basename(originalCodexPath, ext);
113
+ const backupPath = path.join(dir, `${name}.hippo-real${ext}`);
114
+ if (process.platform === 'win32' && ext === '.exe') {
115
+ return {
116
+ commandPath: path.join(dir, `${name}.cmd`),
117
+ backupPath,
118
+ installMode: 'cmd-shim',
119
+ };
120
+ }
121
+ return {
122
+ commandPath: originalCodexPath,
123
+ backupPath,
124
+ installMode: 'same-path',
125
+ };
126
+ }
127
+ function writeCodexLauncherWrapper(commandPath) {
128
+ const ext = path.extname(commandPath).toLowerCase();
129
+ const nodePath = process.execPath;
130
+ const hippoCliPath = resolveHippoCliPath();
131
+ if (process.platform === 'win32' && ext === '.ps1') {
132
+ writeExecutableFile(commandPath, [
133
+ `# ${HIPPO_CODEX_WRAPPER_MARKER}`,
134
+ `& ${quoteForPowerShell(nodePath)} ${quoteForPowerShell(hippoCliPath)} codex-run -- @args`,
135
+ '',
136
+ ].join('\n'));
137
+ return;
138
+ }
139
+ if (process.platform === 'win32' && (ext === '.cmd' || ext === '.bat')) {
140
+ writeExecutableFile(commandPath, [
141
+ '@echo off',
142
+ `REM ${HIPPO_CODEX_WRAPPER_MARKER}`,
143
+ `${quoteForCmd(nodePath)} ${quoteForCmd(hippoCliPath)} codex-run -- %*`,
144
+ '',
145
+ ].join('\r\n'));
146
+ return;
147
+ }
148
+ writeExecutableFile(commandPath, [
149
+ '#!/usr/bin/env sh',
150
+ `# ${HIPPO_CODEX_WRAPPER_MARKER}`,
151
+ `exec ${quoteForShell(nodePath)} ${quoteForShell(hippoCliPath)} codex-run -- "$@"`,
152
+ '',
153
+ ].join('\n'));
154
+ }
155
+ function cleanupLegacyCodexPathWrappers(paths) {
156
+ for (const filePath of [paths.wrapperCmdPath, paths.wrapperPs1Path, paths.wrapperShPath]) {
157
+ if (fs.existsSync(filePath))
158
+ fs.rmSync(filePath, { force: true });
159
+ }
160
+ }
161
+ export function detectRealCodexPath() {
162
+ const metadata = readCodexWrapperMetadata();
163
+ if (isCodexWrapperMetadataValid(metadata))
164
+ return metadata.realCodexPath;
165
+ const { wrapperDir } = resolveCodexWrapperPaths();
166
+ const entries = (process.env.PATH ?? '')
167
+ .split(path.delimiter)
168
+ .map((entry) => entry.trim())
169
+ .filter(Boolean)
170
+ .filter((entry) => !pathEquals(entry, wrapperDir));
171
+ const names = process.platform === 'win32'
172
+ ? ['codex.cmd', 'codex.ps1', 'codex.exe', 'codex']
173
+ : ['codex'];
174
+ for (const entry of entries) {
175
+ for (const name of names) {
176
+ const candidate = path.join(entry, name);
177
+ if (fs.existsSync(candidate))
178
+ return candidate;
179
+ }
180
+ }
181
+ return null;
182
+ }
183
+ function ensureDir(dir) {
184
+ if (!fs.existsSync(dir))
185
+ fs.mkdirSync(dir, { recursive: true });
186
+ }
187
+ function writeExecutableFile(filePath, content) {
188
+ fs.writeFileSync(filePath, content, 'utf8');
189
+ try {
190
+ fs.chmodSync(filePath, 0o755);
191
+ }
192
+ catch {
193
+ // chmod is best-effort on Windows
194
+ }
195
+ }
196
+ export function installCodexWrapper(realCodexPath) {
197
+ const existingMetadata = readCodexWrapperMetadata();
198
+ if (isCodexWrapperMetadataValid(existingMetadata) && !realCodexPath) {
199
+ cleanupLegacyCodexPathWrappers(resolveCodexWrapperPaths());
200
+ return {
201
+ installed: true,
202
+ metadataPath: resolveCodexWrapperPaths().metadataPath,
203
+ realCodexPath: existingMetadata.realCodexPath,
204
+ commandPath: existingMetadata.commandPath,
205
+ backupPath: existingMetadata.backupPath,
206
+ installMode: existingMetadata.installMode,
207
+ };
208
+ }
209
+ const resolvedRealCodexPath = realCodexPath ?? detectRealCodexPath();
210
+ if (!resolvedRealCodexPath) {
211
+ throw new Error('Could not locate the real Codex executable on PATH.');
212
+ }
213
+ const paths = resolveCodexWrapperPaths();
214
+ ensureDir(path.dirname(paths.metadataPath));
215
+ ensureDir(path.dirname(paths.logFile));
216
+ ensureDir(paths.runsDir);
217
+ cleanupLegacyCodexPathWrappers(paths);
218
+ const plan = resolveCodexInstallPlan(resolvedRealCodexPath);
219
+ ensureDir(path.dirname(plan.commandPath));
220
+ if (isCodexWrapperMetadataValid(existingMetadata)) {
221
+ uninstallCodexWrapper();
222
+ }
223
+ if (!fs.existsSync(plan.backupPath)) {
224
+ fs.renameSync(resolvedRealCodexPath, plan.backupPath);
225
+ }
226
+ writeCodexLauncherWrapper(plan.commandPath);
227
+ const metadata = {
228
+ originalCodexPath: resolvedRealCodexPath,
229
+ realCodexPath: plan.backupPath,
230
+ commandPath: plan.commandPath,
231
+ backupPath: plan.backupPath,
232
+ installMode: plan.installMode,
233
+ logFile: paths.logFile,
234
+ historyPath: paths.historyPath,
235
+ sessionsDir: paths.sessionsDir,
236
+ installedAt: new Date().toISOString(),
237
+ };
238
+ fs.writeFileSync(paths.metadataPath, JSON.stringify(metadata, null, 2) + '\n', 'utf8');
239
+ return {
240
+ installed: true,
241
+ metadataPath: paths.metadataPath,
242
+ realCodexPath: metadata.realCodexPath,
243
+ commandPath: metadata.commandPath,
244
+ backupPath: metadata.backupPath,
245
+ installMode: metadata.installMode,
246
+ };
247
+ }
248
+ export function uninstallCodexWrapper() {
249
+ const paths = resolveCodexWrapperPaths();
250
+ let changed = false;
251
+ const metadata = readCodexWrapperMetadata();
252
+ if (metadata) {
253
+ if (fs.existsSync(metadata.commandPath) && isHippoCodexWrapperFile(metadata.commandPath)) {
254
+ fs.rmSync(metadata.commandPath, { force: true });
255
+ changed = true;
256
+ }
257
+ if (fs.existsSync(metadata.backupPath)) {
258
+ fs.renameSync(metadata.backupPath, metadata.originalCodexPath);
259
+ changed = true;
260
+ }
261
+ }
262
+ cleanupLegacyCodexPathWrappers(paths);
263
+ if (fs.existsSync(paths.metadataPath)) {
264
+ fs.rmSync(paths.metadataPath, { force: true });
265
+ changed = true;
266
+ }
267
+ return changed;
268
+ }
269
+ export function ensureCodexWrapperInstalled() {
270
+ const metadata = readCodexWrapperMetadata();
271
+ if (isCodexWrapperMetadataValid(metadata)) {
272
+ cleanupLegacyCodexPathWrappers(resolveCodexWrapperPaths());
273
+ return {
274
+ status: 'already-installed',
275
+ metadataPath: resolveCodexWrapperPaths().metadataPath,
276
+ realCodexPath: metadata.realCodexPath,
277
+ commandPath: metadata.commandPath,
278
+ backupPath: metadata.backupPath,
279
+ };
280
+ }
281
+ if (metadata) {
282
+ uninstallCodexWrapper();
283
+ }
284
+ const detectedRealCodexPath = detectRealCodexPath();
285
+ if (!detectedRealCodexPath) {
286
+ return { status: 'not-found' };
287
+ }
288
+ const result = installCodexWrapper(detectedRealCodexPath);
289
+ return {
290
+ status: 'installed',
291
+ metadataPath: result.metadataPath,
292
+ realCodexPath: result.realCodexPath,
293
+ commandPath: result.commandPath,
294
+ backupPath: result.backupPath,
295
+ };
296
+ }
297
+ function collectFiles(dir) {
298
+ if (!fs.existsSync(dir))
299
+ return [];
300
+ const out = [];
301
+ const stack = [dir];
302
+ while (stack.length > 0) {
303
+ const current = stack.pop();
304
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
305
+ const full = path.join(current, entry.name);
306
+ if (entry.isDirectory()) {
307
+ stack.push(full);
308
+ }
309
+ else if (entry.isFile()) {
310
+ out.push(full);
311
+ }
312
+ }
313
+ }
314
+ return out;
315
+ }
316
+ function readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes) {
317
+ if (!fs.existsSync(historyPath))
318
+ return [];
319
+ const raw = fs.readFileSync(historyPath);
320
+ if (startOffsetBytes >= raw.length)
321
+ return [];
322
+ const delta = raw.subarray(startOffsetBytes).toString('utf8');
323
+ const seen = new Set();
324
+ const ordered = [];
325
+ for (const line of delta.split('\n')) {
326
+ if (!line.trim())
327
+ continue;
328
+ try {
329
+ const parsed = JSON.parse(line);
330
+ const sessionId = parsed.session_id;
331
+ if (typeof sessionId === 'string' && sessionId && !seen.has(sessionId)) {
332
+ seen.add(sessionId);
333
+ ordered.push(sessionId);
334
+ }
335
+ }
336
+ catch {
337
+ // ignore malformed JSONL lines
338
+ }
339
+ }
340
+ return ordered;
341
+ }
342
+ function findCodexTranscriptBySessionId(sessionsDir, sessionId) {
343
+ const matches = collectFiles(sessionsDir).filter((filePath) => filePath.endsWith('.jsonl') && filePath.includes(sessionId));
344
+ if (matches.length === 0)
345
+ return null;
346
+ matches.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
347
+ return matches[0];
348
+ }
349
+ function findNewestCodexTranscriptSince(sessionsDir, startedAtMs) {
350
+ const matches = collectFiles(sessionsDir)
351
+ .filter((filePath) => filePath.endsWith('.jsonl'))
352
+ .map((filePath) => ({ filePath, mtimeMs: fs.statSync(filePath).mtimeMs }))
353
+ .filter((entry) => entry.mtimeMs >= startedAtMs)
354
+ .sort((a, b) => b.mtimeMs - a.mtimeMs);
355
+ return matches[0]?.filePath ?? null;
356
+ }
357
+ export function resolveCodexSessionTranscript(options) {
358
+ const { codexHome, historyPath, startOffsetBytes, startedAtMs } = options;
359
+ const sessionsDir = path.join(codexHome, 'sessions');
360
+ for (const sessionId of readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes).reverse()) {
361
+ const transcript = findCodexTranscriptBySessionId(sessionsDir, sessionId);
362
+ if (transcript)
363
+ return transcript;
364
+ }
365
+ return findNewestCodexTranscriptSince(sessionsDir, startedAtMs);
366
+ }
367
+ export function resolveJsonHookPaths(target) {
368
+ const home = homeDir();
369
+ const logsDir = path.join(home, '.hippo', 'logs');
370
+ switch (target) {
371
+ case 'claude-code':
372
+ return {
373
+ settings: path.join(home, '.claude', 'settings.json'),
374
+ logFile: path.join(logsDir, 'claude-code-sleep.log'),
375
+ display: 'Claude Code',
376
+ };
377
+ case 'opencode':
378
+ return {
379
+ settings: path.join(home, '.config', 'opencode', 'opencode.json'),
380
+ logFile: path.join(logsDir, 'opencode-sleep.log'),
381
+ display: 'OpenCode',
382
+ };
383
+ }
384
+ }
385
+ function hookArrayContains(hookArray, marker) {
386
+ if (!Array.isArray(hookArray))
387
+ return false;
388
+ return JSON.stringify(hookArray).includes(marker);
389
+ }
390
+ function hasCurrentSessionEnd(hookArray) {
391
+ return hookArrayContains(hookArray, HIPPO_SESSION_END_MARKER);
392
+ }
393
+ /**
394
+ * Returns true when `hooks.SessionEnd` still contains either of the legacy
395
+ * v0.22.x split entries (bare `hippo sleep` / `hippo capture --last-session`)
396
+ * without the current consolidated `hippo session-end` entry.
397
+ */
398
+ function hasLegacySplitSessionEnd(hookArray) {
399
+ if (!Array.isArray(hookArray))
400
+ return false;
401
+ const serialized = JSON.stringify(hookArray);
402
+ const hasSleep = serialized.includes(HIPPO_SLEEP_MARKER);
403
+ const hasCapture = serialized.includes(HIPPO_CAPTURE_MARKER);
404
+ return (hasSleep || hasCapture) && !serialized.includes(HIPPO_SESSION_END_MARKER);
405
+ }
406
+ export function installJsonHooks(target) {
407
+ const { settings: settingsPath, logFile } = resolveJsonHookPaths(target);
408
+ const dir = path.dirname(settingsPath);
409
+ if (!fs.existsSync(dir))
410
+ fs.mkdirSync(dir, { recursive: true });
411
+ let settings = {};
412
+ if (fs.existsSync(settingsPath)) {
413
+ try {
414
+ settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
415
+ }
416
+ catch {
417
+ return {
418
+ target,
419
+ settingsPath,
420
+ installedSessionEnd: false,
421
+ installedSessionStart: false,
422
+ installedUserPromptSubmit: false,
423
+ migratedFromStop: false,
424
+ migratedLegacySessionEnd: false,
425
+ migratedSplitSessionEnd: false,
426
+ };
427
+ }
428
+ }
429
+ if (!settings.hooks)
430
+ settings.hooks = {};
431
+ const hooks = settings.hooks;
432
+ let migratedFromStop = false;
433
+ if (Array.isArray(hooks.Stop) && hookArrayContains(hooks.Stop, HIPPO_SLEEP_MARKER)) {
434
+ hooks.Stop = hooks.Stop.filter((entry) => !JSON.stringify(entry).includes(HIPPO_SLEEP_MARKER));
435
+ if (hooks.Stop.length === 0)
436
+ delete hooks.Stop;
437
+ migratedFromStop = true;
438
+ }
439
+ // Migrate legacy SessionEnd forms:
440
+ // - pre-0.21 bare `hippo sleep`
441
+ // - 0.21.x+ `hippo sleep --log-file` split across two entries
442
+ // - 0.22.x `hippo capture --last-session --log-file` second entry
443
+ // All of these get collapsed into the single `hippo session-end` entry.
444
+ let migratedLegacySessionEnd = false;
445
+ let migratedSplitSessionEnd = false;
446
+ if (Array.isArray(hooks.SessionEnd) && hasLegacySplitSessionEnd(hooks.SessionEnd)) {
447
+ const before = hooks.SessionEnd.length;
448
+ hooks.SessionEnd = hooks.SessionEnd.filter((entry) => {
449
+ const s = JSON.stringify(entry);
450
+ return !s.includes(HIPPO_SLEEP_MARKER) && !s.includes(HIPPO_CAPTURE_MARKER);
451
+ });
452
+ if (hooks.SessionEnd.length === 0)
453
+ delete hooks.SessionEnd;
454
+ // If the removed entries used the log-file pattern (0.21.x-0.22.x) we
455
+ // call it a "split" migration; otherwise it was the older bare form.
456
+ migratedSplitSessionEnd = true;
457
+ migratedLegacySessionEnd = before > 1;
458
+ }
459
+ let installedSessionEnd = false;
460
+ if (!hasCurrentSessionEnd(hooks.SessionEnd)) {
461
+ if (!Array.isArray(hooks.SessionEnd))
462
+ hooks.SessionEnd = [];
463
+ hooks.SessionEnd.push({
464
+ hooks: [
465
+ {
466
+ type: 'command',
467
+ command: `hippo session-end --log-file "${logFile}"`,
468
+ timeout: 5,
469
+ },
470
+ ],
471
+ });
472
+ installedSessionEnd = true;
473
+ }
474
+ let installedSessionStart = false;
475
+ if (!hookArrayContains(hooks.SessionStart, HIPPO_LAST_SLEEP_MARKER)) {
476
+ if (!Array.isArray(hooks.SessionStart))
477
+ hooks.SessionStart = [];
478
+ hooks.SessionStart.push({
479
+ hooks: [
480
+ {
481
+ type: 'command',
482
+ command: `hippo last-sleep --path "${logFile}"`,
483
+ timeout: 5,
484
+ },
485
+ ],
486
+ });
487
+ installedSessionStart = true;
488
+ }
489
+ // Mid-session pinned-rule re-injection: UserPromptSubmit runs every turn,
490
+ // so pinned memories stay in context even after the model would otherwise
491
+ // "forget" them in a long session. `hippo context --pinned-only` prints
492
+ // nothing when no pinned memories exist, so this is zero-tax when unused.
493
+ let installedUserPromptSubmit = false;
494
+ if (!hookArrayContains(hooks.UserPromptSubmit, HIPPO_PINNED_INJECT_MARKER)) {
495
+ if (!Array.isArray(hooks.UserPromptSubmit))
496
+ hooks.UserPromptSubmit = [];
497
+ hooks.UserPromptSubmit.push({
498
+ hooks: [
499
+ {
500
+ type: 'command',
501
+ command: 'hippo context --pinned-only --format additional-context',
502
+ timeout: 5,
503
+ },
504
+ ],
505
+ });
506
+ installedUserPromptSubmit = true;
507
+ }
508
+ if (installedSessionEnd ||
509
+ installedSessionStart ||
510
+ installedUserPromptSubmit ||
511
+ migratedFromStop ||
512
+ migratedLegacySessionEnd ||
513
+ migratedSplitSessionEnd) {
514
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf8');
515
+ }
516
+ return {
517
+ target,
518
+ settingsPath,
519
+ installedSessionEnd,
520
+ installedSessionStart,
521
+ installedUserPromptSubmit,
522
+ migratedFromStop,
523
+ migratedLegacySessionEnd,
524
+ migratedSplitSessionEnd,
525
+ };
526
+ }
527
+ export function uninstallJsonHooks(target) {
528
+ const { settings: settingsPath } = resolveJsonHookPaths(target);
529
+ if (!fs.existsSync(settingsPath))
530
+ return false;
531
+ let settings;
532
+ try {
533
+ settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
534
+ }
535
+ catch {
536
+ return false;
537
+ }
538
+ const hooks = settings.hooks;
539
+ if (!hooks)
540
+ return false;
541
+ let changed = false;
542
+ const markersByKey = {
543
+ SessionEnd: [HIPPO_SESSION_END_MARKER, HIPPO_SLEEP_MARKER, HIPPO_CAPTURE_MARKER],
544
+ SessionStart: [HIPPO_LAST_SLEEP_MARKER],
545
+ UserPromptSubmit: [HIPPO_PINNED_INJECT_MARKER],
546
+ Stop: [HIPPO_SLEEP_MARKER],
547
+ };
548
+ for (const [key, markers] of Object.entries(markersByKey)) {
549
+ if (!Array.isArray(hooks[key]))
550
+ continue;
551
+ const before = hooks[key].length;
552
+ hooks[key] = hooks[key].filter((entry) => !markers.some((m) => JSON.stringify(entry).includes(m)));
553
+ if (hooks[key].length !== before) {
554
+ changed = true;
555
+ if (hooks[key].length === 0)
556
+ delete hooks[key];
557
+ }
558
+ }
559
+ if (!changed)
560
+ return false;
561
+ if (Object.keys(hooks).length === 0)
562
+ delete settings.hooks;
563
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf8');
564
+ return true;
565
+ }
566
+ /**
567
+ * Detect which AI coding tools are installed based on config directory presence.
568
+ * Used by `hippo setup` to decide which JSON-hook installs to run.
569
+ */
570
+ export function detectInstalledTools() {
571
+ const home = homeDir();
572
+ const exists = (...parts) => fs.existsSync(path.join(home, ...parts));
573
+ return [
574
+ { name: 'claude-code', configDir: '~/.claude', detected: exists('.claude'), kind: 'json-hook' },
575
+ { name: 'opencode', configDir: '~/.config/opencode', detected: exists('.config', 'opencode'), kind: 'json-hook' },
576
+ { name: 'openclaw', configDir: '~/.openclaw', detected: exists('.openclaw'), kind: 'plugin', notes: 'install via `openclaw plugins install hippo-memory`' },
577
+ { name: 'codex', configDir: '~/.codex', detected: exists('.codex'), kind: 'wrapper', notes: 'wraps the detected codex launcher for session-end consolidation' },
578
+ { name: 'cursor', configDir: '~/.cursor', detected: exists('.cursor'), kind: 'markdown-instruction', notes: 'no hook API - patches .cursorrules in the project' },
579
+ { name: 'pi', configDir: '~/.pi', detected: exists('.pi'), kind: 'markdown-instruction', notes: 'no hook API - patches AGENTS.md in the project' },
580
+ ];
581
+ }
582
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}