@zengxingyuan/aamp-feishu-task-bridge 0.1.1-dev.8

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/index.js ADDED
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env node
2
+ import { inspect } from 'node:util';
3
+ import { applyFeishuRuntimeOverrides, ensureBridgeHomeDir, getBridgeHomeDir, initializeBridgeConfig, loadBridgeConfig, loadBridgeState, } from './config.js';
4
+ import { FeishuTaskBridgeRuntime } from './runtime.js';
5
+ function parseArgs(argv) {
6
+ const [rawCommand, ...tail] = argv;
7
+ const hasCommand = rawCommand !== undefined && !rawCommand.startsWith('-');
8
+ const command = (hasCommand ? rawCommand : 'start');
9
+ const rest = hasCommand ? tail : argv;
10
+ const values = {};
11
+ const booleans = new Set();
12
+ for (let index = 0; index < rest.length; index += 1) {
13
+ const token = rest[index];
14
+ if (token === '-h') {
15
+ booleans.add('help');
16
+ continue;
17
+ }
18
+ if (!token.startsWith('--'))
19
+ continue;
20
+ const eq = token.indexOf('=');
21
+ if (eq > 2) {
22
+ const key = token.slice(2, eq);
23
+ const value = token.slice(eq + 1);
24
+ values[key] = [...(values[key] ?? []), value];
25
+ continue;
26
+ }
27
+ const key = token.slice(2);
28
+ const next = rest[index + 1];
29
+ if (!next || next.startsWith('--')) {
30
+ booleans.add(key);
31
+ continue;
32
+ }
33
+ values[key] = [...(values[key] ?? []), next];
34
+ index += 1;
35
+ }
36
+ return { command, values, booleans };
37
+ }
38
+ function firstArg(args, key) {
39
+ return args.values[key]?.[0];
40
+ }
41
+ function allArgs(args, key) {
42
+ return args.values[key];
43
+ }
44
+ function parseTaskApiVersion(raw) {
45
+ if (!raw)
46
+ return undefined;
47
+ if (raw !== 'v1' && raw !== 'v2') {
48
+ throw new Error('--task-api-version must be v1 or v2');
49
+ }
50
+ return raw;
51
+ }
52
+ function printUsage() {
53
+ console.log(`AAMP Feishu Task Bridge
54
+
55
+ Usage:
56
+ aamp-feishu-task-bridge init [--config-dir DIR] [--aamp-host URL] [--target-agent EMAIL|--pairing-url URL] [--app-id ID] [--app-secret SECRET] [--slug NAME] [--domain DOMAIN] [--boe|--pre] [--env NAME] [--debug] [--event-name NAME] [--task-api-version v1|v2] [--no-ack-comment] [--no-start]
57
+ aamp-feishu-task-bridge start [--config-dir DIR] [--domain DOMAIN] [--boe|--pre] [--env NAME] [--debug] [--force-register-agent]
58
+ aamp-feishu-task-bridge status [--config-dir DIR] [--json]
59
+
60
+ Aliases:
61
+ run Alias for start
62
+
63
+ Modes:
64
+ --boe Use https://open.feishu-boe.cn as Feishu OpenAPI domain.
65
+ --pre Use https://open.feishu-pre.cn as Feishu OpenAPI domain.
66
+ --env NAME Add x-tt-env: NAME. With --pre or without --boe, also add x-use-ppe: 1.
67
+ Domain/env mode flags are runtime-only and are not persisted in config.json.
68
+ --debug Print detailed logs and write detailed ACK comments.
69
+ --force-register-agent
70
+ Register the Feishu app as a task agent even when local state says it was already registered.
71
+
72
+ Defaults:
73
+ task.dispatch source: feishu-task
74
+ task.ack: writes one default Feishu task comment
75
+ task.help_needed: writes the help question as one Feishu task comment, then marks the Feishu task blocked
76
+ task.stream.opened: selected status/progress/error events are throttled into Feishu task steps
77
+ task.result: FEISHU_TASK_RESULT_JSON is summarized and completed by the bridge; rejected/malformed results close as failures
78
+ card.*: not consumed by this bridge
79
+ `);
80
+ }
81
+ async function runInit(args) {
82
+ const configDir = firstArg(args, 'config-dir');
83
+ await ensureBridgeHomeDir(configDir);
84
+ const config = await initializeBridgeConfig({
85
+ configDir,
86
+ aampHost: firstArg(args, 'aamp-host'),
87
+ targetAgentEmail: firstArg(args, 'target-agent'),
88
+ pairingUrl: firstArg(args, 'pairing-url'),
89
+ appId: firstArg(args, 'app-id'),
90
+ appSecret: firstArg(args, 'app-secret'),
91
+ slug: firstArg(args, 'slug'),
92
+ domain: firstArg(args, 'domain'),
93
+ boe: args.booleans.has('boe'),
94
+ pre: args.booleans.has('pre'),
95
+ env: firstArg(args, 'env'),
96
+ debug: args.booleans.has('debug') ? true : undefined,
97
+ eventNames: allArgs(args, 'event-name'),
98
+ taskApiVersion: parseTaskApiVersion(firstArg(args, 'task-api-version')),
99
+ ackComment: args.booleans.has('no-ack-comment') ? false : undefined,
100
+ });
101
+ const runtimeConfig = applyFeishuRuntimeOverrides(config, {
102
+ domain: firstArg(args, 'domain'),
103
+ boe: args.booleans.has('boe'),
104
+ pre: args.booleans.has('pre'),
105
+ env: firstArg(args, 'env'),
106
+ debug: args.booleans.has('debug') ? true : undefined,
107
+ });
108
+ console.log(`Initialized bridge in ${getBridgeHomeDir(configDir)}`);
109
+ console.log(`AAMP mailbox: ${config.mailbox.email}`);
110
+ console.log(`Target agent: ${config.targetAgentEmail}`);
111
+ console.log(`Feishu runtime domain: ${runtimeConfig.feishu.domain ?? 'default'}`);
112
+ console.log(`Feishu runtime env: ${runtimeConfig.feishu.headers?.['x-tt-env'] ?? '(none)'}`);
113
+ console.log(`Debug: ${config.behavior.debug ? 'enabled' : 'disabled'}`);
114
+ console.log(`Feishu task API: ${config.feishu.taskApiVersion}`);
115
+ console.log(`Feishu events: ${config.feishu.eventNames.join(', ')}`);
116
+ console.log(`ACK comment: ${config.behavior.ackComment ? 'enabled' : 'disabled'}`);
117
+ if (args.booleans.has('no-start')) {
118
+ console.log('Bridge not started because --no-start was provided.');
119
+ return;
120
+ }
121
+ await runBridge(args);
122
+ }
123
+ async function runStatus(args) {
124
+ const configDir = firstArg(args, 'config-dir');
125
+ const config = await loadBridgeConfig(configDir);
126
+ const state = await loadBridgeState(configDir);
127
+ if (args.booleans.has('json')) {
128
+ console.log(JSON.stringify({ config, state }, null, 2));
129
+ return;
130
+ }
131
+ if (!config) {
132
+ console.log(`No bridge config found in ${getBridgeHomeDir(configDir)}.`);
133
+ return;
134
+ }
135
+ console.log(`Bridge home: ${getBridgeHomeDir(configDir)}`);
136
+ console.log(`AAMP mailbox: ${config.mailbox.email}`);
137
+ console.log(`Target agent: ${config.targetAgentEmail}`);
138
+ console.log(`Feishu app: ${config.feishu.appId}`);
139
+ console.log(`Feishu domain: ${config.feishu.domain ?? 'default'}`);
140
+ console.log(`Feishu env: ${config.feishu.headers?.['x-tt-env'] ?? '(none)'}`);
141
+ console.log(`Debug: ${config.behavior.debug ? 'enabled' : 'disabled'}`);
142
+ console.log(`Feishu task API: ${config.feishu.taskApiVersion}`);
143
+ console.log(`Feishu events: ${config.feishu.eventNames.join(', ')}`);
144
+ console.log(`ACK comment: ${config.behavior.ackComment ? 'enabled' : 'disabled'}`);
145
+ console.log(`Connectivity: feishu=${state.connectivity.feishu} aamp=${state.connectivity.aamp}`);
146
+ console.log(`Tracked AAMP tasks: ${Object.keys(state.tasks).length}`);
147
+ console.log(`Deduped Feishu events: ${Object.keys(state.dedupEventIds).length}`);
148
+ if (state.taskSubscription?.subscribedAt) {
149
+ console.log([
150
+ `Feishu task subscription: ${state.taskSubscription.subscribedAt}`,
151
+ `app=${state.taskSubscription.appId}`,
152
+ `domain=${state.taskSubscription.domain}`,
153
+ `env=${state.taskSubscription.env ?? '(none)'}`,
154
+ `userIdType=${state.taskSubscription.userIdType}`,
155
+ ].join(' '));
156
+ }
157
+ if (state.lastFeishuEventAt) {
158
+ console.log(`Last Feishu event: ${state.lastFeishuEventAt} ${state.lastFeishuEventId ?? ''} task=${state.lastFeishuEventTaskGuid ?? ''}`.trim());
159
+ }
160
+ if (state.lastIgnoredFeishuEventAt) {
161
+ console.log([
162
+ `Last ignored Feishu event: ${state.lastIgnoredFeishuEventAt}`,
163
+ state.lastIgnoredFeishuEventId ?? '',
164
+ `task=${state.lastIgnoredFeishuEventTaskGuid ?? ''}`,
165
+ `types=${state.lastIgnoredFeishuEventTypes?.join(',') || '(unknown)'}`,
166
+ `reason=${state.lastIgnoredFeishuEventReason ?? '(unknown)'}`,
167
+ ].join(' ').trim());
168
+ }
169
+ if (state.lastAampDispatchAt) {
170
+ console.log(`Last AAMP dispatch: ${state.lastAampDispatchAt} ${state.lastAampDispatchTaskId ?? ''}`.trim());
171
+ }
172
+ if (state.lastAampAckAt) {
173
+ console.log(`Last AAMP ack: ${state.lastAampAckAt} ${state.lastAampAckTaskId ?? ''}`.trim());
174
+ }
175
+ if (state.lastAampHelpAt) {
176
+ console.log(`Last AAMP help: ${state.lastAampHelpAt} ${state.lastAampHelpTaskId ?? ''}`.trim());
177
+ }
178
+ if (state.lastAampResultAt) {
179
+ console.log(`Last AAMP result: ${state.lastAampResultAt} ${state.lastAampResultTaskId ?? ''}`.trim());
180
+ }
181
+ if (state.lastError) {
182
+ console.log(`Last error: ${state.lastError}`);
183
+ }
184
+ }
185
+ async function runBridge(args) {
186
+ const configDir = firstArg(args, 'config-dir');
187
+ const config = await loadBridgeConfig(configDir);
188
+ if (!config) {
189
+ throw new Error(`No bridge config found in ${getBridgeHomeDir(configDir)}. Run "aamp-feishu-task-bridge init" first.`);
190
+ }
191
+ const runtimeConfig = applyFeishuRuntimeOverrides(config, {
192
+ domain: firstArg(args, 'domain'),
193
+ boe: args.booleans.has('boe'),
194
+ pre: args.booleans.has('pre'),
195
+ env: firstArg(args, 'env'),
196
+ debug: args.booleans.has('debug') ? true : undefined,
197
+ });
198
+ const runtime = new FeishuTaskBridgeRuntime(runtimeConfig, {
199
+ configDir,
200
+ forceRegisterAgent: args.booleans.has('force-register-agent'),
201
+ });
202
+ await runtime.start();
203
+ console.log(`Feishu task bridge is running for ${runtimeConfig.targetAgentEmail}`);
204
+ console.log(`Mailbox: ${runtimeConfig.mailbox.email}`);
205
+ console.log(`Feishu domain: ${runtimeConfig.feishu.domain ?? 'default'}`);
206
+ console.log(`Feishu env: ${runtimeConfig.feishu.headers?.['x-tt-env'] ?? '(none)'}`);
207
+ console.log(`Debug: ${runtimeConfig.behavior.debug ? 'enabled' : 'disabled'}`);
208
+ const shutdown = async (signal) => {
209
+ console.log(`Received ${signal}, shutting down...`);
210
+ await runtime.stop();
211
+ process.exit(0);
212
+ };
213
+ process.on('SIGINT', () => { void shutdown('SIGINT'); });
214
+ process.on('SIGTERM', () => { void shutdown('SIGTERM'); });
215
+ }
216
+ async function main() {
217
+ const args = parseArgs(process.argv.slice(2));
218
+ if (args.booleans.has('help')) {
219
+ printUsage();
220
+ return;
221
+ }
222
+ switch (args.command) {
223
+ case 'init':
224
+ await runInit(args);
225
+ return;
226
+ case 'start':
227
+ case 'run':
228
+ await runBridge(args);
229
+ return;
230
+ case 'status':
231
+ await runStatus(args);
232
+ return;
233
+ case 'help':
234
+ printUsage();
235
+ return;
236
+ default:
237
+ printUsage();
238
+ }
239
+ }
240
+ main().catch((error) => {
241
+ console.error(error instanceof Error ? error.message : inspect(error));
242
+ process.exitCode = 1;
243
+ });
244
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { type AampStreamEvent, type SendTaskOptions, type StreamSubscription, type TaskAck, type TaskHelp, type TaskResult, type TaskStreamOpened } from 'aamp-sdk';
2
+ import type { BridgeConfig, BridgeState, FeishuTaskClient } from './types.js';
3
+ type Logger = Pick<Console, 'error' | 'log'>;
4
+ interface AampClientLike {
5
+ on(event: 'connected', handler: () => void): unknown;
6
+ on(event: 'disconnected', handler: (reason?: string) => void): unknown;
7
+ on(event: 'error', handler: (error: Error) => void): unknown;
8
+ on(event: 'task.ack', handler: (ack: TaskAck) => void): unknown;
9
+ on(event: 'task.stream.opened', handler: (stream: TaskStreamOpened) => void): unknown;
10
+ on(event: 'task.help_needed', handler: (help: TaskHelp) => void): unknown;
11
+ on(event: 'task.result', handler: (result: TaskResult) => void): unknown;
12
+ connect(): Promise<void>;
13
+ disconnect(): void;
14
+ sendTask(opts: SendTaskOptions): Promise<{
15
+ taskId: string;
16
+ messageId: string;
17
+ }>;
18
+ subscribeStream?(streamId: string, handlers: {
19
+ onEvent: (event: AampStreamEvent) => void;
20
+ onError?: (err: Error) => void;
21
+ onOpen?: () => void;
22
+ }, opts?: {
23
+ lastEventId?: string;
24
+ signal?: AbortSignal;
25
+ }): Promise<StreamSubscription>;
26
+ updateDirectoryProfile?(opts: {
27
+ summary: string;
28
+ cardText: string;
29
+ }): Promise<unknown>;
30
+ }
31
+ export interface FeishuTaskBridgeRuntimeOptions {
32
+ configDir?: string;
33
+ logger?: Logger;
34
+ feishuClient?: FeishuTaskClient;
35
+ aampClient?: AampClientLike;
36
+ forceRegisterAgent?: boolean;
37
+ streamStepFlushIntervalMs?: number;
38
+ }
39
+ export declare class FeishuTaskBridgeRuntime {
40
+ private readonly config;
41
+ private readonly configDir?;
42
+ private readonly logger;
43
+ private readonly aamp;
44
+ private readonly feishu;
45
+ private readonly forceRegisterAgent;
46
+ private readonly streamStepFlushIntervalMs;
47
+ private state;
48
+ private readonly ackCommentInFlight;
49
+ private readonly helpCommentInFlight;
50
+ private readonly resultInFlight;
51
+ private readonly feishuCompleteInFlight;
52
+ private readonly feishuBlockInFlight;
53
+ private readonly activeStreamSubscriptions;
54
+ private readonly streamEventQueues;
55
+ private readonly streamStepBuffers;
56
+ private readonly streamStepFlushQueues;
57
+ private stopping;
58
+ constructor(config: BridgeConfig, options?: FeishuTaskBridgeRuntimeOptions);
59
+ start(): Promise<void>;
60
+ stop(): Promise<void>;
61
+ getStateSnapshot(): BridgeState;
62
+ private ensureFeishuAgentRegistered;
63
+ private ensureFeishuTaskEventsSubscribed;
64
+ private registerAampHandlers;
65
+ private ignoreFeishuTaskEvent;
66
+ private handleFeishuTaskEvent;
67
+ private handleTaskStreamOpened;
68
+ private subscribeToTaskStream;
69
+ private enqueueStreamEvent;
70
+ private handleStreamEvent;
71
+ private getStreamStepBuffer;
72
+ private scheduleStreamStepFlush;
73
+ private clearStreamStepFlushTimer;
74
+ private clearAllStreamStepFlushTimers;
75
+ private enqueueStreamStepFlush;
76
+ private flushAllStreamStepBuffers;
77
+ private flushStreamStepBuffer;
78
+ private handleTaskAck;
79
+ private handleTaskHelp;
80
+ private handleTaskResult;
81
+ private commentHelpNeededOnce;
82
+ private commentAnsweredResultOnce;
83
+ private commentTaskResultOnce;
84
+ private completeFeishuTasksOnce;
85
+ private completeFeishuTaskOnce;
86
+ private markFeishuTaskBlockedOnce;
87
+ private rememberEvent;
88
+ private pruneDedupEvents;
89
+ private setConnectivity;
90
+ private debugLog;
91
+ private persistState;
92
+ }
93
+ export {};
94
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}