@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.
- package/api.ts +32 -0
- package/autobot.plugin.json +180 -0
- package/channel-entry.ts +20 -0
- package/channel-plugin-api.ts +1 -0
- package/contract-api.ts +16 -0
- package/index.ts +82 -0
- package/package.json +62 -0
- package/runtime-api.ts +55 -0
- package/secret-contract-api.ts +5 -0
- package/security-contract-api.ts +1 -0
- package/session-key-api.ts +1 -0
- package/setup-api.ts +3 -0
- package/setup-entry.ts +13 -0
- package/skills/feishu-doc/SKILL.md +211 -0
- package/skills/feishu-doc/references/block-types.md +103 -0
- package/skills/feishu-drive/SKILL.md +97 -0
- package/skills/feishu-perm/SKILL.md +119 -0
- package/skills/feishu-wiki/SKILL.md +113 -0
- package/src/accounts.ts +333 -0
- package/src/agent-config.ts +21 -0
- package/src/app-registration.ts +331 -0
- package/src/approval-auth.ts +25 -0
- package/src/async.ts +104 -0
- package/src/audio-preflight.runtime.ts +9 -0
- package/src/bitable.ts +762 -0
- package/src/bot-content.ts +485 -0
- package/src/bot-runtime-api.ts +12 -0
- package/src/bot-sender-name.ts +125 -0
- package/src/bot.ts +1703 -0
- package/src/card-action.ts +447 -0
- package/src/card-interaction.ts +159 -0
- package/src/card-test-helpers.ts +54 -0
- package/src/card-ux-approval.ts +65 -0
- package/src/card-ux-launcher.ts +121 -0
- package/src/card-ux-shared.ts +33 -0
- package/src/channel-runtime-api.ts +16 -0
- package/src/channel.runtime.ts +47 -0
- package/src/channel.ts +1423 -0
- package/src/chat-schema.ts +25 -0
- package/src/chat.ts +188 -0
- package/src/client-timeout.ts +42 -0
- package/src/client.ts +262 -0
- package/src/comment-dispatcher-runtime-api.ts +6 -0
- package/src/comment-dispatcher.ts +107 -0
- package/src/comment-handler-runtime-api.ts +3 -0
- package/src/comment-handler.ts +303 -0
- package/src/comment-reaction.ts +259 -0
- package/src/comment-shared.ts +406 -0
- package/src/comment-target.ts +44 -0
- package/src/config-schema.ts +335 -0
- package/src/conversation-id.ts +199 -0
- package/src/dedup-runtime-api.ts +1 -0
- package/src/dedup.ts +141 -0
- package/src/dedupe-key.ts +72 -0
- package/src/directory.static.ts +61 -0
- package/src/directory.ts +124 -0
- package/src/doc-schema.ts +182 -0
- package/src/docx-batch-insert.ts +223 -0
- package/src/docx-color-text.ts +154 -0
- package/src/docx-table-ops.ts +316 -0
- package/src/docx-types.ts +38 -0
- package/src/docx.ts +1596 -0
- package/src/drive-schema.ts +92 -0
- package/src/drive.ts +829 -0
- package/src/dynamic-agent.ts +143 -0
- package/src/event-types.ts +45 -0
- package/src/external-keys.ts +19 -0
- package/src/lifecycle.test-support.ts +220 -0
- package/src/media.ts +1105 -0
- package/src/mention-target.types.ts +5 -0
- package/src/mention.ts +114 -0
- package/src/message-action-contract.ts +13 -0
- package/src/monitor-state-runtime-api.ts +7 -0
- package/src/monitor-transport-runtime-api.ts +10 -0
- package/src/monitor.account.ts +492 -0
- package/src/monitor.acp-init-failure.lifecycle.test-support.ts +219 -0
- package/src/monitor.bot-identity.ts +86 -0
- package/src/monitor.bot-menu-handler.ts +165 -0
- package/src/monitor.bot-menu.lifecycle.test-support.ts +224 -0
- package/src/monitor.broadcast.reply-once.lifecycle.test-support.ts +264 -0
- package/src/monitor.card-action.lifecycle.test-support.ts +421 -0
- package/src/monitor.comment-notice-handler.ts +105 -0
- package/src/monitor.comment.ts +1386 -0
- package/src/monitor.message-handler.ts +350 -0
- package/src/monitor.reaction.lifecycle.test-support.ts +68 -0
- package/src/monitor.startup.ts +74 -0
- package/src/monitor.state.ts +170 -0
- package/src/monitor.synthetic-error.ts +18 -0
- package/src/monitor.test-mocks.ts +46 -0
- package/src/monitor.transport.ts +451 -0
- package/src/monitor.ts +100 -0
- package/src/outbound-runtime-api.ts +1 -0
- package/src/outbound.ts +785 -0
- package/src/perm-schema.ts +52 -0
- package/src/perm.ts +170 -0
- package/src/pins.ts +108 -0
- package/src/policy.ts +321 -0
- package/src/post.ts +275 -0
- package/src/probe.ts +166 -0
- package/src/processing-claims.ts +59 -0
- package/src/qr-terminal.ts +1 -0
- package/src/reactions.ts +123 -0
- package/src/reasoning-preview.ts +28 -0
- package/src/reply-dispatcher-runtime-api.ts +7 -0
- package/src/reply-dispatcher.ts +748 -0
- package/src/runtime.ts +9 -0
- package/src/secret-contract.ts +145 -0
- package/src/secret-input.ts +1 -0
- package/src/security-audit-shared.ts +69 -0
- package/src/security-audit.ts +1 -0
- package/src/send-result.ts +80 -0
- package/src/send-target.ts +35 -0
- package/src/send.ts +861 -0
- package/src/sequential-key.ts +28 -0
- package/src/sequential-queue.ts +86 -0
- package/src/session-conversation.ts +42 -0
- package/src/session-route.ts +48 -0
- package/src/setup-core.ts +51 -0
- package/src/setup-surface.ts +618 -0
- package/src/streaming-card.ts +571 -0
- package/src/subagent-hooks.ts +413 -0
- package/src/targets.ts +97 -0
- package/src/thread-bindings.ts +331 -0
- package/src/tool-account.ts +93 -0
- package/src/tool-factory-test-harness.ts +79 -0
- package/src/tool-result.ts +16 -0
- package/src/tools-config.ts +22 -0
- package/src/types.ts +106 -0
- package/src/typing.ts +214 -0
- package/src/wiki-schema.ts +69 -0
- package/src/wiki.ts +270 -0
- package/subagent-hooks-api.ts +31 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { createFeishuCardInteractionEnvelope } from "./card-interaction.js";
|
|
2
|
+
import { buildFeishuCardButton, buildFeishuCardInteractionContext } from "./card-ux-shared.js";
|
|
3
|
+
|
|
4
|
+
export const FEISHU_APPROVAL_REQUEST_ACTION = "feishu.quick_actions.request_approval";
|
|
5
|
+
export const FEISHU_APPROVAL_CONFIRM_ACTION = "feishu.approval.confirm";
|
|
6
|
+
export const FEISHU_APPROVAL_CANCEL_ACTION = "feishu.approval.cancel";
|
|
7
|
+
|
|
8
|
+
export function createApprovalCard(params: {
|
|
9
|
+
operatorOpenId: string;
|
|
10
|
+
chatId?: string;
|
|
11
|
+
command: string;
|
|
12
|
+
prompt: string;
|
|
13
|
+
expiresAt: number;
|
|
14
|
+
chatType?: "p2p" | "group";
|
|
15
|
+
sessionKey?: string;
|
|
16
|
+
confirmLabel?: string;
|
|
17
|
+
cancelLabel?: string;
|
|
18
|
+
}): Record<string, unknown> {
|
|
19
|
+
const context = buildFeishuCardInteractionContext(params);
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
schema: "2.0",
|
|
23
|
+
config: {
|
|
24
|
+
width_mode: "fill",
|
|
25
|
+
},
|
|
26
|
+
header: {
|
|
27
|
+
title: {
|
|
28
|
+
tag: "plain_text",
|
|
29
|
+
content: "Confirm action",
|
|
30
|
+
},
|
|
31
|
+
template: "orange",
|
|
32
|
+
},
|
|
33
|
+
body: {
|
|
34
|
+
elements: [
|
|
35
|
+
{
|
|
36
|
+
tag: "markdown",
|
|
37
|
+
content: params.prompt,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
tag: "action",
|
|
41
|
+
actions: [
|
|
42
|
+
buildFeishuCardButton({
|
|
43
|
+
label: params.confirmLabel ?? "Confirm",
|
|
44
|
+
type: "primary",
|
|
45
|
+
value: createFeishuCardInteractionEnvelope({
|
|
46
|
+
k: "quick",
|
|
47
|
+
a: FEISHU_APPROVAL_CONFIRM_ACTION,
|
|
48
|
+
q: params.command,
|
|
49
|
+
c: context,
|
|
50
|
+
}),
|
|
51
|
+
}),
|
|
52
|
+
buildFeishuCardButton({
|
|
53
|
+
label: params.cancelLabel ?? "Cancel",
|
|
54
|
+
value: createFeishuCardInteractionEnvelope({
|
|
55
|
+
k: "button",
|
|
56
|
+
a: FEISHU_APPROVAL_CANCEL_ACTION,
|
|
57
|
+
c: context,
|
|
58
|
+
}),
|
|
59
|
+
}),
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { normalizeOptionalLowercaseString } from "autobot/plugin-sdk/string-coerce-runtime";
|
|
2
|
+
import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js";
|
|
3
|
+
import { createFeishuCardInteractionEnvelope } from "./card-interaction.js";
|
|
4
|
+
import { FEISHU_APPROVAL_REQUEST_ACTION } from "./card-ux-approval.js";
|
|
5
|
+
import { buildFeishuCardButton, buildFeishuCardInteractionContext } from "./card-ux-shared.js";
|
|
6
|
+
import { sendCardFeishu } from "./send.js";
|
|
7
|
+
|
|
8
|
+
const FEISHU_QUICK_ACTION_CARD_TTL_MS = 10 * 60_000;
|
|
9
|
+
|
|
10
|
+
const QUICK_ACTION_MENU_KEYS = new Set(["quick-actions", "quick_actions", "launcher"]);
|
|
11
|
+
|
|
12
|
+
export function isFeishuQuickActionMenuEventKey(eventKey: string): boolean {
|
|
13
|
+
return QUICK_ACTION_MENU_KEYS.has(normalizeOptionalLowercaseString(eventKey) ?? "");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createQuickActionLauncherCard(params: {
|
|
17
|
+
operatorOpenId: string;
|
|
18
|
+
chatId?: string;
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
chatType?: "p2p" | "group";
|
|
21
|
+
sessionKey?: string;
|
|
22
|
+
}): Record<string, unknown> {
|
|
23
|
+
const context = buildFeishuCardInteractionContext(params);
|
|
24
|
+
return {
|
|
25
|
+
schema: "2.0",
|
|
26
|
+
config: {
|
|
27
|
+
width_mode: "fill",
|
|
28
|
+
},
|
|
29
|
+
header: {
|
|
30
|
+
title: {
|
|
31
|
+
tag: "plain_text",
|
|
32
|
+
content: "Quick actions",
|
|
33
|
+
},
|
|
34
|
+
template: "indigo",
|
|
35
|
+
},
|
|
36
|
+
body: {
|
|
37
|
+
elements: [
|
|
38
|
+
{
|
|
39
|
+
tag: "markdown",
|
|
40
|
+
content: "Run common actions without typing raw commands.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
tag: "action",
|
|
44
|
+
actions: [
|
|
45
|
+
buildFeishuCardButton({
|
|
46
|
+
label: "Help",
|
|
47
|
+
value: createFeishuCardInteractionEnvelope({
|
|
48
|
+
k: "quick",
|
|
49
|
+
a: "feishu.quick_actions.help",
|
|
50
|
+
q: "/help",
|
|
51
|
+
c: context,
|
|
52
|
+
}),
|
|
53
|
+
}),
|
|
54
|
+
buildFeishuCardButton({
|
|
55
|
+
label: "New session",
|
|
56
|
+
type: "primary",
|
|
57
|
+
value: createFeishuCardInteractionEnvelope({
|
|
58
|
+
k: "meta",
|
|
59
|
+
a: FEISHU_APPROVAL_REQUEST_ACTION,
|
|
60
|
+
m: {
|
|
61
|
+
command: "/new",
|
|
62
|
+
prompt: "Start a fresh session? This will reset the current chat context.",
|
|
63
|
+
},
|
|
64
|
+
c: context,
|
|
65
|
+
}),
|
|
66
|
+
}),
|
|
67
|
+
buildFeishuCardButton({
|
|
68
|
+
label: "Reset",
|
|
69
|
+
type: "danger",
|
|
70
|
+
value: createFeishuCardInteractionEnvelope({
|
|
71
|
+
k: "meta",
|
|
72
|
+
a: FEISHU_APPROVAL_REQUEST_ACTION,
|
|
73
|
+
m: {
|
|
74
|
+
command: "/reset",
|
|
75
|
+
prompt: "Reset this session now? Any active conversation state will be cleared.",
|
|
76
|
+
},
|
|
77
|
+
c: context,
|
|
78
|
+
}),
|
|
79
|
+
}),
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export async function maybeHandleFeishuQuickActionMenu(params: {
|
|
88
|
+
cfg: ClawdbotConfig;
|
|
89
|
+
eventKey: string;
|
|
90
|
+
operatorOpenId: string;
|
|
91
|
+
runtime?: RuntimeEnv;
|
|
92
|
+
accountId?: string;
|
|
93
|
+
now?: number;
|
|
94
|
+
}): Promise<boolean> {
|
|
95
|
+
if (!isFeishuQuickActionMenuEventKey(params.eventKey)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const expiresAt = (params.now ?? Date.now()) + FEISHU_QUICK_ACTION_CARD_TTL_MS;
|
|
100
|
+
try {
|
|
101
|
+
await sendCardFeishu({
|
|
102
|
+
cfg: params.cfg,
|
|
103
|
+
to: `user:${params.operatorOpenId}`,
|
|
104
|
+
card: createQuickActionLauncherCard({
|
|
105
|
+
operatorOpenId: params.operatorOpenId,
|
|
106
|
+
expiresAt,
|
|
107
|
+
chatType: "p2p",
|
|
108
|
+
}),
|
|
109
|
+
accountId: params.accountId,
|
|
110
|
+
});
|
|
111
|
+
} catch (err) {
|
|
112
|
+
params.runtime?.log?.(
|
|
113
|
+
`feishu[${params.accountId ?? "default"}]: failed to open quick-action launcher for ${params.operatorOpenId}: ${String(err)}`,
|
|
114
|
+
);
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
params.runtime?.log?.(
|
|
118
|
+
`feishu[${params.accountId ?? "default"}]: opened quick-action launcher for ${params.operatorOpenId}`,
|
|
119
|
+
);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { FeishuCardInteractionEnvelope } from "./card-interaction.js";
|
|
2
|
+
|
|
3
|
+
export function buildFeishuCardButton(params: {
|
|
4
|
+
label: string;
|
|
5
|
+
value: FeishuCardInteractionEnvelope;
|
|
6
|
+
type?: "default" | "primary" | "danger";
|
|
7
|
+
}) {
|
|
8
|
+
return {
|
|
9
|
+
tag: "button",
|
|
10
|
+
text: {
|
|
11
|
+
tag: "plain_text",
|
|
12
|
+
content: params.label,
|
|
13
|
+
},
|
|
14
|
+
type: params.type ?? "default",
|
|
15
|
+
value: params.value,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function buildFeishuCardInteractionContext(params: {
|
|
20
|
+
operatorOpenId: string;
|
|
21
|
+
chatId?: string;
|
|
22
|
+
expiresAt: number;
|
|
23
|
+
chatType?: "p2p" | "group";
|
|
24
|
+
sessionKey?: string;
|
|
25
|
+
}) {
|
|
26
|
+
return {
|
|
27
|
+
u: params.operatorOpenId,
|
|
28
|
+
...(params.chatId ? { h: params.chatId } : {}),
|
|
29
|
+
...(params.sessionKey ? { s: params.sessionKey } : {}),
|
|
30
|
+
e: params.expiresAt,
|
|
31
|
+
...(params.chatType ? { t: params.chatType } : {}),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
ChannelMessageActionName,
|
|
3
|
+
ChannelMeta,
|
|
4
|
+
ChannelPlugin,
|
|
5
|
+
ClawdbotConfig,
|
|
6
|
+
} from "../runtime-api.js";
|
|
7
|
+
|
|
8
|
+
export { DEFAULT_ACCOUNT_ID } from "autobot/plugin-sdk/account-resolution";
|
|
9
|
+
export { createActionGate } from "autobot/plugin-sdk/channel-actions";
|
|
10
|
+
export { buildChannelConfigSchema } from "autobot/plugin-sdk/channel-config-primitives";
|
|
11
|
+
export {
|
|
12
|
+
buildProbeChannelStatusSummary,
|
|
13
|
+
createDefaultChannelRuntimeState,
|
|
14
|
+
} from "autobot/plugin-sdk/status-helpers";
|
|
15
|
+
export { PAIRING_APPROVED_MESSAGE } from "autobot/plugin-sdk/channel-status";
|
|
16
|
+
export { chunkTextForOutbound } from "autobot/plugin-sdk/text-chunking";
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getChatInfo as getChatInfoImpl,
|
|
3
|
+
getChatMembers as getChatMembersImpl,
|
|
4
|
+
getFeishuMemberInfo as getFeishuMemberInfoImpl,
|
|
5
|
+
} from "./chat.js";
|
|
6
|
+
import {
|
|
7
|
+
listFeishuDirectoryGroupsLive as listFeishuDirectoryGroupsLiveImpl,
|
|
8
|
+
listFeishuDirectoryPeersLive as listFeishuDirectoryPeersLiveImpl,
|
|
9
|
+
} from "./directory.js";
|
|
10
|
+
import { feishuOutbound as feishuOutboundImpl } from "./outbound.js";
|
|
11
|
+
import {
|
|
12
|
+
createPinFeishu as createPinFeishuImpl,
|
|
13
|
+
listPinsFeishu as listPinsFeishuImpl,
|
|
14
|
+
removePinFeishu as removePinFeishuImpl,
|
|
15
|
+
} from "./pins.js";
|
|
16
|
+
import { probeFeishu as probeFeishuImpl } from "./probe.js";
|
|
17
|
+
import {
|
|
18
|
+
addReactionFeishu as addReactionFeishuImpl,
|
|
19
|
+
listReactionsFeishu as listReactionsFeishuImpl,
|
|
20
|
+
removeReactionFeishu as removeReactionFeishuImpl,
|
|
21
|
+
} from "./reactions.js";
|
|
22
|
+
import {
|
|
23
|
+
editMessageFeishu as editMessageFeishuImpl,
|
|
24
|
+
getMessageFeishu as getMessageFeishuImpl,
|
|
25
|
+
sendCardFeishu as sendCardFeishuImpl,
|
|
26
|
+
sendMessageFeishu as sendMessageFeishuImpl,
|
|
27
|
+
} from "./send.js";
|
|
28
|
+
|
|
29
|
+
export const feishuChannelRuntime = {
|
|
30
|
+
listFeishuDirectoryGroupsLive: listFeishuDirectoryGroupsLiveImpl,
|
|
31
|
+
listFeishuDirectoryPeersLive: listFeishuDirectoryPeersLiveImpl,
|
|
32
|
+
feishuOutbound: { ...feishuOutboundImpl },
|
|
33
|
+
createPinFeishu: createPinFeishuImpl,
|
|
34
|
+
listPinsFeishu: listPinsFeishuImpl,
|
|
35
|
+
removePinFeishu: removePinFeishuImpl,
|
|
36
|
+
probeFeishu: probeFeishuImpl,
|
|
37
|
+
addReactionFeishu: addReactionFeishuImpl,
|
|
38
|
+
listReactionsFeishu: listReactionsFeishuImpl,
|
|
39
|
+
removeReactionFeishu: removeReactionFeishuImpl,
|
|
40
|
+
getChatInfo: getChatInfoImpl,
|
|
41
|
+
getChatMembers: getChatMembersImpl,
|
|
42
|
+
getFeishuMemberInfo: getFeishuMemberInfoImpl,
|
|
43
|
+
editMessageFeishu: editMessageFeishuImpl,
|
|
44
|
+
getMessageFeishu: getMessageFeishuImpl,
|
|
45
|
+
sendCardFeishu: sendCardFeishuImpl,
|
|
46
|
+
sendMessageFeishu: sendMessageFeishuImpl,
|
|
47
|
+
};
|