pathmark 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +339 -0
- package/SECURITY.md +39 -0
- package/assets/pathmark-icon-v3-glyph.png +0 -0
- package/dist/chat.d.ts +6 -0
- package/dist/chat.js +169 -0
- package/dist/chat.js.map +1 -0
- package/dist/codex/capture.d.ts +12 -0
- package/dist/codex/capture.js +328 -0
- package/dist/codex/capture.js.map +1 -0
- package/dist/codex/cli.d.ts +1 -0
- package/dist/codex/cli.js +96 -0
- package/dist/codex/cli.js.map +1 -0
- package/dist/codex/config-file.d.ts +9 -0
- package/dist/codex/config-file.js +100 -0
- package/dist/codex/config-file.js.map +1 -0
- package/dist/codex/cursor.d.ts +11 -0
- package/dist/codex/cursor.js +35 -0
- package/dist/codex/cursor.js.map +1 -0
- package/dist/codex/hooks.d.ts +10 -0
- package/dist/codex/hooks.js +108 -0
- package/dist/codex/hooks.js.map +1 -0
- package/dist/codex/paths.d.ts +5 -0
- package/dist/codex/paths.js +29 -0
- package/dist/codex/paths.js.map +1 -0
- package/dist/codex/tool-summary.d.ts +5 -0
- package/dist/codex/tool-summary.js +223 -0
- package/dist/codex/tool-summary.js.map +1 -0
- package/dist/codex/transcript.d.ts +9 -0
- package/dist/codex/transcript.js +99 -0
- package/dist/codex/transcript.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/format.d.ts +10 -0
- package/dist/format.js +48 -0
- package/dist/format.js.map +1 -0
- package/dist/ids.d.ts +1 -0
- package/dist/ids.js +6 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +1 -0
- package/dist/mcp.js +130 -0
- package/dist/mcp.js.map +1 -0
- package/dist/redact.d.ts +5 -0
- package/dist/redact.js +36 -0
- package/dist/redact.js.map +1 -0
- package/dist/setup.d.ts +1 -0
- package/dist/setup.js +208 -0
- package/dist/setup.js.map +1 -0
- package/dist/store.d.ts +27 -0
- package/dist/store.js +174 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/examples/claude_code.md +21 -0
- package/examples/claude_desktop_config.json +10 -0
- package/examples/codex.md +39 -0
- package/examples/cursor_mcp_config.json +10 -0
- package/examples/gemini_settings.json +12 -0
- package/examples/generic_mcp_config.json +12 -0
- package/examples/openai_compatible.env +8 -0
- package/examples/opencode.jsonc +13 -0
- package/package.json +66 -0
- package/scripts/import-honcho.mjs +243 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadConfig } from "../config.js";
|
|
4
|
+
import { deterministicId } from "../ids.js";
|
|
5
|
+
import { redactSecrets } from "../redact.js";
|
|
6
|
+
import { PathmarkStore } from "../store.js";
|
|
7
|
+
import { readCursorState, writeCursor } from "./cursor.js";
|
|
8
|
+
import { summarizeToolUse } from "./tool-summary.js";
|
|
9
|
+
import { readCodexTranscriptStrict } from "./transcript.js";
|
|
10
|
+
const TRIVIAL_PROMPT = /^(?:y|n|yes|no|ok|okay|sure|thanks|yep|nope|continue|go ahead|do it|proceed)\.?$/i;
|
|
11
|
+
const MEMORY_CUE = /\b(?:before|previous|previously|earlier|last time|remember|memory|context|history|decided|decision|same as|again|preference|prefer|repo|project)\b/i;
|
|
12
|
+
const GENERIC_RECALL_TOKENS = new Set(["codex", "coding", "users", "user", "mac", "home", "documents"]);
|
|
13
|
+
const GENERIC_RECALL_TERMS = ["project", "decisions", "preferences"];
|
|
14
|
+
const RECALL_TEXT_LIMIT = 240;
|
|
15
|
+
const RECALL_SEARCH_LIMIT = 50;
|
|
16
|
+
const IMMEDIATE_PROMPT_TAG = "immediate-prompt";
|
|
17
|
+
const IMMEDIATE_PROMPT_WINDOW_MS = 5 * 60 * 1000;
|
|
18
|
+
const TRIVIAL_ASSISTANT_TURN = /^(?:done|ok|fixed|complete|completed)[.!?]*$/i;
|
|
19
|
+
export async function recall(input) {
|
|
20
|
+
const config = loadConfig();
|
|
21
|
+
const store = new PathmarkStore(config);
|
|
22
|
+
const query = recallQuery(input);
|
|
23
|
+
if (!query)
|
|
24
|
+
return memoryBlock([], config.memoryFile);
|
|
25
|
+
try {
|
|
26
|
+
const results = await recallSearchResults(store, query, input);
|
|
27
|
+
return memoryBlock(filterRecallResults(results, input).slice(0, 8), config.memoryFile);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return memoryBlock([], config.memoryFile);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function prompt(input) {
|
|
34
|
+
const text = input.prompt?.trim() ?? "";
|
|
35
|
+
if (shouldSkipUserPrompt(text))
|
|
36
|
+
return "";
|
|
37
|
+
try {
|
|
38
|
+
await saveCapturedRecord({
|
|
39
|
+
sessionId: sessionId(input),
|
|
40
|
+
cwd: input.cwd,
|
|
41
|
+
role: "user",
|
|
42
|
+
text,
|
|
43
|
+
at: new Date().toISOString(),
|
|
44
|
+
immediatePrompt: true,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return "";
|
|
49
|
+
}
|
|
50
|
+
if (!MEMORY_CUE.test(text))
|
|
51
|
+
return "";
|
|
52
|
+
return [
|
|
53
|
+
"<pathmark-memory-nudge>",
|
|
54
|
+
"This prompt may depend on Pathmark memory. Prefer mcp__pathmark__chat for synthesized answers and mcp__pathmark__search_memory when exact evidence is needed.",
|
|
55
|
+
"</pathmark-memory-nudge>",
|
|
56
|
+
].join("\n");
|
|
57
|
+
}
|
|
58
|
+
export async function observe(input) {
|
|
59
|
+
const summary = summarizeToolUse({ tool_name: input.tool_name, tool_input: input.tool_input });
|
|
60
|
+
if (!summary)
|
|
61
|
+
return "";
|
|
62
|
+
try {
|
|
63
|
+
await saveCapturedRecord({
|
|
64
|
+
sessionId: sessionId(input),
|
|
65
|
+
cwd: input.cwd,
|
|
66
|
+
role: "tool",
|
|
67
|
+
text: summary,
|
|
68
|
+
at: new Date().toISOString(),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return "";
|
|
73
|
+
}
|
|
74
|
+
return "";
|
|
75
|
+
}
|
|
76
|
+
export async function writeback(input) {
|
|
77
|
+
if (!input.transcript_path)
|
|
78
|
+
return "";
|
|
79
|
+
try {
|
|
80
|
+
const config = loadConfig();
|
|
81
|
+
const store = new PathmarkStore(config);
|
|
82
|
+
const session = sessionId(input);
|
|
83
|
+
const turns = await readCodexTranscriptStrict(input.transcript_path);
|
|
84
|
+
const cursor = await readCursorState(config.storeDir, session);
|
|
85
|
+
const legacyCursorUnknown = cursor.count > 0 && !cursor.transcriptFingerprint;
|
|
86
|
+
const replacedTranscript = transcriptReplaced(cursor, turns);
|
|
87
|
+
const rotatedTranscript = cursor.count > turns.length || replacedTranscript || legacyCursorUnknown;
|
|
88
|
+
const rotationDiscriminator = rotatedTranscript && !legacyCursorUnknown ? transcriptRotationDiscriminator(turns) : undefined;
|
|
89
|
+
const freshTurns = turns.slice(rotatedTranscript ? 0 : cursor.count);
|
|
90
|
+
const immediatePrompts = await immediatePromptRecords(store, session);
|
|
91
|
+
for (const turn of freshTurns) {
|
|
92
|
+
if (turn.role === "user" && shouldSkipUserPrompt(turn.text))
|
|
93
|
+
continue;
|
|
94
|
+
if (turn.role === "user" && consumeImmediatePrompt(immediatePrompts, turn.text, turn.at))
|
|
95
|
+
continue;
|
|
96
|
+
if (turn.role === "assistant" && shouldSkipAssistantTurn(turn.text))
|
|
97
|
+
continue;
|
|
98
|
+
await store.addRecord(capturedRecord({
|
|
99
|
+
sessionId: session,
|
|
100
|
+
cwd: input.cwd,
|
|
101
|
+
role: turn.role,
|
|
102
|
+
text: turn.text,
|
|
103
|
+
at: turn.at ?? new Date().toISOString(),
|
|
104
|
+
stablePart: rotationDiscriminator ? `rotation:${rotationDiscriminator}:${turn.index}` : String(turn.index),
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
await writeCursor(config.storeDir, session, turns.length, {
|
|
108
|
+
transcriptFingerprint: transcriptFingerprint(turns),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return "";
|
|
113
|
+
}
|
|
114
|
+
return "";
|
|
115
|
+
}
|
|
116
|
+
function transcriptReplaced(cursor, turns) {
|
|
117
|
+
if (cursor.count <= 0 || cursor.count > turns.length || !cursor.transcriptFingerprint)
|
|
118
|
+
return false;
|
|
119
|
+
return cursor.transcriptFingerprint !== transcriptFingerprint(turns.slice(0, cursor.count));
|
|
120
|
+
}
|
|
121
|
+
function transcriptFingerprint(turns) {
|
|
122
|
+
return hashTurns(turns);
|
|
123
|
+
}
|
|
124
|
+
function transcriptRotationDiscriminator(turns) {
|
|
125
|
+
return hashTurns(turns);
|
|
126
|
+
}
|
|
127
|
+
function hashTurns(turns) {
|
|
128
|
+
const hash = createHash("sha256");
|
|
129
|
+
for (const turn of turns) {
|
|
130
|
+
hash.update(turn.role);
|
|
131
|
+
hash.update("\0");
|
|
132
|
+
hash.update(String(turn.index));
|
|
133
|
+
hash.update("\0");
|
|
134
|
+
hash.update(turn.at ?? "");
|
|
135
|
+
hash.update("\0");
|
|
136
|
+
hash.update(normalizeCapturedText(turn.text));
|
|
137
|
+
hash.update("\0");
|
|
138
|
+
}
|
|
139
|
+
return hash.digest("hex").slice(0, 12);
|
|
140
|
+
}
|
|
141
|
+
async function saveCapturedRecord(input) {
|
|
142
|
+
const config = loadConfig();
|
|
143
|
+
const store = new PathmarkStore(config);
|
|
144
|
+
await store.addRecord(capturedRecord(input));
|
|
145
|
+
}
|
|
146
|
+
function capturedRecord(input) {
|
|
147
|
+
const redacted = redactSecrets(input.text);
|
|
148
|
+
const roleTag = `role-${input.role}`;
|
|
149
|
+
const tags = ["codex-raw", "codex-session", roleTag, `session:${input.sessionId}`];
|
|
150
|
+
const projectTag = projectTagFromCwd(input.cwd);
|
|
151
|
+
if (projectTag)
|
|
152
|
+
tags.push(projectTag);
|
|
153
|
+
const workspaceTag = workspaceTagFromCwd(input.cwd);
|
|
154
|
+
if (workspaceTag)
|
|
155
|
+
tags.push(workspaceTag);
|
|
156
|
+
if (input.immediatePrompt)
|
|
157
|
+
tags.push(IMMEDIATE_PROMPT_TAG);
|
|
158
|
+
if (redacted.redacted || redacted.text.includes("[REDACTED]"))
|
|
159
|
+
tags.push("redacted");
|
|
160
|
+
const normalizedText = normalizeCapturedText(redacted.text);
|
|
161
|
+
const stablePart = input.stablePart ?? input.at;
|
|
162
|
+
return {
|
|
163
|
+
id: deterministicId(["codex", input.sessionId, input.role, stablePart, normalizedText]),
|
|
164
|
+
kind: "memory",
|
|
165
|
+
text: redacted.text,
|
|
166
|
+
tags,
|
|
167
|
+
source: `codex:session:${input.sessionId}`,
|
|
168
|
+
createdAt: input.at,
|
|
169
|
+
updatedAt: input.at,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function memoryBlock(results, memoryFile) {
|
|
173
|
+
return [
|
|
174
|
+
"<pathmark-memory>",
|
|
175
|
+
"Pathmark memory context:",
|
|
176
|
+
results.length > 0 ? summarizeResults(results) : "No matching Pathmark memory found.",
|
|
177
|
+
"",
|
|
178
|
+
`Store: ${memoryFile}`,
|
|
179
|
+
"MCP tools: use mcp__pathmark__chat for synthesized memory answers or mcp__pathmark__search_memory for exact records.",
|
|
180
|
+
"</pathmark-memory>",
|
|
181
|
+
].join("\n");
|
|
182
|
+
}
|
|
183
|
+
function summarizeResults(results) {
|
|
184
|
+
return results
|
|
185
|
+
.map((result, index) => {
|
|
186
|
+
const record = result.record;
|
|
187
|
+
const redacted = redactSecrets(record.text);
|
|
188
|
+
return `${index + 1}. ${record.kind}: ${truncate(redacted.text, RECALL_TEXT_LIMIT)}`;
|
|
189
|
+
})
|
|
190
|
+
.join("\n");
|
|
191
|
+
}
|
|
192
|
+
function recallQuery(input) {
|
|
193
|
+
const specificTerms = recallSpecificTerms(input);
|
|
194
|
+
if (specificTerms.length === 0)
|
|
195
|
+
return "";
|
|
196
|
+
return [...new Set([...specificTerms, ...GENERIC_RECALL_TERMS])].join(" ");
|
|
197
|
+
}
|
|
198
|
+
async function recallSearchResults(store, query, input) {
|
|
199
|
+
const specificQuery = recallSpecificTerms(input).join(" ");
|
|
200
|
+
const searches = [store.search({ query, limit: RECALL_SEARCH_LIMIT })];
|
|
201
|
+
if (specificQuery && specificQuery !== query) {
|
|
202
|
+
searches.push(store.search({ query: specificQuery, limit: RECALL_SEARCH_LIMIT }));
|
|
203
|
+
}
|
|
204
|
+
const merged = new Map();
|
|
205
|
+
for (const results of await Promise.all(searches)) {
|
|
206
|
+
for (const result of results) {
|
|
207
|
+
const existing = merged.get(result.record.id);
|
|
208
|
+
if (!existing || result.score > existing.score)
|
|
209
|
+
merged.set(result.record.id, result);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return [...merged.values()].sort((a, b) => b.score - a.score || b.record.createdAt.localeCompare(a.record.createdAt));
|
|
213
|
+
}
|
|
214
|
+
function filterRecallResults(results, input) {
|
|
215
|
+
const specificTerms = recallSpecificTerms(input);
|
|
216
|
+
const session = input.session_id?.trim().toLowerCase();
|
|
217
|
+
const workspaceTag = workspaceTagFromCwd(input.cwd);
|
|
218
|
+
if (specificTerms.length === 0 && !session)
|
|
219
|
+
return results;
|
|
220
|
+
return results.filter((result) => {
|
|
221
|
+
const record = result.record;
|
|
222
|
+
const tags = record.tags.map((tag) => tag.toLowerCase());
|
|
223
|
+
const source = record.source.toLowerCase();
|
|
224
|
+
if (session && (source === `codex:session:${session}` || tags.includes(`session:${session}`)))
|
|
225
|
+
return true;
|
|
226
|
+
if (workspaceTag && tags.some((tag) => tag.startsWith("workspace:")))
|
|
227
|
+
return tags.includes(workspaceTag);
|
|
228
|
+
if (workspaceTag)
|
|
229
|
+
return false;
|
|
230
|
+
const haystack = `${record.text} ${record.tags.join(" ")} ${record.source}`.toLowerCase();
|
|
231
|
+
return specificTerms.some((term) => haystack.includes(term.toLowerCase()));
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
function recallSpecificTerms(input) {
|
|
235
|
+
const cwdTerms = recallTermsFromCwd(input.cwd);
|
|
236
|
+
const workspaceTag = workspaceTagFromCwd(input.cwd);
|
|
237
|
+
const session = input.session_id?.trim();
|
|
238
|
+
const sessionTerms = session && !GENERIC_RECALL_TOKENS.has(session.toLowerCase()) ? [session] : [];
|
|
239
|
+
return [...new Set([...(workspaceTag ? [workspaceTag] : []), ...cwdTerms, ...sessionTerms])];
|
|
240
|
+
}
|
|
241
|
+
function recallTermsFromCwd(cwd) {
|
|
242
|
+
if (!cwd?.trim())
|
|
243
|
+
return [];
|
|
244
|
+
const basename = path.basename(cwd.trim());
|
|
245
|
+
return basename
|
|
246
|
+
.toLowerCase()
|
|
247
|
+
.split(/[^a-z0-9_-]+/)
|
|
248
|
+
.map((term) => term.trim())
|
|
249
|
+
.filter((term) => term.length > 1 && !GENERIC_RECALL_TOKENS.has(term));
|
|
250
|
+
}
|
|
251
|
+
function projectTagFromCwd(cwd) {
|
|
252
|
+
if (!cwd?.trim())
|
|
253
|
+
return undefined;
|
|
254
|
+
const project = path
|
|
255
|
+
.basename(cwd.trim())
|
|
256
|
+
.toLowerCase()
|
|
257
|
+
.replace(/[^a-z0-9_.-]+/g, "-")
|
|
258
|
+
.replace(/^-+|-+$/g, "");
|
|
259
|
+
if (!project || GENERIC_RECALL_TOKENS.has(project))
|
|
260
|
+
return undefined;
|
|
261
|
+
return `project:${project}`;
|
|
262
|
+
}
|
|
263
|
+
function workspaceTagFromCwd(cwd) {
|
|
264
|
+
if (!cwd?.trim())
|
|
265
|
+
return undefined;
|
|
266
|
+
const normalized = path.resolve(cwd.trim());
|
|
267
|
+
const hash = createHash("sha256").update(normalized).digest("hex").slice(0, 12);
|
|
268
|
+
return `workspace:${hash}`;
|
|
269
|
+
}
|
|
270
|
+
function sessionId(input) {
|
|
271
|
+
return input.session_id?.trim() || input.cwd?.trim() || "codex";
|
|
272
|
+
}
|
|
273
|
+
function shouldSkipUserPrompt(text) {
|
|
274
|
+
const trimmed = text.trim();
|
|
275
|
+
return !trimmed || TRIVIAL_PROMPT.test(trimmed);
|
|
276
|
+
}
|
|
277
|
+
function shouldSkipAssistantTurn(text) {
|
|
278
|
+
const trimmed = text.trim();
|
|
279
|
+
return !trimmed || TRIVIAL_ASSISTANT_TURN.test(trimmed);
|
|
280
|
+
}
|
|
281
|
+
async function immediatePromptRecords(store, session) {
|
|
282
|
+
const records = new Map();
|
|
283
|
+
const sessionTag = `session:${session}`.toLowerCase();
|
|
284
|
+
for (const record of await store.all()) {
|
|
285
|
+
if (!record.tags.includes("role-user"))
|
|
286
|
+
continue;
|
|
287
|
+
if (!record.tags.includes(IMMEDIATE_PROMPT_TAG))
|
|
288
|
+
continue;
|
|
289
|
+
if (record.source.toLowerCase() !== `codex:session:${session.toLowerCase()}` && !record.tags.includes(sessionTag)) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const createdAt = Date.parse(record.createdAt);
|
|
293
|
+
if (!Number.isFinite(createdAt))
|
|
294
|
+
continue;
|
|
295
|
+
const key = normalizeCapturedText(record.text);
|
|
296
|
+
records.set(key, [...(records.get(key) ?? []), createdAt]);
|
|
297
|
+
}
|
|
298
|
+
return records;
|
|
299
|
+
}
|
|
300
|
+
function consumeImmediatePrompt(records, text, turnAt) {
|
|
301
|
+
if (!turnAt)
|
|
302
|
+
return false;
|
|
303
|
+
const turnTime = Date.parse(turnAt);
|
|
304
|
+
if (!Number.isFinite(turnTime))
|
|
305
|
+
return false;
|
|
306
|
+
const redacted = redactSecrets(text);
|
|
307
|
+
const key = normalizeCapturedText(redacted.text);
|
|
308
|
+
const candidates = records.get(key) ?? [];
|
|
309
|
+
const index = candidates.findIndex((createdAt) => Math.abs(createdAt - turnTime) <= IMMEDIATE_PROMPT_WINDOW_MS);
|
|
310
|
+
if (index < 0)
|
|
311
|
+
return false;
|
|
312
|
+
candidates.splice(index, 1);
|
|
313
|
+
if (candidates.length === 0)
|
|
314
|
+
records.delete(key);
|
|
315
|
+
else
|
|
316
|
+
records.set(key, candidates);
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
function normalizeCapturedText(text) {
|
|
320
|
+
return text.trim().replace(/\s+/g, " ").toLowerCase();
|
|
321
|
+
}
|
|
322
|
+
function truncate(text, limit) {
|
|
323
|
+
const normalized = text.trim().replace(/\s+/g, " ");
|
|
324
|
+
if (normalized.length <= limit)
|
|
325
|
+
return normalized;
|
|
326
|
+
return `${normalized.slice(0, Math.max(0, limit - 3)).trimEnd()}...`;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/codex/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCodexCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { loadConfig } from "../config.js";
|
|
2
|
+
import { PathmarkStore } from "../store.js";
|
|
3
|
+
import { observe, prompt, recall, writeback } from "./capture.js";
|
|
4
|
+
import { installPathmarkMcp, pathmarkMcpStatus, removePathmarkMcp } from "./config-file.js";
|
|
5
|
+
import { hookStatus, installPathmarkHooks, uninstallPathmarkHooks } from "./hooks.js";
|
|
6
|
+
const USAGE = "Usage: pathmark codex <install|uninstall|status|recall|prompt|observe|writeback>";
|
|
7
|
+
export async function runCodexCommand(args) {
|
|
8
|
+
const [command, ...rest] = args;
|
|
9
|
+
if (command === "install") {
|
|
10
|
+
await installPathmarkHooks({ replaceHoncho: rest.includes("--replace-honcho") });
|
|
11
|
+
await installPathmarkMcp();
|
|
12
|
+
console.log("Installed Pathmark Codex hooks and MCP server.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (command === "uninstall") {
|
|
16
|
+
await uninstallPathmarkHooks();
|
|
17
|
+
await removePathmarkMcp();
|
|
18
|
+
console.log("Removed Pathmark Codex hooks and MCP server registration.");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (command === "status") {
|
|
22
|
+
await printStatus();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (isHookCommand(command)) {
|
|
26
|
+
await runHook(command);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.error(USAGE);
|
|
30
|
+
process.exitCode = 2;
|
|
31
|
+
}
|
|
32
|
+
async function runHook(command) {
|
|
33
|
+
const input = await readHookInput();
|
|
34
|
+
if (!input)
|
|
35
|
+
return;
|
|
36
|
+
const output = command === "recall"
|
|
37
|
+
? await recall(input)
|
|
38
|
+
: command === "prompt"
|
|
39
|
+
? await prompt(input)
|
|
40
|
+
: command === "observe"
|
|
41
|
+
? await observe(input)
|
|
42
|
+
: await writeback(input);
|
|
43
|
+
if (!output)
|
|
44
|
+
return;
|
|
45
|
+
if (command === "recall" || command === "prompt") {
|
|
46
|
+
process.stdout.write(`${JSON.stringify({
|
|
47
|
+
hookSpecificOutput: {
|
|
48
|
+
hookEventName: command === "recall" ? "SessionStart" : "UserPromptSubmit",
|
|
49
|
+
additionalContext: output,
|
|
50
|
+
},
|
|
51
|
+
})}\n`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
process.stdout.write(`${output}\n`);
|
|
55
|
+
}
|
|
56
|
+
async function printStatus() {
|
|
57
|
+
const config = loadConfig();
|
|
58
|
+
const store = new PathmarkStore(config);
|
|
59
|
+
const [hooks, mcp, recordCount] = await Promise.all([hookStatus(), pathmarkMcpStatus(), store.count()]);
|
|
60
|
+
console.log(JSON.stringify({
|
|
61
|
+
pathmarkHooksInstalled: hooks.pathmark,
|
|
62
|
+
pathmarkMcpRegistered: mcp.installed,
|
|
63
|
+
codexHooksFeatureEnabled: mcp.hooksFeatureEnabled,
|
|
64
|
+
honchoHooksPresent: hooks.honcho,
|
|
65
|
+
storeDir: config.storeDir,
|
|
66
|
+
memoryFile: config.memoryFile,
|
|
67
|
+
recordCount,
|
|
68
|
+
}, null, 2));
|
|
69
|
+
}
|
|
70
|
+
async function readHookInput() {
|
|
71
|
+
if (process.stdin.isTTY)
|
|
72
|
+
return {};
|
|
73
|
+
const chunks = [];
|
|
74
|
+
for await (const chunk of process.stdin) {
|
|
75
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));
|
|
76
|
+
}
|
|
77
|
+
const raw = Buffer.concat(chunks).toString("utf8").trim();
|
|
78
|
+
if (!raw)
|
|
79
|
+
return {};
|
|
80
|
+
try {
|
|
81
|
+
const parsed = JSON.parse(raw);
|
|
82
|
+
if (!isHookInput(parsed))
|
|
83
|
+
return undefined;
|
|
84
|
+
return parsed;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function isHookCommand(command) {
|
|
91
|
+
return command === "recall" || command === "prompt" || command === "observe" || command === "writeback";
|
|
92
|
+
}
|
|
93
|
+
function isHookInput(value) {
|
|
94
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/codex/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface PathmarkMcpStatus {
|
|
2
|
+
installed: boolean;
|
|
3
|
+
hooksFeatureEnabled: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function installPathmarkMcp(configPath?: string): Promise<void>;
|
|
6
|
+
export declare function removePathmarkMcp(configPath?: string): Promise<void>;
|
|
7
|
+
export declare function hasPathmarkMcp(configPath?: string): Promise<boolean>;
|
|
8
|
+
export declare function pathmarkMcpStatus(configPath?: string): Promise<PathmarkMcpStatus>;
|
|
9
|
+
export declare function enableHooksFeature(content: string): string;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { codexConfigPath, pathmarkStoreDir } from "./paths.js";
|
|
4
|
+
const PATHMARK_BLOCK_START = "# >>> pathmark MCP >>>";
|
|
5
|
+
const PATHMARK_BLOCK_END = "# <<< pathmark MCP <<<";
|
|
6
|
+
const PATHMARK_BLOCK_RE = /(?:^|\n)# >>> pathmark MCP >>>\n[\s\S]*?\n# <<< pathmark MCP <<<(?:\n|$)/g;
|
|
7
|
+
const TOML_TABLE_RE = /^\s*\[+.*\]+\s*(?:#.*)?$/;
|
|
8
|
+
const PATHMARK_MCP_TABLE_RE = /^\s*\[\s*mcp_servers\s*\.\s*pathmark(?:\s*\.\s*env)?\s*\]\s*(?:#.*)?$/;
|
|
9
|
+
export async function installPathmarkMcp(configPath = codexConfigPath()) {
|
|
10
|
+
const current = await readText(configPath);
|
|
11
|
+
const block = [
|
|
12
|
+
PATHMARK_BLOCK_START,
|
|
13
|
+
"[mcp_servers.pathmark]",
|
|
14
|
+
'command = "pathmark"',
|
|
15
|
+
`env = { PATHMARK_STORE_DIR = ${tomlString(pathmarkStoreDir())}, PATHMARK_SYNTHESIS_PROVIDER = "client" }`,
|
|
16
|
+
PATHMARK_BLOCK_END,
|
|
17
|
+
].join("\n");
|
|
18
|
+
const base = stripPathmarkMcpTables(stripPathmarkBlock(enableHooksFeature(current))).trimEnd();
|
|
19
|
+
await writeText(configPath, `${base ? `${base}\n\n` : ""}${block}\n`);
|
|
20
|
+
}
|
|
21
|
+
export async function removePathmarkMcp(configPath = codexConfigPath()) {
|
|
22
|
+
const next = stripPathmarkMcpTables(stripPathmarkBlock(await readText(configPath))).trimEnd();
|
|
23
|
+
await writeText(configPath, next ? `${next}\n` : "");
|
|
24
|
+
}
|
|
25
|
+
export async function hasPathmarkMcp(configPath = codexConfigPath()) {
|
|
26
|
+
const content = await readText(configPath);
|
|
27
|
+
return pathmarkMcpStatusFromContent(content).installed;
|
|
28
|
+
}
|
|
29
|
+
export async function pathmarkMcpStatus(configPath = codexConfigPath()) {
|
|
30
|
+
return pathmarkMcpStatusFromContent(await readText(configPath));
|
|
31
|
+
}
|
|
32
|
+
export function enableHooksFeature(content) {
|
|
33
|
+
const normalized = content.replace(/\r\n/g, "\n").trimEnd();
|
|
34
|
+
if (!normalized)
|
|
35
|
+
return "[features]\nhooks = true\n";
|
|
36
|
+
const lines = normalized.split("\n");
|
|
37
|
+
const header = lines.findIndex((line) => /^\s*\[features\]\s*$/.test(line));
|
|
38
|
+
if (header === -1)
|
|
39
|
+
return `${normalized}\n\n[features]\nhooks = true\n`;
|
|
40
|
+
let end = lines.length;
|
|
41
|
+
let hooksLine = -1;
|
|
42
|
+
for (let index = header + 1; index < lines.length; index += 1) {
|
|
43
|
+
if (/^\s*\[[^\]]+\]\s*$/.test(lines[index])) {
|
|
44
|
+
end = index;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
if (/^\s*hooks\s*=/.test(lines[index]))
|
|
48
|
+
hooksLine = index;
|
|
49
|
+
}
|
|
50
|
+
if (hooksLine >= 0)
|
|
51
|
+
lines[hooksLine] = "hooks = true";
|
|
52
|
+
else
|
|
53
|
+
lines.splice(end, 0, "hooks = true");
|
|
54
|
+
return `${lines.join("\n")}\n`;
|
|
55
|
+
}
|
|
56
|
+
function pathmarkMcpStatusFromContent(content) {
|
|
57
|
+
return {
|
|
58
|
+
installed: content.includes(PATHMARK_BLOCK_START) && content.includes(PATHMARK_BLOCK_END),
|
|
59
|
+
hooksFeatureEnabled: /^\s*hooks\s*=\s*true\s*$/m.test(featuresTable(content)),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function stripPathmarkBlock(content) {
|
|
63
|
+
return content.replace(PATHMARK_BLOCK_RE, "\n").replace(/\n{3,}/g, "\n\n");
|
|
64
|
+
}
|
|
65
|
+
function stripPathmarkMcpTables(content) {
|
|
66
|
+
const lines = content.replace(/\r\n/g, "\n").split("\n");
|
|
67
|
+
const kept = [];
|
|
68
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
69
|
+
if (!PATHMARK_MCP_TABLE_RE.test(lines[index])) {
|
|
70
|
+
kept.push(lines[index]);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
while (index + 1 < lines.length && !TOML_TABLE_RE.test(lines[index + 1]))
|
|
74
|
+
index += 1;
|
|
75
|
+
}
|
|
76
|
+
return kept.join("\n").replace(/\n{3,}/g, "\n\n");
|
|
77
|
+
}
|
|
78
|
+
function featuresTable(content) {
|
|
79
|
+
const normalized = content.replace(/\r\n/g, "\n");
|
|
80
|
+
const match = normalized.match(/(?:^|\n)\s*\[features\]\s*\n([\s\S]*?)(?=\n\s*\[[^\]]+\]\s*(?:\n|$)|$)/);
|
|
81
|
+
return match?.[1] ?? "";
|
|
82
|
+
}
|
|
83
|
+
async function readText(file) {
|
|
84
|
+
try {
|
|
85
|
+
return await readFile(file, "utf8");
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error.code === "ENOENT")
|
|
89
|
+
return "";
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function writeText(file, text) {
|
|
94
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
95
|
+
await writeFile(file, text, "utf8");
|
|
96
|
+
}
|
|
97
|
+
function tomlString(value) {
|
|
98
|
+
return JSON.stringify(value);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=config-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../../src/codex/config-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CaptureCursor {
|
|
2
|
+
count: number;
|
|
3
|
+
updatedAt: string;
|
|
4
|
+
transcriptFingerprint?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function cursorPath(storeDir: string, sessionId: string): string;
|
|
7
|
+
export declare function readCursor(storeDir: string, sessionId: string): Promise<number>;
|
|
8
|
+
export declare function readCursorState(storeDir: string, sessionId: string): Promise<CaptureCursor>;
|
|
9
|
+
export declare function writeCursor(storeDir: string, sessionId: string, count: number, metadata?: {
|
|
10
|
+
transcriptFingerprint?: string;
|
|
11
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function cursorPath(storeDir, sessionId) {
|
|
4
|
+
const safeSession = sessionId.replace(/[^a-zA-Z0-9_.-]/g, "_") || "_";
|
|
5
|
+
return path.join(storeDir, "codex-cursors", `${safeSession}.json`);
|
|
6
|
+
}
|
|
7
|
+
export async function readCursor(storeDir, sessionId) {
|
|
8
|
+
return (await readCursorState(storeDir, sessionId)).count;
|
|
9
|
+
}
|
|
10
|
+
export async function readCursorState(storeDir, sessionId) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(await readFile(cursorPath(storeDir, sessionId), "utf8"));
|
|
13
|
+
return {
|
|
14
|
+
count: typeof parsed.count === "number" && Number.isFinite(parsed.count) && parsed.count >= 0 ? parsed.count : 0,
|
|
15
|
+
updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : "",
|
|
16
|
+
transcriptFingerprint: typeof parsed.transcriptFingerprint === "string" && parsed.transcriptFingerprint
|
|
17
|
+
? parsed.transcriptFingerprint
|
|
18
|
+
: undefined,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { count: 0, updatedAt: "" };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function writeCursor(storeDir, sessionId, count, metadata = {}) {
|
|
26
|
+
const file = cursorPath(storeDir, sessionId);
|
|
27
|
+
const safeCount = Number.isFinite(count) && count >= 0 ? count : 0;
|
|
28
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
29
|
+
await writeFile(file, JSON.stringify({
|
|
30
|
+
count: safeCount,
|
|
31
|
+
updatedAt: new Date().toISOString(),
|
|
32
|
+
...(metadata.transcriptFingerprint ? { transcriptFingerprint: metadata.transcriptFingerprint } : {}),
|
|
33
|
+
}, null, 2), "utf8");
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/codex/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,SAAiB;IAC5D,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;IACtE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,SAAiB;IAClE,OAAO,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAiB;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAA2B,CAAC;QAC7G,OAAO;YACL,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChH,SAAS,EAAE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YACvE,qBAAqB,EACnB,OAAO,MAAM,CAAC,qBAAqB,KAAK,QAAQ,IAAI,MAAM,CAAC,qBAAqB;gBAC9E,CAAC,CAAC,MAAM,CAAC,qBAAqB;gBAC9B,CAAC,CAAC,SAAS;SAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,SAAiB,EACjB,KAAa,EACb,WAA+C,EAAE;IAEjD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,CACb,IAAI,EACJ,IAAI,CAAC,SAAS,CACZ;QACE,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrG,EACD,IAAI,EACJ,CAAC,CACF,EACD,MAAM,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface HookStatus {
|
|
2
|
+
pathmark: boolean;
|
|
3
|
+
honcho: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function installPathmarkHooks(options?: {
|
|
6
|
+
replaceHoncho?: boolean;
|
|
7
|
+
hooksPath?: string;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export declare function uninstallPathmarkHooks(hooksPath?: string): Promise<void>;
|
|
10
|
+
export declare function hookStatus(hooksPath?: string): Promise<HookStatus>;
|