antechamber 0.2.16 → 0.2.17

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/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ and this project uses [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.17] - 2026-10-17
11
+
12
+ ### Fixed
13
+
14
+ - Keep files in the session diff when the agent reports their absolute path through a symlinked workspace, such as
15
+ a macOS temporary directory under `/var`.
16
+ - Make `antechamber doctor` skip running-server records whose process has exited on macOS, not only on Linux.
17
+ - Stop a fast subagent task from staying busy on macOS when its task record changes before the file watcher is
18
+ live.
19
+
10
20
  ## [0.2.16] - 2026-10-17
11
21
 
12
22
  ### Fixed
@@ -7,6 +7,16 @@ import { readRunningServers } from "../running-servers.js";
7
7
  import { isNewerVersion } from "../self-update.js";
8
8
  import { ADAPTER_VERSION } from "../version.js";
9
9
  import { autoUpdateLauncherPath, autoUpdateLauncherTarget, createContext, isPackageBinary, readSettings, resolveBinary, settingsPath, } from "./context.js";
10
+ /** EPERM means the process exists under another user. */
11
+ function processAlive(pid) {
12
+ try {
13
+ process.kill(pid, 0);
14
+ return true;
15
+ }
16
+ catch (error) {
17
+ return error instanceof Error && "code" in error && error.code === "EPERM";
18
+ }
19
+ }
10
20
  /** Checks capabilities with access/stat only, never creating state or config files. */
11
21
  export function doctor(options = {}, ctx = createContext(), latestVersion) {
12
22
  const checks = [];
@@ -53,7 +63,7 @@ export function doctor(options = {}, ctx = createContext(), latestVersion) {
53
63
  else
54
64
  add("version", "PASS", ADAPTER_VERSION);
55
65
  // A released fix is live only once OpenChamber relaunches the adapter.
56
- const running = readRunningServers(stateDir, ctx.fs, (pid) => ctx.platform === "linux" ? ctx.fs.existsSync(`/proc/${pid}`) : true);
66
+ const running = readRunningServers(stateDir, ctx.fs, processAlive);
57
67
  if (running.length === 0)
58
68
  add("running", "INFO", `no running antechamber server recorded in ${stateDir}`);
59
69
  for (const server of running) {
@@ -26,7 +26,10 @@ async function git(directory, args) {
26
26
  /** A removed file may be absent, but neither traversal nor symlinks may escape. */
27
27
  async function confinedFile(directory, path) {
28
28
  const root = await realpath(directory);
29
- const absolute = resolve(root, path);
29
+ // Map paths spelled through a symlinked workspace (macOS /var -> /private/var) onto the canonical root.
30
+ const lexical = relative(resolve(directory), resolve(directory, path));
31
+ const insideLexical = lexical !== ".." && !lexical.startsWith(`..${sep}`) && !isAbsolute(lexical);
32
+ const absolute = insideLexical ? resolve(root, lexical) : resolve(root, path);
30
33
  const rel = relative(root, absolute);
31
34
  if (!rel || rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel))
32
35
  return undefined;
package/dist/subagents.js CHANGED
@@ -6,6 +6,9 @@ import { syncSessionCost } from "./pi-event-translation.js";
6
6
  import { ocIdFor, SessionPersistenceError } from "./session-store.js";
7
7
  import { mapTool, resultText, toolMappers } from "./tool-map.js";
8
8
  import { ADAPTER_VERSION } from "./version.js";
9
+ // macOS watches directories through FSEvents, which goes live asynchronously after
10
+ // watch() returns; a task record replaced inside that window raises no event.
11
+ const FSEVENTS_STARTUP_RECHECK_MS = 1_000;
9
12
  function record(value) {
10
13
  return value !== null && typeof value === "object" && !Array.isArray(value);
11
14
  }
@@ -506,6 +509,12 @@ export class SubagentBridge {
506
509
  child.watchers.delete(dir);
507
510
  });
508
511
  child.watchers.set(dir, watcher);
512
+ if (process.platform === "darwin") {
513
+ setTimeout(() => {
514
+ if (child.watchers.get(dir) === watcher)
515
+ this.refresh(child, true);
516
+ }, FSEVENTS_STARTUP_RECHECK_MS).unref();
517
+ }
509
518
  }
510
519
  refresh(child, publish, useRecord = true) {
511
520
  const archive = this.archive(child.task.id);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antechamber-omo-graph",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "description": "OpenChamber extension: live, interactive graph of the OmO sub-agents behind the current session",
5
5
  "private": true,
6
6
  "type": "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antechamber",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "description": "OpenCode-compatible HTTP/SSE server that lets OpenChamber drive the pi coding agent (and OmO) over RPC",
5
5
  "type": "module",
6
6
  "license": "MIT",