botmux 2.44.0 → 2.45.0

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 (167) hide show
  1. package/README.en.md +1 -2
  2. package/README.md +1 -2
  3. package/dist/cli/bots-list-output.d.ts +8 -0
  4. package/dist/cli/bots-list-output.d.ts.map +1 -1
  5. package/dist/cli/bots-list-output.js +9 -0
  6. package/dist/cli/bots-list-output.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +6 -0
  9. package/dist/cli.js.map +1 -1
  10. package/dist/core/command-handler.d.ts.map +1 -1
  11. package/dist/core/command-handler.js +132 -50
  12. package/dist/core/command-handler.js.map +1 -1
  13. package/dist/core/dashboard-ipc-server.d.ts +2 -0
  14. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  15. package/dist/core/dashboard-ipc-server.js +56 -0
  16. package/dist/core/dashboard-ipc-server.js.map +1 -1
  17. package/dist/core/role-resolver.d.ts +17 -1
  18. package/dist/core/role-resolver.d.ts.map +1 -1
  19. package/dist/core/role-resolver.js +64 -10
  20. package/dist/core/role-resolver.js.map +1 -1
  21. package/dist/core/session-manager.d.ts.map +1 -1
  22. package/dist/core/session-manager.js +14 -9
  23. package/dist/core/session-manager.js.map +1 -1
  24. package/dist/core/trigger-session.d.ts +9 -0
  25. package/dist/core/trigger-session.d.ts.map +1 -0
  26. package/dist/core/trigger-session.js +158 -0
  27. package/dist/core/trigger-session.js.map +1 -0
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +73 -44
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/connector-api.d.ts +3 -0
  32. package/dist/dashboard/connector-api.d.ts.map +1 -0
  33. package/dist/dashboard/connector-api.js +351 -0
  34. package/dist/dashboard/connector-api.js.map +1 -0
  35. package/dist/dashboard/federated-group-core.d.ts +54 -0
  36. package/dist/dashboard/federated-group-core.d.ts.map +1 -0
  37. package/dist/dashboard/federated-group-core.js +165 -0
  38. package/dist/dashboard/federated-group-core.js.map +1 -0
  39. package/dist/dashboard/federation-api.d.ts +42 -0
  40. package/dist/dashboard/federation-api.d.ts.map +1 -0
  41. package/dist/dashboard/federation-api.js +408 -0
  42. package/dist/dashboard/federation-api.js.map +1 -0
  43. package/dist/dashboard/federation-spoke-api.d.ts +76 -0
  44. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -0
  45. package/dist/dashboard/federation-spoke-api.js +618 -0
  46. package/dist/dashboard/federation-spoke-api.js.map +1 -0
  47. package/dist/dashboard/team-group.d.ts +18 -0
  48. package/dist/dashboard/team-group.d.ts.map +1 -0
  49. package/dist/dashboard/team-group.js +7 -0
  50. package/dist/dashboard/team-group.js.map +1 -0
  51. package/dist/dashboard/trigger-api.d.ts +13 -0
  52. package/dist/dashboard/trigger-api.d.ts.map +1 -0
  53. package/dist/dashboard/trigger-api.js +77 -0
  54. package/dist/dashboard/trigger-api.js.map +1 -0
  55. package/dist/dashboard/web/app.js +8 -0
  56. package/dist/dashboard/web/app.js.map +1 -1
  57. package/dist/dashboard/web/connectors.d.ts +2 -0
  58. package/dist/dashboard/web/connectors.d.ts.map +1 -0
  59. package/dist/dashboard/web/connectors.js +187 -0
  60. package/dist/dashboard/web/connectors.js.map +1 -0
  61. package/dist/dashboard/web/team-federation.d.ts +3 -0
  62. package/dist/dashboard/web/team-federation.d.ts.map +1 -0
  63. package/dist/dashboard/web/team-federation.js +472 -0
  64. package/dist/dashboard/web/team-federation.js.map +1 -0
  65. package/dist/dashboard/webhook-routes.d.ts +19 -0
  66. package/dist/dashboard/webhook-routes.d.ts.map +1 -0
  67. package/dist/dashboard/webhook-routes.js +321 -0
  68. package/dist/dashboard/webhook-routes.js.map +1 -0
  69. package/dist/dashboard-web/app.js +509 -386
  70. package/dist/dashboard-web/index.html +2 -0
  71. package/dist/dashboard.js +152 -1
  72. package/dist/dashboard.js.map +1 -1
  73. package/dist/i18n/en.d.ts.map +1 -1
  74. package/dist/i18n/en.js +24 -8
  75. package/dist/i18n/en.js.map +1 -1
  76. package/dist/i18n/zh.d.ts.map +1 -1
  77. package/dist/i18n/zh.js +24 -8
  78. package/dist/i18n/zh.js.map +1 -1
  79. package/dist/im/lark/client.d.ts +21 -0
  80. package/dist/im/lark/client.d.ts.map +1 -1
  81. package/dist/im/lark/client.js +86 -18
  82. package/dist/im/lark/client.js.map +1 -1
  83. package/dist/services/bot-owner-store.d.ts +28 -0
  84. package/dist/services/bot-owner-store.d.ts.map +1 -0
  85. package/dist/services/bot-owner-store.js +82 -0
  86. package/dist/services/bot-owner-store.js.map +1 -0
  87. package/dist/services/bot-profile-store.d.ts +16 -0
  88. package/dist/services/bot-profile-store.d.ts.map +1 -0
  89. package/dist/services/bot-profile-store.js +98 -0
  90. package/dist/services/bot-profile-store.js.map +1 -0
  91. package/dist/services/connector-store.d.ts +58 -0
  92. package/dist/services/connector-store.d.ts.map +1 -0
  93. package/dist/services/connector-store.js +79 -0
  94. package/dist/services/connector-store.js.map +1 -0
  95. package/dist/services/deployment-identity.d.ts +22 -0
  96. package/dist/services/deployment-identity.d.ts.map +1 -0
  97. package/dist/services/deployment-identity.js +67 -0
  98. package/dist/services/deployment-identity.js.map +1 -0
  99. package/dist/services/federation-membership-store.d.ts +23 -0
  100. package/dist/services/federation-membership-store.d.ts.map +1 -0
  101. package/dist/services/federation-membership-store.js +66 -0
  102. package/dist/services/federation-membership-store.js.map +1 -0
  103. package/dist/services/federation-roster.d.ts +54 -0
  104. package/dist/services/federation-roster.d.ts.map +1 -0
  105. package/dist/services/federation-roster.js +51 -0
  106. package/dist/services/federation-roster.js.map +1 -0
  107. package/dist/services/federation-store.d.ts +76 -0
  108. package/dist/services/federation-store.d.ts.map +1 -0
  109. package/dist/services/federation-store.js +133 -0
  110. package/dist/services/federation-store.js.map +1 -0
  111. package/dist/services/group-creator.d.ts +6 -0
  112. package/dist/services/group-creator.d.ts.map +1 -1
  113. package/dist/services/group-creator.js +10 -1
  114. package/dist/services/group-creator.js.map +1 -1
  115. package/dist/services/groups-store.d.ts +11 -0
  116. package/dist/services/groups-store.d.ts.map +1 -1
  117. package/dist/services/groups-store.js +42 -0
  118. package/dist/services/groups-store.js.map +1 -1
  119. package/dist/services/invite-store.d.ts +28 -0
  120. package/dist/services/invite-store.d.ts.map +1 -0
  121. package/dist/services/invite-store.js +85 -0
  122. package/dist/services/invite-store.js.map +1 -0
  123. package/dist/services/pairing-store.d.ts +47 -0
  124. package/dist/services/pairing-store.d.ts.map +1 -0
  125. package/dist/services/pairing-store.js +132 -0
  126. package/dist/services/pairing-store.js.map +1 -0
  127. package/dist/services/team-roster.d.ts +38 -0
  128. package/dist/services/team-roster.d.ts.map +1 -0
  129. package/dist/services/team-roster.js +82 -0
  130. package/dist/services/team-roster.js.map +1 -0
  131. package/dist/services/team-store.d.ts +54 -0
  132. package/dist/services/team-store.d.ts.map +1 -0
  133. package/dist/services/team-store.js +156 -0
  134. package/dist/services/team-store.js.map +1 -0
  135. package/dist/services/trigger-log-store.d.ts +46 -0
  136. package/dist/services/trigger-log-store.d.ts.map +1 -0
  137. package/dist/services/trigger-log-store.js +132 -0
  138. package/dist/services/trigger-log-store.js.map +1 -0
  139. package/dist/services/trigger-types.d.ts +57 -0
  140. package/dist/services/trigger-types.d.ts.map +1 -0
  141. package/dist/services/trigger-types.js +28 -0
  142. package/dist/services/trigger-types.js.map +1 -0
  143. package/dist/services/webhook-key.d.ts +16 -0
  144. package/dist/services/webhook-key.d.ts.map +1 -0
  145. package/dist/services/webhook-key.js +123 -0
  146. package/dist/services/webhook-key.js.map +1 -0
  147. package/dist/services/webhook-lifecycle-extractors.d.ts +15 -0
  148. package/dist/services/webhook-lifecycle-extractors.d.ts.map +1 -0
  149. package/dist/services/webhook-lifecycle-extractors.js +59 -0
  150. package/dist/services/webhook-lifecycle-extractors.js.map +1 -0
  151. package/dist/services/webhook-lifecycle-store.d.ts +45 -0
  152. package/dist/services/webhook-lifecycle-store.d.ts.map +1 -0
  153. package/dist/services/webhook-lifecycle-store.js +159 -0
  154. package/dist/services/webhook-lifecycle-store.js.map +1 -0
  155. package/dist/setup/verify-permissions.d.ts.map +1 -1
  156. package/dist/setup/verify-permissions.js +4 -0
  157. package/dist/setup/verify-permissions.js.map +1 -1
  158. package/dist/skills/definitions.d.ts.map +1 -1
  159. package/dist/skills/definitions.js +64 -10
  160. package/dist/skills/definitions.js.map +1 -1
  161. package/dist/workflows/events/payloads.d.ts +2 -2
  162. package/dist/workflows/events/schema.d.ts +8 -8
  163. package/dist/workflows/trigger-from-envelope.d.ts +13 -0
  164. package/dist/workflows/trigger-from-envelope.d.ts.map +1 -0
  165. package/dist/workflows/trigger-from-envelope.js +67 -0
  166. package/dist/workflows/trigger-from-envelope.js.map +1 -0
  167. package/package.json +1 -1
@@ -5,6 +5,10 @@ export interface CreateGroupOpts {
5
5
  larkAppIds: string[];
6
6
  name?: string;
7
7
  userOpenIds?: string[];
8
+ /** Users to add by union_id (tenant-stable) — used to pull bot OWNERS into a
9
+ * federated group regardless of which bot they paired through (open_id is
10
+ * app-scoped, union_id is not). Added after the chat is created. */
11
+ ownerUnionIds?: string[];
8
12
  transferOwnerTo?: string;
9
13
  notifyOwnerOpenId?: string;
10
14
  /** Optional working directory to bind the newly created chat to oncall for
@@ -18,6 +22,8 @@ export interface CreateGroupResult {
18
22
  creator: string;
19
23
  invalidBotIds: string[];
20
24
  invalidUserIds: string[];
25
+ /** Owner union_ids Lark could not add to the chat (best-effort). */
26
+ invalidOwnerUnionIds: string[];
21
27
  ownerTransferredTo: string | null;
22
28
  transferError: string | null;
23
29
  notifyMessageId: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"group-creator.d.ts","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB;wEACoE;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;2DAEuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;8EAC0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0G3F"}
1
+ {"version":3,"file":"group-creator.d.ts","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB;wEACoE;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;yEAEqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;2DAEuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oEAAoE;IACpE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;8EAC0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoH3F"}
@@ -17,7 +17,7 @@
17
17
  * `notifyOwnerOpenId` MUST be in `creatorLarkAppId`'s app scope. Enforcing
18
18
  * this is the decision layer's job — the service trusts its inputs.
19
19
  */
20
- import { createChat, transferChatOwner, getChatOwner, getChatShareLink } from './groups-store.js';
20
+ import { createChat, transferChatOwner, getChatOwner, getChatShareLink, addUsersToChatByUnionId } from './groups-store.js';
21
21
  import { sendMessage } from '../im/lark/client.js';
22
22
  import { bindOncall } from './oncall-store.js';
23
23
  export async function createGroupWithBots(opts) {
@@ -44,6 +44,14 @@ export async function createGroupWithBots(opts) {
44
44
  else
45
45
  shareLinkError = sl.error;
46
46
  }
47
+ // Pull bot owners into the chat by union_id (tenant-stable; the creator bot
48
+ // adds them). Best-effort — failures surface as invalidOwnerUnionIds, the chat
49
+ // still exists. The creator's own owner (if any) is harmless to re-add.
50
+ let invalidOwnerUnionIds = [];
51
+ if (opts.ownerUnionIds && opts.ownerUnionIds.length > 0) {
52
+ const ar = await addUsersToChatByUnionId(opts.creatorLarkAppId, r.chatId, opts.ownerUnionIds);
53
+ invalidOwnerUnionIds = ar.invalidUserIds;
54
+ }
47
55
  let ownerTransferredTo = null;
48
56
  let transferError = null;
49
57
  if (opts.transferOwnerTo) {
@@ -117,6 +125,7 @@ export async function createGroupWithBots(opts) {
117
125
  creator: opts.creatorLarkAppId,
118
126
  invalidBotIds: r.invalidBotIds,
119
127
  invalidUserIds: r.invalidUserIds,
128
+ invalidOwnerUnionIds,
120
129
  ownerTransferredTo,
121
130
  transferError,
122
131
  notifyMessageId,
@@ -1 +1 @@
1
- {"version":3,"file":"group-creator.js","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"group-creator.js","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC3H,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAwC/C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAqB;IAC7D,8EAA8E;IAC9E,uEAAuE;IACvE,gEAAgE;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7E,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAChD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;KAChC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,+EAA+E;IAC/E,uEAAuE;IACvE,gFAAgF;IAChF,mEAAmE;IACnE,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,CAAC;QACC,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,EAAE,CAAC,EAAE;YAAE,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;;YAC/B,cAAc,GAAG,EAAE,CAAC,KAAK,CAAC;IACjC,CAAC;IAED,4EAA4E;IAC5E,+EAA+E;IAC/E,wEAAwE;IACxE,IAAI,oBAAoB,GAAa,EAAE,CAAC;IACxC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9F,oBAAoB,GAAG,EAAE,CAAC,cAAc,CAAC;IAC3C,CAAC;IAED,IAAI,kBAAkB,GAAkB,IAAI,CAAC;IAC7C,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,kEAAkE;QAClE,gDAAgD;QAChD,IAAI,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACpD,aAAa,GAAG,kBAAkB,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAC1F,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBACV,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,wEAAwE;gBACxE,uEAAuE;gBACvE,+DAA+D;gBAC/D,oEAAoE;gBACpE,iEAAiE;gBACjE,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBACzE,IAAI,YAAY,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC1C,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtD,WAAW,GAAG,kBAAkB,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,eAAe,GAAG,MAAM,WAAW,CACjC,IAAI,CAAC,gBAAgB,EACrB,CAAC,CAAC,MAAM,EACR,gBAAgB,IAAI,CAAC,iBAAiB,SAAS,EAC/C,MAAM,CACP,CAAC;YACJ,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,WAAW,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAwC,EAAE,CAAC;IAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,cAAc,EAAE,CAAC;QACnB,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;aAClF,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;gBACjE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBACV,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,IAAI,CAAC,gBAAgB;QAC9B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,oBAAoB;QACpB,kBAAkB;QAClB,aAAa;QACb,eAAe;QACf,WAAW;QACX,SAAS;QACT,cAAc;QACd,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -125,4 +125,15 @@ export declare function addBotToChat(proxyLarkAppId: string, chatId: string, tar
125
125
  ok: boolean;
126
126
  error?: string;
127
127
  }[]>;
128
+ /**
129
+ * Add USERS to an existing chat by **union_id** (tenant-stable, NOT app-scoped
130
+ * like open_id). Used to pull bot owners into a federated group regardless of
131
+ * which bot they paired through. Returns the union_ids Lark could not add.
132
+ * Best-effort: total failure reports all ids invalid.
133
+ *
134
+ * Uses /open-apis/im/v1/chats/:chat_id/members with member_id_type=union_id.
135
+ */
136
+ export declare function addUsersToChatByUnionId(proxyLarkAppId: string, chatId: string, unionIds: string[]): Promise<{
137
+ invalidUserIds: string[];
138
+ }>;
128
139
  //# sourceMappingURL=groups-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"groups-store.d.ts","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAyBvE;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASlF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5D,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAetD;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,MAAM,GAAG,MAAM,GAAG,aAA6B,GAC9D,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBzE;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAWtD;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAetD;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAwBxD"}
1
+ {"version":3,"file":"groups-store.d.ts","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { getBotClient } from '../bot-registry.js';
13
13
  import { larkGet } from '../im/lark/client.js';
14
+ import { logger } from '../utils/logger.js';
14
15
  /**
15
16
  * List chats the given bot is a member of, draining pagination internally.
16
17
  * Uses /open-apis/im/v1/chats.
@@ -267,4 +268,45 @@ export async function addBotToChat(proxyLarkAppId, chatId, targetLarkAppIds) {
267
268
  }
268
269
  return out;
269
270
  }
271
+ /**
272
+ * Add USERS to an existing chat by **union_id** (tenant-stable, NOT app-scoped
273
+ * like open_id). Used to pull bot owners into a federated group regardless of
274
+ * which bot they paired through. Returns the union_ids Lark could not add.
275
+ * Best-effort: total failure reports all ids invalid.
276
+ *
277
+ * Uses /open-apis/im/v1/chats/:chat_id/members with member_id_type=union_id.
278
+ */
279
+ export async function addUsersToChatByUnionId(proxyLarkAppId, chatId, unionIds) {
280
+ const ids = Array.from(new Set(unionIds.filter(Boolean)));
281
+ if (ids.length === 0)
282
+ return { invalidUserIds: [] };
283
+ const client = getBotClient(proxyLarkAppId);
284
+ // Add ONE id per call: Lark fails the WHOLE batch (HTTP 400, code 232024) if any
285
+ // single union_id is outside the bot's app visibility scope — that would drop
286
+ // valid owners too. Per-id calls isolate the out-of-scope ones so the rest land.
287
+ const invalidUserIds = [];
288
+ for (const id of ids) {
289
+ try {
290
+ const res = await client.im.v1.chatMembers.create({
291
+ path: { chat_id: chatId },
292
+ params: { member_id_type: 'union_id' },
293
+ data: { id_list: [id] },
294
+ });
295
+ if (res.code !== 0 && res.code !== undefined) {
296
+ logger.warn(`[groups] addUsersByUnionId rejected: code=${res.code} msg=${res.msg} (proxy=${proxyLarkAppId})`);
297
+ invalidUserIds.push(id);
298
+ }
299
+ else if ((res.data?.invalid_id_list ?? []).length) {
300
+ invalidUserIds.push(id);
301
+ }
302
+ }
303
+ catch (e) {
304
+ // code 232024 = user not in app's visibility scope / no collaboration perm.
305
+ const code = e?.response?.data?.code ?? e?.code;
306
+ logger.warn(`[groups] addUsersByUnionId threw: code=${code} ${e?.message ?? e} (proxy=${proxyLarkAppId})`);
307
+ invalidUserIds.push(id);
308
+ }
309
+ }
310
+ return { invalidUserIds };
311
+ }
270
312
  //# sourceMappingURL=groups-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"groups-store.js","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"groups-store.js","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface TeamInvite {
2
+ code: string;
3
+ teamId: string;
4
+ createdBy: string;
5
+ createdAt: number;
6
+ expiresAt: number;
7
+ usedAt?: number;
8
+ }
9
+ export interface CreatedInvite {
10
+ code: string;
11
+ expiresAt: number;
12
+ }
13
+ /** Mint a single-use invite for a team. */
14
+ export declare function createInvite(dataDir: string, teamId: string, createdBy: string, ttlMs?: number, now?: number): CreatedInvite;
15
+ /** Drop every invite for a team (e.g. when the team is deleted), so stale codes
16
+ * can't later be consumed to join/switch into a non-existent team. Returns count. */
17
+ export declare function deleteInvitesForTeam(dataDir: string, teamId: string): number;
18
+ export type ConsumeInviteResult = {
19
+ ok: true;
20
+ teamId: string;
21
+ } | {
22
+ ok: false;
23
+ reason: 'not_found' | 'expired' | 'used';
24
+ };
25
+ /** Validate + burn an invite (single-use). Determines the precise failure
26
+ * reason BEFORE pruning, so an expired code reports `expired` (not `not_found`). */
27
+ export declare function consumeInvite(dataDir: string, code: string, now?: number): ConsumeInviteResult;
28
+ //# sourceMappingURL=invite-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite-store.d.ts","sourceRoot":"","sources":["../../src/services/invite-store.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAgCD,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CAAE;AAEnE,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAuB,EAAE,GAAG,GAAE,MAAmB,GAAG,aAAa,CAMxJ;AAED;sFACsF;AACtF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,CAAC;AAE5D;qFACqF;AACrF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,mBAAmB,CAS1G"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Team invite store: an existing member mints a single-use, short-TTL invite
3
+ * code; the invitee pairs (pairing-login) and presents the code on consume,
4
+ * which authorizes joining the team (team-store.addMember). This sidesteps
5
+ * email→open_id resolution (the dashboard process has no Lark client) — the
6
+ * invitee self-authenticates via the bot, the invite only grants admission.
7
+ *
8
+ * Storage: `{dataDir}/team-invites.json`, atomic writes; expired/used pruned.
9
+ *
10
+ * Concurrency: consume is a read-modify-write. This assumes a SINGLE dashboard
11
+ * writer process (the current deployment model). If multiple dashboard processes
12
+ * ever write concurrently, a single-use code would need a file lock here.
13
+ */
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { randomBytes, randomUUID } from 'node:crypto';
17
+ const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000; // 24h
18
+ function filePath(dataDir) { return join(dataDir, 'team-invites.json'); }
19
+ function readFile(dataDir) {
20
+ const fp = filePath(dataDir);
21
+ if (!existsSync(fp))
22
+ return {};
23
+ try {
24
+ const parsed = JSON.parse(readFileSync(fp, 'utf-8'));
25
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
26
+ return parsed;
27
+ }
28
+ catch { /* corrupt */ }
29
+ return {};
30
+ }
31
+ function writeFileAtomic(dataDir, data) {
32
+ if (!existsSync(dataDir))
33
+ mkdirSync(dataDir, { recursive: true });
34
+ const fp = filePath(dataDir);
35
+ const tmp = `${fp}.${process.pid}.${randomUUID()}.tmp`;
36
+ writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', 'utf-8');
37
+ renameSync(tmp, fp);
38
+ }
39
+ /** Drop expired or used-and-old entries. */
40
+ function prune(data, now) {
41
+ for (const [code, inv] of Object.entries(data)) {
42
+ if (inv.expiresAt <= now || (inv.usedAt && now - inv.usedAt > DEFAULT_TTL_MS))
43
+ delete data[code];
44
+ }
45
+ return data;
46
+ }
47
+ /** Mint a single-use invite for a team. */
48
+ export function createInvite(dataDir, teamId, createdBy, ttlMs = DEFAULT_TTL_MS, now = Date.now()) {
49
+ const data = prune(readFile(dataDir), now);
50
+ const code = randomBytes(9).toString('base64url'); // ~12 chars, high entropy
51
+ data[code] = { code, teamId, createdBy, createdAt: now, expiresAt: now + ttlMs };
52
+ writeFileAtomic(dataDir, data);
53
+ return { code, expiresAt: now + ttlMs };
54
+ }
55
+ /** Drop every invite for a team (e.g. when the team is deleted), so stale codes
56
+ * can't later be consumed to join/switch into a non-existent team. Returns count. */
57
+ export function deleteInvitesForTeam(dataDir, teamId) {
58
+ const data = readFile(dataDir);
59
+ let removed = 0;
60
+ for (const [code, inv] of Object.entries(data)) {
61
+ if (inv.teamId === teamId) {
62
+ delete data[code];
63
+ removed++;
64
+ }
65
+ }
66
+ if (removed)
67
+ writeFileAtomic(dataDir, data);
68
+ return removed;
69
+ }
70
+ /** Validate + burn an invite (single-use). Determines the precise failure
71
+ * reason BEFORE pruning, so an expired code reports `expired` (not `not_found`). */
72
+ export function consumeInvite(dataDir, code, now = Date.now()) {
73
+ const data = readFile(dataDir);
74
+ const inv = data[code?.trim()];
75
+ if (!inv)
76
+ return { ok: false, reason: 'not_found' };
77
+ if (inv.expiresAt <= now)
78
+ return { ok: false, reason: 'expired' };
79
+ if (inv.usedAt)
80
+ return { ok: false, reason: 'used' };
81
+ inv.usedAt = now;
82
+ writeFileAtomic(dataDir, prune(data, now)); // burn this one; prune other stale entries
83
+ return { ok: true, teamId: inv.teamId };
84
+ }
85
+ //# sourceMappingURL=invite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite-store.js","sourceRoot":"","sources":["../../src/services/invite-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export type PairingStatus = 'pending' | 'claimed' | 'consumed';
2
+ export interface PairingClaimer {
3
+ openId: string;
4
+ unionId?: string;
5
+ name?: string;
6
+ /** The bot app the user ran `/pair` with — open_id is scoped to THIS app. */
7
+ larkAppId?: string;
8
+ }
9
+ export interface StartedPairing {
10
+ pairingId: string;
11
+ code: string;
12
+ browserToken: string;
13
+ expiresAt: number;
14
+ }
15
+ /** Begin a pairing. Returns the code to show the user + a private browserToken. */
16
+ export declare function createPairing(dataDir: string, ttlMs?: number, now?: number): StartedPairing;
17
+ export type ClaimResult = {
18
+ ok: true;
19
+ pairingId: string;
20
+ } | {
21
+ ok: false;
22
+ reason: 'not_found' | 'expired' | 'already_claimed';
23
+ };
24
+ /** Claim a pending pairing for a Feishu identity (called by the daemon on the bot side). */
25
+ export declare function claimPairing(dataDir: string, code: string, claimer: PairingClaimer, now?: number): ClaimResult;
26
+ export type PairingView = {
27
+ status: 'pending';
28
+ } | {
29
+ status: 'claimed';
30
+ claimedBy: PairingClaimer;
31
+ } | {
32
+ status: 'consumed';
33
+ } | {
34
+ status: 'not_found';
35
+ };
36
+ /** Browser-side status poll; requires the matching browserToken. */
37
+ export declare function getPairingStatus(dataDir: string, pairingId: string, browserToken: string, now?: number): PairingView;
38
+ export type ConsumeResult = {
39
+ ok: true;
40
+ claimedBy: PairingClaimer;
41
+ } | {
42
+ ok: false;
43
+ reason: 'not_found' | 'not_claimed' | 'already_consumed';
44
+ };
45
+ /** Single-use: turn a claimed pairing into a session. Requires the browserToken. */
46
+ export declare function consumePairing(dataDir: string, pairingId: string, browserToken: string, now?: number): ConsumeResult;
47
+ //# sourceMappingURL=pairing-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing-store.d.ts","sourceRoot":"","sources":["../../src/services/pairing-store.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmDD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAuB,EAAE,GAAG,GAAE,MAAmB,GAAG,cAAc,CAavH;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,iBAAiB,CAAA;CAAE,CAAC;AAEvE,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,GAAE,MAAmB,GAAG,WAAW,CAe1H;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAE5B,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,WAAW,CAOhI;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,kBAAkB,CAAA;CAAE,CAAC;AAE5E,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,aAAa,CAUhI"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Pairing-login store: binds a browser session to a Feishu user without a web
3
+ * OAuth redirect (which is unfriendly to ip:port self-host — see
4
+ * docs/platform-design.md). Device-code style:
5
+ *
6
+ * 1. Browser (unauthenticated) calls start → gets a short human `code` to show
7
+ * the user, plus a high-entropy `browserToken` it keeps privately.
8
+ * 2. User sends the `code` to the bot in Feishu. The daemon (which already
9
+ * knows the sender's open_id) claims the pairing for that identity.
10
+ * 3. Browser polls/consumes with its `browserToken`; on a claimed pairing it
11
+ * learns the Feishu identity and the web endpoint issues a session.
12
+ *
13
+ * Identity is established INSIDE Feishu, so only a short-lived code crosses to
14
+ * the web — independent of domain/IP/port. Team-membership gating is the
15
+ * caller's job (via team-store); this store only pairs browser ↔ identity.
16
+ *
17
+ * Security: code is high-entropy + short TTL + single-use; browserToken gates
18
+ * status/consume so a guessed code alone can't hijack a browser session.
19
+ * (Brute-forcing codes is further bounded by endpoint rate limiting at the wiring
20
+ * layer.) Codes/tokens are never logged.
21
+ *
22
+ * Storage: `{dataDir}/pairings.json` (shared across the web + daemon processes),
23
+ * atomic writes.
24
+ */
25
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from 'node:fs';
26
+ import { join } from 'node:path';
27
+ import { randomBytes, randomUUID } from 'node:crypto';
28
+ const DEFAULT_TTL_MS = 5 * 60 * 1000; // 5 minutes
29
+ /** Unambiguous alphabet (no 0/O/1/I) for the human-entered code. */
30
+ const CODE_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
31
+ const CODE_LEN = 8;
32
+ function filePath(dataDir) {
33
+ return join(dataDir, 'pairings.json');
34
+ }
35
+ function readFile(dataDir) {
36
+ const fp = filePath(dataDir);
37
+ if (!existsSync(fp))
38
+ return {};
39
+ try {
40
+ const parsed = JSON.parse(readFileSync(fp, 'utf-8'));
41
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
42
+ return parsed;
43
+ }
44
+ catch { /* corrupt — fall through */ }
45
+ return {};
46
+ }
47
+ function writeFileAtomic(dataDir, data) {
48
+ if (!existsSync(dataDir))
49
+ mkdirSync(dataDir, { recursive: true });
50
+ const fp = filePath(dataDir);
51
+ const tmp = `${fp}.${process.pid}.${randomUUID()}.tmp`;
52
+ writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', 'utf-8');
53
+ renameSync(tmp, fp);
54
+ }
55
+ /** Drop expired entries; returns the live map. */
56
+ function prune(data, now) {
57
+ for (const [id, e] of Object.entries(data)) {
58
+ if (e.expiresAt <= now)
59
+ delete data[id];
60
+ }
61
+ return data;
62
+ }
63
+ function genCode() {
64
+ const bytes = randomBytes(CODE_LEN);
65
+ let out = '';
66
+ for (let i = 0; i < CODE_LEN; i++)
67
+ out += CODE_ALPHABET[bytes[i] % CODE_ALPHABET.length];
68
+ return out;
69
+ }
70
+ /** Begin a pairing. Returns the code to show the user + a private browserToken. */
71
+ export function createPairing(dataDir, ttlMs = DEFAULT_TTL_MS, now = Date.now()) {
72
+ const data = prune(readFile(dataDir), now);
73
+ const entry = {
74
+ pairingId: randomUUID(),
75
+ code: genCode(),
76
+ browserToken: randomBytes(24).toString('base64url'),
77
+ status: 'pending',
78
+ createdAt: now,
79
+ expiresAt: now + ttlMs,
80
+ };
81
+ data[entry.pairingId] = entry;
82
+ writeFileAtomic(dataDir, data);
83
+ return { pairingId: entry.pairingId, code: entry.code, browserToken: entry.browserToken, expiresAt: entry.expiresAt };
84
+ }
85
+ /** Claim a pending pairing for a Feishu identity (called by the daemon on the bot side). */
86
+ export function claimPairing(dataDir, code, claimer, now = Date.now()) {
87
+ const data = prune(readFile(dataDir), now);
88
+ const entry = Object.values(data).find(e => e.code === code.trim().toUpperCase());
89
+ if (!entry)
90
+ return { ok: false, reason: 'not_found' };
91
+ if (entry.expiresAt <= now)
92
+ return { ok: false, reason: 'expired' };
93
+ if (entry.status !== 'pending')
94
+ return { ok: false, reason: 'already_claimed' };
95
+ entry.status = 'claimed';
96
+ entry.claimedBy = {
97
+ openId: claimer.openId,
98
+ ...(claimer.unionId ? { unionId: claimer.unionId } : {}),
99
+ ...(claimer.name ? { name: claimer.name } : {}),
100
+ ...(claimer.larkAppId ? { larkAppId: claimer.larkAppId } : {}),
101
+ };
102
+ writeFileAtomic(dataDir, data);
103
+ return { ok: true, pairingId: entry.pairingId };
104
+ }
105
+ /** Browser-side status poll; requires the matching browserToken. */
106
+ export function getPairingStatus(dataDir, pairingId, browserToken, now = Date.now()) {
107
+ const data = prune(readFile(dataDir), now);
108
+ const entry = data[pairingId];
109
+ if (!entry || entry.browserToken !== browserToken)
110
+ return { status: 'not_found' };
111
+ if (entry.status === 'claimed' && entry.claimedBy)
112
+ return { status: 'claimed', claimedBy: entry.claimedBy };
113
+ if (entry.status === 'consumed')
114
+ return { status: 'consumed' };
115
+ return { status: 'pending' };
116
+ }
117
+ /** Single-use: turn a claimed pairing into a session. Requires the browserToken. */
118
+ export function consumePairing(dataDir, pairingId, browserToken, now = Date.now()) {
119
+ const data = prune(readFile(dataDir), now);
120
+ const entry = data[pairingId];
121
+ if (!entry || entry.browserToken !== browserToken)
122
+ return { ok: false, reason: 'not_found' };
123
+ if (entry.status === 'consumed')
124
+ return { ok: false, reason: 'already_consumed' };
125
+ if (entry.status !== 'claimed' || !entry.claimedBy)
126
+ return { ok: false, reason: 'not_claimed' };
127
+ entry.status = 'consumed';
128
+ const claimedBy = entry.claimedBy;
129
+ writeFileAtomic(dataDir, data);
130
+ return { ok: true, claimedBy };
131
+ }
132
+ //# sourceMappingURL=pairing-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing-store.js","sourceRoot":"","sources":["../../src/services/pairing-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export interface TeamRosterBot {
2
+ larkAppId: string;
3
+ name: string;
4
+ cliId: string;
5
+ capability: string | null;
6
+ hasTeamRole: boolean;
7
+ /** Owner for grouping by person; null if unassigned. unionId is the key, name for display. */
8
+ owner: {
9
+ unionId?: string;
10
+ openId?: string;
11
+ name?: string;
12
+ } | null;
13
+ }
14
+ export interface TeamRoster {
15
+ team: {
16
+ id: string;
17
+ name: string;
18
+ memberCount: number;
19
+ };
20
+ bots: TeamRosterBot[];
21
+ }
22
+ /** A currently-running bot from the live daemon registry (authoritative for
23
+ * "what's running" — unlike bots-info.json which is a racy, probe-lagged file). */
24
+ export interface LiveBot {
25
+ larkAppId: string;
26
+ botName?: string | null;
27
+ cliId?: string;
28
+ }
29
+ /**
30
+ * @param configOrder optional list of larkAppIds in bots.json (config) order;
31
+ * when given, the roster is sorted to match it (and the personal dashboard).
32
+ * @param liveBots optional live daemon-registry bots. When given, the roster's
33
+ * bot set is THESE (authoritative — fixes an empty/stale bots-info.json
34
+ * showing no bots even though daemons are running), enriched with cliId from
35
+ * bots-info.json by larkAppId. When omitted, falls back to bots-info.json.
36
+ */
37
+ export declare function buildTeamRoster(dataDir: string, teamId?: string, configOrder?: string[], liveBots?: LiveBot[]): TeamRoster;
38
+ //# sourceMappingURL=team-roster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-roster.d.ts","sourceRoot":"","sources":["../../src/services/team-roster.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,8FAA8F;IAC9F,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB;AAkBD;oFACoF;AACpF,MAAM,WAAW,OAAO;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AAEvF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAwB,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,CAyC3I"}