@ganglion/xacpx 0.23.0-beta.0 → 0.23.0-beta.2

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/dist/cli.js CHANGED
@@ -50322,6 +50322,7 @@ class AgentEndpointRegistry {
50322
50322
  }),
50323
50323
  node: ep.displayName ?? ep.nodeId,
50324
50324
  displayName: ep.displayName,
50325
+ sessionAlias: ep.sessionAlias,
50325
50326
  agent: ep.agent,
50326
50327
  workspace: ep.workspace,
50327
50328
  state: ep.state,
@@ -50352,6 +50353,7 @@ class AgentEndpointRegistry {
50352
50353
  activity: candidate.endpoint.activity,
50353
50354
  capabilities: candidate.endpoint.capabilities,
50354
50355
  ...candidate.endpoint.displayName ? { displayName: candidate.endpoint.displayName } : {},
50356
+ ...candidate.endpoint.sessionAlias ? { sessionAlias: candidate.endpoint.sessionAlias } : {},
50355
50357
  updatedAt: Date.now()
50356
50358
  }));
50357
50359
  }
@@ -50502,7 +50504,7 @@ class AgentEndpointRegistry {
50502
50504
  const matches = candidates.filter((candidate) => {
50503
50505
  if (displayNameFilter) {
50504
50506
  const candDisplayName = candidate.endpoint.displayName?.trim().toLowerCase();
50505
- const candAlias = candidate.runtime.kind === "logical" ? candidate.runtime.alias?.trim().toLowerCase() : undefined;
50507
+ const candAlias = candidate.endpoint.sessionAlias?.trim().toLowerCase() ?? (candidate.runtime.kind === "logical" ? candidate.runtime.alias?.trim().toLowerCase() : undefined);
50506
50508
  if (candDisplayName !== displayNameFilter && candAlias !== displayNameFilter) {
50507
50509
  return false;
50508
50510
  }
@@ -50593,7 +50595,8 @@ class AgentEndpointRegistry {
50593
50595
  nodeId: this.deps.nodeId,
50594
50596
  endpointId: session3.logical_session_id
50595
50597
  };
50596
- const displayName = session3.display_name || toDisplaySessionAlias(session3.alias);
50598
+ const sessionAlias = toDisplaySessionAlias(session3.alias);
50599
+ const displayName = session3.display_name || sessionAlias;
50597
50600
  const isRunning = this.deps.isSessionActive?.(session3.alias) ?? false;
50598
50601
  return {
50599
50602
  address,
@@ -50602,6 +50605,7 @@ class AgentEndpointRegistry {
50602
50605
  agent: session3.agent,
50603
50606
  workspace: session3.workspace,
50604
50607
  displayName,
50608
+ sessionAlias,
50605
50609
  state: isRunning ? "running" : "idle",
50606
50610
  activity: {
50607
50611
  status: isRunning ? "working" : "idle"
@@ -57747,7 +57751,7 @@ import { execFile as execFile2, spawn as spawn17 } from "node:child_process";
57747
57751
  import { promisify as promisify2 } from "node:util";
57748
57752
  import { homedir as homedir14 } from "node:os";
57749
57753
  import { readdir as readdir9, realpath as realpath6, stat as stat7, open as open10, readFile as readFile23, writeFile as writeFile9, mkdir as mkdir14, rename as fsRename, cp, rm as rm13 } from "node:fs/promises";
57750
- import { basename as basename7, dirname as dirname22, isAbsolute as isAbsolute7, relative as relative3, resolve as resolve7, sep as sep4 } from "node:path";
57754
+ import { basename as basename7, dirname as dirname22, isAbsolute as isAbsolute7, join as join33, relative as relative3, resolve as resolve7, sep as sep4 } from "node:path";
57751
57755
  import writeFileAtomic3 from "write-file-atomic";
57752
57756
  function expandHome2(p) {
57753
57757
  if (p === "~")
@@ -57756,6 +57760,44 @@ function expandHome2(p) {
57756
57760
  return resolve7(homedir14(), p.slice(2));
57757
57761
  return p;
57758
57762
  }
57763
+ async function browseDirectories(input) {
57764
+ const raw = (input ?? "").trim();
57765
+ const dir = resolve7(homedir14(), expandHome2(raw));
57766
+ const dirents = await readdir9(dir, { withFileTypes: true });
57767
+ const out = [];
57768
+ for (const d of dirents) {
57769
+ if (d.isDirectory()) {
57770
+ out.push({ name: d.name, path: join33(dir, d.name) });
57771
+ continue;
57772
+ }
57773
+ if (d.isSymbolicLink()) {
57774
+ try {
57775
+ if ((await stat7(join33(dir, d.name))).isDirectory()) {
57776
+ out.push({ name: d.name, path: join33(dir, d.name) });
57777
+ }
57778
+ } catch {}
57779
+ }
57780
+ }
57781
+ out.sort((a, b) => {
57782
+ const la = a.name.toLowerCase(), lb = b.name.toLowerCase();
57783
+ return la < lb ? -1 : la > lb ? 1 : a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
57784
+ });
57785
+ const truncated = out.length > MAX_BROWSE_ENTRIES;
57786
+ if (truncated)
57787
+ out.length = MAX_BROWSE_ENTRIES;
57788
+ const parent = dirname22(dir);
57789
+ return {
57790
+ path: dir,
57791
+ sep: sepChar(),
57792
+ parent: parent === dir ? null : parent,
57793
+ home: homedir14(),
57794
+ dirs: out,
57795
+ truncated
57796
+ };
57797
+ }
57798
+ function sepChar() {
57799
+ return sep4 === "\\" ? "\\" : "/";
57800
+ }
57759
57801
 
57760
57802
  class WorkspaceFs {
57761
57803
  listWorkspaces;
@@ -58354,7 +58396,7 @@ function globToRegExp(glob) {
58354
58396
  return /$^/;
58355
58397
  }
58356
58398
  }
58357
- var execFileAsync2, MAX_ENTRIES = 2000, FILE_READ_CAP, DIFF_CAP, GIT_MAX_BUFFER, SEARCH_MAX_RESULTS = 200, SEARCH_MAX_SCAN = 20000, SEARCH_SKIP_DIRS, SEARCH_CONTENT_MAX_HITS = 500, SEARCH_CONTENT_MAX_FILE, LINE_MATCH_CAP = 2000, DOWNLOAD_MAX, GIT_TIMEOUT_MS = 1e4, SEARCH_DEADLINE_MS = 4000, MIME_BY_EXT;
58399
+ var execFileAsync2, MAX_ENTRIES = 2000, FILE_READ_CAP, DIFF_CAP, GIT_MAX_BUFFER, SEARCH_MAX_RESULTS = 200, SEARCH_MAX_SCAN = 20000, SEARCH_SKIP_DIRS, SEARCH_CONTENT_MAX_HITS = 500, SEARCH_CONTENT_MAX_FILE, LINE_MATCH_CAP = 2000, DOWNLOAD_MAX, GIT_TIMEOUT_MS = 1e4, SEARCH_DEADLINE_MS = 4000, MAX_BROWSE_ENTRIES = 1000, MIME_BY_EXT;
58358
58400
  var init_workspace_fs = __esm(() => {
58359
58401
  execFileAsync2 = promisify2(execFile2);
58360
58402
  FILE_READ_CAP = 256 * 1024;
@@ -58389,7 +58431,7 @@ import { execFile as execFile3 } from "node:child_process";
58389
58431
  import { createHash as createHash11 } from "node:crypto";
58390
58432
  import { lstat, mkdir as mkdir15, realpath as realpath7 } from "node:fs/promises";
58391
58433
  import { homedir as homedir15 } from "node:os";
58392
- import { basename as basename8, isAbsolute as isAbsolute8, join as join33, resolve as resolve8, sep as sep5, win32 as win324 } from "node:path";
58434
+ import { basename as basename8, isAbsolute as isAbsolute8, join as join34, resolve as resolve8, sep as sep5, win32 as win324 } from "node:path";
58393
58435
  import { promisify as promisify3 } from "node:util";
58394
58436
  function expandHome3(path14) {
58395
58437
  if (path14 === "~")
@@ -58437,7 +58479,7 @@ class WorkspaceGit {
58437
58479
  writeTails = new Map;
58438
58480
  constructor(listWorkspaces, options = {}) {
58439
58481
  this.listWorkspaces = listWorkspaces;
58440
- this.managedWorktreesRoot = options.managedWorktreesRoot ?? join33(homedir15(), ".xacpx", "worktrees");
58482
+ this.managedWorktreesRoot = options.managedWorktreesRoot ?? join34(homedir15(), ".xacpx", "worktrees");
58441
58483
  this.platform = options.platform ?? process.platform;
58442
58484
  this.runGitOverride = options.runGit;
58443
58485
  }
@@ -58669,7 +58711,7 @@ class WorkspaceGit {
58669
58711
  const repoKey = `${basename8(top)}-${createHash11("sha256").update(commonDir).digest("hex").slice(0, 8)}`;
58670
58712
  const branchSlug = branch.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "branch";
58671
58713
  const branchKey = `${branchSlug}-${createHash11("sha256").update(branch).digest("hex").slice(0, 6)}`;
58672
- const repoDir = join33(managedRoot, repoKey);
58714
+ const repoDir = join34(managedRoot, repoKey);
58673
58715
  try {
58674
58716
  const existing = await lstat(repoDir);
58675
58717
  if (!existing.isDirectory() || existing.isSymbolicLink())
@@ -58682,7 +58724,7 @@ class WorkspaceGit {
58682
58724
  const realRepoDir = await realpath7(repoDir);
58683
58725
  if (!worktreePathIsWithin(managedRoot, realRepoDir, this.platform))
58684
58726
  throw new Error("worktree-path-unsafe");
58685
- const target = join33(realRepoDir, branchKey);
58727
+ const target = join34(realRepoDir, branchKey);
58686
58728
  try {
58687
58729
  await lstat(target);
58688
58730
  throw new Error("worktree-path-exists");
@@ -59531,6 +59573,9 @@ class ControlService {
59531
59573
  listDirectory(workspace3, path15) {
59532
59574
  return this.workspaceFs.listDirectory(workspace3, path15);
59533
59575
  }
59576
+ browseDirectories(path15) {
59577
+ return browseDirectories(path15);
59578
+ }
59534
59579
  readWorkspaceFile(workspace3, path15) {
59535
59580
  return this.workspaceFs.readFile(workspace3, path15);
59536
59581
  }
@@ -60906,9 +60951,9 @@ __export(exports_acpx_agent_overlay, {
60906
60951
  ACPX_MANAGED_ALIAS_PREFIX: () => ACPX_MANAGED_ALIAS_PREFIX
60907
60952
  });
60908
60953
  import { chmod as chmod5, readFile as readFile24, stat as stat9 } from "node:fs/promises";
60909
- import { join as join34 } from "node:path";
60954
+ import { join as join35 } from "node:path";
60910
60955
  function acpxConfigPath(home) {
60911
- return join34(home, ".acpx", "config.json");
60956
+ return join35(home, ".acpx", "config.json");
60912
60957
  }
60913
60958
  function computeAgentOverlayEntries(config4) {
60914
60959
  const entries = [];
@@ -61100,7 +61145,7 @@ __export(exports_main, {
61100
61145
  });
61101
61146
  import { randomUUID as randomUUID15 } from "node:crypto";
61102
61147
  import { homedir as homedir17 } from "node:os";
61103
- import { dirname as dirname24, join as join35 } from "node:path";
61148
+ import { dirname as dirname24, join as join36 } from "node:path";
61104
61149
  import { fileURLToPath as fileURLToPath7 } from "node:url";
61105
61150
  async function defaultProvisionAgentOverlays(config4, logger) {
61106
61151
  const entries = computeAgentOverlayEntries(config4);
@@ -61239,7 +61284,7 @@ async function buildApp(paths, deps = {}) {
61239
61284
  }
61240
61285
  });
61241
61286
  const runtimeRoot = dirname24(paths.configPath);
61242
- const messagingNodeIdentity = await new MessagingNodeIdentityStore(join35(runtimeRoot, "agent-messaging", "node.json")).loadOrCreate();
61287
+ const messagingNodeIdentity = await new MessagingNodeIdentityStore(join36(runtimeRoot, "agent-messaging", "node.json")).loadOrCreate();
61243
61288
  const sessions = new SessionService(config4, debouncedStateStore, state, {
61244
61289
  stateMutex,
61245
61290
  runtimeRoot
@@ -61306,7 +61351,7 @@ async function buildApp(paths, deps = {}) {
61306
61351
  sessionInitTimeoutMs: config4.transport.sessionInitTimeoutMs
61307
61352
  } : {},
61308
61353
  ...deps.orphanRegistry ? {
61309
- generationFilePath: join35(deps.orphanRegistry.root, "generation.json")
61354
+ generationFilePath: join36(deps.orphanRegistry.root, "generation.json")
61310
61355
  } : {},
61311
61356
  onMalformedLine: (line) => {
61312
61357
  logger.error("bridge.protocol.malformed_line", "dropped undecodable bridge output line", {
@@ -62087,8 +62132,8 @@ async function main() {
62087
62132
  }
62088
62133
  }
62089
62134
  async function prepareChannelMedia(configPath, config4) {
62090
- const runtimeDir = join35(dirname24(configPath), "runtime");
62091
- const mediaRootDir = join35(runtimeDir, "media");
62135
+ const runtimeDir = join36(dirname24(configPath), "runtime");
62136
+ const mediaRootDir = join36(runtimeDir, "media");
62092
62137
  const mediaStore = new RuntimeMediaStore({ rootDir: mediaRootDir });
62093
62138
  await mediaStore.cleanupExpired().catch((error2) => {
62094
62139
  console.error("[xacpx] media cleanup failed:", error2 instanceof Error ? error2.message : String(error2));
@@ -62101,12 +62146,12 @@ function resolveRuntimePaths() {
62101
62146
  if (!home) {
62102
62147
  throw new Error("Unable to resolve the current user home directory");
62103
62148
  }
62104
- const configPath = coreEnv("CONFIG") ?? join35(coreHomeDir(home), "config.json");
62105
- const runtimeDir = join35(dirname24(configPath), "runtime");
62149
+ const configPath = coreEnv("CONFIG") ?? join36(coreHomeDir(home), "config.json");
62150
+ const runtimeDir = join36(dirname24(configPath), "runtime");
62106
62151
  return {
62107
62152
  configPath,
62108
- statePath: coreEnv("STATE") ?? join35(coreHomeDir(home), "state.json"),
62109
- perfLogPath: join35(runtimeDir, "perf.log"),
62153
+ statePath: coreEnv("STATE") ?? join36(coreHomeDir(home), "state.json"),
62154
+ perfLogPath: join36(runtimeDir, "perf.log"),
62110
62155
  orchestrationSocketPath: coreEnv("ORCHESTRATION_SOCKET") ?? resolveDaemonOrchestrationSocketPath(runtimeDir)
62111
62156
  };
62112
62157
  }
@@ -62118,13 +62163,13 @@ function resolveBridgeEntryPath() {
62118
62163
  }
62119
62164
  function resolveAppLogPath(configPath) {
62120
62165
  const rootDir = dirname24(configPath);
62121
- const runtimeDir = join35(rootDir, "runtime");
62122
- return join35(runtimeDir, "app.log");
62166
+ const runtimeDir = join36(rootDir, "runtime");
62167
+ return join36(runtimeDir, "app.log");
62123
62168
  }
62124
62169
  function resolvePerfLogPath(configPath) {
62125
62170
  const rootDir = dirname24(configPath);
62126
- const runtimeDir = join35(rootDir, "runtime");
62127
- return join35(runtimeDir, "perf.log");
62171
+ const runtimeDir = join36(rootDir, "runtime");
62172
+ return join36(runtimeDir, "perf.log");
62128
62173
  }
62129
62174
  function resolveOrchestrationSocketPathFromConfigPath(configPath) {
62130
62175
  const runtimeDir = resolveRuntimeDirFromConfigPath(configPath);
@@ -62806,7 +62851,7 @@ var init_config_check = __esm(() => {
62806
62851
  import { readdir as readdir11, readFile as readFile25, rm as rm15 } from "node:fs/promises";
62807
62852
  import { fileURLToPath as fileURLToPath8 } from "node:url";
62808
62853
  import { homedir as homedir18 } from "node:os";
62809
- import { join as join36 } from "node:path";
62854
+ import { join as join37 } from "node:path";
62810
62855
  async function checkDaemon(options = {}) {
62811
62856
  const home = options.home ?? process.env.HOME ?? homedir18();
62812
62857
  const runtimeDir = options.configPath ? resolveRuntimeDirFromConfigPath(options.configPath) : undefined;
@@ -62908,7 +62953,7 @@ async function detectStaleConsumerLockFix(runtimeDir, deps) {
62908
62953
  if (fileName === RUNTIME_CONSUMER_LOCK_FILE || !fileName.endsWith(CONSUMER_LOCK_SUFFIX2)) {
62909
62954
  continue;
62910
62955
  }
62911
- const lockPath = join36(runtimeDir, fileName);
62956
+ const lockPath = join37(runtimeDir, fileName);
62912
62957
  const lock2 = await deps.readConsumerLock(lockPath);
62913
62958
  if (lock2 && !deps.isProcessRunning(lock2.pid)) {
62914
62959
  stalePaths.push(lockPath);
@@ -62973,7 +63018,7 @@ var init_daemon_check = __esm(() => {
62973
63018
 
62974
63019
  // src/doctor/checks/logs-check.ts
62975
63020
  import { stat as stat10, readdir as readdir12 } from "node:fs/promises";
62976
- import { basename as basename10, join as join37 } from "node:path";
63021
+ import { basename as basename10, join as join38 } from "node:path";
62977
63022
  import { homedir as homedir19 } from "node:os";
62978
63023
  async function checkLogs(options = {}) {
62979
63024
  const home = options.home ?? process.env.HOME ?? homedir19();
@@ -63008,7 +63053,7 @@ async function checkLogs(options = {}) {
63008
63053
  const matched = entries.filter((entry) => isTrackedLogName(entry, tracked));
63009
63054
  const files = [];
63010
63055
  for (const name of matched) {
63011
- const path16 = join37(paths.runtimeDir, name);
63056
+ const path16 = join38(paths.runtimeDir, name);
63012
63057
  try {
63013
63058
  const fileStat = await probe.stat(path16);
63014
63059
  if (fileStat.isDirectory()) {
@@ -64039,7 +64084,7 @@ var init_render_doctor = __esm(() => {
64039
64084
 
64040
64085
  // src/doctor/doctor.ts
64041
64086
  import { homedir as homedir22 } from "node:os";
64042
- import { join as join38 } from "node:path";
64087
+ import { join as join39 } from "node:path";
64043
64088
  async function runDoctor(options = {}, deps = {}) {
64044
64089
  const home = deps.home ?? process.env.HOME ?? homedir22();
64045
64090
  const runtimePaths = resolveDoctorRuntimePaths(home, deps.resolveRuntimePaths);
@@ -64200,8 +64245,8 @@ function resolveDoctorRuntimePaths(home, resolver) {
64200
64245
  return resolveRuntimePaths();
64201
64246
  }
64202
64247
  return {
64203
- configPath: join38(coreHomeDir(home), "config.json"),
64204
- statePath: join38(coreHomeDir(home), "state.json")
64248
+ configPath: join39(coreHomeDir(home), "config.json"),
64249
+ statePath: join39(coreHomeDir(home), "state.json")
64205
64250
  };
64206
64251
  }
64207
64252
  function depsUseExplicitRuntimeOverrides() {
@@ -64404,7 +64449,7 @@ __export(exports_cli, {
64404
64449
  });
64405
64450
  import { randomUUID as randomUUID16 } from "node:crypto";
64406
64451
  import { homedir as homedir23 } from "node:os";
64407
- import { dirname as dirname26, join as join39, sep as sep6 } from "node:path";
64452
+ import { dirname as dirname26, join as join40, sep as sep6 } from "node:path";
64408
64453
  import { fileURLToPath as fileURLToPath9 } from "node:url";
64409
64454
  async function prepareMcpCoordinatorStartup(input) {
64410
64455
  const coordinatorSession = input.coordinatorSession.trim();
@@ -65090,14 +65135,14 @@ function createAdapterCliDeps(input) {
65090
65135
  const runtimeRoot = dirname26(resolveConfigPathForCurrentEnv());
65091
65136
  let orphanRegistry;
65092
65137
  if (process.platform === "win32") {
65093
- orphanRegistry = new OrphanRegistry(join39(runtimeRoot, "runtime"));
65138
+ orphanRegistry = new OrphanRegistry(join40(runtimeRoot, "runtime"));
65094
65139
  await orphanRegistry.initialize();
65095
65140
  }
65096
65141
  const [result] = await garbageCollectAdapterReleases({
65097
65142
  runtimeRoot,
65098
65143
  id,
65099
65144
  releaseId,
65100
- statePath: coreEnv("STATE") ?? join39(runtimeRoot, "state.json"),
65145
+ statePath: coreEnv("STATE") ?? join40(runtimeRoot, "state.json"),
65101
65146
  ...orphanRegistry ? { orphanRegistry } : {}
65102
65147
  });
65103
65148
  return result.disposition;
@@ -65516,7 +65561,7 @@ function safeDaemonLogPaths() {
65516
65561
  const configPath = resolveConfigPathForCurrentEnv();
65517
65562
  const paths = resolveDaemonPathsForCurrentConfig();
65518
65563
  return {
65519
- appLog: join39(dirname26(configPath), "runtime", "app.log"),
65564
+ appLog: join40(dirname26(configPath), "runtime", "app.log"),
65520
65565
  stderrLog: paths.stderrLog
65521
65566
  };
65522
65567
  } catch {
@@ -8,7 +8,7 @@ import type { CancelTaskInput, OrchestrationService, OrchestrationTaskFilter } f
8
8
  import type { OrchestrationTaskRecord } from "../orchestration/orchestration-types";
9
9
  import type { ControlEventBus } from "./control-event-bus";
10
10
  import type { AgentCatalogEntry } from "../config/agent-catalog";
11
- import { type DirListing, type FileContent, type SearchOptions, type SearchResult, type WorkspaceDiff } from "./workspace-fs";
11
+ import { type BrowseDirsResult, type DirListing, type FileContent, type SearchOptions, type SearchResult, type WorkspaceDiff } from "./workspace-fs";
12
12
  import { type GitCheckoutOptions, type GitCommitResult, type GitPushOptions, type GitStatus, type GitWorktreeCreateOptions, type GitWorktreeCreateResult } from "./workspace-git";
13
13
  import type { AgentEndpointView, AgentMessageTraceRecord } from "../orchestration/agent-messaging-types";
14
14
  import type { PromptAttachmentRef } from "@ganglion/xacpx-relay-protocol";
@@ -226,6 +226,7 @@ export declare class ControlService {
226
226
  constructor(deps: ControlServiceDeps);
227
227
  private readonly workspaceFs;
228
228
  listDirectory(workspace: string, path?: string): Promise<DirListing>;
229
+ browseDirectories(path?: string): Promise<BrowseDirsResult>;
229
230
  readWorkspaceFile(workspace: string, path: string): Promise<FileContent>;
230
231
  workspaceGitDiff(workspace: string, path?: string): Promise<WorkspaceDiff>;
231
232
  workspaceGitStatus(workspace: string): Promise<GitStatus>;
@@ -1,3 +1,6 @@
1
+ /** Expand a leading `~` to the home directory (workspace cwds are often configured
2
+ * as `~` or `~/path`). */
3
+ export declare function expandHome(p: string): string;
1
4
  export interface FsEntry {
2
5
  name: string;
3
6
  type: "dir" | "file";
@@ -67,6 +70,18 @@ export interface WorkspaceDiff {
67
70
  linked: boolean;
68
71
  };
69
72
  }
73
+ export interface BrowseDirsResult {
74
+ path: string;
75
+ sep: "/" | "\\";
76
+ parent: string | null;
77
+ home: string;
78
+ dirs: Array<{
79
+ name: string;
80
+ path: string;
81
+ }>;
82
+ truncated: boolean;
83
+ }
84
+ export declare function browseDirectories(input?: string): Promise<BrowseDirsResult>;
70
85
  export interface WorkspaceRef {
71
86
  name: string;
72
87
  cwd: string;
@@ -25,6 +25,7 @@ export interface AgentEndpointView {
25
25
  agent: string;
26
26
  workspace?: string;
27
27
  displayName?: string;
28
+ sessionAlias?: string;
28
29
  state: "idle" | "running" | "unreachable";
29
30
  activity: AgentActivityView;
30
31
  capabilities: AgentCapabilities;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ganglion/xacpx",
3
- "version": "0.23.0-beta.0",
3
+ "version": "0.23.0-beta.2",
4
4
  "description": "随时随地通过聊天频道(微信 / 飞书 / 元宝等)远程控制 `acpx` 上的 Claude Code、Codex 等 Agents。",
5
5
  "keywords": [
6
6
  "acpx",