@clawos-dev/clawd 0.2.270 → 0.2.271

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),
@@ -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
@@ -52960,7 +52977,7 @@ var LocalWsServer = class {
52960
52977
  } catch {
52961
52978
  }
52962
52979
  }, this.pingIntervalMs);
52963
- this.clients.set(id, { handle, ws: socket, pingTimer, ctx: null });
52980
+ this.clients.set(id, { handle, ws: socket, pingTimer, ctx: null, connectedAt: Date.now() });
52964
52981
  this.logger?.info("client connected", { clientId: id, total: this.clients.size, remoteAddress });
52965
52982
  const authGate = this.opts.authGate;
52966
52983
  let authed = true;
@@ -53085,6 +53102,18 @@ var LocalWsServer = class {
53085
53102
  clientCount() {
53086
53103
  return this.clients.size;
53087
53104
  }
53105
+ // device:connections 数据源:owner 连接快照。
53106
+ // principal.kind==='guest'(connect/visitor 票种)不列——不是"我的设备",也不向 UI
53107
+ // 泄露 guest 信息;ctx===null 是 noAuth localhost 路径(dispatcher 按 owner fallback
53108
+ // 处理),视作 owner 列入。
53109
+ listOwnerConnections() {
53110
+ const out = [];
53111
+ for (const [id, c] of this.clients) {
53112
+ if (c.ctx && c.ctx.principal.kind !== "owner") continue;
53113
+ out.push({ clientId: id, connectedAt: c.connectedAt, clientInfo: c.ctx?.clientInfo });
53114
+ }
53115
+ return out.sort((a, b2) => a.connectedAt - b2.connectedAt);
53116
+ }
53088
53117
  };
53089
53118
  function addSubscription(client, sessionId) {
53090
53119
  const cur = client.subscribedSessions.get(sessionId) ?? 0;
@@ -57628,9 +57657,20 @@ function buildDeviceHandlers(deps) {
57628
57657
  }
57629
57658
  }
57630
57659
  };
57660
+ const connections = async (_frame, client, ctx) => {
57661
+ ensureOwner3(ctx);
57662
+ const entries = deps.listOwnerConnections();
57663
+ return {
57664
+ response: {
57665
+ type: "device:connections:ok",
57666
+ connections: entries.map((e) => ({ ...e, self: e.clientId === client.id }))
57667
+ }
57668
+ };
57669
+ };
57631
57670
  return {
57632
57671
  "device:list": list,
57633
- "device:connect": connect
57672
+ "device:connect": connect,
57673
+ "device:connections": connections
57634
57674
  };
57635
57675
  }
57636
57676
 
@@ -57814,6 +57854,7 @@ var METHOD_GRANT_MAP = {
57814
57854
  // 设备目录 / 连接都是 owner 本机操作(用 owner 的 ttcJwt 找中心 server),guest 不可调
57815
57855
  "device:list": ADMIN_ANY,
57816
57856
  "device:connect": ADMIN_ANY,
57857
+ "device:connections": ADMIN_ANY,
57817
57858
  // ---- app-builder Project picker(spec 2026-06-01-app-builder-project-picker-design) ----
57818
57859
  // owner-only:picker UI 给 owner 管理本机 build 中的 project(fs + 端口分配)。
57819
57860
  // 即使 persona-app-builder 是 PreinstalledPersona,project 管理也属本机 owner 行为,
@@ -57872,7 +57913,7 @@ function computeMethodAccess(args) {
57872
57913
  }
57873
57914
 
57874
57915
  // src/version.ts
57875
- var version = "0.2.270".length > 0 ? "0.2.270" : "dev";
57916
+ var version = "0.2.271".length > 0 ? "0.2.271" : "dev";
57876
57917
 
57877
57918
  // src/cli-probe/probe.ts
57878
57919
  var fs54 = __toESM(require("fs"), 1);
@@ -61739,7 +61780,9 @@ async function startDaemon(config) {
61739
61780
  // 自动反向(spec 决策 #11):本机可达地址 = tunnel URL(公网),出站连接时
61740
61781
  // 透传让对方反向加我为联系人。无 tunnel(仅本机 ws)→ null,对方不自动反向(不造假数据)。
61741
61782
  // 决策 #16:身份不自报——本机 deviceId/ownerId/provider 由 exchange 签进 token 背书。
61742
- selfUrl: () => currentTunnelUrl
61783
+ selfUrl: () => currentTunnelUrl,
61784
+ // device:connections 数据源。惰性闭包:wsServer 晚于本 deps 赋值,请求时才解引用。
61785
+ listOwnerConnections: () => wsServer?.listOwnerConnections() ?? []
61743
61786
  },
61744
61787
  // app-builder
61745
61788
  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