@clawos-dev/clawd 0.2.155 → 0.2.156-beta.327.ef22c15

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 +62 -17
  2. package/package.json +1 -1
package/dist/cli.cjs CHANGED
@@ -4730,6 +4730,14 @@ var init_schemas = __esm({
4730
4730
  * 归属人由 contact(deviceId→ownerId) 反查,该字段理由消失。
4731
4731
  */
4732
4732
  creatorPrincipalId: external_exports.string().min(1).optional(),
4733
+ /**
4734
+ * 创建该 session 的连接者飞书 displayName(一次性 stamp)。session:create handler
4735
+ * 从 ctx.principal.displayName 传入;newRunner 时读这个字段派生 SubSessionMeta.callerDisplayName,
4736
+ * 注入到 cc system prompt 引导自我介绍(见 connection-prompt.ts)。
4737
+ * Optional 兼容老 SessionFile——newRunner 读不到时 fallback ContactStore 反查(guest)
4738
+ * 或 deps.ownerDisplayName(owner)。
4739
+ */
4740
+ creatorDisplayName: external_exports.string().min(1).optional(),
4733
4741
  /**
4734
4742
  * Mirror peer sessions (2026-05-26): mirror 标识。**我在朋友 daemon 上创建的 session**,
4735
4743
  * 远端是 source of truth,本机是持久化副本,方便 sidebar 跨设备聚合。
@@ -31782,21 +31790,28 @@ function scopeSubPath(scope) {
31782
31790
  if (scope.mode === "guest") return [scope.personaId, "guests", scope.capId];
31783
31791
  return [scope.personaId, scope.mode];
31784
31792
  }
31785
- function metaFromScope(scope, personaRoot, usersRoot, ownerPrincipalId) {
31793
+ function metaFromScope(scope, personaRoot, usersRoot, ownerPrincipalId, callerDisplayName) {
31786
31794
  if (scope.kind === "default") return void 0;
31787
31795
  if (scope.mode === "owner") {
31788
31796
  if (!ownerPrincipalId || !usersRoot) {
31789
- return { idleKillEnabled: false, personaMode: "owner" };
31797
+ return { idleKillEnabled: false, personaMode: "owner", callerDisplayName };
31790
31798
  }
31791
31799
  const userWorkDir2 = deriveUserWorkDir(ownerPrincipalId, usersRoot);
31792
- return { idleKillEnabled: false, personaMode: "owner", userWorkDir: userWorkDir2, addDirs: [userWorkDir2] };
31800
+ return {
31801
+ idleKillEnabled: false,
31802
+ personaMode: "owner",
31803
+ userWorkDir: userWorkDir2,
31804
+ addDirs: [userWorkDir2],
31805
+ callerDisplayName
31806
+ };
31793
31807
  }
31794
31808
  const userWorkDir = deriveUserWorkDir(scope.capId, usersRoot);
31795
31809
  return {
31796
31810
  idleKillEnabled: true,
31797
31811
  personaMode: "guest",
31798
31812
  userWorkDir,
31799
- addDirs: [userWorkDir]
31813
+ addDirs: [userWorkDir],
31814
+ callerDisplayName
31800
31815
  };
31801
31816
  }
31802
31817
  function scopeForFile(file, ownerPrincipalId) {
@@ -32076,12 +32091,19 @@ function buildRule(tool, input) {
32076
32091
  var OWNER_TEMPLATE = `# \u8FDE\u63A5\u4E0A\u4E0B\u6587
32077
32092
  \u4F60\u73B0\u5728\u4EE5 Owner \u8EAB\u4EFD\u88AB\u8FDE\u63A5\uFF0C\u5BF9\u65B9\u5C31\u662F owner \u672C\u4EBA\uFF08{ownerLabel}\uFF09\u3002
32078
32093
  \u81EA\u6211\u4ECB\u7ECD\u65F6\u4F7F\u7528\u7B2C\u4E00/\u7B2C\u4E8C\u4EBA\u79F0\uFF0C\u4F8B\u5982\u300C\u6211\u662F\u60A8\u7684 xxx \u52A9\u624B\u300D\u3002`;
32079
- var LISTENER_TEMPLATE = `# \u8FDE\u63A5\u4E0A\u4E0B\u6587
32080
- \u4F60\u73B0\u5728\u4EE5 Listener \u8EAB\u4EFD\u88AB\u8FDE\u63A5\uFF0C\u672C persona \u7684 owner \u662F\u300C{ownerLabel}\u300D\uFF0C\u4F46\u5F53\u524D\u5BF9\u8BDD\u7684\u5BF9\u65B9\u4E0D\u662F owner \u672C\u4EBA\u3002
32081
- \u81EA\u6211\u4ECB\u7ECD\u65F6\u4F7F\u7528\u7B2C\u4E09\u4EBA\u79F0\u6307\u4EE3 owner\uFF0C\u4F8B\u5982\u300C\u6211\u662F {ownerLabel} \u7684 xxx \u52A9\u624B\uFF0C\u4F60\u53EF\u4EE5\u901A\u8FC7\u6211\u770B\u5230\u4ED6\u7684 xxx\u300D\u3002\u4E0D\u8981\u628A\u5BF9\u65B9\u5F53\u6210 owner\uFF0C\u4E0D\u8981\u66FF owner \u505A\u51FA\u627F\u8BFA\u3002`;
32094
+ var GUEST_TEMPLATE = `# \u8FDE\u63A5\u4E0A\u4E0B\u6587
32095
+ \u4F60\u73B0\u5728\u4EE5 Guest \u8EAB\u4EFD\u88AB\u8FDE\u63A5\uFF0C\u672C persona \u7684 owner \u662F\u300C{ownerLabel}\u300D\uFF0C\u5F53\u524D\u5BF9\u8BDD\u7684\u5BF9\u65B9\u662F\u300C{guestLabel}\u300D\uFF0C\u4E0D\u662F owner \u672C\u4EBA\u3002
32096
+ \u81EA\u6211\u4ECB\u7ECD\u65F6\u7B2C\u4E09\u4EBA\u79F0\u6307\u4EE3 owner\u3001\u7B2C\u4E8C\u4EBA\u79F0\u79F0\u547C\u5BF9\u65B9\uFF0C\u4F8B\u5982\u300C{guestLabel}\uFF0C\u6211\u662F {ownerLabel} \u7684 xxx \u52A9\u624B\uFF0C\u4F60\u53EF\u4EE5\u901A\u8FC7\u6211\u770B\u5230\u4ED6\u7684 xxx\u300D\u3002\u4E0D\u8981\u628A\u5BF9\u65B9\u5F53\u6210 owner\uFF0C\u4E0D\u8981\u66FF owner \u505A\u51FA\u627F\u8BFA\u3002`;
32082
32097
  function buildConnectionPrompt(args) {
32083
- const template = args.mode === "owner" ? OWNER_TEMPLATE : LISTENER_TEMPLATE;
32084
- let result = template.replace(/\{ownerLabel\}/g, args.ownerLabel);
32098
+ let result;
32099
+ if (args.mode === "guest") {
32100
+ result = GUEST_TEMPLATE.replace(/\{ownerLabel\}/g, args.ownerLabel).replace(
32101
+ /\{guestLabel\}/g,
32102
+ args.guestLabel
32103
+ );
32104
+ } else {
32105
+ result = OWNER_TEMPLATE.replace(/\{ownerLabel\}/g, args.ownerLabel);
32106
+ }
32085
32107
  if (args.workDir) {
32086
32108
  result += `
32087
32109
  \u4F60\u7684\u6587\u4EF6\u5DE5\u4F5C\u76EE\u5F55\u662F ${args.workDir}\uFF0C\u6240\u6709\u6587\u4EF6\u8BFB\u5199\u90FD\u653E\u5728\u8FD9\u4E2A\u76EE\u5F55\u4E0B\u3002persona \u76EE\u5F55\u5BF9\u4F60\u53EA\u8BFB\uFF0C\u4E0D\u8981\u5F80\u91CC\u5199\u3002`;
@@ -32213,11 +32235,25 @@ function buildSpawnContext(state, deps) {
32213
32235
  const meta = state.subSessionMeta;
32214
32236
  if (meta?.personaMode) {
32215
32237
  ctx.personaMode = meta.personaMode;
32216
- ctx.extraSystemPrompt = buildConnectionPrompt({
32217
- mode: meta.personaMode,
32218
- ownerLabel: deps.ownerDisplayName,
32219
- workDir: meta.userWorkDir
32220
- });
32238
+ let promptArgs;
32239
+ if (meta.personaMode === "guest") {
32240
+ if (!meta.callerDisplayName) {
32241
+ throw new Error("guest persona mode requires meta.callerDisplayName");
32242
+ }
32243
+ promptArgs = {
32244
+ mode: "guest",
32245
+ ownerLabel: deps.ownerDisplayName,
32246
+ guestLabel: meta.callerDisplayName,
32247
+ workDir: meta.userWorkDir
32248
+ };
32249
+ } else {
32250
+ promptArgs = {
32251
+ mode: "owner",
32252
+ ownerLabel: meta.callerDisplayName ?? deps.ownerDisplayName,
32253
+ workDir: meta.userWorkDir
32254
+ };
32255
+ }
32256
+ ctx.extraSystemPrompt = buildConnectionPrompt(promptArgs);
32221
32257
  }
32222
32258
  if (dispatchMcpConfigPath2) {
32223
32259
  ctx.extraSystemPrompt = (ctx.extraSystemPrompt ? ctx.extraSystemPrompt + "\n\n" : "") + DISPATCH_SYSTEM_PROMPT_HINT;
@@ -33702,11 +33738,13 @@ var SessionManager = class {
33702
33738
  newRunner(file, scope) {
33703
33739
  const adapter = this.deps.getAdapter(file.tool ?? "claude");
33704
33740
  const store = this.storeFor(scope);
33741
+ const callerDisplayName = file.creatorDisplayName ?? (scope.kind === "persona" ? scope.mode === "owner" ? this.deps.ownerDisplayName : this.deps.contactStore?.get(scope.capId)?.displayName : void 0);
33705
33742
  const subSessionMeta = metaFromScope(
33706
33743
  scope,
33707
33744
  this.deps.personaRoot ?? "",
33708
33745
  this.deps.usersRoot ?? "",
33709
- this.deps.ownerPrincipalId
33746
+ this.deps.ownerPrincipalId,
33747
+ callerDisplayName
33710
33748
  );
33711
33749
  if (subSessionMeta?.userWorkDir) {
33712
33750
  import_node_fs6.default.mkdirSync(subSessionMeta.userWorkDir, { recursive: true });
@@ -33851,7 +33889,7 @@ var SessionManager = class {
33851
33889
  }
33852
33890
  }
33853
33891
  // ---- 命令方法:均返回 { response, broadcast[] },由 dispatcher 聚合 ----
33854
- create(args, creatorPrincipalId) {
33892
+ create(args, creatorPrincipalId, creatorDisplayName) {
33855
33893
  let cwd;
33856
33894
  if (args.ownerPersonaId) {
33857
33895
  cwd = derivePersonaSpawnCwd(
@@ -33894,6 +33932,7 @@ var SessionManager = class {
33894
33932
  ownerPersonaId: args.ownerPersonaId,
33895
33933
  appBuilderProject: args.appBuilderProject,
33896
33934
  creatorPrincipalId,
33935
+ creatorDisplayName,
33897
33936
  createdAt: iso,
33898
33937
  updatedAt: iso
33899
33938
  };
@@ -42250,7 +42289,12 @@ function buildSessionHandlers(deps) {
42250
42289
  }
42251
42290
  ensurePersonaAccess(ctx, args.ownerPersonaId, "send");
42252
42291
  const creatorPrincipalId = ctx?.principal.id ?? ownerPrincipalId;
42253
- const { response, broadcast } = manager.create({ ...args, tool }, creatorPrincipalId);
42292
+ const creatorDisplayName = ctx?.principal.displayName ?? "Owner";
42293
+ const { response, broadcast } = manager.create(
42294
+ { ...args, tool },
42295
+ creatorPrincipalId,
42296
+ creatorDisplayName
42297
+ );
42254
42298
  return { response: { type: "session:info", ...response }, broadcast };
42255
42299
  };
42256
42300
  const list = async (_frame, _client, ctx) => {
@@ -46489,6 +46533,7 @@ async function startDaemon(config) {
46489
46533
  personaStore,
46490
46534
  ownerDisplayName,
46491
46535
  ownerPrincipalId,
46536
+ contactStore,
46492
46537
  mode: config.mode,
46493
46538
  // 单栏 refactor (spec 2026-06-02 §5.1):cc 子进程 env CLAWD_DAEMON_URL 闭包来源。
46494
46539
  // assistant 用 curl 调本机 daemon HTTP RPC adapter(/api/rpc/<method>)触发 appBuilder.* 管理操作。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawos-dev/clawd",
3
- "version": "0.2.155",
3
+ "version": "0.2.156-beta.327.ef22c15",
4
4
  "description": "Standalone clawd daemon — Claude Code (and future Codex) session server over WebSocket",
5
5
  "type": "module",
6
6
  "license": "MIT",