@clawos-dev/clawd 0.2.66 → 0.2.67-beta.115.8d05743

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 +9 -231
  2. package/package.json +1 -1
package/dist/cli.cjs CHANGED
@@ -85,9 +85,6 @@ var init_methods = __esm({
85
85
  "git:root",
86
86
  "git:branch",
87
87
  "git:branches",
88
- "git:worktree:prefix",
89
- "git:worktree:create",
90
- "git:worktree:remove",
91
88
  "capabilities:get",
92
89
  // ---- persona:* (老板侧管理 + 插话;alice 走 persona-bound WS 简化协议,不在此白名单) ----
93
90
  "persona:create",
@@ -4584,7 +4581,7 @@ var init_persona_schemas = __esm({
4584
4581
  });
4585
4582
 
4586
4583
  // ../protocol/src/schemas.ts
4587
- var SessionStatusSchema, UsageSchema, ContextUsageSchema, sessionMetaShape, SessionMetaSchema, ModelInfoSchema, ModeInfoSchema, ConfigFieldSchemaSchema, CapabilitiesGetArgs, CapabilitiesResponseSchema, AllowRuleSchema, SessionFileSchema, ParsedEventBase, HistoryUserMetaSchema, SubagentToolStatsSchema, StructuredPatchHunkSchema, ToolResultExtraSchema, MemoryEntrySchema, AskQuestionOptionSchema, AskQuestionItemSchema, ParsedEventSchema, SessionCreateArgs, SessionIdArgs, SessionUpdateArgs, SessionSendArgs, SessionRewindArgs, SessionRewindResponseSchema, SessionRewindDiffArgs, RewindDiffHunkSchema, RewindDiffFileSchema, SessionRewindDiffResponseSchema, SessionRewindableMessageIdsArgs, SessionRewindableMessageIdsResponseSchema, SessionResumeArgs, SessionForkArgs, SessionForkResponseSchema, SessionObserveArgs, SessionEventsArgs, PermissionRespondArgs, HistoryListArgs, HistoryReadArgs, HistorySubagentsArgs, HistorySubagentReadArgs, WorkspaceListArgs, WorkspaceReadArgs, SkillsListArgs, SkillEntrySchema, AgentEntrySchema, AgentsListArgs, AgentsListResponseSchema, SessionSubscribeArgs, SessionPinArgs, SessionReorderPinsArgs, GitRootArgs, GitRootResponseSchema, GitBranchArgs, GitBranchResponseSchema, GitBranchesArgs, GitBranchesResponseSchema, GitWorktreePrefixArgs, GitWorktreePrefixResponseSchema, GitWorktreeCreateArgs, GitWorktreeCreateResponseSchema, GitWorktreeRemoveArgs, GitWorktreeRemoveResponseSchema, HistoryRecentDirsArgs, RecentDirEntrySchema, HistoryRecentDirsResponseSchema, SessionQuestionFrameSchema, SessionQuestionClearedFrameSchema, AnswerQuestionArgs, AnswerQuestionResponseSchema, CancelQuestionArgs, CancelQuestionResponseSchema, AuthRequestFrameSchema, AuthOkFrameSchema, TunnelExitedEventSchema, InfoRunningSessionSchema, InfoResponseSchema;
4584
+ var SessionStatusSchema, UsageSchema, ContextUsageSchema, sessionMetaShape, SessionMetaSchema, ModelInfoSchema, ModeInfoSchema, ConfigFieldSchemaSchema, CapabilitiesGetArgs, CapabilitiesResponseSchema, AllowRuleSchema, SessionFileSchema, ParsedEventBase, HistoryUserMetaSchema, SubagentToolStatsSchema, StructuredPatchHunkSchema, ToolResultExtraSchema, MemoryEntrySchema, AskQuestionOptionSchema, AskQuestionItemSchema, ParsedEventSchema, SessionCreateArgs, SessionIdArgs, SessionUpdateArgs, SessionSendArgs, SessionRewindArgs, SessionRewindResponseSchema, SessionRewindDiffArgs, RewindDiffHunkSchema, RewindDiffFileSchema, SessionRewindDiffResponseSchema, SessionRewindableMessageIdsArgs, SessionRewindableMessageIdsResponseSchema, SessionResumeArgs, SessionForkArgs, SessionForkResponseSchema, SessionObserveArgs, SessionEventsArgs, PermissionRespondArgs, HistoryListArgs, HistoryReadArgs, HistorySubagentsArgs, HistorySubagentReadArgs, WorkspaceListArgs, WorkspaceReadArgs, SkillsListArgs, SkillEntrySchema, AgentEntrySchema, AgentsListArgs, AgentsListResponseSchema, SessionSubscribeArgs, SessionPinArgs, SessionReorderPinsArgs, GitRootArgs, GitRootResponseSchema, GitBranchArgs, GitBranchResponseSchema, GitBranchesArgs, GitBranchesResponseSchema, HistoryRecentDirsArgs, RecentDirEntrySchema, HistoryRecentDirsResponseSchema, SessionQuestionFrameSchema, SessionQuestionClearedFrameSchema, AnswerQuestionArgs, AnswerQuestionResponseSchema, CancelQuestionArgs, CancelQuestionResponseSchema, AuthRequestFrameSchema, AuthOkFrameSchema, TunnelExitedEventSchema, InfoRunningSessionSchema, InfoResponseSchema;
4588
4585
  var init_schemas = __esm({
4589
4586
  "../protocol/src/schemas.ts"() {
4590
4587
  "use strict";
@@ -4674,9 +4671,6 @@ var init_schemas = __esm({
4674
4671
  pinSortOrder: external_exports.number().int().nullable().optional(),
4675
4672
  // 用户在 NewSessionDialog 或 Edit modal 选择的 icon 标识;UI 端做 enum 兜底
4676
4673
  iconKey: external_exports.string().optional(),
4677
- // NewSessionDialog 勾选 worktree 创建的 session 才会持久化这两个字段
4678
- worktreeRoot: external_exports.string().min(1).optional(),
4679
- worktreeBranch: external_exports.string().min(1).optional(),
4680
4674
  // 由 session:fork 派生的 session 在 create 时记录源 session 的 sessionId(稳定 key,
4681
4675
  // 不受 parent clear / re-spawn 影响);sidebar 据此挂 fork 图标。非 fork session 该字段缺省。
4682
4676
  // 旧字段 forkedFromToolSessionId 已弃用,daemon 启动时一次性迁移老数据
@@ -4897,9 +4891,6 @@ var init_schemas = __esm({
4897
4891
  effort: external_exports.string().optional(),
4898
4892
  // 用户在 NewSessionDialog 选择的 icon 标识;UI 端做 enum 兜底
4899
4893
  iconKey: external_exports.string().optional(),
4900
- // NewSessionDialog 勾选 worktree 时由 UI 传入,daemon 原样持久化,不做额外副作用
4901
- worktreeRoot: external_exports.string().min(1).optional(),
4902
- worktreeBranch: external_exports.string().min(1).optional(),
4903
4894
  // session:fork 派生 session 时由 UI 传入源 sessionId,daemon 写到 SessionFile.forkedFromSessionId
4904
4895
  forkedFromSessionId: external_exports.string().min(1).optional(),
4905
4896
  // owner-mode persona session:传此字段时 daemon 自行派生 cwd 和启动参数,
@@ -5064,25 +5055,6 @@ var init_schemas = __esm({
5064
5055
  branches: external_exports.array(external_exports.string()),
5065
5056
  head: external_exports.string().nullable()
5066
5057
  });
5067
- GitWorktreePrefixArgs = external_exports.object({}).optional();
5068
- GitWorktreePrefixResponseSchema = external_exports.object({
5069
- prefix: external_exports.string().min(1)
5070
- });
5071
- GitWorktreeCreateArgs = external_exports.object({
5072
- cwd: external_exports.string().min(1),
5073
- baseBranch: external_exports.string().min(1),
5074
- label: external_exports.string().min(1)
5075
- });
5076
- GitWorktreeCreateResponseSchema = external_exports.object({
5077
- worktreeRoot: external_exports.string().min(1),
5078
- branch: external_exports.string().min(1),
5079
- baseBranch: external_exports.string().min(1)
5080
- });
5081
- GitWorktreeRemoveArgs = external_exports.object({
5082
- worktreeRoot: external_exports.string().min(1),
5083
- worktreeBranch: external_exports.string().min(1)
5084
- });
5085
- GitWorktreeRemoveResponseSchema = external_exports.object({ ok: external_exports.literal(true) });
5086
5058
  HistoryRecentDirsArgs = external_exports.object({}).optional();
5087
5059
  RecentDirEntrySchema = external_exports.object({
5088
5060
  cwd: external_exports.string().min(1),
@@ -9306,7 +9278,7 @@ var require_multistream = __commonJS({
9306
9278
  var require_pino = __commonJS({
9307
9279
  "../node_modules/.pnpm/pino@9.14.0/node_modules/pino/pino.js"(exports2, module2) {
9308
9280
  "use strict";
9309
- var os16 = require("os");
9281
+ var os15 = require("os");
9310
9282
  var stdSerializers = require_pino_std_serializers();
9311
9283
  var caller = require_caller();
9312
9284
  var redaction = require_redaction();
@@ -9353,7 +9325,7 @@ var require_pino = __commonJS({
9353
9325
  } = symbols;
9354
9326
  var { epochTime, nullTime } = time;
9355
9327
  var { pid } = process;
9356
- var hostname = os16.hostname();
9328
+ var hostname = os15.hostname();
9357
9329
  var defaultErrorSerializer = stdSerializers.err;
9358
9330
  var defaultOptions = {
9359
9331
  level: "info",
@@ -20334,7 +20306,7 @@ var init_wire = __esm({
20334
20306
  // src/run-case/controller.ts
20335
20307
  async function runController(opts) {
20336
20308
  const now = opts.now ?? Date.now;
20337
- const cwd = opts.cwd ?? (0, import_node_fs26.mkdtempSync)(import_node_path28.default.join(import_node_os15.default.tmpdir(), "clawd-runcase-"));
20309
+ const cwd = opts.cwd ?? (0, import_node_fs26.mkdtempSync)(import_node_path28.default.join(import_node_os14.default.tmpdir(), "clawd-runcase-"));
20338
20310
  const ownsCwd = opts.cwd === void 0;
20339
20311
  const recorder = startRunCaseRecorder({ recordPath: opts.record, now });
20340
20312
  const spawnCtx = { cwd };
@@ -20501,12 +20473,12 @@ async function runController(opts) {
20501
20473
  }
20502
20474
  return exitCode ?? 0;
20503
20475
  }
20504
- var import_node_fs26, import_node_os15, import_node_path28;
20476
+ var import_node_fs26, import_node_os14, import_node_path28;
20505
20477
  var init_controller = __esm({
20506
20478
  "src/run-case/controller.ts"() {
20507
20479
  "use strict";
20508
20480
  import_node_fs26 = require("fs");
20509
- import_node_os15 = __toESM(require("os"), 1);
20481
+ import_node_os14 = __toESM(require("os"), 1);
20510
20482
  import_node_path28 = __toESM(require("path"), 1);
20511
20483
  init_claude();
20512
20484
  init_stdout_splitter();
@@ -22436,8 +22408,6 @@ var SessionManager = class {
22436
22408
  permissionMode: args.permissionMode,
22437
22409
  effort: args.effort,
22438
22410
  iconKey: args.iconKey,
22439
- worktreeRoot: args.worktreeRoot,
22440
- worktreeBranch: args.worktreeBranch,
22441
22411
  forkedFromSessionId: args.forkedFromSessionId,
22442
22412
  ownerPersonaId: args.ownerPersonaId,
22443
22413
  createdAt: iso,
@@ -27957,21 +27927,9 @@ init_protocol();
27957
27927
  // src/workspace/git.ts
27958
27928
  var import_node_child_process6 = require("child_process");
27959
27929
  var import_node_fs23 = __toESM(require("fs"), 1);
27960
- var import_node_os13 = __toESM(require("os"), 1);
27961
27930
  var import_node_path25 = __toESM(require("path"), 1);
27962
27931
  var import_node_util = require("util");
27963
27932
  var pexec = (0, import_node_util.promisify)(import_node_child_process6.execFile);
27964
- function formatChildProcessError(err) {
27965
- const e = err;
27966
- const stderrLine = (e.stderr ?? "").split("\n").map((s) => s.trim()).find((s) => s.length > 0);
27967
- if (stderrLine) return stderrLine;
27968
- const parts = [];
27969
- if (e.killed) parts.push("killed");
27970
- if (e.signal) parts.push(`signal=${e.signal}`);
27971
- if (e.code !== void 0 && e.code !== null) parts.push(`code=${e.code}`);
27972
- if (parts.length > 0) return parts.join(" ");
27973
- return e.message ?? "unknown error";
27974
- }
27975
27933
  function normalizePath(p2) {
27976
27934
  const resolved = import_node_path25.default.resolve(p2);
27977
27935
  try {
@@ -28044,160 +28002,6 @@ async function listGitBranches(cwd) {
28044
28002
  return { branches: [], head: null };
28045
28003
  }
28046
28004
  }
28047
- var LABEL_WHITELIST = /^[a-zA-Z0-9 _-]+$/;
28048
- var MAX_SANITIZED_LABEL_LEN = 40;
28049
- function sanitizeLabel(raw) {
28050
- if (typeof raw !== "string") return { sanitized: null, reason: "empty" };
28051
- if (raw.length === 0) return { sanitized: null, reason: "empty" };
28052
- if (!LABEL_WHITELIST.test(raw)) return { sanitized: null, reason: "invalid-chars" };
28053
- let s = raw.toLowerCase();
28054
- s = s.replace(/\s+/g, "-");
28055
- s = s.replace(/-+/g, "-");
28056
- s = s.replace(/^[-_]+|[-_]+$/g, "");
28057
- s = s.slice(0, MAX_SANITIZED_LABEL_LEN);
28058
- s = s.replace(/^[-_]+|[-_]+$/g, "");
28059
- if (!s) return { sanitized: null, reason: "empty" };
28060
- return { sanitized: s, reason: null };
28061
- }
28062
- function computePrefix() {
28063
- let username;
28064
- try {
28065
- username = import_node_os13.default.userInfo().username;
28066
- } catch {
28067
- username = void 0;
28068
- }
28069
- const { sanitized } = sanitizeLabel(username);
28070
- if (sanitized) return sanitized;
28071
- const rand = Math.floor(1e3 + Math.random() * 9e3).toString();
28072
- return `user-${rand}`;
28073
- }
28074
- function flattenToDirName(branch) {
28075
- return branch.replace(/\//g, "-");
28076
- }
28077
- function encodeClaudeProjectDir(absPath) {
28078
- if (!absPath || typeof absPath !== "string") return "";
28079
- let canonical = import_node_path25.default.resolve(absPath);
28080
- try {
28081
- canonical = import_node_fs23.default.realpathSync(canonical);
28082
- } catch {
28083
- try {
28084
- const parent = import_node_fs23.default.realpathSync(import_node_path25.default.dirname(canonical));
28085
- canonical = import_node_path25.default.join(parent, import_node_path25.default.basename(canonical));
28086
- } catch {
28087
- }
28088
- }
28089
- return canonical.replace(/[/.]/g, "-");
28090
- }
28091
- async function createWorktree(input) {
28092
- const { cwd, baseBranch, label } = input;
28093
- if (!cwd || typeof cwd !== "string") throw new Error("cwd \u4E0D\u80FD\u4E3A\u7A7A");
28094
- if (!baseBranch || typeof baseBranch !== "string") throw new Error("baseBranch \u4E0D\u80FD\u4E3A\u7A7A");
28095
- const labelResult = sanitizeLabel(label);
28096
- if (labelResult.reason === "invalid-chars") {
28097
- throw new Error("label \u4E0D\u80FD\u542B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\uFF0C\u53EA\u5141\u8BB8\u82F1\u6587\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u7A7A\u683C\u3001\u8FDE\u5B57\u7B26\u3001\u4E0B\u5212\u7EBF");
28098
- }
28099
- if (labelResult.reason === "empty" || !labelResult.sanitized) {
28100
- throw new Error("label \u5FC5\u987B\u5305\u542B\u81F3\u5C11\u4E00\u4E2A\u82F1\u6587\u5B57\u6BCD\u6216\u6570\u5B57");
28101
- }
28102
- const prefix = computePrefix();
28103
- const branch = `${prefix}/${labelResult.sanitized}`;
28104
- const dirName = flattenToDirName(branch);
28105
- const { isGitRoot } = await getGitRoot(cwd);
28106
- if (!isGitRoot) {
28107
- throw new Error(`\u76EE\u5F55 ${cwd} \u4E0D\u662F git repo \u6839`);
28108
- }
28109
- const parent = import_node_path25.default.dirname(import_node_path25.default.resolve(cwd));
28110
- if (parent === "/" || parent === import_node_path25.default.resolve(cwd)) {
28111
- throw new Error("repo \u5728\u78C1\u76D8\u6839\u76EE\u5F55\uFF0C\u65E0\u6CD5\u5728\u540C\u7EA7\u521B\u5EFA worktree");
28112
- }
28113
- const worktreeRoot = import_node_path25.default.join(parent, dirName);
28114
- try {
28115
- await pexec("git", ["-C", cwd, "fetch", "origin", baseBranch, "--no-tags"], {
28116
- timeout: 3e4
28117
- });
28118
- } catch (err) {
28119
- throw new Error(
28120
- `\u57FA\u51C6\u5206\u652F ${baseBranch} \u4E0D\u5B58\u5728\u6216 fetch \u8FDC\u7AEF\u5931\u8D25\uFF1A${formatChildProcessError(err)}`
28121
- );
28122
- }
28123
- try {
28124
- await pexec("git", ["-C", cwd, "rev-parse", "--verify", `refs/heads/${branch}`], {
28125
- timeout: 3e3
28126
- });
28127
- throw new Error(`\u5206\u652F ${branch} \u5DF2\u5B58\u5728\uFF0C\u8BF7\u6362\u4E00\u4E2A label`);
28128
- } catch (err) {
28129
- const msg = err.message;
28130
- if (msg.startsWith("\u5206\u652F ")) throw err;
28131
- }
28132
- if (import_node_fs23.default.existsSync(worktreeRoot)) {
28133
- throw new Error(`\u76EE\u5F55 ${worktreeRoot} \u5DF2\u5B58\u5728\uFF0C\u8BF7\u6362\u4E00\u4E2A label \u6216\u6E05\u7406\u540E\u91CD\u8BD5`);
28134
- }
28135
- try {
28136
- await pexec(
28137
- "git",
28138
- ["-C", cwd, "worktree", "add", worktreeRoot, "-b", branch, `origin/${baseBranch}`],
28139
- { timeout: 15e3 }
28140
- );
28141
- } catch (err) {
28142
- throw new Error(`\u521B\u5EFA worktree \u5931\u8D25\uFF1A${formatChildProcessError(err)}`);
28143
- }
28144
- return { worktreeRoot, branch, baseBranch };
28145
- }
28146
- async function removeWorktree(input) {
28147
- const { worktreeRoot, worktreeBranch } = input;
28148
- if (!worktreeRoot || !worktreeBranch) {
28149
- throw new Error("worktreeRoot \u548C worktreeBranch \u90FD\u4E0D\u80FD\u4E3A\u7A7A");
28150
- }
28151
- let repoRoot = null;
28152
- try {
28153
- const { stdout } = await pexec(
28154
- "git",
28155
- ["-C", worktreeRoot, "rev-parse", "--git-common-dir"],
28156
- { timeout: 3e3 }
28157
- );
28158
- const gitCommonDir = stdout.trim();
28159
- if (!gitCommonDir) throw new Error("empty git-common-dir");
28160
- const absGitCommon = import_node_path25.default.isAbsolute(gitCommonDir) ? gitCommonDir : import_node_path25.default.resolve(worktreeRoot, gitCommonDir);
28161
- repoRoot = import_node_path25.default.dirname(absGitCommon);
28162
- } catch {
28163
- repoRoot = null;
28164
- }
28165
- if (repoRoot) {
28166
- try {
28167
- await pexec("git", ["-C", repoRoot, "worktree", "remove", worktreeRoot, "--force"], {
28168
- timeout: 1e4
28169
- });
28170
- } catch (err) {
28171
- const stderr = err.stderr ?? "";
28172
- const lower = stderr.toLowerCase();
28173
- const vanished = lower.includes("not a working tree") || lower.includes("is not a working tree") || !import_node_fs23.default.existsSync(worktreeRoot);
28174
- if (!vanished) {
28175
- throw new Error(`\u6E05\u7406 worktree \u5931\u8D25\uFF1A${formatChildProcessError(err)}`);
28176
- }
28177
- }
28178
- try {
28179
- await pexec("git", ["-C", repoRoot, "branch", "-D", worktreeBranch], { timeout: 5e3 });
28180
- } catch (err) {
28181
- const stderr = err.stderr ?? "";
28182
- const lower = stderr.toLowerCase();
28183
- const vanished = lower.includes("not found") || lower.includes("no such");
28184
- if (!vanished) {
28185
- throw new Error(`\u6E05\u7406\u5206\u652F\u5931\u8D25\uFF1A${formatChildProcessError(err)}`);
28186
- }
28187
- }
28188
- }
28189
- try {
28190
- const encoded = encodeClaudeProjectDir(worktreeRoot);
28191
- if (encoded) {
28192
- const projectsRoot = import_node_path25.default.join(import_node_os13.default.homedir(), ".claude", "projects");
28193
- const target = import_node_path25.default.resolve(projectsRoot, encoded);
28194
- if (target.startsWith(projectsRoot + import_node_path25.default.sep) && target !== projectsRoot) {
28195
- import_node_fs23.default.rmSync(target, { recursive: true, force: true });
28196
- }
28197
- }
28198
- } catch {
28199
- }
28200
- }
28201
28005
 
28202
28006
  // src/handlers/git.ts
28203
28007
  function buildGitHandlers() {
@@ -28216,36 +28020,10 @@ function buildGitHandlers() {
28216
28020
  const res = await listGitBranches(args.cwd);
28217
28021
  return { response: { type: "git:branches", ...res } };
28218
28022
  };
28219
- const worktreePrefix = async () => {
28220
- return {
28221
- response: { type: "git:worktree:prefix", prefix: computePrefix() }
28222
- };
28223
- };
28224
- const worktreeCreate = async (frame) => {
28225
- const args = GitWorktreeCreateArgs.parse(frame);
28226
- try {
28227
- const res = await createWorktree(args);
28228
- return { response: { type: "git:worktree:create", ...res } };
28229
- } catch (err) {
28230
- throw new ClawdError(ERROR_CODES.INTERNAL, err.message);
28231
- }
28232
- };
28233
- const worktreeRemove = async (frame) => {
28234
- const args = GitWorktreeRemoveArgs.parse(frame);
28235
- try {
28236
- await removeWorktree(args);
28237
- return { response: { type: "git:worktree:remove", ok: true } };
28238
- } catch (err) {
28239
- throw new ClawdError(ERROR_CODES.INTERNAL, err.message);
28240
- }
28241
- };
28242
28023
  return {
28243
28024
  "git:root": root,
28244
28025
  "git:branch": branch,
28245
- "git:branches": branches,
28246
- "git:worktree:prefix": worktreePrefix,
28247
- "git:worktree:create": worktreeCreate,
28248
- "git:worktree:remove": worktreeRemove
28026
+ "git:branches": branches
28249
28027
  };
28250
28028
  }
28251
28029
 
@@ -28264,7 +28042,7 @@ function buildCapabilitiesHandlers(deps) {
28264
28042
  }
28265
28043
 
28266
28044
  // src/handlers/meta.ts
28267
- var import_node_os14 = __toESM(require("os"), 1);
28045
+ var import_node_os13 = __toESM(require("os"), 1);
28268
28046
  init_protocol();
28269
28047
 
28270
28048
  // src/version.ts
@@ -28294,7 +28072,7 @@ function buildReadyFrame(deps, client) {
28294
28072
  return {
28295
28073
  version,
28296
28074
  protocolVersion: PROTOCOL_VERSION,
28297
- hostname: import_node_os14.default.hostname(),
28075
+ hostname: import_node_os13.default.hostname(),
28298
28076
  os: process.platform,
28299
28077
  tools,
28300
28078
  runningSessions: info.runningSessions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawos-dev/clawd",
3
- "version": "0.2.66",
3
+ "version": "0.2.67-beta.115.8d05743",
4
4
  "description": "Standalone clawd daemon — Claude Code (and future Codex) session server over WebSocket",
5
5
  "type": "module",
6
6
  "license": "MIT",