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 +10 -0
- package/dist/commands/doctor.js +11 -1
- package/dist/session-diff.js +4 -1
- package/dist/subagents.js +9 -0
- package/extensions/omo-dag/package.json +1 -1
- package/package.json +1 -1
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
|
package/dist/commands/doctor.js
CHANGED
|
@@ -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,
|
|
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) {
|
package/dist/session-diff.js
CHANGED
|
@@ -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
|
-
|
|
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);
|