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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +339 -0
  3. package/SECURITY.md +39 -0
  4. package/assets/pathmark-icon-v3-glyph.png +0 -0
  5. package/dist/chat.d.ts +6 -0
  6. package/dist/chat.js +169 -0
  7. package/dist/chat.js.map +1 -0
  8. package/dist/codex/capture.d.ts +12 -0
  9. package/dist/codex/capture.js +328 -0
  10. package/dist/codex/capture.js.map +1 -0
  11. package/dist/codex/cli.d.ts +1 -0
  12. package/dist/codex/cli.js +96 -0
  13. package/dist/codex/cli.js.map +1 -0
  14. package/dist/codex/config-file.d.ts +9 -0
  15. package/dist/codex/config-file.js +100 -0
  16. package/dist/codex/config-file.js.map +1 -0
  17. package/dist/codex/cursor.d.ts +11 -0
  18. package/dist/codex/cursor.js +35 -0
  19. package/dist/codex/cursor.js.map +1 -0
  20. package/dist/codex/hooks.d.ts +10 -0
  21. package/dist/codex/hooks.js +108 -0
  22. package/dist/codex/hooks.js.map +1 -0
  23. package/dist/codex/paths.d.ts +5 -0
  24. package/dist/codex/paths.js +29 -0
  25. package/dist/codex/paths.js.map +1 -0
  26. package/dist/codex/tool-summary.d.ts +5 -0
  27. package/dist/codex/tool-summary.js +223 -0
  28. package/dist/codex/tool-summary.js.map +1 -0
  29. package/dist/codex/transcript.d.ts +9 -0
  30. package/dist/codex/transcript.js +99 -0
  31. package/dist/codex/transcript.js.map +1 -0
  32. package/dist/config.d.ts +2 -0
  33. package/dist/config.js +40 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/format.d.ts +10 -0
  36. package/dist/format.js +48 -0
  37. package/dist/format.js.map +1 -0
  38. package/dist/ids.d.ts +1 -0
  39. package/dist/ids.js +6 -0
  40. package/dist/ids.js.map +1 -0
  41. package/dist/index.d.ts +2 -0
  42. package/dist/index.js +27 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/mcp.d.ts +1 -0
  45. package/dist/mcp.js +130 -0
  46. package/dist/mcp.js.map +1 -0
  47. package/dist/redact.d.ts +5 -0
  48. package/dist/redact.js +36 -0
  49. package/dist/redact.js.map +1 -0
  50. package/dist/setup.d.ts +1 -0
  51. package/dist/setup.js +208 -0
  52. package/dist/setup.js.map +1 -0
  53. package/dist/store.d.ts +27 -0
  54. package/dist/store.js +174 -0
  55. package/dist/store.js.map +1 -0
  56. package/dist/types.d.ts +38 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/examples/claude_code.md +21 -0
  60. package/examples/claude_desktop_config.json +10 -0
  61. package/examples/codex.md +39 -0
  62. package/examples/cursor_mcp_config.json +10 -0
  63. package/examples/gemini_settings.json +12 -0
  64. package/examples/generic_mcp_config.json +12 -0
  65. package/examples/openai_compatible.env +8 -0
  66. package/examples/opencode.jsonc +13 -0
  67. package/package.json +66 -0
  68. package/scripts/import-honcho.mjs +243 -0
@@ -0,0 +1,108 @@
1
+ import { copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { codexHooksPath } from "./paths.js";
4
+ const PATHMARK_VERBS = ["recall", "prompt", "observe", "writeback"];
5
+ const PATHMARK_PATTERN = new RegExp(`\\bpathmark\\b[\\s\\S]*\\bcodex\\b[\\s\\S]*\\b(?:${PATHMARK_VERBS.join("|")})\\b`);
6
+ const HONCHO_PATTERN = /(?:codex-honcho|[/.]honcho[/\\]codex-honcho\.mjs)/i;
7
+ export async function installPathmarkHooks(options = {}) {
8
+ const file = await readHooksFile(options.hooksPath);
9
+ await backupHooksFile(options.hooksPath);
10
+ const stripped = stripOwnedHooks(file, (command) => PATHMARK_PATTERN.test(command) || Boolean(options.replaceHoncho && HONCHO_PATTERN.test(command)));
11
+ await writeHooksFile(addPathmarkHooks(stripped), options.hooksPath);
12
+ }
13
+ export async function uninstallPathmarkHooks(hooksPath) {
14
+ const file = await readHooksFile(hooksPath);
15
+ await backupHooksFile(hooksPath);
16
+ await writeHooksFile(stripOwnedHooks(file, (command) => PATHMARK_PATTERN.test(command)), hooksPath);
17
+ }
18
+ export async function hookStatus(hooksPath) {
19
+ const commands = hookCommands(await readHooksFile(hooksPath));
20
+ return {
21
+ pathmark: commands.some((command) => PATHMARK_PATTERN.test(command)),
22
+ honcho: commands.some((command) => HONCHO_PATTERN.test(command)),
23
+ };
24
+ }
25
+ function addPathmarkHooks(file) {
26
+ const next = { ...file, hooks: { ...file.hooks } };
27
+ next.hooks.SessionStart = [
28
+ ...(next.hooks.SessionStart ?? []),
29
+ {
30
+ matcher: "startup|resume|clear|compact",
31
+ hooks: [{ type: "command", command: "pathmark codex recall", timeout: 30, statusMessage: "pathmark" }],
32
+ },
33
+ ];
34
+ next.hooks.UserPromptSubmit = [
35
+ ...(next.hooks.UserPromptSubmit ?? []),
36
+ { hooks: [{ type: "command", command: "pathmark codex prompt", timeout: 20 }] },
37
+ ];
38
+ next.hooks.PostToolUse = [
39
+ ...(next.hooks.PostToolUse ?? []),
40
+ { matcher: "*", hooks: [{ type: "command", command: "pathmark codex observe", timeout: 10 }] },
41
+ ];
42
+ next.hooks.Stop = [
43
+ ...(next.hooks.Stop ?? []),
44
+ { hooks: [{ type: "command", command: "pathmark codex writeback", timeout: 30 }] },
45
+ ];
46
+ next.hooks.PreCompact = [
47
+ ...(next.hooks.PreCompact ?? []),
48
+ { matcher: "manual|auto", hooks: [{ type: "command", command: "pathmark codex writeback", timeout: 30 }] },
49
+ ];
50
+ return next;
51
+ }
52
+ function stripOwnedHooks(file, isOwned) {
53
+ const next = { ...file, hooks: {} };
54
+ for (const [event, groups] of Object.entries(file.hooks)) {
55
+ const keptGroups = [];
56
+ for (const group of groups) {
57
+ const hooks = Array.isArray(group.hooks) ? group.hooks : [];
58
+ const keptHooks = hooks.filter((hook) => !isOwnedHook(hook, isOwned));
59
+ if (keptHooks.length > 0 || hooks.length === 0)
60
+ keptGroups.push({ ...group, hooks: keptHooks });
61
+ }
62
+ if (keptGroups.length > 0)
63
+ next.hooks[event] = keptGroups;
64
+ }
65
+ return next;
66
+ }
67
+ function isOwnedHook(hook, isOwned) {
68
+ return typeof hook.command === "string" && isOwned(hook.command);
69
+ }
70
+ function hookCommands(file) {
71
+ return Object.values(file.hooks).flatMap((groups) => groups.flatMap((group) => (group.hooks ?? []).flatMap((hook) => (typeof hook.command === "string" ? [hook.command] : []))));
72
+ }
73
+ async function readHooksFile(hooksPath = codexHooksPath()) {
74
+ try {
75
+ const parsed = JSON.parse(await readFile(hooksPath, "utf8"));
76
+ return {
77
+ ...parsed,
78
+ hooks: parsed.hooks && typeof parsed.hooks === "object" && !Array.isArray(parsed.hooks) ? normalizeHooks(parsed.hooks) : {},
79
+ };
80
+ }
81
+ catch (error) {
82
+ if (error.code === "ENOENT")
83
+ return { hooks: {} };
84
+ throw error;
85
+ }
86
+ }
87
+ function normalizeHooks(rawHooks) {
88
+ const hooks = {};
89
+ for (const [event, groups] of Object.entries(rawHooks)) {
90
+ hooks[event] = Array.isArray(groups) ? groups : [];
91
+ }
92
+ return hooks;
93
+ }
94
+ async function writeHooksFile(file, hooksPath = codexHooksPath()) {
95
+ await mkdir(path.dirname(hooksPath), { recursive: true });
96
+ await writeFile(hooksPath, `${JSON.stringify(file, null, 2)}\n`, "utf8");
97
+ }
98
+ async function backupHooksFile(hooksPath = codexHooksPath()) {
99
+ try {
100
+ await copyFile(hooksPath, `${hooksPath}.backup-${new Date().toISOString().replace(/[:.]/g, "-")}`);
101
+ }
102
+ catch (error) {
103
+ if (error.code !== "ENOENT")
104
+ throw error;
105
+ await mkdir(path.dirname(hooksPath), { recursive: true });
106
+ }
107
+ }
108
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/codex/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function codexHome(): string;
2
+ export declare function codexHooksPath(): string;
3
+ export declare function codexConfigPath(): string;
4
+ export declare function pathmarkStoreDir(): string;
5
+ export declare function codexCursorDir(storeDir?: string): string;
@@ -0,0 +1,29 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ function expandHome(input) {
4
+ if (input === "~")
5
+ return os.homedir();
6
+ if (input.startsWith("~/"))
7
+ return path.join(os.homedir(), input.slice(2));
8
+ return input;
9
+ }
10
+ function envPath(name, fallback) {
11
+ const value = process.env[name];
12
+ return value && value.trim() ? value : fallback;
13
+ }
14
+ export function codexHome() {
15
+ return path.resolve(expandHome(envPath("CODEX_HOME", "~/.codex")));
16
+ }
17
+ export function codexHooksPath() {
18
+ return path.join(codexHome(), "hooks.json");
19
+ }
20
+ export function codexConfigPath() {
21
+ return path.join(codexHome(), "config.toml");
22
+ }
23
+ export function pathmarkStoreDir() {
24
+ return path.resolve(expandHome(envPath("PATHMARK_STORE_DIR", "~/.pathmark/memory")));
25
+ }
26
+ export function codexCursorDir(storeDir = pathmarkStoreDir()) {
27
+ return path.join(storeDir, "codex-cursors");
28
+ }
29
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/codex/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,QAAgB;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAQ,GAAG,gBAAgB,EAAE;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface ToolHookInput {
2
+ tool_name?: string;
3
+ tool_input?: unknown;
4
+ }
5
+ export declare function summarizeToolUse(input: ToolHookInput): string;
@@ -0,0 +1,223 @@
1
+ import { redactSecrets } from "../redact.js";
2
+ const SHELL_TOOLS = new Set(["Bash", "shell", "local_shell", "exec", "functions.exec_command"]);
3
+ const SKIP_TOOL_PREFIXES = ["mcp__pathmark", "pathmark"];
4
+ const TRIVIAL_COMMANDS = [
5
+ "cd",
6
+ "true",
7
+ "false",
8
+ "echo",
9
+ "printf",
10
+ "pwd",
11
+ "ls",
12
+ "cat",
13
+ "head",
14
+ "tail",
15
+ "sed",
16
+ "rg",
17
+ "grep",
18
+ "jq",
19
+ "awk",
20
+ "find",
21
+ "wc",
22
+ "du",
23
+ "git status",
24
+ "git log",
25
+ "git diff",
26
+ "git show",
27
+ "git branch",
28
+ "git remote",
29
+ "git ls-files",
30
+ "git grep",
31
+ "git rev-parse",
32
+ ];
33
+ export function summarizeToolUse(input) {
34
+ const name = input.tool_name?.trim() ?? "";
35
+ if (!name)
36
+ return "";
37
+ if (SKIP_TOOL_PREFIXES.some((prefix) => name.startsWith(prefix)))
38
+ return "";
39
+ if (SHELL_TOOLS.has(name)) {
40
+ const command = shellCommand(input.tool_input).trim();
41
+ if (!command)
42
+ return "";
43
+ const summaryCommand = nonPathmarkShellCommand(command);
44
+ if (!summaryCommand)
45
+ return "";
46
+ if (isTrivialShellCommand(summaryCommand))
47
+ return "";
48
+ const redacted = redactSecrets(summaryCommand);
49
+ return `ran: ${redacted.text.slice(0, 200)}`;
50
+ }
51
+ if (name === "apply_patch" || name === "functions.apply_patch") {
52
+ const patch = patchText(input.tool_input);
53
+ const files = changedFiles(patch);
54
+ return files.length > 0 ? `edited: ${files.slice(0, 8).join(", ")}` : "applied a patch";
55
+ }
56
+ return `used ${name}`;
57
+ }
58
+ function shellCommand(input) {
59
+ if (Array.isArray(input))
60
+ return input.map(String).join(" ");
61
+ if (!isRecord(input))
62
+ return "";
63
+ if (typeof input.cmd === "string")
64
+ return input.cmd;
65
+ if (Array.isArray(input.cmd))
66
+ return input.cmd.map(String).join(" ");
67
+ if (typeof input.command === "string")
68
+ return input.command;
69
+ if (Array.isArray(input.command))
70
+ return input.command.map(String).join(" ");
71
+ return "";
72
+ }
73
+ function patchText(input) {
74
+ if (typeof input === "string")
75
+ return input;
76
+ if (!isRecord(input))
77
+ return "";
78
+ if (typeof input.input === "string")
79
+ return input.input;
80
+ if (typeof input.patch === "string")
81
+ return input.patch;
82
+ return "";
83
+ }
84
+ function changedFiles(patch) {
85
+ const files = [
86
+ ...[...patch.matchAll(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm)].map((match) => match[1]),
87
+ ...[...patch.matchAll(/^\+\+\+ b\/(.+)$/gm)].map((match) => match[1]),
88
+ ];
89
+ return [...new Set(files.map((file) => file.trim()).filter((file) => file && file !== "/dev/null"))];
90
+ }
91
+ function isPathmarkShellCommand(command) {
92
+ return shellSegments(command).some(isPathmarkShellSegment);
93
+ }
94
+ function nonPathmarkShellCommand(command) {
95
+ const segments = shellSegments(command);
96
+ if (segments.length === 0)
97
+ return command;
98
+ const nonPathmarkSegments = segments.filter((segment) => !isPathmarkShellSegment(segment));
99
+ if (nonPathmarkSegments.length === 0)
100
+ return "";
101
+ if (nonPathmarkSegments.length === segments.length)
102
+ return command;
103
+ return nonPathmarkSegments.join(" && ");
104
+ }
105
+ function shellSegments(command) {
106
+ return command
107
+ .split(/\s*(?:&&|\|\||;|\|)\s*/)
108
+ .map(stripLeadingEnvAssignments)
109
+ .filter(Boolean);
110
+ }
111
+ function isPathmarkShellSegment(segment) {
112
+ return (/^pathmark(?:\s|$)/.test(segment) ||
113
+ /^npx(?:\s+(?:--yes|-y))*\s+pathmark(?:\s|$)/.test(segment) ||
114
+ /^node(?:\s+--?[^\s]+)*\s+\S*pathmark\S*(?:\s|$)/.test(segment) ||
115
+ /^node\b[\s\S]*\bdist\/index\.js\s+codex(?:\s|$)/.test(segment));
116
+ }
117
+ function stripLeadingEnvAssignments(command) {
118
+ let text = command.trim();
119
+ if (text.startsWith("env "))
120
+ text = text.slice(4).trimStart();
121
+ while (/^[A-Za-z_][A-Za-z0-9_]*=/.test(text)) {
122
+ text = text.replace(/^[A-Za-z_][A-Za-z0-9_]*=(?:"[^"]*"|'[^']*'|\S+)\s*/, "").trimStart();
123
+ }
124
+ return text;
125
+ }
126
+ function isTrivialShellCommand(command) {
127
+ if (hasMutationShellMarker(command))
128
+ return false;
129
+ if (hasUsefulShellChain(command))
130
+ return false;
131
+ return isTrivialReadCommand(command);
132
+ }
133
+ function isTrivialReadCommand(command) {
134
+ const normalized = stripLeadingEnvAssignments(command);
135
+ return TRIVIAL_COMMANDS.some((trivial) => {
136
+ if (normalized === trivial)
137
+ return true;
138
+ if (!normalized.startsWith(`${trivial} `))
139
+ return false;
140
+ if (trivial === "sed" && /\s-i(?:\S*)?(?:\s|$)/.test(normalized))
141
+ return false;
142
+ if (trivial === "find" && /\s(?:-delete|-exec)(?:\s|$)/.test(normalized))
143
+ return false;
144
+ return true;
145
+ });
146
+ }
147
+ function hasUsefulShellChain(command) {
148
+ if (!/(?:&&|\|\||;)/.test(command))
149
+ return false;
150
+ const segments = command
151
+ .split(/\s*(?:&&|\|\||;)\s*/)
152
+ .map(stripLeadingEnvAssignments)
153
+ .filter(Boolean);
154
+ if (segments.length < 2)
155
+ return false;
156
+ return segments.some((segment) => !isPathmarkShellCommand(segment) && !isTrivialReadCommand(segment));
157
+ }
158
+ function hasMutationShellMarker(command) {
159
+ return (/\|\s*xargs\b/.test(command) ||
160
+ /\|\s*tee\b/.test(command) ||
161
+ /\|\s*(?:bash|sh|zsh|python|python3)\b/.test(command) ||
162
+ /\|\s*git\s+apply\b/.test(command) ||
163
+ /\|\s*sponge\b/.test(command) ||
164
+ /\|\s*while\b[\s\S]*\b(?:rm|mv|cp|sed|perl|python|python3)\b/.test(command) ||
165
+ hasChainedMutatingCommand(command) ||
166
+ hasNonNullOutputRedirection(command) ||
167
+ command.includes("<<") ||
168
+ /\bsed\b[^|;&]*\s-i(?:\S*)?(?:\s|$)/.test(command) ||
169
+ /\bfind\b[\s\S]*(?:\s-delete\b|\s-exec\b)/.test(command));
170
+ }
171
+ function hasChainedMutatingCommand(command) {
172
+ return command
173
+ .split(/\s*(?:&&|\|\||;)\s*/)
174
+ .map(stripLeadingEnvAssignments)
175
+ .some(isMutatingShellSegment);
176
+ }
177
+ function isMutatingShellSegment(segment) {
178
+ const command = segment.trim().replace(/^sudo\s+/, "");
179
+ return (/^git\s+(?:add|commit)\b/.test(command) ||
180
+ /^(?:rm|mv|cp|chmod|chown|mkdir|touch)\b/.test(command) ||
181
+ /^perl\b[\s\S]*\s-i(?:\S*)?(?:\s|$)/.test(command));
182
+ }
183
+ function hasNonNullOutputRedirection(command) {
184
+ let quote;
185
+ for (let index = 0; index < command.length; index += 1) {
186
+ const char = command[index];
187
+ if (char === "\\" && quote) {
188
+ index += 1;
189
+ continue;
190
+ }
191
+ if (quote) {
192
+ if (char === quote)
193
+ quote = undefined;
194
+ continue;
195
+ }
196
+ if (char === "'" || char === '"') {
197
+ quote = char;
198
+ continue;
199
+ }
200
+ if (char !== ">")
201
+ continue;
202
+ const previous = command[index - 1] ?? "";
203
+ const next = command[index + 1] ?? "";
204
+ if (previous === "<" || previous === ">" || previous === "=" || next === "=")
205
+ continue;
206
+ let targetStart = next === ">" ? index + 2 : index + 1;
207
+ while (/\s/.test(command[targetStart] ?? ""))
208
+ targetStart += 1;
209
+ if ((command[targetStart] ?? "") === "&")
210
+ continue;
211
+ let targetEnd = targetStart;
212
+ while (targetEnd < command.length && !/[\s;&|]/.test(command[targetEnd]))
213
+ targetEnd += 1;
214
+ const target = command.slice(targetStart, targetEnd);
215
+ if (target && target !== "/dev/null")
216
+ return true;
217
+ }
218
+ return false;
219
+ }
220
+ function isRecord(value) {
221
+ return typeof value === "object" && value !== null && !Array.isArray(value);
222
+ }
223
+ //# sourceMappingURL=tool-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-summary.js","sourceRoot":"","sources":["../../src/codex/tool-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface CodexTurn {
2
+ role: "user" | "assistant";
3
+ text: string;
4
+ at?: string;
5
+ index: number;
6
+ }
7
+ export declare function readCodexTranscript(file: string): Promise<CodexTurn[]>;
8
+ export declare function readCodexTranscriptStrict(file: string): Promise<CodexTurn[]>;
9
+ export declare function parseTranscriptEvent(event: unknown, index: number): CodexTurn | undefined;
@@ -0,0 +1,99 @@
1
+ import { readFile } from "node:fs/promises";
2
+ const TEXT_BLOCK_TYPES = new Set(["input_text", "output_text", "text"]);
3
+ const INJECTED_TAGS = [
4
+ "environment_context",
5
+ "turn_aborted",
6
+ "user_instructions",
7
+ "apps_instructions",
8
+ "plugins_instructions",
9
+ "skills_instructions",
10
+ "collaboration_mode",
11
+ "honcho-memory",
12
+ "honcho-memory-nudge",
13
+ "pathmark-memory",
14
+ "pathmark-memory-nudge",
15
+ ];
16
+ export async function readCodexTranscript(file) {
17
+ return readCodexTranscriptFile(file, { strict: false });
18
+ }
19
+ export async function readCodexTranscriptStrict(file) {
20
+ return readCodexTranscriptFile(file, { strict: true });
21
+ }
22
+ async function readCodexTranscriptFile(file, options) {
23
+ const raw = await readFile(file, "utf8");
24
+ const turns = [];
25
+ let lineNumber = 0;
26
+ for (const line of raw.split("\n")) {
27
+ lineNumber += 1;
28
+ if (!line.trim())
29
+ continue;
30
+ let event;
31
+ try {
32
+ event = JSON.parse(line);
33
+ }
34
+ catch {
35
+ if (options.strict)
36
+ throw new Error(`Invalid Codex transcript JSON at line ${lineNumber}: ${file}`);
37
+ continue;
38
+ }
39
+ const parsed = parseTranscriptEventInternal(event, turns.length, options.strict ? { file, lineNumber } : undefined);
40
+ if (parsed)
41
+ turns.push(parsed);
42
+ }
43
+ return turns;
44
+ }
45
+ export function parseTranscriptEvent(event, index) {
46
+ return parseTranscriptEventInternal(event, index);
47
+ }
48
+ function parseTranscriptEventInternal(event, index, strict) {
49
+ if (!isRecord(event) || event.type !== "response_item")
50
+ return undefined;
51
+ const payload = event.payload;
52
+ if (!isRecord(payload) || payload.type !== "message")
53
+ return undefined;
54
+ if (payload.role !== "user" && payload.role !== "assistant")
55
+ return undefined;
56
+ const text = collectText(payload.content).trim();
57
+ if (!text) {
58
+ if (strict)
59
+ throw new Error(`Malformed Codex transcript message at line ${strict.lineNumber}: ${strict.file}`);
60
+ return undefined;
61
+ }
62
+ if (payload.role === "user" && isInjectedContext(text))
63
+ return undefined;
64
+ return {
65
+ role: payload.role,
66
+ text,
67
+ at: typeof event.timestamp === "string" ? event.timestamp : undefined,
68
+ index,
69
+ };
70
+ }
71
+ function collectText(content) {
72
+ if (typeof content === "string")
73
+ return content;
74
+ if (!Array.isArray(content))
75
+ return "";
76
+ return content
77
+ .flatMap((block) => {
78
+ if (typeof block === "string")
79
+ return [block];
80
+ if (!isRecord(block) || !TEXT_BLOCK_TYPES.has(String(block.type)))
81
+ return [];
82
+ return typeof block.text === "string" ? [block.text] : [];
83
+ })
84
+ .join("\n");
85
+ }
86
+ function isInjectedContext(text) {
87
+ const trimmed = text.trimStart();
88
+ return INJECTED_TAGS.some((tag) => startsWithTag(trimmed, tag));
89
+ }
90
+ function startsWithTag(text, tag) {
91
+ if (!text.startsWith(`<${tag}`))
92
+ return false;
93
+ const next = text.at(tag.length + 1);
94
+ return next === ">" || next === undefined || /\s/.test(next);
95
+ }
96
+ function isRecord(value) {
97
+ return typeof value === "object" && value !== null && !Array.isArray(value);
98
+ }
99
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/codex/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAS5C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;AACxE,MAAM,aAAa,GAAG;IACpB,qBAAqB;IACrB,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,eAAe;IACf,qBAAqB;IACrB,iBAAiB;IACjB,uBAAuB;CACxB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,OAAO,uBAAuB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAY;IAC1D,OAAO,uBAAuB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,IAAY,EAAE,OAA4B;IAC/E,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,UAAU,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAE3B,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,KAAK,IAAI,EAAE,CAAC,CAAC;YACpG,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpH,IAAI,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,KAAa;IAChE,OAAO,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,4BAA4B,CACnC,KAAc,EACd,KAAa,EACb,MAA6C;IAE7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,SAAS,CAAC;IAEzE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACvE,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAE9E,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/G,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzE,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI;QACJ,EAAE,EAAE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACrE,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,OAAO,OAAO;SACX,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAC7E,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,GAAW;IAC9C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { PathmarkConfig } from "./types.js";
2
+ export declare function loadConfig(): PathmarkConfig;
package/dist/config.js ADDED
@@ -0,0 +1,40 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ function expandHome(input) {
4
+ if (input === "~")
5
+ return os.homedir();
6
+ if (input.startsWith("~/"))
7
+ return path.join(os.homedir(), input.slice(2));
8
+ return input;
9
+ }
10
+ function envValue(name, fallback) {
11
+ const value = process.env[name];
12
+ return value && value.trim() ? value : fallback;
13
+ }
14
+ export function loadConfig() {
15
+ const storeDir = path.resolve(expandHome(envValue("PATHMARK_STORE_DIR", "~/.pathmark/memory")));
16
+ return {
17
+ storeDir,
18
+ memoryFile: path.join(storeDir, "memory.jsonl"),
19
+ synthesisProvider: synthesisProvider(),
20
+ chatCommand: process.env.PATHMARK_CHAT_COMMAND,
21
+ codexCommand: process.env.PATHMARK_CODEX_COMMAND ?? "codex",
22
+ codexModel: process.env.PATHMARK_CODEX_MODEL,
23
+ openaiBaseUrl: process.env.PATHMARK_OPENAI_BASE_URL ?? "https://api.openai.com/v1",
24
+ openaiApiKey: process.env.PATHMARK_OPENAI_API_KEY,
25
+ openaiModel: process.env.PATHMARK_OPENAI_MODEL,
26
+ chatTimeoutMs: Number.parseInt(process.env.PATHMARK_CHAT_TIMEOUT_MS ?? "120000", 10),
27
+ maxSearchResults: Number.parseInt(process.env.PATHMARK_MAX_SEARCH_RESULTS ?? "12", 10),
28
+ };
29
+ }
30
+ function synthesisProvider() {
31
+ const value = process.env.PATHMARK_SYNTHESIS_PROVIDER;
32
+ if (value === "command" || value === "codex" || value === "openai-compatible")
33
+ return value;
34
+ if (process.env.PATHMARK_OPENAI_API_KEY && process.env.PATHMARK_OPENAI_MODEL)
35
+ return "openai-compatible";
36
+ if (process.env.PATHMARK_CHAT_COMMAND)
37
+ return "command";
38
+ return "client";
39
+ }
40
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAgB;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAEhG,OAAO;QACL,QAAQ;QACR,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC/C,iBAAiB,EAAE,iBAAiB,EAAE;QACtC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAC9C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO;QAC3D,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAC5C,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,2BAA2B;QAClF,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACjD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAC9C,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,QAAQ,EAAE,EAAE,CAAC;QACpF,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,IAAI,EAAE,EAAE,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAC5F,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAAE,OAAO,mBAAmB,CAAC;IACzG,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAAE,OAAO,SAAS,CAAC;IACxD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { PathmarkConfig, PathmarkRecord, SearchResult } from "./types.js";
2
+ export declare function jsonText(value: unknown): {
3
+ content: Array<{
4
+ type: "text";
5
+ text: string;
6
+ }>;
7
+ };
8
+ export declare function publicConfig(config: PathmarkConfig): Record<string, unknown>;
9
+ export declare function summarizeRecords(records: PathmarkRecord[]): string;
10
+ export declare function summarizeSearch(results: SearchResult[]): string;
package/dist/format.js ADDED
@@ -0,0 +1,48 @@
1
+ export function jsonText(value) {
2
+ return {
3
+ content: [
4
+ {
5
+ type: "text",
6
+ text: JSON.stringify(value, null, 2),
7
+ },
8
+ ],
9
+ };
10
+ }
11
+ export function publicConfig(config) {
12
+ return {
13
+ storeDir: config.storeDir,
14
+ memoryFile: config.memoryFile,
15
+ synthesisProvider: config.synthesisProvider,
16
+ chatCommand: config.chatCommand ? "configured" : "not_configured",
17
+ codexCommand: config.codexCommand,
18
+ codexModel: config.codexModel ?? "default",
19
+ openaiBaseUrl: config.openaiBaseUrl,
20
+ openaiApiKey: config.openaiApiKey ? "set" : "missing",
21
+ openaiModel: config.openaiModel ?? "unset",
22
+ chatTimeoutMs: config.chatTimeoutMs,
23
+ maxSearchResults: config.maxSearchResults,
24
+ };
25
+ }
26
+ export function summarizeRecords(records) {
27
+ if (records.length === 0)
28
+ return "No records found.";
29
+ return records
30
+ .map((record) => {
31
+ const tagText = record.tags.length > 0 ? ` tags=${record.tags.join(",")}` : "";
32
+ return `- ${record.kind} ${record.id} (${record.createdAt}${tagText})\n ${record.text}`;
33
+ })
34
+ .join("\n");
35
+ }
36
+ export function summarizeSearch(results) {
37
+ if (results.length === 0)
38
+ return "No matching memory found.";
39
+ return results
40
+ .map((result) => {
41
+ const record = result.record;
42
+ const matches = result.matchedTerms.length > 0 ? ` matches=${result.matchedTerms.join(",")}` : "";
43
+ const tagText = record.tags.length > 0 ? ` tags=${record.tags.join(",")}` : "";
44
+ return `- ${record.kind} ${record.id} score=${result.score}${matches} (${record.createdAt}${tagText})\n ${record.text}`;
45
+ })
46
+ .join("\n");
47
+ }
48
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACrC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB;QACjE,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;QAC1C,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QACrD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,OAAO;QAC1C,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAErD,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,SAAS,GAAG,OAAO,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3F,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,2BAA2B,CAAC;IAE7D,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,UAAU,MAAM,CAAC,KAAK,GAAG,OAAO,KAAK,MAAM,CAAC,SAAS,GAAG,OAAO,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3H,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
package/dist/ids.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function deterministicId(parts: string[]): string;
package/dist/ids.js ADDED
@@ -0,0 +1,6 @@
1
+ import { createHash } from "node:crypto";
2
+ export function deterministicId(parts) {
3
+ const hash = createHash("sha256").update(parts.join("\u001f")).digest("hex");
4
+ return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
5
+ }
6
+ //# sourceMappingURL=ids.js.map