@gakr-gakr/feishu 0.1.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 (133) hide show
  1. package/api.ts +32 -0
  2. package/autobot.plugin.json +180 -0
  3. package/channel-entry.ts +20 -0
  4. package/channel-plugin-api.ts +1 -0
  5. package/contract-api.ts +16 -0
  6. package/index.ts +82 -0
  7. package/package.json +62 -0
  8. package/runtime-api.ts +55 -0
  9. package/secret-contract-api.ts +5 -0
  10. package/security-contract-api.ts +1 -0
  11. package/session-key-api.ts +1 -0
  12. package/setup-api.ts +3 -0
  13. package/setup-entry.ts +13 -0
  14. package/skills/feishu-doc/SKILL.md +211 -0
  15. package/skills/feishu-doc/references/block-types.md +103 -0
  16. package/skills/feishu-drive/SKILL.md +97 -0
  17. package/skills/feishu-perm/SKILL.md +119 -0
  18. package/skills/feishu-wiki/SKILL.md +113 -0
  19. package/src/accounts.ts +333 -0
  20. package/src/agent-config.ts +21 -0
  21. package/src/app-registration.ts +331 -0
  22. package/src/approval-auth.ts +25 -0
  23. package/src/async.ts +104 -0
  24. package/src/audio-preflight.runtime.ts +9 -0
  25. package/src/bitable.ts +762 -0
  26. package/src/bot-content.ts +485 -0
  27. package/src/bot-runtime-api.ts +12 -0
  28. package/src/bot-sender-name.ts +125 -0
  29. package/src/bot.ts +1703 -0
  30. package/src/card-action.ts +447 -0
  31. package/src/card-interaction.ts +159 -0
  32. package/src/card-test-helpers.ts +54 -0
  33. package/src/card-ux-approval.ts +65 -0
  34. package/src/card-ux-launcher.ts +121 -0
  35. package/src/card-ux-shared.ts +33 -0
  36. package/src/channel-runtime-api.ts +16 -0
  37. package/src/channel.runtime.ts +47 -0
  38. package/src/channel.ts +1423 -0
  39. package/src/chat-schema.ts +25 -0
  40. package/src/chat.ts +188 -0
  41. package/src/client-timeout.ts +42 -0
  42. package/src/client.ts +262 -0
  43. package/src/comment-dispatcher-runtime-api.ts +6 -0
  44. package/src/comment-dispatcher.ts +107 -0
  45. package/src/comment-handler-runtime-api.ts +3 -0
  46. package/src/comment-handler.ts +303 -0
  47. package/src/comment-reaction.ts +259 -0
  48. package/src/comment-shared.ts +406 -0
  49. package/src/comment-target.ts +44 -0
  50. package/src/config-schema.ts +335 -0
  51. package/src/conversation-id.ts +199 -0
  52. package/src/dedup-runtime-api.ts +1 -0
  53. package/src/dedup.ts +141 -0
  54. package/src/dedupe-key.ts +72 -0
  55. package/src/directory.static.ts +61 -0
  56. package/src/directory.ts +124 -0
  57. package/src/doc-schema.ts +182 -0
  58. package/src/docx-batch-insert.ts +223 -0
  59. package/src/docx-color-text.ts +154 -0
  60. package/src/docx-table-ops.ts +316 -0
  61. package/src/docx-types.ts +38 -0
  62. package/src/docx.ts +1596 -0
  63. package/src/drive-schema.ts +92 -0
  64. package/src/drive.ts +829 -0
  65. package/src/dynamic-agent.ts +143 -0
  66. package/src/event-types.ts +45 -0
  67. package/src/external-keys.ts +19 -0
  68. package/src/lifecycle.test-support.ts +220 -0
  69. package/src/media.ts +1105 -0
  70. package/src/mention-target.types.ts +5 -0
  71. package/src/mention.ts +114 -0
  72. package/src/message-action-contract.ts +13 -0
  73. package/src/monitor-state-runtime-api.ts +7 -0
  74. package/src/monitor-transport-runtime-api.ts +10 -0
  75. package/src/monitor.account.ts +492 -0
  76. package/src/monitor.acp-init-failure.lifecycle.test-support.ts +219 -0
  77. package/src/monitor.bot-identity.ts +86 -0
  78. package/src/monitor.bot-menu-handler.ts +165 -0
  79. package/src/monitor.bot-menu.lifecycle.test-support.ts +224 -0
  80. package/src/monitor.broadcast.reply-once.lifecycle.test-support.ts +264 -0
  81. package/src/monitor.card-action.lifecycle.test-support.ts +421 -0
  82. package/src/monitor.comment-notice-handler.ts +105 -0
  83. package/src/monitor.comment.ts +1386 -0
  84. package/src/monitor.message-handler.ts +350 -0
  85. package/src/monitor.reaction.lifecycle.test-support.ts +68 -0
  86. package/src/monitor.startup.ts +74 -0
  87. package/src/monitor.state.ts +170 -0
  88. package/src/monitor.synthetic-error.ts +18 -0
  89. package/src/monitor.test-mocks.ts +46 -0
  90. package/src/monitor.transport.ts +451 -0
  91. package/src/monitor.ts +100 -0
  92. package/src/outbound-runtime-api.ts +1 -0
  93. package/src/outbound.ts +785 -0
  94. package/src/perm-schema.ts +52 -0
  95. package/src/perm.ts +170 -0
  96. package/src/pins.ts +108 -0
  97. package/src/policy.ts +321 -0
  98. package/src/post.ts +275 -0
  99. package/src/probe.ts +166 -0
  100. package/src/processing-claims.ts +59 -0
  101. package/src/qr-terminal.ts +1 -0
  102. package/src/reactions.ts +123 -0
  103. package/src/reasoning-preview.ts +28 -0
  104. package/src/reply-dispatcher-runtime-api.ts +7 -0
  105. package/src/reply-dispatcher.ts +748 -0
  106. package/src/runtime.ts +9 -0
  107. package/src/secret-contract.ts +145 -0
  108. package/src/secret-input.ts +1 -0
  109. package/src/security-audit-shared.ts +69 -0
  110. package/src/security-audit.ts +1 -0
  111. package/src/send-result.ts +80 -0
  112. package/src/send-target.ts +35 -0
  113. package/src/send.ts +861 -0
  114. package/src/sequential-key.ts +28 -0
  115. package/src/sequential-queue.ts +86 -0
  116. package/src/session-conversation.ts +42 -0
  117. package/src/session-route.ts +48 -0
  118. package/src/setup-core.ts +51 -0
  119. package/src/setup-surface.ts +618 -0
  120. package/src/streaming-card.ts +571 -0
  121. package/src/subagent-hooks.ts +413 -0
  122. package/src/targets.ts +97 -0
  123. package/src/thread-bindings.ts +331 -0
  124. package/src/tool-account.ts +93 -0
  125. package/src/tool-factory-test-harness.ts +79 -0
  126. package/src/tool-result.ts +16 -0
  127. package/src/tools-config.ts +22 -0
  128. package/src/types.ts +106 -0
  129. package/src/typing.ts +214 -0
  130. package/src/wiki-schema.ts +69 -0
  131. package/src/wiki.ts +270 -0
  132. package/subagent-hooks-api.ts +31 -0
  133. package/tsconfig.json +16 -0
@@ -0,0 +1,105 @@
1
+ import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js";
2
+ import { handleFeishuCommentEvent } from "./comment-handler.js";
3
+ import {
4
+ claimUnprocessedFeishuMessage,
5
+ recordProcessedFeishuMessage,
6
+ releaseFeishuMessageProcessing,
7
+ } from "./dedup.js";
8
+ import { parseFeishuDriveCommentNoticeEventPayload } from "./monitor.comment.js";
9
+ import { botOpenIds } from "./monitor.state.js";
10
+ import { isFeishuRetryableSyntheticEventError } from "./monitor.synthetic-error.js";
11
+ import { createSequentialQueue } from "./sequential-queue.js";
12
+
13
+ function buildCommentNoticeQueueKey(event: {
14
+ notice_meta?: {
15
+ file_type?: string;
16
+ file_token?: string;
17
+ };
18
+ }): string {
19
+ const fileType = event.notice_meta?.file_type?.trim() || "unknown";
20
+ const fileToken = event.notice_meta?.file_token?.trim() || "unknown";
21
+ return `comment-doc:${fileType}:${fileToken}`;
22
+ }
23
+
24
+ export function createFeishuDriveCommentNoticeHandler(params: {
25
+ cfg: ClawdbotConfig;
26
+ accountId: string;
27
+ runtime?: RuntimeEnv;
28
+ fireAndForget?: boolean;
29
+ getBotOpenId?: (accountId: string) => string | undefined;
30
+ }): (data: unknown) => Promise<void> {
31
+ const { cfg, accountId, runtime, fireAndForget } = params;
32
+ const log = runtime?.log ?? console.log;
33
+ const error = runtime?.error ?? console.error;
34
+ const enqueue = createSequentialQueue();
35
+ const getBotOpenId = params.getBotOpenId ?? ((id) => botOpenIds.get(id));
36
+
37
+ const runFeishuHandler = async (task: () => Promise<void>) => {
38
+ const promise = task().catch((err) => {
39
+ error(`feishu[${accountId}]: error handling drive comment notice: ${String(err)}`);
40
+ });
41
+ if (!fireAndForget) {
42
+ await promise;
43
+ }
44
+ };
45
+
46
+ return async (data: unknown) => {
47
+ await runFeishuHandler(async () => {
48
+ const event = parseFeishuDriveCommentNoticeEventPayload(data);
49
+ if (!event) {
50
+ error(`feishu[${accountId}]: ignoring malformed drive comment notice payload`);
51
+ return;
52
+ }
53
+ const eventId = event.event_id?.trim();
54
+ const syntheticMessageId = eventId ? `drive-comment:${eventId}` : undefined;
55
+ if (syntheticMessageId) {
56
+ const claim = await claimUnprocessedFeishuMessage({
57
+ messageId: syntheticMessageId,
58
+ namespace: accountId,
59
+ log,
60
+ });
61
+ if (claim === "duplicate") {
62
+ log(`feishu[${accountId}]: dropping duplicate comment event ${syntheticMessageId}`);
63
+ return;
64
+ }
65
+ if (claim === "inflight") {
66
+ log(`feishu[${accountId}]: dropping in-flight comment event ${syntheticMessageId}`);
67
+ return;
68
+ }
69
+ }
70
+ log(
71
+ `feishu[${accountId}]: received drive comment notice ` +
72
+ `event=${event.event_id ?? "unknown"} ` +
73
+ `type=${event.notice_meta?.notice_type ?? "unknown"} ` +
74
+ `file=${event.notice_meta?.file_type ?? "unknown"}:${event.notice_meta?.file_token ?? "unknown"} ` +
75
+ `comment=${event.comment_id ?? "unknown"} ` +
76
+ `reply=${event.reply_id ?? "none"} ` +
77
+ `from=${event.notice_meta?.from_user_id?.open_id ?? "unknown"} ` +
78
+ `mentioned=${event.is_mentioned === true ? "yes" : "no"}`,
79
+ );
80
+ try {
81
+ await enqueue(buildCommentNoticeQueueKey(event), async () => {
82
+ await handleFeishuCommentEvent({
83
+ cfg,
84
+ accountId,
85
+ event,
86
+ botOpenId: getBotOpenId(accountId),
87
+ runtime,
88
+ });
89
+ });
90
+ if (syntheticMessageId) {
91
+ await recordProcessedFeishuMessage(syntheticMessageId, accountId, log);
92
+ }
93
+ } catch (err) {
94
+ if (syntheticMessageId && !isFeishuRetryableSyntheticEventError(err)) {
95
+ await recordProcessedFeishuMessage(syntheticMessageId, accountId, log);
96
+ }
97
+ throw err;
98
+ } finally {
99
+ if (syntheticMessageId) {
100
+ releaseFeishuMessageProcessing(syntheticMessageId, accountId);
101
+ }
102
+ }
103
+ });
104
+ };
105
+ }