@clawos-dev/clawd 0.2.270 → 0.2.272

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.cjs CHANGED
@@ -6774,7 +6774,7 @@ var init_principal = __esm({
6774
6774
  });
6775
6775
 
6776
6776
  // ../protocol/src/schemas.ts
6777
- var SessionStatusSchema, UsageSchema, ContextUsageSchema, sessionMetaShape, SessionMetaSchema, ModelInfoSchema, ModeInfoSchema, ConfigFieldSchemaSchema, CapabilitiesGetArgs, ToolFeaturesSchema, CapabilitiesResponseSchema, AllowRuleSchema, SessionFileSchema, ParsedEventBase, HistoryUserMetaSchema, SubagentToolStatsSchema, StructuredPatchHunkSchema, ToolResultExtraSchema, MemoryEntrySchema, AskQuestionOptionSchema, AskQuestionItemSchema, ParsedEventSchema, SessionCreateArgs, SessionListArgs, SessionIdArgs, SessionUpdateArgs, SessionSendArgs, SessionInterruptArgs, 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, SessionCurrentTurnSenderArgs, SessionSubscribeArgs, SessionPinArgs, PeerSessionUpsertArgs, PeerSessionUpsertResponseSchema, PeerSessionRemoveArgs, PeerSessionRemoveResponseSchema, SessionReorderPinsArgs, GitRootArgs, GitRootResponseSchema, GitBranchArgs, GitBranchResponseSchema, GitBranchesArgs, GitBranchesResponseSchema, HistoryRecentDirsArgs, RecentDirEntrySchema, HistoryRecentDirsResponseSchema, SessionQuestionFrameSchema, SessionQuestionClearedFrameSchema, AnswerQuestionArgs, AnswerQuestionResponseSchema, CancelQuestionArgs, CancelQuestionResponseSchema, AuthRequestFrameSchema, AuthOkFrameSchema, TunnelReadyEventSchema, TunnelExitedEventSchema, TunnelUnavailableEventSchema, InfoRunningSessionSchema, InfoResponseSchema, PROJECT_PORT_MIN, PROJECT_PORT_MAX, projectNameRegex, DEFAULT_DEV_COMMAND, ProjectMetadataSchema, PROJECT_STAGE_VALUES, ProjectStageSchema, ProjectWithStatusSchema, ListProjectsArgsSchema, ListProjectsResultSchema, GetProjectArgsSchema, GetProjectResultSchema, CreateProjectArgsSchema, CreateProjectResultSchema, DeleteProjectArgsSchema, DeleteProjectResultSchema, UpdateProjectPortArgsSchema, UpdateProjectPortResultSchema, SetProdUrlArgsSchema, SetProdUrlResultSchema, StartDevServerArgsSchema, StartDevServerResultSchema, ASSISTANT_REPORTABLE_STAGES, ReportStageArgsSchema, ReportStageResultSchema, StopDevServerArgsSchema, StopDevServerResultSchema, AppBuilderProjectUpdatedEventSchema, PublishArgsSchema, PublishResultSchema, DismissPublishJobArgsSchema, DismissPublishJobResultSchema, AppBuilderPublishProgressEventSchema, AppBuilderPublishFailedEventSchema;
6777
+ var SessionStatusSchema, UsageSchema, ContextUsageSchema, sessionMetaShape, SessionMetaSchema, ModelInfoSchema, ModeInfoSchema, ConfigFieldSchemaSchema, CapabilitiesGetArgs, ToolFeaturesSchema, CapabilitiesResponseSchema, AllowRuleSchema, SessionFileSchema, ParsedEventBase, HistoryUserMetaSchema, SubagentToolStatsSchema, StructuredPatchHunkSchema, ToolResultExtraSchema, MemoryEntrySchema, AskQuestionOptionSchema, AskQuestionItemSchema, ParsedEventSchema, SessionCreateArgs, SessionListArgs, SessionIdArgs, SessionUpdateArgs, SessionSendArgs, SessionInterruptArgs, 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, SessionCurrentTurnSenderArgs, SessionSubscribeArgs, SessionPinArgs, PeerSessionUpsertArgs, PeerSessionUpsertResponseSchema, PeerSessionRemoveArgs, PeerSessionRemoveResponseSchema, SessionReorderPinsArgs, GitRootArgs, GitRootResponseSchema, GitBranchArgs, GitBranchResponseSchema, GitBranchesArgs, GitBranchesResponseSchema, HistoryRecentDirsArgs, RecentDirEntrySchema, HistoryRecentDirsResponseSchema, SessionQuestionFrameSchema, SessionQuestionClearedFrameSchema, AnswerQuestionArgs, AnswerQuestionResponseSchema, CancelQuestionArgs, CancelQuestionResponseSchema, ClientInfoSchema, AuthRequestFrameSchema, AuthOkFrameSchema, DeviceConnectionEntrySchema, DeviceConnectionsResponseSchema, TunnelReadyEventSchema, TunnelExitedEventSchema, TunnelUnavailableEventSchema, InfoRunningSessionSchema, InfoResponseSchema, PROJECT_PORT_MIN, PROJECT_PORT_MAX, projectNameRegex, DEFAULT_DEV_COMMAND, ProjectMetadataSchema, PROJECT_STAGE_VALUES, ProjectStageSchema, ProjectWithStatusSchema, ListProjectsArgsSchema, ListProjectsResultSchema, GetProjectArgsSchema, GetProjectResultSchema, CreateProjectArgsSchema, CreateProjectResultSchema, DeleteProjectArgsSchema, DeleteProjectResultSchema, UpdateProjectPortArgsSchema, UpdateProjectPortResultSchema, SetProdUrlArgsSchema, SetProdUrlResultSchema, StartDevServerArgsSchema, StartDevServerResultSchema, ASSISTANT_REPORTABLE_STAGES, ReportStageArgsSchema, ReportStageResultSchema, StopDevServerArgsSchema, StopDevServerResultSchema, AppBuilderProjectUpdatedEventSchema, PublishArgsSchema, PublishResultSchema, DismissPublishJobArgsSchema, DismissPublishJobResultSchema, AppBuilderPublishProgressEventSchema, AppBuilderPublishFailedEventSchema;
6778
6778
  var init_schemas = __esm({
6779
6779
  "../protocol/src/schemas.ts"() {
6780
6780
  "use strict";
@@ -7466,6 +7466,13 @@ var init_schemas = __esm({
7466
7466
  toolUseId: external_exports.string().min(1)
7467
7467
  });
7468
7468
  CancelQuestionResponseSchema = external_exports.object({ ok: external_exports.literal(true) });
7469
+ ClientInfoSchema = external_exports.object({
7470
+ name: external_exports.string().min(1),
7471
+ version: external_exports.string().min(1),
7472
+ instanceId: external_exports.string().min(1),
7473
+ /** 自报设备名(如 os.hostname()),展示用非身份;trim 后截断 64 字符 */
7474
+ deviceLabel: external_exports.string().transform((s) => s.trim().slice(0, 64)).optional()
7475
+ });
7469
7476
  AuthRequestFrameSchema = external_exports.object({
7470
7477
  type: external_exports.literal("auth"),
7471
7478
  token: external_exports.string().min(1),
@@ -7486,17 +7493,23 @@ var init_schemas = __esm({
7486
7493
  * 'clawd-mobile-android' / ...),宽容未知值(将来加新客户端不动 schema)。
7487
7494
  * instanceId:客户端首启生成 UUID 并本地持久化——区分同种类多实例(多手机/多 desktop 同连)。
7488
7495
  */
7489
- clientInfo: external_exports.object({
7490
- name: external_exports.string().min(1),
7491
- version: external_exports.string().min(1),
7492
- instanceId: external_exports.string().min(1)
7493
- }).optional()
7496
+ clientInfo: ClientInfoSchema.optional()
7494
7497
  });
7495
7498
  AuthOkFrameSchema = external_exports.object({
7496
7499
  type: external_exports.literal("auth:ok"),
7497
7500
  version: external_exports.string().min(1).optional(),
7498
7501
  protocolVersion: external_exports.number().int().nonnegative().optional()
7499
7502
  });
7503
+ DeviceConnectionEntrySchema = external_exports.object({
7504
+ clientId: external_exports.string().min(1),
7505
+ connectedAt: external_exports.number().int().nonnegative(),
7506
+ self: external_exports.boolean(),
7507
+ clientInfo: ClientInfoSchema.optional()
7508
+ });
7509
+ DeviceConnectionsResponseSchema = external_exports.object({
7510
+ type: external_exports.literal("device:connections:ok"),
7511
+ connections: external_exports.array(DeviceConnectionEntrySchema)
7512
+ });
7500
7513
  TunnelReadyEventSchema = external_exports.object({
7501
7514
  type: external_exports.literal("tunnel:ready"),
7502
7515
  url: external_exports.string().min(1),
@@ -7743,7 +7756,7 @@ function isMethodName(name) {
7743
7756
  function methodArgsSchema(method) {
7744
7757
  const doc = METHOD_DOCS[method];
7745
7758
  if (!doc.args) return null;
7746
- const base = zodToJsonSchema(doc.args, { $refStrategy: "none" });
7759
+ const base = zodToJsonSchemaMono(doc.args, { $refStrategy: "none" });
7747
7760
  return doc.argsConstraints ? { ...base, ...doc.argsConstraints } : base;
7748
7761
  }
7749
7762
  function methodArgFields(method) {
@@ -7753,7 +7766,7 @@ function methodArgFields(method) {
7753
7766
  const required = new Set(schema.required ?? []);
7754
7767
  return Object.keys(props).map((name) => ({ name, required: required.has(name) }));
7755
7768
  }
7756
- var NO_ARGS, MetaMethodsArgs, METHOD_DOCS, METHOD_NAMES, RPC_METHOD_STATUSES, RpcMethodStatusSchema, RpcMethodInfoSchema, MetaMethodsResultSchema;
7769
+ var NO_ARGS, MetaMethodsArgs, METHOD_DOCS, METHOD_NAMES, RPC_METHOD_STATUSES, RpcMethodStatusSchema, RpcMethodInfoSchema, MetaMethodsResultSchema, zodToJsonSchemaMono;
7757
7770
  var init_methods = __esm({
7758
7771
  "../protocol/src/methods.ts"() {
7759
7772
  "use strict";
@@ -8156,6 +8169,10 @@ var init_methods = __esm({
8156
8169
  summary: "\u8FDE\u63A5\u76EE\u6807\u8BBE\u5907\uFF1A\u6362 aud \u7ED1\u5B9A\u7684\u7B7E\u540D token \u5E76\u8D70 contact:handshake \u5EFA\u8054\u3002owner-only",
8157
8170
  args: DeviceConnectArgsSchema
8158
8171
  },
8172
+ "device:connections": {
8173
+ summary: '\u5217\u51FA\u672C daemon \u5F53\u524D\u6240\u6709 owner WS \u8FDE\u63A5\uFF08\u672C\u673A UI / \u624B\u673A / \u7B2C\u4E8C\u53F0\u684C\u9762\uFF09+ \u5404\u81EA clientInfo\u3002owner-only\uFF1Bguest \u8FDE\u63A5\u4E0D\u5728\u5217\uFF08\u4E0D\u662F"\u6211\u7684\u8BBE\u5907"\u4E14\u4E0D\u5411 UI \u6CC4\u9732 guest \u4FE1\u606F\uFF09',
8174
+ args: NO_ARGS
8175
+ },
8159
8176
  "appBuilder:listProjects": {
8160
8177
  summary: "\u5217\u51FA app-builder project\uFF08\u542B dev server \u72B6\u6001\uFF09",
8161
8178
  args: ListProjectsArgsSchema
@@ -8232,6 +8249,7 @@ var init_methods = __esm({
8232
8249
  /** METHOD_NAMES 全集,顺序与之一致 */
8233
8250
  methods: external_exports.array(RpcMethodInfoSchema)
8234
8251
  });
8252
+ zodToJsonSchemaMono = zodToJsonSchema;
8235
8253
  }
8236
8254
  });
8237
8255
 
@@ -52960,7 +52978,7 @@ var LocalWsServer = class {
52960
52978
  } catch {
52961
52979
  }
52962
52980
  }, this.pingIntervalMs);
52963
- this.clients.set(id, { handle, ws: socket, pingTimer, ctx: null });
52981
+ this.clients.set(id, { handle, ws: socket, pingTimer, ctx: null, connectedAt: Date.now() });
52964
52982
  this.logger?.info("client connected", { clientId: id, total: this.clients.size, remoteAddress });
52965
52983
  const authGate = this.opts.authGate;
52966
52984
  let authed = true;
@@ -53085,6 +53103,18 @@ var LocalWsServer = class {
53085
53103
  clientCount() {
53086
53104
  return this.clients.size;
53087
53105
  }
53106
+ // device:connections 数据源:owner 连接快照。
53107
+ // principal.kind==='guest'(connect/visitor 票种)不列——不是"我的设备",也不向 UI
53108
+ // 泄露 guest 信息;ctx===null 是 noAuth localhost 路径(dispatcher 按 owner fallback
53109
+ // 处理),视作 owner 列入。
53110
+ listOwnerConnections() {
53111
+ const out = [];
53112
+ for (const [id, c] of this.clients) {
53113
+ if (c.ctx && c.ctx.principal.kind !== "owner") continue;
53114
+ out.push({ clientId: id, connectedAt: c.connectedAt, clientInfo: c.ctx?.clientInfo });
53115
+ }
53116
+ return out.sort((a, b2) => a.connectedAt - b2.connectedAt);
53117
+ }
53088
53118
  };
53089
53119
  function addSubscription(client, sessionId) {
53090
53120
  const cur = client.subscribedSessions.get(sessionId) ?? 0;
@@ -57628,9 +57658,20 @@ function buildDeviceHandlers(deps) {
57628
57658
  }
57629
57659
  }
57630
57660
  };
57661
+ const connections = async (_frame, client, ctx) => {
57662
+ ensureOwner3(ctx);
57663
+ const entries = deps.listOwnerConnections();
57664
+ return {
57665
+ response: {
57666
+ type: "device:connections:ok",
57667
+ connections: entries.map((e) => ({ ...e, self: e.clientId === client.id }))
57668
+ }
57669
+ };
57670
+ };
57631
57671
  return {
57632
57672
  "device:list": list,
57633
- "device:connect": connect
57673
+ "device:connect": connect,
57674
+ "device:connections": connections
57634
57675
  };
57635
57676
  }
57636
57677
 
@@ -57814,6 +57855,7 @@ var METHOD_GRANT_MAP = {
57814
57855
  // 设备目录 / 连接都是 owner 本机操作(用 owner 的 ttcJwt 找中心 server),guest 不可调
57815
57856
  "device:list": ADMIN_ANY,
57816
57857
  "device:connect": ADMIN_ANY,
57858
+ "device:connections": ADMIN_ANY,
57817
57859
  // ---- app-builder Project picker(spec 2026-06-01-app-builder-project-picker-design) ----
57818
57860
  // owner-only:picker UI 给 owner 管理本机 build 中的 project(fs + 端口分配)。
57819
57861
  // 即使 persona-app-builder 是 PreinstalledPersona,project 管理也属本机 owner 行为,
@@ -57872,7 +57914,7 @@ function computeMethodAccess(args) {
57872
57914
  }
57873
57915
 
57874
57916
  // src/version.ts
57875
- var version = "0.2.270".length > 0 ? "0.2.270" : "dev";
57917
+ var version = "0.2.272".length > 0 ? "0.2.272" : "dev";
57876
57918
 
57877
57919
  // src/cli-probe/probe.ts
57878
57920
  var fs54 = __toESM(require("fs"), 1);
@@ -61739,7 +61781,9 @@ async function startDaemon(config) {
61739
61781
  // 自动反向(spec 决策 #11):本机可达地址 = tunnel URL(公网),出站连接时
61740
61782
  // 透传让对方反向加我为联系人。无 tunnel(仅本机 ws)→ null,对方不自动反向(不造假数据)。
61741
61783
  // 决策 #16:身份不自报——本机 deviceId/ownerId/provider 由 exchange 签进 token 背书。
61742
- selfUrl: () => currentTunnelUrl
61784
+ selfUrl: () => currentTunnelUrl,
61785
+ // device:connections 数据源。惰性闭包:wsServer 晚于本 deps 赋值,请求时才解引用。
61786
+ listOwnerConnections: () => wsServer?.listOwnerConnections() ?? []
61743
61787
  },
61744
61788
  // app-builder
61745
61789
  appBuilderStore,
@@ -22617,6 +22617,13 @@ var CancelQuestionArgs = external_exports.object({
22617
22617
  toolUseId: external_exports.string().min(1)
22618
22618
  });
22619
22619
  var CancelQuestionResponseSchema = external_exports.object({ ok: external_exports.literal(true) });
22620
+ var ClientInfoSchema = external_exports.object({
22621
+ name: external_exports.string().min(1),
22622
+ version: external_exports.string().min(1),
22623
+ instanceId: external_exports.string().min(1),
22624
+ /** 自报设备名(如 os.hostname()),展示用非身份;trim 后截断 64 字符 */
22625
+ deviceLabel: external_exports.string().transform((s) => s.trim().slice(0, 64)).optional()
22626
+ });
22620
22627
  var AuthRequestFrameSchema = external_exports.object({
22621
22628
  type: external_exports.literal("auth"),
22622
22629
  token: external_exports.string().min(1),
@@ -22637,17 +22644,23 @@ var AuthRequestFrameSchema = external_exports.object({
22637
22644
  * 'clawd-mobile-android' / ...),宽容未知值(将来加新客户端不动 schema)。
22638
22645
  * instanceId:客户端首启生成 UUID 并本地持久化——区分同种类多实例(多手机/多 desktop 同连)。
22639
22646
  */
22640
- clientInfo: external_exports.object({
22641
- name: external_exports.string().min(1),
22642
- version: external_exports.string().min(1),
22643
- instanceId: external_exports.string().min(1)
22644
- }).optional()
22647
+ clientInfo: ClientInfoSchema.optional()
22645
22648
  });
22646
22649
  var AuthOkFrameSchema = external_exports.object({
22647
22650
  type: external_exports.literal("auth:ok"),
22648
22651
  version: external_exports.string().min(1).optional(),
22649
22652
  protocolVersion: external_exports.number().int().nonnegative().optional()
22650
22653
  });
22654
+ var DeviceConnectionEntrySchema = external_exports.object({
22655
+ clientId: external_exports.string().min(1),
22656
+ connectedAt: external_exports.number().int().nonnegative(),
22657
+ self: external_exports.boolean(),
22658
+ clientInfo: ClientInfoSchema.optional()
22659
+ });
22660
+ var DeviceConnectionsResponseSchema = external_exports.object({
22661
+ type: external_exports.literal("device:connections:ok"),
22662
+ connections: external_exports.array(DeviceConnectionEntrySchema)
22663
+ });
22651
22664
  var TunnelReadyEventSchema = external_exports.object({
22652
22665
  type: external_exports.literal("tunnel:ready"),
22653
22666
  url: external_exports.string().min(1),
@@ -23270,6 +23283,10 @@ var METHOD_DOCS = {
23270
23283
  summary: "\u8FDE\u63A5\u76EE\u6807\u8BBE\u5907\uFF1A\u6362 aud \u7ED1\u5B9A\u7684\u7B7E\u540D token \u5E76\u8D70 contact:handshake \u5EFA\u8054\u3002owner-only",
23271
23284
  args: DeviceConnectArgsSchema
23272
23285
  },
23286
+ "device:connections": {
23287
+ summary: '\u5217\u51FA\u672C daemon \u5F53\u524D\u6240\u6709 owner WS \u8FDE\u63A5\uFF08\u672C\u673A UI / \u624B\u673A / \u7B2C\u4E8C\u53F0\u684C\u9762\uFF09+ \u5404\u81EA clientInfo\u3002owner-only\uFF1Bguest \u8FDE\u63A5\u4E0D\u5728\u5217\uFF08\u4E0D\u662F"\u6211\u7684\u8BBE\u5907"\u4E14\u4E0D\u5411 UI \u6CC4\u9732 guest \u4FE1\u606F\uFF09',
23288
+ args: NO_ARGS
23289
+ },
23273
23290
  "appBuilder:listProjects": {
23274
23291
  summary: "\u5217\u51FA app-builder project\uFF08\u542B dev server \u72B6\u6001\uFF09",
23275
23292
  args: ListProjectsArgsSchema