oh-my-codex 0.16.4 → 0.17.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 (138) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/dist/catalog/__tests__/generator.test.js +2 -0
  4. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  5. package/dist/cli/__tests__/doctor-warning-copy.test.js +80 -7
  6. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  7. package/dist/cli/__tests__/index.test.js +17 -11
  8. package/dist/cli/__tests__/index.test.js.map +1 -1
  9. package/dist/cli/__tests__/mcp-serve.test.js +4 -0
  10. package/dist/cli/__tests__/mcp-serve.test.js.map +1 -1
  11. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +8 -3
  12. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -1
  13. package/dist/cli/__tests__/setup-install-mode.test.js +27 -1
  14. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  15. package/dist/cli/__tests__/ultragoal.test.js +22 -0
  16. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  17. package/dist/cli/doctor.d.ts.map +1 -1
  18. package/dist/cli/doctor.js +66 -10
  19. package/dist/cli/doctor.js.map +1 -1
  20. package/dist/cli/index.d.ts +8 -2
  21. package/dist/cli/index.d.ts.map +1 -1
  22. package/dist/cli/index.js +17 -7
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/mcp-serve.d.ts.map +1 -1
  25. package/dist/cli/mcp-serve.js +4 -0
  26. package/dist/cli/mcp-serve.js.map +1 -1
  27. package/dist/cli/plugin-marketplace.d.ts +20 -0
  28. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  29. package/dist/cli/plugin-marketplace.js +115 -1
  30. package/dist/cli/plugin-marketplace.js.map +1 -1
  31. package/dist/cli/setup.d.ts.map +1 -1
  32. package/dist/cli/setup.js +29 -10
  33. package/dist/cli/setup.js.map +1 -1
  34. package/dist/cli/ultragoal.d.ts.map +1 -1
  35. package/dist/cli/ultragoal.js +7 -1
  36. package/dist/cli/ultragoal.js.map +1 -1
  37. package/dist/config/__tests__/codex-hooks.test.js +136 -9
  38. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  39. package/dist/config/__tests__/generator-idempotent.test.js +15 -0
  40. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  41. package/dist/config/codex-hooks.d.ts +13 -14
  42. package/dist/config/codex-hooks.d.ts.map +1 -1
  43. package/dist/config/codex-hooks.js +85 -7
  44. package/dist/config/codex-hooks.js.map +1 -1
  45. package/dist/config/generator.d.ts +4 -1
  46. package/dist/config/generator.d.ts.map +1 -1
  47. package/dist/config/generator.js +15 -9
  48. package/dist/config/generator.js.map +1 -1
  49. package/dist/config/omx-first-party-mcp.d.ts.map +1 -1
  50. package/dist/config/omx-first-party-mcp.js +7 -0
  51. package/dist/config/omx-first-party-mcp.js.map +1 -1
  52. package/dist/hooks/__tests__/design-skill.test.d.ts +2 -0
  53. package/dist/hooks/__tests__/design-skill.test.d.ts.map +1 -0
  54. package/dist/hooks/__tests__/design-skill.test.js +55 -0
  55. package/dist/hooks/__tests__/design-skill.test.js.map +1 -0
  56. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +265 -0
  57. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  58. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js +1 -1
  59. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -1
  60. package/dist/hooks/__tests__/skill-guidance-contract.test.js +41 -0
  61. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  62. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  63. package/dist/hooks/keyword-detector.js +5 -1
  64. package/dist/hooks/keyword-detector.js.map +1 -1
  65. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  66. package/dist/hooks/keyword-registry.js +2 -0
  67. package/dist/hooks/keyword-registry.js.map +1 -1
  68. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  69. package/dist/hooks/prompt-guidance-contract.js +47 -2
  70. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  71. package/dist/mcp/__tests__/bootstrap.test.js +3 -0
  72. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  73. package/dist/mcp/__tests__/hermes-bridge.test.d.ts +2 -0
  74. package/dist/mcp/__tests__/hermes-bridge.test.d.ts.map +1 -0
  75. package/dist/mcp/__tests__/hermes-bridge.test.js +374 -0
  76. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -0
  77. package/dist/mcp/__tests__/state-paths.test.js +96 -13
  78. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  79. package/dist/mcp/bootstrap.d.ts +1 -1
  80. package/dist/mcp/bootstrap.d.ts.map +1 -1
  81. package/dist/mcp/bootstrap.js +2 -0
  82. package/dist/mcp/bootstrap.js.map +1 -1
  83. package/dist/mcp/hermes-bridge.d.ts +81 -0
  84. package/dist/mcp/hermes-bridge.d.ts.map +1 -0
  85. package/dist/mcp/hermes-bridge.js +400 -0
  86. package/dist/mcp/hermes-bridge.js.map +1 -0
  87. package/dist/mcp/hermes-server.d.ts +269 -0
  88. package/dist/mcp/hermes-server.d.ts.map +1 -0
  89. package/dist/mcp/hermes-server.js +121 -0
  90. package/dist/mcp/hermes-server.js.map +1 -0
  91. package/dist/mcp/state-paths.d.ts.map +1 -1
  92. package/dist/mcp/state-paths.js +41 -9
  93. package/dist/mcp/state-paths.js.map +1 -1
  94. package/dist/modes/__tests__/base-tmux-pane.test.js +31 -1
  95. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
  96. package/dist/scripts/__tests__/codex-native-hook.test.js +187 -2
  97. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  98. package/dist/scripts/codex-native-hook.d.ts +1 -0
  99. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  100. package/dist/scripts/codex-native-hook.js +44 -17
  101. package/dist/scripts/codex-native-hook.js.map +1 -1
  102. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  103. package/dist/scripts/notify-hook/tmux-injection.js +91 -2
  104. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  105. package/dist/state/mode-state-context.d.ts +2 -0
  106. package/dist/state/mode-state-context.d.ts.map +1 -1
  107. package/dist/state/mode-state-context.js +21 -0
  108. package/dist/state/mode-state-context.js.map +1 -1
  109. package/dist/ultragoal/__tests__/artifacts.test.js +121 -0
  110. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  111. package/dist/ultragoal/artifacts.d.ts +9 -1
  112. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  113. package/dist/ultragoal/artifacts.js +105 -3
  114. package/dist/ultragoal/artifacts.js.map +1 -1
  115. package/dist/utils/__tests__/paths.test.js +31 -1
  116. package/dist/utils/__tests__/paths.test.js.map +1 -1
  117. package/dist/utils/paths.d.ts +6 -0
  118. package/dist/utils/paths.d.ts.map +1 -1
  119. package/dist/utils/paths.js +18 -0
  120. package/dist/utils/paths.js.map +1 -1
  121. package/dist/wiki/lifecycle.js +3 -3
  122. package/dist/wiki/lifecycle.js.map +1 -1
  123. package/package.json +1 -1
  124. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  125. package/plugins/oh-my-codex/.mcp.json +8 -0
  126. package/plugins/oh-my-codex/skills/design/SKILL.md +180 -0
  127. package/plugins/oh-my-codex/skills/skill/SKILL.md +2 -1
  128. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +161 -47
  129. package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +2 -2
  130. package/skills/design/SKILL.md +180 -0
  131. package/skills/frontend-ui-ux/SKILL.md +6 -2
  132. package/skills/skill/SKILL.md +2 -1
  133. package/skills/ultraqa/SKILL.md +161 -47
  134. package/skills/visual-ralph/SKILL.md +2 -2
  135. package/src/scripts/__tests__/codex-native-hook.test.ts +206 -1
  136. package/src/scripts/codex-native-hook.ts +45 -18
  137. package/src/scripts/notify-hook/tmux-injection.ts +110 -3
  138. package/templates/catalog-manifest.json +9 -2
@@ -0,0 +1,400 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { mkdir, open, readdir, readFile, realpath, stat, writeFile } from "node:fs/promises";
4
+ import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
5
+ import { injectExecFollowup } from "../exec/followup.js";
6
+ import { isSessionStateUsable, readUsableSessionState } from "../hooks/session.js";
7
+ import { getAllSessionScopedStateDirs, getBaseStateDir, listModeStateFilesWithScopePreference, resolveWorkingDirectoryForState, validateSessionId, } from "./state-paths.js";
8
+ import { resolveOmxCliEntryPath } from "../utils/paths.js";
9
+ import { safeJsonParse } from "../utils/safe-json.js";
10
+ const SAFE_ARTIFACT_PREFIXES = [
11
+ ".omx/plans/",
12
+ ".omx/specs/",
13
+ ".omx/goals/",
14
+ ".omx/context/",
15
+ ".omx/reports/",
16
+ ];
17
+ const DEFAULT_ARTIFACT_MAX_BYTES = 128_000;
18
+ const DEFAULT_TAIL_LINES = 80;
19
+ const MAX_TAIL_LINES = 500;
20
+ const MAX_TAIL_READ_BYTES = 256_000;
21
+ function jsonResult(data) {
22
+ return { ok: true, data };
23
+ }
24
+ function failure(code, error) {
25
+ return { ok: false, code, error };
26
+ }
27
+ function normalizeString(value, name, options = {}) {
28
+ if (value == null) {
29
+ if (options.required)
30
+ throw new Error(`${name} is required`);
31
+ return undefined;
32
+ }
33
+ if (typeof value !== "string")
34
+ throw new Error(`${name} must be a string`);
35
+ const trimmed = value.trim();
36
+ if (!trimmed && options.required)
37
+ throw new Error(`${name} must be non-empty`);
38
+ return trimmed || undefined;
39
+ }
40
+ function requireMutation(args) {
41
+ if (args.allow_mutation !== true) {
42
+ throw new Error("mutating Hermes bridge tools require allow_mutation: true");
43
+ }
44
+ }
45
+ function normalizePositiveInteger(value, fallback, max) {
46
+ if (value == null)
47
+ return fallback;
48
+ const parsed = typeof value === "number" ? value : Number.parseInt(String(value), 10);
49
+ if (!Number.isInteger(parsed) || parsed <= 0)
50
+ return fallback;
51
+ return Math.min(parsed, max);
52
+ }
53
+ async function readJsonFile(path) {
54
+ try {
55
+ return safeJsonParse(await readFile(path, "utf-8"), null);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function optionalBoolean(value) {
62
+ return typeof value === "boolean" ? value : undefined;
63
+ }
64
+ function optionalString(value) {
65
+ const normalized = typeof value === "string" ? value.trim() : "";
66
+ return normalized || undefined;
67
+ }
68
+ function projectSessionStatus(session) {
69
+ if (!session)
70
+ return null;
71
+ return {
72
+ session_id: session.session_id,
73
+ ...(optionalString(session.native_session_id) ? { native_session_id: optionalString(session.native_session_id) } : {}),
74
+ ...(optionalString(session.cwd) ? { cwd: optionalString(session.cwd) } : {}),
75
+ ...(optionalString(session.started_at) ? { started_at: optionalString(session.started_at) } : {}),
76
+ };
77
+ }
78
+ function projectModeStatus(mode, scope, state) {
79
+ const raw = state && typeof state === "object" && !Array.isArray(state)
80
+ ? state
81
+ : {};
82
+ return {
83
+ mode,
84
+ scope,
85
+ ...(optionalBoolean(raw.active) !== undefined ? { active: optionalBoolean(raw.active) } : {}),
86
+ ...(optionalString(raw.current_phase) ? { phase: optionalString(raw.current_phase) } : {}),
87
+ ...(optionalString(raw.phase) && !optionalString(raw.current_phase) ? { phase: optionalString(raw.phase) } : {}),
88
+ ...(optionalString(raw.run_outcome) ? { run_outcome: optionalString(raw.run_outcome) } : {}),
89
+ ...(optionalString(raw.lifecycle_outcome) ? { lifecycle_outcome: optionalString(raw.lifecycle_outcome) } : {}),
90
+ ...(optionalString(raw.updated_at) ? { updated_at: optionalString(raw.updated_at) } : {}),
91
+ ...(optionalString(raw.completed_at) ? { completed_at: optionalString(raw.completed_at) } : {}),
92
+ ...(optionalString(raw.error) ? { error: optionalString(raw.error) } : {}),
93
+ };
94
+ }
95
+ async function listModeNamesInStateDir(stateDir) {
96
+ if (!existsSync(stateDir))
97
+ return [];
98
+ const entries = await readdir(stateDir, { withFileTypes: true }).catch(() => []);
99
+ return entries
100
+ .filter((entry) => entry.isFile() && entry.name.endsWith("-state.json"))
101
+ .map((entry) => entry.name.slice(0, -"-state.json".length))
102
+ .sort();
103
+ }
104
+ function sessionIdFromSessionStateDir(path) {
105
+ const name = basename(path);
106
+ try {
107
+ return validateSessionId(name) ?? null;
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ async function summarizeCurrentSession(cwd, deps) {
114
+ const reader = deps.readUsableSessionState ?? readUsableSessionState;
115
+ const current = await reader(cwd);
116
+ if (!current || !isSessionStateUsable(current, cwd))
117
+ return null;
118
+ return {
119
+ session_id: current.session_id,
120
+ cwd: current.cwd,
121
+ started_at: current.started_at,
122
+ active: true,
123
+ source: "current",
124
+ modes: await listModeNamesInStateDir(join(getBaseStateDir(cwd), "sessions", current.session_id)),
125
+ };
126
+ }
127
+ export async function hermesListSessions(args, deps = {}) {
128
+ try {
129
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory"));
130
+ const sessions = new Map();
131
+ const current = await summarizeCurrentSession(cwd, deps);
132
+ if (current)
133
+ sessions.set(current.session_id, current);
134
+ for (const dir of await getAllSessionScopedStateDirs(cwd)) {
135
+ const sessionId = sessionIdFromSessionStateDir(dir);
136
+ if (!sessionId || sessions.has(sessionId))
137
+ continue;
138
+ sessions.set(sessionId, {
139
+ session_id: sessionId,
140
+ active: false,
141
+ source: "session_state_dir",
142
+ modes: await listModeNamesInStateDir(dir),
143
+ });
144
+ }
145
+ return jsonResult({ sessions: [...sessions.values()].sort((a, b) => a.session_id.localeCompare(b.session_id)) });
146
+ }
147
+ catch (error) {
148
+ return failure("invalid_input", error instanceof Error ? error.message : String(error));
149
+ }
150
+ }
151
+ export async function hermesReadStatus(args, deps = {}) {
152
+ try {
153
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory"));
154
+ const sessionId = validateSessionId(normalizeString(args.session_id, "session_id"));
155
+ const rawSession = sessionId ? null : await (deps.readUsableSessionState ?? readUsableSessionState)(cwd);
156
+ const session = projectSessionStatus(rawSession);
157
+ if (sessionId && !existsSync(join(getBaseStateDir(cwd), "sessions", sessionId))) {
158
+ return failure("no_session", `No OMX session state directory exists for ${sessionId}`);
159
+ }
160
+ const refs = await listModeStateFilesWithScopePreference(cwd, sessionId);
161
+ const modes = [];
162
+ for (const ref of refs) {
163
+ modes.push(projectModeStatus(ref.mode, ref.scope, await readJsonFile(ref.path)));
164
+ }
165
+ return jsonResult({ session, modes });
166
+ }
167
+ catch (error) {
168
+ return failure("invalid_input", error instanceof Error ? error.message : String(error));
169
+ }
170
+ }
171
+ export async function hermesSendPrompt(args, deps = {}) {
172
+ try {
173
+ requireMutation(args);
174
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory"));
175
+ const sessionId = normalizeString(args.session_id, "session_id", { required: true });
176
+ validateSessionId(sessionId);
177
+ const prompt = normalizeString(args.prompt, "prompt", { required: true });
178
+ const actor = normalizeString(args.actor, "actor") ?? "hermes-mcp";
179
+ const inject = deps.injectExecFollowup ?? injectExecFollowup;
180
+ const result = await inject({ cwd, sessionId, prompt, actor });
181
+ return jsonResult({
182
+ followup_id: result.queued.id,
183
+ session_id: result.queued.session_id,
184
+ queue_path: result.queuePath,
185
+ });
186
+ }
187
+ catch (error) {
188
+ const message = error instanceof Error ? error.message : String(error);
189
+ if (message.startsWith("job_not_input_accepting"))
190
+ return failure("prompt_not_accepted", message);
191
+ if (message.includes("allow_mutation"))
192
+ return failure("mutation_not_allowed", message);
193
+ return failure("invalid_input", message);
194
+ }
195
+ }
196
+ export async function hermesStartSession(args, deps = {}) {
197
+ try {
198
+ requireMutation(args);
199
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory", { required: true }));
200
+ const prompt = normalizeString(args.prompt, "prompt", { required: true });
201
+ const worktreeName = normalizeString(args.worktreeName, "worktreeName");
202
+ if (worktreeName && (!/^[A-Za-z0-9._/-]{1,128}$/.test(worktreeName) || worktreeName.includes("..") || worktreeName.startsWith("/"))) {
203
+ throw new Error("worktreeName must be a relative safe worktree name");
204
+ }
205
+ const command = (deps.resolveOmxCliEntryPath ?? resolveOmxCliEntryPath)({ cwd }) ?? "omx";
206
+ const launchArgs = ["--tmux", worktreeName ? `--worktree=${worktreeName}` : "--worktree", prompt];
207
+ const child = (deps.spawnProcess ?? spawn)(command, launchArgs, {
208
+ cwd,
209
+ detached: true,
210
+ stdio: "ignore",
211
+ env: { ...process.env, OMX_HERMES_MCP_BRIDGE: "1" },
212
+ });
213
+ child.unref();
214
+ if (!child.pid)
215
+ return failure("command_failed", "OMX session launcher did not report a pid");
216
+ return jsonResult({ pid: child.pid, command, args: launchArgs, workingDirectory: cwd });
217
+ }
218
+ catch (error) {
219
+ const message = error instanceof Error ? error.message : String(error);
220
+ if (message.includes("allow_mutation"))
221
+ return failure("mutation_not_allowed", message);
222
+ return failure("invalid_input", message);
223
+ }
224
+ }
225
+ function normalizeArtifactRelativePath(pathValue) {
226
+ const raw = normalizeString(pathValue, "path", { required: true });
227
+ if (isAbsolute(raw))
228
+ throw new Error("artifact path must be relative");
229
+ const normalized = raw.replace(/\\/g, "/").replace(/^\.\//, "");
230
+ if (normalized.includes("../") || normalized === ".." || normalized.includes("\0")) {
231
+ throw new Error("artifact path must not traverse directories");
232
+ }
233
+ if (!SAFE_ARTIFACT_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {
234
+ throw new Error(`artifact path must be under ${SAFE_ARTIFACT_PREFIXES.join(", ")}`);
235
+ }
236
+ return normalized;
237
+ }
238
+ function isInsideDirectory(parent, candidate) {
239
+ const rel = relative(parent, candidate);
240
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
241
+ }
242
+ async function resolveSafeArtifactPath(cwd, rel) {
243
+ const cwdRealPath = await realpath(cwd);
244
+ const full = resolve(cwd, rel);
245
+ const relativeToCwd = relative(resolve(cwd), full);
246
+ if (relativeToCwd.startsWith("..") || isAbsolute(relativeToCwd)) {
247
+ throw new Error("artifact resolved outside working directory");
248
+ }
249
+ let artifactRealPath;
250
+ try {
251
+ artifactRealPath = await realpath(full);
252
+ }
253
+ catch (error) {
254
+ if (error.code === "ENOENT")
255
+ throw new Error("artifact_missing");
256
+ throw error;
257
+ }
258
+ if (!isInsideDirectory(cwdRealPath, artifactRealPath)) {
259
+ throw new Error("artifact resolved outside working directory");
260
+ }
261
+ for (const prefix of SAFE_ARTIFACT_PREFIXES) {
262
+ const rootRealPath = await realpath(resolve(cwd, prefix)).catch(() => null);
263
+ if (rootRealPath && isInsideDirectory(rootRealPath, artifactRealPath))
264
+ return artifactRealPath;
265
+ }
266
+ throw new Error(`artifact path must be under ${SAFE_ARTIFACT_PREFIXES.join(", ")}`);
267
+ }
268
+ async function collectFiles(root, cwd, limit, out) {
269
+ if (out.length >= limit || !existsSync(root))
270
+ return;
271
+ const cwdRealPath = await realpath(cwd);
272
+ const rootRealPath = await realpath(root).catch(() => null);
273
+ if (!rootRealPath || !isInsideDirectory(cwdRealPath, rootRealPath))
274
+ return;
275
+ const entries = await readdir(rootRealPath, { withFileTypes: true }).catch(() => []);
276
+ for (const entry of entries) {
277
+ if (out.length >= limit)
278
+ return;
279
+ const full = join(rootRealPath, entry.name);
280
+ const logicalFull = join(root, entry.name);
281
+ if (entry.isDirectory()) {
282
+ await collectFiles(logicalFull, cwd, limit, out);
283
+ }
284
+ else if (entry.isFile()) {
285
+ const rel = relative(cwd, logicalFull).replace(/\\/g, "/");
286
+ try {
287
+ const info = await stat(full);
288
+ out.push({ path: rel, bytes: info.size });
289
+ }
290
+ catch {
291
+ // Ignore unreadable artifacts.
292
+ }
293
+ }
294
+ }
295
+ }
296
+ export async function hermesListArtifacts(args) {
297
+ try {
298
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory"));
299
+ const limit = normalizePositiveInteger(args.limit, 100, 500);
300
+ const artifacts = [];
301
+ for (const prefix of [".omx/plans", ".omx/specs", ".omx/goals", ".omx/context", ".omx/reports"]) {
302
+ await collectFiles(join(cwd, prefix), cwd, limit, artifacts);
303
+ }
304
+ return jsonResult({ artifacts: artifacts.sort((a, b) => a.path.localeCompare(b.path)) });
305
+ }
306
+ catch (error) {
307
+ return failure("invalid_input", error instanceof Error ? error.message : String(error));
308
+ }
309
+ }
310
+ export async function hermesReadArtifact(args) {
311
+ try {
312
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory"));
313
+ const rel = normalizeArtifactRelativePath(args.path);
314
+ const full = await resolveSafeArtifactPath(cwd, rel);
315
+ const maxBytes = normalizePositiveInteger(args.max_bytes, DEFAULT_ARTIFACT_MAX_BYTES, 1_000_000);
316
+ const handle = await open(full, "r");
317
+ try {
318
+ const buffer = Buffer.alloc(maxBytes + 1);
319
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
320
+ const truncated = bytesRead > maxBytes;
321
+ return jsonResult({ path: rel, content: buffer.subarray(0, Math.min(bytesRead, maxBytes)).toString("utf-8"), truncated });
322
+ }
323
+ finally {
324
+ await handle.close();
325
+ }
326
+ }
327
+ catch (error) {
328
+ const message = error instanceof Error ? error.message : String(error);
329
+ if (message === "artifact_missing")
330
+ return failure("artifact_missing", message);
331
+ if (message.includes("artifact path") || message.includes("outside working directory")) {
332
+ return failure("artifact_outside_safe_roots", message);
333
+ }
334
+ return failure("invalid_input", message);
335
+ }
336
+ }
337
+ export async function hermesReadTail(args) {
338
+ try {
339
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory"));
340
+ const lines = normalizePositiveInteger(args.lines, DEFAULT_TAIL_LINES, MAX_TAIL_LINES);
341
+ const path = join(cwd, ".omx", "logs", "session-history.jsonl");
342
+ if (!existsSync(path))
343
+ return jsonResult({ tail: [], path });
344
+ const cwdRealPath = await realpath(cwd);
345
+ const pathRealPath = await realpath(path);
346
+ if (!isInsideDirectory(cwdRealPath, pathRealPath)) {
347
+ throw new Error("session history resolved outside working directory");
348
+ }
349
+ const info = await stat(path);
350
+ const readBytes = Math.min(info.size, MAX_TAIL_READ_BYTES);
351
+ const start = Math.max(0, info.size - readBytes);
352
+ const handle = await open(pathRealPath, "r");
353
+ try {
354
+ const buffer = Buffer.alloc(readBytes);
355
+ const { bytesRead } = await handle.read(buffer, 0, readBytes, start);
356
+ const prefix = start > 0 ? "\n" : "";
357
+ const content = `${prefix}${buffer.subarray(0, bytesRead).toString("utf-8")}`;
358
+ return jsonResult({ tail: content.split(/\r?\n/).filter(Boolean).slice(-lines), path });
359
+ }
360
+ finally {
361
+ await handle.close();
362
+ }
363
+ }
364
+ catch (error) {
365
+ return failure("invalid_input", error instanceof Error ? error.message : String(error));
366
+ }
367
+ }
368
+ export async function hermesReportStatus(args, deps = {}) {
369
+ try {
370
+ requireMutation(args);
371
+ const cwd = resolveWorkingDirectoryForState(normalizeString(args.workingDirectory, "workingDirectory"));
372
+ const sessionId = validateSessionId(normalizeString(args.session_id, "session_id"));
373
+ const status = normalizeString(args.status, "status", { required: true });
374
+ if (!["running", "blocked", "failed", "complete"].includes(status)) {
375
+ throw new Error("status must be one of running, blocked, failed, complete");
376
+ }
377
+ const summary = normalizeString(args.summary, "summary");
378
+ const prUrl = normalizeString(args.pr_url, "pr_url");
379
+ const blocker = normalizeString(args.blocker, "blocker");
380
+ const report = {
381
+ status,
382
+ updated_at: (deps.now ?? (() => new Date()))().toISOString(),
383
+ ...(summary ? { summary } : {}),
384
+ ...(prUrl ? { pr_url: prUrl } : {}),
385
+ ...(blocker ? { blocker } : {}),
386
+ };
387
+ const stateDir = sessionId ? join(getBaseStateDir(cwd), "sessions", sessionId) : getBaseStateDir(cwd);
388
+ const path = join(stateDir, "hermes-coordination.json");
389
+ await mkdir(dirname(path), { recursive: true });
390
+ await writeFile(path, JSON.stringify(report, null, 2) + "\n");
391
+ return jsonResult({ path, report });
392
+ }
393
+ catch (error) {
394
+ const message = error instanceof Error ? error.message : String(error);
395
+ if (message.includes("allow_mutation"))
396
+ return failure("mutation_not_allowed", message);
397
+ return failure("invalid_input", message);
398
+ }
399
+ }
400
+ //# sourceMappingURL=hermes-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-bridge.js","sourceRoot":"","sources":["../../src/mcp/hermes-bridge.ts"],"names":[],"mappings":"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"}