@clawos-dev/clawd 0.2.143-beta.305.c9c21d1 → 0.2.143

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 (2) hide show
  1. package/dist/cli.cjs +81 -62
  2. package/package.json +1 -1
package/dist/cli.cjs CHANGED
@@ -11406,12 +11406,12 @@ function readCurrentContent(filePath) {
11406
11406
  return null;
11407
11407
  }
11408
11408
  }
11409
- var import_node_fs8, import_node_os4, import_node_path8, TASK_NOTIFICATION_RE, TASK_ID_RE, TOOL_USE_ID_RE, SLASH_COMMAND_RE, LOCAL_COMMAND_RE, SYSTEM_REMINDER_RE, OPENSPEC_BLOCK_RE, SKILL_HINT_RE, ATTACHMENT_SILENT_SUBTYPES, ClaudeHistoryReader;
11409
+ var import_node_fs8, import_node_os5, import_node_path8, TASK_NOTIFICATION_RE, TASK_ID_RE, TOOL_USE_ID_RE, SLASH_COMMAND_RE, LOCAL_COMMAND_RE, SYSTEM_REMINDER_RE, OPENSPEC_BLOCK_RE, SKILL_HINT_RE, ATTACHMENT_SILENT_SUBTYPES, ClaudeHistoryReader;
11410
11410
  var init_claude_history = __esm({
11411
11411
  "src/tools/claude-history.ts"() {
11412
11412
  "use strict";
11413
11413
  import_node_fs8 = __toESM(require("fs"), 1);
11414
- import_node_os4 = __toESM(require("os"), 1);
11414
+ import_node_os5 = __toESM(require("os"), 1);
11415
11415
  import_node_path8 = __toESM(require("path"), 1);
11416
11416
  init_lib();
11417
11417
  init_tool_result_extra();
@@ -11436,7 +11436,7 @@ var init_claude_history = __esm({
11436
11436
  // 每次 user 提交前 trackEdit 拷一份,作为 rewind 回退目标
11437
11437
  fileHistoryRoot;
11438
11438
  constructor(opts = {}) {
11439
- const base = opts.baseDir ?? import_node_path8.default.join(import_node_os4.default.homedir(), ".claude");
11439
+ const base = opts.baseDir ?? import_node_path8.default.join(import_node_os5.default.homedir(), ".claude");
11440
11440
  this.projectsRoot = import_node_path8.default.join(base, "projects");
11441
11441
  this.fileHistoryRoot = import_node_path8.default.join(base, "file-history");
11442
11442
  }
@@ -30901,7 +30901,7 @@ var init_wire = __esm({
30901
30901
  // src/run-case/controller.ts
30902
30902
  async function runController(opts) {
30903
30903
  const now = opts.now ?? Date.now;
30904
- const cwd = opts.cwd ?? (0, import_node_fs36.mkdtempSync)(import_node_path48.default.join(import_node_os20.default.tmpdir(), "clawd-runcase-"));
30904
+ const cwd = opts.cwd ?? (0, import_node_fs36.mkdtempSync)(import_node_path48.default.join(import_node_os21.default.tmpdir(), "clawd-runcase-"));
30905
30905
  const ownsCwd = opts.cwd === void 0;
30906
30906
  const recorder = startRunCaseRecorder({ recordPath: opts.record, now });
30907
30907
  const spawnCtx = { cwd };
@@ -31068,12 +31068,12 @@ async function runController(opts) {
31068
31068
  }
31069
31069
  return exitCode ?? 0;
31070
31070
  }
31071
- var import_node_fs36, import_node_os20, import_node_path48;
31071
+ var import_node_fs36, import_node_os21, import_node_path48;
31072
31072
  var init_controller = __esm({
31073
31073
  "src/run-case/controller.ts"() {
31074
31074
  "use strict";
31075
31075
  import_node_fs36 = require("fs");
31076
- import_node_os20 = __toESM(require("os"), 1);
31076
+ import_node_os21 = __toESM(require("os"), 1);
31077
31077
  import_node_path48 = __toESM(require("path"), 1);
31078
31078
  init_claude();
31079
31079
  init_stdout_splitter();
@@ -31338,7 +31338,7 @@ Env (advanced):
31338
31338
  // src/index.ts
31339
31339
  var import_node_path46 = __toESM(require("path"), 1);
31340
31340
  var import_node_fs34 = __toESM(require("fs"), 1);
31341
- var import_node_os19 = __toESM(require("os"), 1);
31341
+ var import_node_os20 = __toESM(require("os"), 1);
31342
31342
 
31343
31343
  // ../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/stringify.js
31344
31344
  var byteToHex = [];
@@ -31946,12 +31946,17 @@ var SessionStoreFactory = class {
31946
31946
  // src/session/manager.ts
31947
31947
  var import_node_fs6 = __toESM(require("fs"), 1);
31948
31948
  var import_node_path6 = __toESM(require("path"), 1);
31949
- var import_node_os2 = __toESM(require("os"), 1);
31949
+ var import_node_os3 = __toESM(require("os"), 1);
31950
31950
  init_protocol();
31951
31951
 
31952
31952
  // src/tools/guest-settings.ts
31953
+ var import_node_os2 = require("os");
31953
31954
  var FORCED_DENY_READ = ["~/"];
31954
- var FORCED_TOOL_DENY = ["Edit(./**)"];
31955
+ function personaEditDeny(personaDir) {
31956
+ const home = (0, import_node_os2.homedir)();
31957
+ const rel = personaDir.startsWith(`${home}/`) ? `~${personaDir.slice(home.length)}` : personaDir;
31958
+ return `Edit(${rel}/**)`;
31959
+ }
31955
31960
  function unionArr(a, b2) {
31956
31961
  const out = [...a ?? []];
31957
31962
  for (const x of b2) if (!out.includes(x)) out.push(x);
@@ -31965,9 +31970,9 @@ function isGuestSettingsLike(v2) {
31965
31970
  function buildGuestSettingsV1() {
31966
31971
  return {
31967
31972
  permissions: {
31968
- defaultMode: "dontAsk",
31969
- deny: [...FORCED_TOOL_DENY]
31970
- // 保留 persona 限制:挡 CC 工具改/读 persona(cwd=persona)
31973
+ defaultMode: "dontAsk"
31974
+ // persona-dir 的 Edit deny 由 composeGuestSandbox 按 spawnCwd 注入 '~/<persona>/**' 绝对规则
31975
+ // (base 不放相对 './'——会随 getCwd 漂移误拦项目,见 personaEditDeny)。
31971
31976
  },
31972
31977
  sandbox: {
31973
31978
  enabled: true,
@@ -32015,7 +32020,6 @@ function composeGuestSandbox(base, userWorkDir, spawnCwd) {
32015
32020
  s.sandbox.allowUnsandboxedCommands = false;
32016
32021
  fsv.denyRead = unionArr(fsv.denyRead, FORCED_DENY_READ);
32017
32022
  fsv.denyWrite = unionArr((fsv.denyWrite ?? []).filter((p2) => p2 !== "~/"), [spawnCwd]);
32018
- s.permissions.deny = unionArr(s.permissions.deny, FORCED_TOOL_DENY);
32019
32023
  fsv.allowRead = unionArr(fsv.allowRead, [userWorkDir]);
32020
32024
  fsv.allowWrite = unionArr(fsv.allowWrite, [userWorkDir]);
32021
32025
  return s;
@@ -33694,7 +33698,7 @@ var SessionManager = class {
33694
33698
  const base = this.deps.personaStore?.readSandboxSettings(scope.personaId) ?? null;
33695
33699
  const settings = composeGuestSandbox(base, subSessionMeta.userWorkDir, file.cwd);
33696
33700
  subSessionMeta.extraSettings = JSON.stringify(settings);
33697
- const home = import_node_os2.default.homedir();
33701
+ const home = import_node_os3.default.homedir();
33698
33702
  const expand = (p2) => p2 === "~" ? home : p2.startsWith("~/") ? import_node_path6.default.join(home, p2.slice(2)) : p2;
33699
33703
  const codexCfg = this.deps.personaStore?.readCodexSandboxSettings(scope.personaId) ?? null;
33700
33704
  subSessionMeta.codexSandbox = {
@@ -34968,10 +34972,10 @@ var PersonaStore = class {
34968
34972
  return path9.join(this.personaDir(personaId), "AGENTS.md");
34969
34973
  }
34970
34974
  /**
34971
- * persona 级 sandbox 模板落盘路径 —— 故意放 `.clawd/` 而非 `.claude/`,让 CC 的 project
34975
+ * persona 级 sandbox base 落盘路径 —— 故意放 `.clawd/` 而非 `.claude/`,让 CC 的 project
34972
34976
  * source 自动发现扫不到(owner `--setting-sources user,project,local` 不会顺手带进来)。
34973
- * 这份是 **UI 展示用模板**(readSandboxSettings);guest 真正加载的沙箱文件由 manager
34974
- * spawn 前 per-guest 动态拼到各自 session 目录(含本 guest userWorkDir carve),不是这份。
34977
+ * 这份是 guest 沙箱的 **base 真源**(manager compose 读它当 base);guest 实际加载的是 manager
34978
+ * spawn 前 per-guest 动态拼到各自 session 目录的那份(base + 强制底座 + 本 guest userWorkDir carve)。
34975
34979
  */
34976
34980
  sandboxSettingsPath(personaId) {
34977
34981
  return path9.join(this.personaDir(personaId), ".clawd", "sandbox-settings.json");
@@ -34981,10 +34985,7 @@ var PersonaStore = class {
34981
34985
  fs7.mkdirSync(path9.join(dir, ".clawd"), { recursive: true });
34982
34986
  this.atomicWrite(this.claudeMdPath(persona.personaId), personality);
34983
34987
  this.atomicWrite(this.agentsMdPath(persona.personaId), personality);
34984
- this.atomicWrite(
34985
- this.sandboxSettingsPath(persona.personaId),
34986
- JSON.stringify(buildGuestSettingsV1(), null, 2)
34987
- );
34988
+ this.writeSandboxSettings(persona.personaId, buildGuestSettingsV1());
34988
34989
  this.atomicWrite(this.metaPath(persona.personaId), JSON.stringify(persona, null, 2));
34989
34990
  }
34990
34991
  writePersonality(personaId, personality) {
@@ -35007,15 +35008,24 @@ var PersonaStore = class {
35007
35008
  }
35008
35009
  /**
35009
35010
  * 覆盖式写 persona 级 sandbox 配置(seed 给有 profile 的 persona 写 base⊕profile;owner 之后可手编)。
35010
- * 这份是 guest 沙箱的 **base 真源**:manager spawn 时 composeGuestSandbox 读它 + 叠强制底座
35011
- * (enabled/denyRead/persona-deny owner 削弱不了)+ 注入本 guest userWorkDir → 写 per-guest 文件给 CC。
35011
+ * 这份是 guest 沙箱的 **base 真源**:manager spawn 时 composeGuestSandbox 读它 + 叠 sandbox 强制底座
35012
+ * (enabled/denyRead/denyWrite/userWorkDir owner 削弱不了)→ 写 per-guest 文件给 CC。
35013
+ * 写入时强制注入本 persona 的 Edit-deny('~/<persona>/**' 按实际 persona dir 算)+ 剥掉历史相对 'Edit(./**)',
35014
+ * 让落盘 base 就是 source of truth(compose 不再运行时替换 permission deny)。
35012
35015
  */
35013
35016
  writeSandboxSettings(personaId, settings) {
35014
35017
  this.atomicWrite(
35015
35018
  this.sandboxSettingsPath(personaId),
35016
- JSON.stringify(settings, null, 2)
35019
+ JSON.stringify(this.injectPersonaEditDeny(personaId, settings), null, 2)
35017
35020
  );
35018
35021
  }
35022
+ /** 把 persona Edit-deny(绝对 '~/<persona>/**')并进 settings.permissions.deny,剥掉历史相对 'Edit(./**)'。 */
35023
+ injectPersonaEditDeny(personaId, settings) {
35024
+ const s = settings;
35025
+ const rule = personaEditDeny(this.personaDir(personaId));
35026
+ const prev = (s.permissions?.deny ?? []).filter((r) => r !== "Edit(./**)" && r !== rule);
35027
+ return { ...s, permissions: { ...s.permissions ?? {}, deny: [...prev, rule] } };
35028
+ }
35019
35029
  codexSandboxSettingsPath(personaId) {
35020
35030
  return path9.join(this.personaDir(personaId), ".clawd", "codex-sandbox.json");
35021
35031
  }
@@ -35174,7 +35184,7 @@ var import_node_crypto3 = __toESM(require("crypto"), 1);
35174
35184
 
35175
35185
  // src/skills/scanner.ts
35176
35186
  var import_node_fs7 = __toESM(require("fs"), 1);
35177
- var import_node_os3 = __toESM(require("os"), 1);
35187
+ var import_node_os4 = __toESM(require("os"), 1);
35178
35188
  var import_node_path7 = __toESM(require("path"), 1);
35179
35189
 
35180
35190
  // src/skills/frontmatter.ts
@@ -35408,7 +35418,7 @@ var SkillsScanner = class {
35408
35418
  home;
35409
35419
  extraPluginRoots;
35410
35420
  constructor(opts = {}) {
35411
- this.home = opts.home ?? import_node_os3.default.homedir();
35421
+ this.home = opts.home ?? import_node_os4.default.homedir();
35412
35422
  this.extraPluginRoots = opts.extraPluginRoots ?? [];
35413
35423
  }
35414
35424
  /**
@@ -35595,8 +35605,7 @@ var DEFAULT_PERSONAS = [
35595
35605
  // defaultMode bypassPermissions:开发流频繁用工具,免逐次审批;deny 规则仍生效、OS 沙箱照管(已验证)。
35596
35606
  permissions: {
35597
35607
  defaultMode: "bypassPermissions",
35598
- allow: ["Read", "Edit", "Write", "Glob", "Grep", "WebFetch", "WebSearch"],
35599
- deny: ["Read(./.secrets/**)"]
35608
+ allow: ["Read", "Edit", "Write", "Glob", "Grep", "WebFetch", "WebSearch"]
35600
35609
  },
35601
35610
  sandbox: {
35602
35611
  filesystem: {
@@ -35631,12 +35640,12 @@ var DEFAULT_PERSONAS = [
35631
35640
  iconKey: "assist",
35632
35641
  public: false,
35633
35642
  // 同 app-builder 的开发型 profile(逐字段照抄):web 工具 + node/pnpm 工具链精确路径
35634
- // + 出站 TLD 通配白名单 + .secrets deny。复用同一条流水线 → 同一套沙箱授权。
35643
+ // + 出站 TLD 通配白名单。复用同一条流水线 → 同一套沙箱授权。
35644
+ // 注:不带 .secrets deny —— dataclaw-builder 的 apikey 走生成 app 的 server/.env,persona .secrets 已清空。
35635
35645
  sandboxProfile: {
35636
35646
  permissions: {
35637
35647
  defaultMode: "bypassPermissions",
35638
- allow: ["Read", "Edit", "Write", "Glob", "Grep", "WebFetch", "WebSearch"],
35639
- deny: ["Read(./.secrets/**)"]
35648
+ allow: ["Read", "Edit", "Write", "Glob", "Grep", "WebFetch", "WebSearch"]
35640
35649
  },
35641
35650
  sandbox: {
35642
35651
  filesystem: {
@@ -35783,6 +35792,15 @@ function refreshDaemonManagedDirs(args) {
35783
35792
  }
35784
35793
  }
35785
35794
  }
35795
+ function refreshSandboxSettings(args) {
35796
+ const entries = args.entries ?? DEFAULT_PERSONAS;
35797
+ for (const entry of entries) {
35798
+ if (!args.store.has(entry.personaId)) continue;
35799
+ const settings = entry.sandboxProfile ? applyProfile(buildGuestSettingsV1(), entry.sandboxProfile) : buildGuestSettingsV1();
35800
+ args.store.writeSandboxSettings(entry.personaId, settings);
35801
+ args.logger.info("persona.sandbox.refreshed", { personaId: entry.personaId });
35802
+ }
35803
+ }
35786
35804
  function migrateAgentsMirror(args) {
35787
35805
  let mirrored = 0;
35788
35806
  for (const personaId of args.store.list()) {
@@ -36354,7 +36372,7 @@ var CodexAdapter = class {
36354
36372
 
36355
36373
  // src/tools/claude-tui.ts
36356
36374
  var import_node_fs11 = __toESM(require("fs"), 1);
36357
- var import_node_os5 = __toESM(require("os"), 1);
36375
+ var import_node_os6 = __toESM(require("os"), 1);
36358
36376
  var import_node_path9 = __toESM(require("path"), 1);
36359
36377
  var import_headless = __toESM(require_xterm_headless(), 1);
36360
36378
 
@@ -37356,7 +37374,7 @@ function buildTuiSpawnArgs(ctx, isResume = false) {
37356
37374
  }
37357
37375
  function jsonlExistsForCtx(ctx) {
37358
37376
  if (!ctx.toolSessionId) return false;
37359
- const home = import_node_os5.default.homedir();
37377
+ const home = import_node_os6.default.homedir();
37360
37378
  const file = import_node_path9.default.join(home, ".claude", "projects", cwdToHashDir(ctx.cwd), `${ctx.toolSessionId}.jsonl`);
37361
37379
  try {
37362
37380
  return import_node_fs11.default.statSync(file).isFile();
@@ -37749,7 +37767,7 @@ async function listCodexSkills(cwd, deps = {}) {
37749
37767
 
37750
37768
  // src/workspace/browser.ts
37751
37769
  var import_node_fs13 = __toESM(require("fs"), 1);
37752
- var import_node_os6 = __toESM(require("os"), 1);
37770
+ var import_node_os7 = __toESM(require("os"), 1);
37753
37771
  var import_node_path11 = __toESM(require("path"), 1);
37754
37772
  init_protocol();
37755
37773
  var MAX_FILE_BYTES = 2 * 1024 * 1024;
@@ -37775,7 +37793,7 @@ function ensureCwd(cwd) {
37775
37793
  }
37776
37794
  var WorkspaceBrowser = class {
37777
37795
  list(args) {
37778
- const cwd = args.cwd && args.cwd.length > 0 ? args.cwd : import_node_os6.default.homedir();
37796
+ const cwd = args.cwd && args.cwd.length > 0 ? args.cwd : import_node_os7.default.homedir();
37779
37797
  ensureCwd(cwd);
37780
37798
  const full = resolveInsideCwd(cwd, args.path);
37781
37799
  const dirents = import_node_fs13.default.readdirSync(full, { withFileTypes: true });
@@ -37834,7 +37852,7 @@ var WorkspaceBrowser = class {
37834
37852
 
37835
37853
  // src/skills/agents-scanner.ts
37836
37854
  var import_node_fs14 = __toESM(require("fs"), 1);
37837
- var import_node_os7 = __toESM(require("os"), 1);
37855
+ var import_node_os8 = __toESM(require("os"), 1);
37838
37856
  var import_node_path12 = __toESM(require("path"), 1);
37839
37857
  var DEFAULT_POLICY_DIR_DARWIN = "/Library/Application Support/ClaudeCode/.claude/agents";
37840
37858
  function isDirLikeSync2(p2) {
@@ -37977,7 +37995,7 @@ var AgentsScanner = class {
37977
37995
  extraPluginRoots;
37978
37996
  policyDir;
37979
37997
  constructor(opts = {}) {
37980
- this.home = opts.home ?? process.env.CLAUDE_CONFIG_DIR ?? import_node_os7.default.homedir();
37998
+ this.home = opts.home ?? process.env.CLAUDE_CONFIG_DIR ?? import_node_os8.default.homedir();
37981
37999
  this.extraPluginRoots = opts.extraPluginRoots ?? [];
37982
38000
  if (opts.policyDir !== void 0) {
37983
38001
  this.policyDir = opts.policyDir;
@@ -38025,20 +38043,20 @@ var AgentsScanner = class {
38025
38043
 
38026
38044
  // src/observer/session-observer.ts
38027
38045
  var import_node_fs16 = __toESM(require("fs"), 1);
38028
- var import_node_os9 = __toESM(require("os"), 1);
38046
+ var import_node_os10 = __toESM(require("os"), 1);
38029
38047
  var import_node_path14 = __toESM(require("path"), 1);
38030
38048
  init_claude_history();
38031
38049
 
38032
38050
  // src/observer/subagent-meta-observer.ts
38033
38051
  var import_node_fs15 = __toESM(require("fs"), 1);
38034
- var import_node_os8 = __toESM(require("os"), 1);
38052
+ var import_node_os9 = __toESM(require("os"), 1);
38035
38053
  var import_node_path13 = __toESM(require("path"), 1);
38036
38054
  init_claude_history();
38037
38055
  var META_RE = /^agent-([A-Za-z0-9_-]+)\.meta\.json$/;
38038
38056
  var SubagentMetaObserver = class {
38039
38057
  constructor(opts) {
38040
38058
  this.opts = opts;
38041
- this.home = opts.home ?? import_node_os8.default.homedir();
38059
+ this.home = opts.home ?? import_node_os9.default.homedir();
38042
38060
  }
38043
38061
  opts;
38044
38062
  home;
@@ -38149,7 +38167,7 @@ var SubagentMetaObserver = class {
38149
38167
  var SessionObserver = class {
38150
38168
  constructor(opts) {
38151
38169
  this.opts = opts;
38152
- this.home = opts.home ?? import_node_os9.default.homedir();
38170
+ this.home = opts.home ?? import_node_os10.default.homedir();
38153
38171
  this.metaObserver = opts.enableSubagentMetaObserver ? new SubagentMetaObserver({ home: this.home, onEvent: opts.onEvent }) : null;
38154
38172
  }
38155
38173
  opts;
@@ -39956,7 +39974,7 @@ async function writeUploadedAttachment(args) {
39956
39974
  // src/extension/import.ts
39957
39975
  var import_promises2 = __toESM(require("fs/promises"), 1);
39958
39976
  var import_node_path17 = __toESM(require("path"), 1);
39959
- var import_node_os10 = __toESM(require("os"), 1);
39977
+ var import_node_os11 = __toESM(require("os"), 1);
39960
39978
  var import_jszip = __toESM(require_lib3(), 1);
39961
39979
  var ImportError = class extends Error {
39962
39980
  constructor(code, message) {
@@ -40016,7 +40034,7 @@ async function importZip(buf, root) {
40016
40034
  if (destExists) {
40017
40035
  throw new ImportError("ALREADY_EXISTS", `extension ${manifest.id} already installed`);
40018
40036
  }
40019
- const stage = await import_promises2.default.mkdtemp(import_node_path17.default.join(import_node_os10.default.tmpdir(), `clawd-ext-stage-${manifest.id}-`));
40037
+ const stage = await import_promises2.default.mkdtemp(import_node_path17.default.join(import_node_os11.default.tmpdir(), `clawd-ext-stage-${manifest.id}-`));
40020
40038
  try {
40021
40039
  for (const [name, entry] of Object.entries(zip.files)) {
40022
40040
  const dest = import_node_path17.default.join(stage, name);
@@ -40913,7 +40931,7 @@ function escape(v2) {
40913
40931
 
40914
40932
  // src/tunnel/frpc-binary.ts
40915
40933
  var import_node_fs23 = __toESM(require("fs"), 1);
40916
- var import_node_os11 = __toESM(require("os"), 1);
40934
+ var import_node_os12 = __toESM(require("os"), 1);
40917
40935
  var import_node_path23 = __toESM(require("path"), 1);
40918
40936
  var import_node_child_process7 = require("child_process");
40919
40937
  var import_node_stream3 = require("stream");
@@ -41374,14 +41392,14 @@ async function waitForFrpcReady(proc, timeoutMs) {
41374
41392
  }
41375
41393
 
41376
41394
  // src/tunnel/device-key.ts
41377
- var import_node_os12 = __toESM(require("os"), 1);
41395
+ var import_node_os13 = __toESM(require("os"), 1);
41378
41396
  var import_node_path26 = __toESM(require("path"), 1);
41379
41397
  var import_node_crypto8 = __toESM(require("crypto"), 1);
41380
41398
  var DERIVE_SALT = "clawd-tunnel-device-v1";
41381
41399
  function deriveStableDeviceKey(opts = {}) {
41382
- const hostname = opts.hostname ?? import_node_os12.default.hostname();
41383
- const uid = opts.uid ?? (typeof import_node_os12.default.userInfo === "function" ? import_node_os12.default.userInfo().uid : 0);
41384
- const home = opts.home ?? import_node_os12.default.homedir();
41400
+ const hostname = opts.hostname ?? import_node_os13.default.hostname();
41401
+ const uid = opts.uid ?? (typeof import_node_os13.default.userInfo === "function" ? import_node_os13.default.userInfo().uid : 0);
41402
+ const home = opts.home ?? import_node_os13.default.homedir();
41385
41403
  const defaultDataDir = import_node_path26.default.resolve(import_node_path26.default.join(home, ".clawd"));
41386
41404
  const normalizedDataDir = opts.dataDir ? import_node_path26.default.resolve(opts.dataDir) : null;
41387
41405
  const isDefaultDir = normalizedDataDir == null || normalizedDataDir === defaultDataDir;
@@ -41458,11 +41476,11 @@ function writeAuthFile(file, content) {
41458
41476
 
41459
41477
  // src/owner-profile.ts
41460
41478
  var import_node_fs27 = __toESM(require("fs"), 1);
41461
- var import_node_os13 = __toESM(require("os"), 1);
41479
+ var import_node_os14 = __toESM(require("os"), 1);
41462
41480
  var import_node_path28 = __toESM(require("path"), 1);
41463
41481
  var PROFILE_FILENAME = "profile.json";
41464
41482
  function loadOwnerDisplayName(dataDir) {
41465
- const fallback = import_node_os13.default.userInfo().username;
41483
+ const fallback = import_node_os14.default.userInfo().username;
41466
41484
  const profilePath = import_node_path28.default.join(dataDir, PROFILE_FILENAME);
41467
41485
  let raw;
41468
41486
  try {
@@ -41850,7 +41868,7 @@ init_protocol();
41850
41868
 
41851
41869
  // src/session/fork.ts
41852
41870
  var import_node_fs29 = __toESM(require("fs"), 1);
41853
- var import_node_os14 = __toESM(require("os"), 1);
41871
+ var import_node_os15 = __toESM(require("os"), 1);
41854
41872
  var import_node_path30 = __toESM(require("path"), 1);
41855
41873
  init_claude_history();
41856
41874
  function readJsonlEntries(file) {
@@ -41867,7 +41885,7 @@ function readJsonlEntries(file) {
41867
41885
  return out;
41868
41886
  }
41869
41887
  function forkSession(input) {
41870
- const baseDir = input.baseDir ?? import_node_path30.default.join(import_node_os14.default.homedir(), ".claude");
41888
+ const baseDir = input.baseDir ?? import_node_path30.default.join(import_node_os15.default.homedir(), ".claude");
41871
41889
  const projectDir = import_node_path30.default.join(baseDir, "projects", cwdToHashDir(input.cwd));
41872
41890
  const sourceFile = import_node_path30.default.join(projectDir, `${input.toolSessionId}.jsonl`);
41873
41891
  if (!import_node_fs29.default.existsSync(sourceFile)) {
@@ -43002,7 +43020,7 @@ function buildDeviceHandlers(deps) {
43002
43020
  }
43003
43021
 
43004
43022
  // src/handlers/meta.ts
43005
- var import_node_os15 = __toESM(require("os"), 1);
43023
+ var import_node_os16 = __toESM(require("os"), 1);
43006
43024
  init_protocol();
43007
43025
 
43008
43026
  // src/version.ts
@@ -43034,7 +43052,7 @@ function buildReadyFrame(deps, client) {
43034
43052
  return {
43035
43053
  version,
43036
43054
  protocolVersion: PROTOCOL_VERSION,
43037
- hostname: import_node_os15.default.hostname(),
43055
+ hostname: import_node_os16.default.hostname(),
43038
43056
  os: process.platform,
43039
43057
  tools,
43040
43058
  runningSessions: info.runningSessions,
@@ -43374,15 +43392,15 @@ function computePublishCheck(args) {
43374
43392
  // src/extension/install-flow.ts
43375
43393
  var import_promises5 = __toESM(require("fs/promises"), 1);
43376
43394
  var import_node_path35 = __toESM(require("path"), 1);
43377
- var import_node_os17 = __toESM(require("os"), 1);
43395
+ var import_node_os18 = __toESM(require("os"), 1);
43378
43396
  var import_node_crypto12 = __toESM(require("crypto"), 1);
43379
43397
  var import_jszip3 = __toESM(require_lib3(), 1);
43380
43398
 
43381
43399
  // src/extension/paths.ts
43382
- var import_node_os16 = __toESM(require("os"), 1);
43400
+ var import_node_os17 = __toESM(require("os"), 1);
43383
43401
  var import_node_path34 = __toESM(require("path"), 1);
43384
43402
  function clawdHomeRoot(override) {
43385
- return override ?? process.env.CLAWD_HOME ?? import_node_path34.default.join(import_node_os16.default.homedir(), ".clawd");
43403
+ return override ?? process.env.CLAWD_HOME ?? import_node_path34.default.join(import_node_os17.default.homedir(), ".clawd");
43386
43404
  }
43387
43405
  function extensionsRoot(override) {
43388
43406
  return import_node_path34.default.join(clawdHomeRoot(override), "extensions");
@@ -43464,7 +43482,7 @@ async function installFromChannel(args, deps) {
43464
43482
  );
43465
43483
  }
43466
43484
  const stage = await import_promises5.default.mkdtemp(
43467
- import_node_path35.default.join(import_node_os17.default.tmpdir(), `clawd-ext-install-${localExtId}-`)
43485
+ import_node_path35.default.join(import_node_os18.default.tmpdir(), `clawd-ext-install-${localExtId}-`)
43468
43486
  );
43469
43487
  try {
43470
43488
  for (const [name, entry] of Object.entries(zip.files)) {
@@ -43495,7 +43513,7 @@ async function installFromChannel(args, deps) {
43495
43513
  // src/extension/update-flow.ts
43496
43514
  var import_promises6 = __toESM(require("fs/promises"), 1);
43497
43515
  var import_node_path36 = __toESM(require("path"), 1);
43498
- var import_node_os18 = __toESM(require("os"), 1);
43516
+ var import_node_os19 = __toESM(require("os"), 1);
43499
43517
  var import_node_crypto13 = __toESM(require("crypto"), 1);
43500
43518
  var import_jszip4 = __toESM(require_lib3(), 1);
43501
43519
  var UpdateError = class extends Error {
@@ -43583,7 +43601,7 @@ async function updateFromChannel(args, deps) {
43583
43601
  await import_promises6.default.rm(prevDir, { recursive: true, force: true });
43584
43602
  await import_promises6.default.rename(liveDir, prevDir);
43585
43603
  const stage = await import_promises6.default.mkdtemp(
43586
- import_node_path36.default.join(import_node_os18.default.tmpdir(), `clawd-ext-update-${localExtId}-`)
43604
+ import_node_path36.default.join(import_node_os19.default.tmpdir(), `clawd-ext-update-${localExtId}-`)
43587
43605
  );
43588
43606
  try {
43589
43607
  for (const [name, entry] of Object.entries(zip.files)) {
@@ -46010,7 +46028,7 @@ async function startDaemon(config) {
46010
46028
  },
46011
46029
  source: "daemon",
46012
46030
  sampling: logShippingCfg.sampling,
46013
- homeDir: import_node_os19.default.homedir()
46031
+ homeDir: import_node_os20.default.homedir()
46014
46032
  });
46015
46033
  const logger = createLogger({
46016
46034
  level: config.logLevel,
@@ -46166,6 +46184,7 @@ async function startDaemon(config) {
46166
46184
  } else {
46167
46185
  logger.warn("deploy-kit.bundle-missing", {});
46168
46186
  }
46187
+ refreshSandboxSettings({ store: personaStore, logger });
46169
46188
  migrateAgentsMirror({ store: personaStore, logger });
46170
46189
  migrateCodexSandbox({ store: personaStore, logger });
46171
46190
  const groupFileStore = new GroupFileStore({ dataDir: config.dataDir, logger });
@@ -46562,7 +46581,7 @@ async function startDaemon(config) {
46562
46581
  throw new Error(`personaDispatch:run source session not found: ${args.sourceSessionId}`);
46563
46582
  }
46564
46583
  const sourceJsonlPath = sourceFile.toolSessionId ? import_node_path46.default.join(
46565
- import_node_os19.default.homedir(),
46584
+ import_node_os20.default.homedir(),
46566
46585
  ".claude",
46567
46586
  "projects",
46568
46587
  cwdToHashDir(sourceFile.cwd),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawos-dev/clawd",
3
- "version": "0.2.143-beta.305.c9c21d1",
3
+ "version": "0.2.143",
4
4
  "description": "Standalone clawd daemon — Claude Code (and future Codex) session server over WebSocket",
5
5
  "type": "module",
6
6
  "license": "MIT",