@gea-ai/agent-sdk 0.1.260910-alpha.0 → 0.1.260910-alpha.2
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/README.md +3 -1253
- package/dist/agent-channel-author-runtime.d.ts +79 -0
- package/dist/agent-channel-author-runtime.d.ts.map +1 -0
- package/dist/agent-channel-author-runtime.js +511 -0
- package/dist/agent-channel-author-runtime.js.map +1 -0
- package/dist/agent-channel-receiver.d.ts +46 -0
- package/dist/agent-channel-receiver.d.ts.map +1 -0
- package/dist/agent-channel-receiver.js +356 -0
- package/dist/agent-channel-receiver.js.map +1 -0
- package/dist/agent-channel-runtime.d.ts +6 -0
- package/dist/agent-channel-runtime.d.ts.map +1 -0
- package/dist/agent-channel-runtime.js +623 -0
- package/dist/agent-channel-runtime.js.map +1 -0
- package/dist/agent-channel-worker.d.ts +22 -0
- package/dist/agent-channel-worker.d.ts.map +1 -0
- package/dist/agent-channel-worker.js +335 -0
- package/dist/agent-channel-worker.js.map +1 -0
- package/dist/agent-session.d.ts.map +1 -1
- package/dist/agent-session.js +177 -4
- package/dist/agent-session.js.map +1 -1
- package/dist/agent-worker.d.ts +27 -1
- package/dist/agent-worker.d.ts.map +1 -1
- package/dist/agent-worker.js +867 -27
- package/dist/agent-worker.js.map +1 -1
- package/dist/channels/feishu-codec.d.ts +18 -0
- package/dist/channels/feishu-codec.d.ts.map +1 -0
- package/dist/channels/feishu-codec.js +109 -0
- package/dist/channels/feishu-codec.js.map +1 -0
- package/dist/channels/feishu-inbound.d.ts +35 -0
- package/dist/channels/feishu-inbound.d.ts.map +1 -0
- package/dist/channels/feishu-inbound.js +136 -0
- package/dist/channels/feishu-inbound.js.map +1 -0
- package/dist/channels/feishu-websocket.d.ts +5 -0
- package/dist/channels/feishu-websocket.d.ts.map +1 -0
- package/dist/channels/feishu-websocket.js +424 -0
- package/dist/channels/feishu-websocket.js.map +1 -0
- package/dist/channels/feishu.d.ts +32 -0
- package/dist/channels/feishu.d.ts.map +1 -0
- package/dist/channels/feishu.js +233 -0
- package/dist/channels/feishu.js.map +1 -0
- package/dist/channels/index.d.ts +180 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +93 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -8
- package/dist/index.js.map +1 -1
- package/package.json +16 -3
- package/src/channels/README.md +298 -0
- package/src/channels/feishu.ts +295 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Long from "long";
|
|
2
|
+
export type FeishuFrame = {
|
|
3
|
+
SeqID: Long;
|
|
4
|
+
LogID: Long;
|
|
5
|
+
service: number;
|
|
6
|
+
method: number;
|
|
7
|
+
headers: {
|
|
8
|
+
key: string;
|
|
9
|
+
value: string;
|
|
10
|
+
}[];
|
|
11
|
+
payloadEncoding?: string;
|
|
12
|
+
payloadType?: string;
|
|
13
|
+
payload?: Uint8Array;
|
|
14
|
+
LogIDNew?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function decodeFeishuFrame(bytes: Uint8Array): FeishuFrame;
|
|
17
|
+
export declare function encodeFeishuFrame(frame: FeishuFrame): Uint8Array<ArrayBuffer>;
|
|
18
|
+
//# sourceMappingURL=feishu-codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu-codec.d.ts","sourceRoot":"","sources":["../../src/channels/feishu-codec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AASxB,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAkEhE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,CA0B7E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import Long from "long";
|
|
2
|
+
import protobuf from "protobufjs/minimal.js";
|
|
3
|
+
// Header/Frame wire fields follow larksuite/node-sdk at
|
|
4
|
+
// af41737d1e9d0fdb08bdbbbe3019a7c64b3d9513/ws-client/proto-buf/pbbp2.js.
|
|
5
|
+
// Keep uint64 values lossless: ACKs must return the original correlation IDs.
|
|
6
|
+
protobuf.util.Long = Long;
|
|
7
|
+
protobuf.configure();
|
|
8
|
+
export function decodeFeishuFrame(bytes) {
|
|
9
|
+
const reader = protobuf.Reader.create(bytes);
|
|
10
|
+
const frame = {
|
|
11
|
+
SeqID: Long.UZERO,
|
|
12
|
+
LogID: Long.UZERO,
|
|
13
|
+
service: 0,
|
|
14
|
+
method: 0,
|
|
15
|
+
headers: [],
|
|
16
|
+
};
|
|
17
|
+
let required = 0;
|
|
18
|
+
while (reader.pos < reader.len) {
|
|
19
|
+
const tag = reader.uint32();
|
|
20
|
+
switch (tag) {
|
|
21
|
+
case 8:
|
|
22
|
+
frame.SeqID = Long.fromValue(reader.uint64(), true);
|
|
23
|
+
required |= 1;
|
|
24
|
+
break;
|
|
25
|
+
case 16:
|
|
26
|
+
frame.LogID = Long.fromValue(reader.uint64(), true);
|
|
27
|
+
required |= 2;
|
|
28
|
+
break;
|
|
29
|
+
case 24:
|
|
30
|
+
frame.service = reader.int32();
|
|
31
|
+
required |= 4;
|
|
32
|
+
break;
|
|
33
|
+
case 32:
|
|
34
|
+
frame.method = reader.int32();
|
|
35
|
+
required |= 8;
|
|
36
|
+
break;
|
|
37
|
+
case 42: {
|
|
38
|
+
if (frame.headers.length >= 64)
|
|
39
|
+
throw new Error("Too many frame headers");
|
|
40
|
+
const length = reader.uint32();
|
|
41
|
+
const end = reader.pos + length;
|
|
42
|
+
if (end > reader.len)
|
|
43
|
+
throw new Error("Truncated frame header");
|
|
44
|
+
let key;
|
|
45
|
+
let value;
|
|
46
|
+
while (reader.pos < end) {
|
|
47
|
+
const headerTag = reader.uint32();
|
|
48
|
+
if (headerTag === 10)
|
|
49
|
+
key = reader.string();
|
|
50
|
+
else if (headerTag === 18)
|
|
51
|
+
value = reader.string();
|
|
52
|
+
else
|
|
53
|
+
reader.skipType(headerTag & 7);
|
|
54
|
+
}
|
|
55
|
+
if (reader.pos !== end || key === undefined || value === undefined)
|
|
56
|
+
throw new Error("Invalid frame header");
|
|
57
|
+
frame.headers.push({ key, value });
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 50:
|
|
61
|
+
frame.payloadEncoding = reader.string();
|
|
62
|
+
break;
|
|
63
|
+
case 58:
|
|
64
|
+
frame.payloadType = reader.string();
|
|
65
|
+
break;
|
|
66
|
+
case 66:
|
|
67
|
+
frame.payload = reader.bytes();
|
|
68
|
+
break;
|
|
69
|
+
case 74:
|
|
70
|
+
frame.LogIDNew = reader.string();
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
reader.skipType(tag & 7);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (required !== 15)
|
|
77
|
+
throw new Error("Missing required frame fields");
|
|
78
|
+
return frame;
|
|
79
|
+
}
|
|
80
|
+
export function encodeFeishuFrame(frame) {
|
|
81
|
+
const writer = protobuf.Writer.create()
|
|
82
|
+
.uint32(8)
|
|
83
|
+
.uint64(frame.SeqID)
|
|
84
|
+
.uint32(16)
|
|
85
|
+
.uint64(frame.LogID)
|
|
86
|
+
.uint32(24)
|
|
87
|
+
.int32(frame.service)
|
|
88
|
+
.uint32(32)
|
|
89
|
+
.int32(frame.method);
|
|
90
|
+
for (const { key, value } of frame.headers)
|
|
91
|
+
writer
|
|
92
|
+
.uint32(42)
|
|
93
|
+
.fork()
|
|
94
|
+
.uint32(10)
|
|
95
|
+
.string(key)
|
|
96
|
+
.uint32(18)
|
|
97
|
+
.string(value)
|
|
98
|
+
.ldelim();
|
|
99
|
+
if (frame.payloadEncoding !== undefined)
|
|
100
|
+
writer.uint32(50).string(frame.payloadEncoding);
|
|
101
|
+
if (frame.payloadType !== undefined)
|
|
102
|
+
writer.uint32(58).string(frame.payloadType);
|
|
103
|
+
if (frame.payload !== undefined)
|
|
104
|
+
writer.uint32(66).bytes(frame.payload);
|
|
105
|
+
if (frame.LogIDNew !== undefined)
|
|
106
|
+
writer.uint32(74).string(frame.LogIDNew);
|
|
107
|
+
return Uint8Array.from(writer.finish());
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=feishu-codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu-codec.js","sourceRoot":"","sources":["../../src/channels/feishu-codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Result } from "better-result";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { ChannelInputContext } from "./index";
|
|
4
|
+
import type { FeishuChannelConfiguration } from "./feishu";
|
|
5
|
+
export declare const feishuSenderSchema: z.ZodObject<{
|
|
6
|
+
tenantKey: z.ZodString;
|
|
7
|
+
openId: z.ZodString;
|
|
8
|
+
}, z.core.$strict>;
|
|
9
|
+
export declare const feishuHeaderSchema: z.ZodObject<{
|
|
10
|
+
event_type: z.ZodString;
|
|
11
|
+
event_id: z.ZodString;
|
|
12
|
+
tenant_key: z.ZodString;
|
|
13
|
+
app_id: z.ZodString;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export declare const feishuEventSchema: z.ZodObject<{
|
|
16
|
+
header: z.ZodOptional<z.ZodObject<{
|
|
17
|
+
event_type: z.ZodString;
|
|
18
|
+
event_id: z.ZodString;
|
|
19
|
+
tenant_key: z.ZodString;
|
|
20
|
+
app_id: z.ZodString;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
event: z.ZodOptional<z.ZodUnknown>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
declare const FeishuInputError_base: import("better-result").TaggedErrorClass<"FeishuInputError", {
|
|
25
|
+
status: 400 | 403 | 500;
|
|
26
|
+
operation: "input" | "allowlist" | "admission";
|
|
27
|
+
message: string;
|
|
28
|
+
cause?: unknown;
|
|
29
|
+
}>;
|
|
30
|
+
export declare class FeishuInputError extends FeishuInputError_base {
|
|
31
|
+
}
|
|
32
|
+
/** HTTP token checks and authenticated WS framing run before this shared admission boundary. */
|
|
33
|
+
export declare function acceptFeishuEvent(envelope: z.output<typeof feishuEventSchema>, configuration: Pick<FeishuChannelConfiguration, "appId" | "allowedSenders">, ctx: Pick<ChannelInputContext, "from">): Promise<Result<"accepted" | "ignored", FeishuInputError>>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=feishu-inbound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu-inbound.d.ts","sourceRoot":"","sources":["../../src/channels/feishu-inbound.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAe,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAE3D,eAAO,MAAM,kBAAkB;;;kBAEpB,CAAC;AAKZ,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AACH,eAAO,MAAM,iBAAiB;;;;;;;;iBAG5B,CAAC;;YAuBO,GAAG,GAAG,GAAG,GAAG,GAAG;eACZ,OAAO,GAAG,WAAW,GAAG,WAAW;aACrC,MAAM;YACP,OAAO;;AAJjB,qBAAa,gBAAiB,SAAQ,qBAKlC;CAAG;AAEP,gGAAgG;AAChG,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,EAC5C,aAAa,EAAE,IAAI,CAAC,0BAA0B,EAAE,OAAO,GAAG,gBAAgB,CAAC,EAC3E,GAAG,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAmH3D"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { createAgentChannelStableId } from "@gea-ai/contract/agent-channels";
|
|
2
|
+
import { Result, TaggedError } from "better-result";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export const feishuSenderSchema = z
|
|
5
|
+
.object({ tenantKey: z.string().min(1), openId: z.string().min(1) })
|
|
6
|
+
.strict();
|
|
7
|
+
const feishuAllowedSendersSchema = z.union([
|
|
8
|
+
z.literal("*"),
|
|
9
|
+
z.array(feishuSenderSchema).max(1000),
|
|
10
|
+
]);
|
|
11
|
+
export const feishuHeaderSchema = z.object({
|
|
12
|
+
event_type: z.string(),
|
|
13
|
+
event_id: z.string().min(1),
|
|
14
|
+
tenant_key: z.string().min(1),
|
|
15
|
+
app_id: z.string().min(1),
|
|
16
|
+
});
|
|
17
|
+
export const feishuEventSchema = z.object({
|
|
18
|
+
header: feishuHeaderSchema.optional(),
|
|
19
|
+
event: z.unknown().optional(),
|
|
20
|
+
});
|
|
21
|
+
const messageEventSchema = z.object({
|
|
22
|
+
sender: z.object({
|
|
23
|
+
sender_id: z.object({ open_id: z.string().min(1) }),
|
|
24
|
+
sender_type: z.string(),
|
|
25
|
+
tenant_key: z.string().min(1),
|
|
26
|
+
}),
|
|
27
|
+
message: z.object({
|
|
28
|
+
message_id: z.string().min(1),
|
|
29
|
+
chat_id: z.string().min(1),
|
|
30
|
+
chat_type: z.string(),
|
|
31
|
+
message_type: z.string(),
|
|
32
|
+
content: z.string(),
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
const contentSchema = z.object({
|
|
36
|
+
text: z
|
|
37
|
+
.string()
|
|
38
|
+
.min(1)
|
|
39
|
+
.max(64 * 1024),
|
|
40
|
+
});
|
|
41
|
+
export class FeishuInputError extends TaggedError("FeishuInputError")() {
|
|
42
|
+
}
|
|
43
|
+
/** HTTP token checks and authenticated WS framing run before this shared admission boundary. */
|
|
44
|
+
export function acceptFeishuEvent(envelope, configuration, ctx) {
|
|
45
|
+
return Result.gen(async function* () {
|
|
46
|
+
const header = envelope.header;
|
|
47
|
+
if (!header || header.event_type !== "im.message.receive_v1")
|
|
48
|
+
return Result.ok("ignored");
|
|
49
|
+
if (header.app_id !== configuration.appId)
|
|
50
|
+
return Result.err(new FeishuInputError({
|
|
51
|
+
status: 403,
|
|
52
|
+
operation: "input",
|
|
53
|
+
message: "App identity mismatch",
|
|
54
|
+
}));
|
|
55
|
+
const parsed = messageEventSchema.safeParse(envelope.event);
|
|
56
|
+
if (!parsed.success)
|
|
57
|
+
return Result.err(new FeishuInputError({
|
|
58
|
+
status: 400,
|
|
59
|
+
operation: "input",
|
|
60
|
+
message: "Invalid message event",
|
|
61
|
+
cause: parsed.error,
|
|
62
|
+
}));
|
|
63
|
+
const { sender, message } = parsed.data;
|
|
64
|
+
if (message.chat_type !== "p2p" ||
|
|
65
|
+
message.message_type !== "text" ||
|
|
66
|
+
sender.sender_type !== "user")
|
|
67
|
+
return Result.ok("ignored");
|
|
68
|
+
const allowed = yield* Result.try({
|
|
69
|
+
try: () => {
|
|
70
|
+
const value = typeof configuration.allowedSenders === "string"
|
|
71
|
+
? configuration.allowedSenders.trim()
|
|
72
|
+
: configuration.allowedSenders;
|
|
73
|
+
return feishuAllowedSendersSchema.parse(typeof value === "string" && value !== "*"
|
|
74
|
+
? JSON.parse(value || "[]")
|
|
75
|
+
: (value ?? []));
|
|
76
|
+
},
|
|
77
|
+
catch: (cause) => new FeishuInputError({
|
|
78
|
+
status: 500,
|
|
79
|
+
operation: "allowlist",
|
|
80
|
+
message: "Channel callback could not be accepted",
|
|
81
|
+
cause,
|
|
82
|
+
}),
|
|
83
|
+
});
|
|
84
|
+
if (header.tenant_key !== sender.tenant_key ||
|
|
85
|
+
(allowed !== "*" &&
|
|
86
|
+
!allowed.some((item) => item.tenantKey === sender.tenant_key &&
|
|
87
|
+
item.openId === sender.sender_id.open_id)))
|
|
88
|
+
return Result.err(new FeishuInputError({
|
|
89
|
+
status: 403,
|
|
90
|
+
operation: "input",
|
|
91
|
+
message: "Sender is not allowed",
|
|
92
|
+
}));
|
|
93
|
+
const rawContent = yield* Result.try({
|
|
94
|
+
try: () => JSON.parse(message.content),
|
|
95
|
+
catch: (cause) => new FeishuInputError({
|
|
96
|
+
status: 500,
|
|
97
|
+
operation: "input",
|
|
98
|
+
message: "Channel callback could not be accepted",
|
|
99
|
+
cause,
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
const content = contentSchema.safeParse(rawContent);
|
|
103
|
+
if (!content.success)
|
|
104
|
+
return Result.err(new FeishuInputError({
|
|
105
|
+
status: 400,
|
|
106
|
+
operation: "input",
|
|
107
|
+
message: "Invalid text content",
|
|
108
|
+
cause: content.error,
|
|
109
|
+
}));
|
|
110
|
+
yield* Result.await(Result.tryPromise({
|
|
111
|
+
try: async () => ctx
|
|
112
|
+
.from(`${header.tenant_key}:${message.chat_id}`, {
|
|
113
|
+
principal: {
|
|
114
|
+
principalType: "user",
|
|
115
|
+
principalId: `feishu:${await createAgentChannelStableId("feishu-user", header.app_id, sender.tenant_key, sender.sender_id.open_id)}`,
|
|
116
|
+
},
|
|
117
|
+
})
|
|
118
|
+
.send(content.data.text, {
|
|
119
|
+
operationId: header.event_id,
|
|
120
|
+
data: { chatId: message.chat_id, messageId: message.message_id },
|
|
121
|
+
actor: {
|
|
122
|
+
tenantKey: sender.tenant_key,
|
|
123
|
+
openId: sender.sender_id.open_id,
|
|
124
|
+
},
|
|
125
|
+
}),
|
|
126
|
+
catch: (cause) => new FeishuInputError({
|
|
127
|
+
status: 500,
|
|
128
|
+
operation: "admission",
|
|
129
|
+
message: "Channel callback could not be accepted",
|
|
130
|
+
cause,
|
|
131
|
+
}),
|
|
132
|
+
}));
|
|
133
|
+
return Result.ok("accepted");
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=feishu-inbound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu-inbound.js","sourceRoot":"","sources":["../../src/channels/feishu-inbound.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FeishuChannelConfiguration } from "./feishu";
|
|
2
|
+
import type { ChannelReceiver, ChannelCapabilities } from "./index";
|
|
3
|
+
/** One protocol instance per active socket; framework owns reconnection and capability lifetime. */
|
|
4
|
+
export declare function createFeishuReceiver(configure: (context: ChannelCapabilities) => FeishuChannelConfiguration): ChannelReceiver;
|
|
5
|
+
//# sourceMappingURL=feishu-websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu-websocket.d.ts","sourceRoot":"","sources":["../../src/channels/feishu-websocket.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,KAAK,EACV,eAAe,EAGf,mBAAmB,EACpB,MAAM,SAAS,CAAC;AA8DjB,oGAAoG;AACpG,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,0BAA0B,GACtE,eAAe,CAycjB"}
|