@krischoichoi/channel-lark 0.6.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/README.md +114 -0
- package/lib/adapter.d.ts +128 -0
- package/lib/adapter.d.ts.map +1 -0
- package/lib/adapter.js +347 -0
- package/lib/adapter.js.map +1 -0
- package/lib/auth/device-authorization.d.ts +12 -0
- package/lib/auth/device-authorization.d.ts.map +1 -0
- package/lib/auth/device-authorization.js +169 -0
- package/lib/auth/device-authorization.js.map +1 -0
- package/lib/card.d.ts +124 -0
- package/lib/card.d.ts.map +1 -0
- package/lib/card.js +347 -0
- package/lib/card.js.map +1 -0
- package/lib/config.d.ts +103 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +60 -0
- package/lib/config.js.map +1 -0
- package/lib/definition.d.ts +74 -0
- package/lib/definition.d.ts.map +1 -0
- package/lib/definition.js +190 -0
- package/lib/definition.js.map +1 -0
- package/lib/inbound.d.ts +41 -0
- package/lib/inbound.d.ts.map +1 -0
- package/lib/inbound.js +102 -0
- package/lib/inbound.js.map +1 -0
- package/lib/index.d.ts +58 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +104 -0
- package/lib/index.js.map +1 -0
- package/lib/lark-sdk-upstream.d.ts +128 -0
- package/lib/lark-sdk-upstream.d.ts.map +1 -0
- package/lib/lark-sdk-upstream.js +339 -0
- package/lib/lark-sdk-upstream.js.map +1 -0
- package/lib/manifest.d.ts +23 -0
- package/lib/manifest.d.ts.map +1 -0
- package/lib/manifest.js +36 -0
- package/lib/manifest.js.map +1 -0
- package/lib/mapper.d.ts +47 -0
- package/lib/mapper.d.ts.map +1 -0
- package/lib/mapper.js +223 -0
- package/lib/mapper.js.map +1 -0
- package/lib/media-hydrator.d.ts +55 -0
- package/lib/media-hydrator.d.ts.map +1 -0
- package/lib/media-hydrator.js +172 -0
- package/lib/media-hydrator.js.map +1 -0
- package/lib/openapi-outbound.d.ts +216 -0
- package/lib/openapi-outbound.d.ts.map +1 -0
- package/lib/openapi-outbound.js +384 -0
- package/lib/openapi-outbound.js.map +1 -0
- package/lib/outbound.d.ts +21 -0
- package/lib/outbound.d.ts.map +1 -0
- package/lib/outbound.js +93 -0
- package/lib/outbound.js.map +1 -0
- package/lib/upstream/media-port.d.ts +154 -0
- package/lib/upstream/media-port.d.ts.map +1 -0
- package/lib/upstream/media-port.js +168 -0
- package/lib/upstream/media-port.js.map +1 -0
- package/lib/upstream.d.ts +119 -0
- package/lib/upstream.d.ts.map +1 -0
- package/lib/upstream.js +2 -0
- package/lib/upstream.js.map +1 -0
- package/package.json +46 -0
package/lib/card.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lark adapter configuration (Schemastery).
|
|
3
|
+
*
|
|
4
|
+
* Every deployment-tunable parameter is configurable here — no hardcoded
|
|
5
|
+
* deployment constants. The upstream is ALWAYS the official
|
|
6
|
+
* `@larksuiteoapi/node-sdk`: the Lark AppId is a plain config string
|
|
7
|
+
* (`upstream.appId` — not a secret) while the AppSecret is resolved via
|
|
8
|
+
* `ctx.credentials` (reference `DSH_CHANNEL_LARK_MAIN_APP_SECRET`). The secret
|
|
9
|
+
* value never appears in profile config, logs, or fixtures — only its reference
|
|
10
|
+
* name does.
|
|
11
|
+
*
|
|
12
|
+
* Fail-closed config governance:
|
|
13
|
+
* - `upstream.mode` is a fixed literal `'sdk'`. A legacy config carrying
|
|
14
|
+
* `mode: 'gateway'` fails config validation (the plugin never enters the
|
|
15
|
+
* runtime), so no gateway fallback can silently come back.
|
|
16
|
+
* - `baseUrl` / `longPollTimeoutMs` (old self-hosted gateway settings) are
|
|
17
|
+
* removed from the schema and defaults.
|
|
18
|
+
*/
|
|
19
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
20
|
+
import type { Volatile } from '@deepseek-ai/cordis';
|
|
21
|
+
/** Default credential reference name for the Lark AppSecret (web + config default). */
|
|
22
|
+
export declare const LARK_APP_SECRET_REF = "DSH_CHANNEL_LARK_MAIN_APP_SECRET";
|
|
23
|
+
export interface LarkReconnectConfig {
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
baseDelayMs: number;
|
|
26
|
+
maxDelayMs: number;
|
|
27
|
+
maxRetries: number;
|
|
28
|
+
}
|
|
29
|
+
export interface LarkDedupConfig {
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
windowMs: number;
|
|
32
|
+
}
|
|
33
|
+
export interface LarkCardConfig {
|
|
34
|
+
/**
|
|
35
|
+
* Create the CardKit streaming card entity on the first streamed delta
|
|
36
|
+
* (eager preview). When `false`, deltas buffer locally and the card is only
|
|
37
|
+
* created at `finish`.
|
|
38
|
+
*/
|
|
39
|
+
createOnFirstDelta: boolean;
|
|
40
|
+
/** Add/remove the Feishu `Typing` reaction while generating a reply. */
|
|
41
|
+
typingIndicator: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Upstream driver selection. The official `@larksuiteoapi/node-sdk` is the
|
|
45
|
+
* ONLY driver: inbound via its WebSocket long-connection (`WSClient` +
|
|
46
|
+
* `EventDispatcher`, `im.message.receive_v1` / `card.action.trigger`) and
|
|
47
|
+
* outbound via its OpenAPI client, including CardKit 2.0 native streaming.
|
|
48
|
+
* The legacy self-hosted HTTP gateway mode is removed — `mode` is a fixed
|
|
49
|
+
* literal so old `'gateway'` configs fail validation.
|
|
50
|
+
*/
|
|
51
|
+
export interface LarkUpstreamConfig {
|
|
52
|
+
/** Fixed: the official SDK is the only upstream driver. */
|
|
53
|
+
mode: 'sdk';
|
|
54
|
+
/**
|
|
55
|
+
* Feishu/Lark AppId — a PLAIN config string (not a secret). The web UI writes
|
|
56
|
+
* it through the config endpoint. Defaults to unset.
|
|
57
|
+
*/
|
|
58
|
+
appId?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Credential reference name for the Lark AppSecret (resolved via
|
|
61
|
+
* `ctx.credentials`). Defaults to `LARK_APP_SECRET_REF`. Only the
|
|
62
|
+
* reference name lives in config — the value never appears in profile / git.
|
|
63
|
+
*/
|
|
64
|
+
appSecretRef?: string;
|
|
65
|
+
/**
|
|
66
|
+
* API domain: 'feishu' | 'lark' | custom base domain. Defaults to 'feishu'
|
|
67
|
+
* (Feishu China).
|
|
68
|
+
*/
|
|
69
|
+
domain?: string;
|
|
70
|
+
}
|
|
71
|
+
export interface LarkConfig {
|
|
72
|
+
enabled: boolean;
|
|
73
|
+
/** Account id within the lark channel (defaults to 'main'). */
|
|
74
|
+
accountId: string;
|
|
75
|
+
/** Per-request timeout. */
|
|
76
|
+
timeoutMs: number;
|
|
77
|
+
reconnect: LarkReconnectConfig;
|
|
78
|
+
dedup: LarkDedupConfig;
|
|
79
|
+
card: LarkCardConfig;
|
|
80
|
+
/** Upstream driver: always the official SDK (detailed above). */
|
|
81
|
+
upstream: LarkUpstreamConfig;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Activation-time config shape (Harness 0.2.0): every volatile field resolves
|
|
85
|
+
* to a `Volatile<T>` live handle instead of a plain value. `apply()` unwraps
|
|
86
|
+
* these once via `resolveVolatileConfig` into a plain `LarkConfig`.
|
|
87
|
+
*
|
|
88
|
+
* Volatile = the fields the control plane's saveConfig may write at runtime
|
|
89
|
+
* (accountId, reconnect/dedup/card, upstream.appId/upstream.domain, enabled).
|
|
90
|
+
* `timeoutMs` and `upstream.appSecretRef`/`upstream.mode` are not runtime-
|
|
91
|
+
* writable and stay plain.
|
|
92
|
+
*/
|
|
93
|
+
export interface LarkConfigLive {
|
|
94
|
+
enabled: Volatile<boolean>;
|
|
95
|
+
accountId: Volatile<string>;
|
|
96
|
+
timeoutMs: number;
|
|
97
|
+
reconnect: Volatile<LarkReconnectConfig>;
|
|
98
|
+
dedup: Volatile<LarkDedupConfig>;
|
|
99
|
+
card: Volatile<LarkCardConfig>;
|
|
100
|
+
upstream: Volatile<LarkUpstreamConfig>;
|
|
101
|
+
}
|
|
102
|
+
export declare const Config: Schema<LarkConfigLive>;
|
|
103
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,uFAAuF;AACvF,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AAEtE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wEAAwE;IACxE,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,IAAI,EAAE,KAAK,CAAC;IACZ;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,iEAAiE;IACjE,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACzC,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;CACxC;AAMD,eAAO,MAAM,MAAM,EAiCF,MAAM,CAAC,cAAc,CAAC,CAAC"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lark adapter configuration (Schemastery).
|
|
3
|
+
*
|
|
4
|
+
* Every deployment-tunable parameter is configurable here — no hardcoded
|
|
5
|
+
* deployment constants. The upstream is ALWAYS the official
|
|
6
|
+
* `@larksuiteoapi/node-sdk`: the Lark AppId is a plain config string
|
|
7
|
+
* (`upstream.appId` — not a secret) while the AppSecret is resolved via
|
|
8
|
+
* `ctx.credentials` (reference `DSH_CHANNEL_LARK_MAIN_APP_SECRET`). The secret
|
|
9
|
+
* value never appears in profile config, logs, or fixtures — only its reference
|
|
10
|
+
* name does.
|
|
11
|
+
*
|
|
12
|
+
* Fail-closed config governance:
|
|
13
|
+
* - `upstream.mode` is a fixed literal `'sdk'`. A legacy config carrying
|
|
14
|
+
* `mode: 'gateway'` fails config validation (the plugin never enters the
|
|
15
|
+
* runtime), so no gateway fallback can silently come back.
|
|
16
|
+
* - `baseUrl` / `longPollTimeoutMs` (old self-hosted gateway settings) are
|
|
17
|
+
* removed from the schema and defaults.
|
|
18
|
+
*/
|
|
19
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
20
|
+
/** Default credential reference name for the Lark AppSecret (web + config default). */
|
|
21
|
+
export const LARK_APP_SECRET_REF = 'DSH_CHANNEL_LARK_MAIN_APP_SECRET';
|
|
22
|
+
// The runtime schema is genuine Schemastery (validation happens at the Loader
|
|
23
|
+
// boundary); the annotation records the activation-time output shape. The cast
|
|
24
|
+
// is required because Schemastery's inferred ObjectT models per-field optionality
|
|
25
|
+
// more precisely than the hand-written `LarkConfigLive` alias.
|
|
26
|
+
export const Config = Schema.object({
|
|
27
|
+
// Harness 0.2.0 settings model: fields the control plane / settings page may
|
|
28
|
+
// write at runtime are declared `.volatile()` — they surface on the
|
|
29
|
+
// auto-generated settings form, `ctx.settings.update(entryId, patch)` accepts
|
|
30
|
+
// exactly these paths, and at activation they resolve to `Volatile<T>`
|
|
31
|
+
// handles (unwrapped by `resolveVolatileConfig` in definition.ts / apply()).
|
|
32
|
+
enabled: Schema.boolean().default(true).volatile(),
|
|
33
|
+
accountId: Schema.string().default('main').volatile(),
|
|
34
|
+
timeoutMs: Schema.natural().default(30000),
|
|
35
|
+
reconnect: Schema.object({
|
|
36
|
+
enabled: Schema.boolean().default(true),
|
|
37
|
+
baseDelayMs: Schema.natural().default(1000),
|
|
38
|
+
maxDelayMs: Schema.natural().default(30000),
|
|
39
|
+
maxRetries: Schema.natural().default(10),
|
|
40
|
+
}).default({}).volatile(),
|
|
41
|
+
dedup: Schema.object({
|
|
42
|
+
enabled: Schema.boolean().default(true),
|
|
43
|
+
windowMs: Schema.natural().default(5000),
|
|
44
|
+
}).default({}).volatile(),
|
|
45
|
+
card: Schema.object({
|
|
46
|
+
createOnFirstDelta: Schema.boolean().default(true),
|
|
47
|
+
typingIndicator: Schema.boolean().default(true),
|
|
48
|
+
}).default({}).volatile(),
|
|
49
|
+
upstream: Schema.object({
|
|
50
|
+
// Fixed literal — `mode: 'gateway'` fails validation (fail closed).
|
|
51
|
+
mode: Schema.union(['sdk']).default('sdk'),
|
|
52
|
+
// AppId is a plain (non-secret) config string, written via the config endpoint.
|
|
53
|
+
appId: Schema.string(),
|
|
54
|
+
// Credential reference name only — never the secret value itself.
|
|
55
|
+
appSecretRef: Schema.string().default(LARK_APP_SECRET_REF),
|
|
56
|
+
// 'feishu' | 'lark' | custom base domain (resolved to the SDK Domain).
|
|
57
|
+
domain: Schema.string().default('feishu'),
|
|
58
|
+
}).default({}).volatile(),
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAG9C,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,kCAAkC,CAAC;AAuFtE,8EAA8E;AAC9E,+EAA+E;AAC/E,kFAAkF;AAClF,+DAA+D;AAC/D,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,6EAA6E;IAC7E,oEAAoE;IACpE,8EAA8E;IAC9E,uEAAuE;IACvE,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IACrD,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACvC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3C,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACzC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACvC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KACzC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAChD,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,oEAAoE;QACpE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1C,gFAAgF;QAChF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QACtB,kEAAkE;QAClE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC1D,uEAAuE;QACvE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC1C,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC1B,CAAsC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lark ChannelDefinition — the description of the lark channel exposed to the
|
|
3
|
+
* Channel Control Plane (doc §14, §26, §29, §49, §52 Task 5).
|
|
4
|
+
*
|
|
5
|
+
* The control plane (when present) drives setup, configured-state reporting and
|
|
6
|
+
* adapter instantiation purely through this object, never through per-channel
|
|
7
|
+
* conditionals. Binding the definition:
|
|
8
|
+
*
|
|
9
|
+
* - `setup.fields` — `appId` is a plain config string (kind 'text'); `appSecret`
|
|
10
|
+
* is a secret referenced by `LARK_APP_SECRET_REF` and only
|
|
11
|
+
* ever written through the credentials seam (doc §31).
|
|
12
|
+
* - `getConfiguredState` — the official-SDK adapter is configured when both
|
|
13
|
+
* `appId` (config) and the `appSecretRef` credential exist.
|
|
14
|
+
* - `saveConfig` — merges only non-secret keys (appId/domain + nested
|
|
15
|
+
* reconnect/dedup/card + accountId/enabled) into an internal
|
|
16
|
+
* mutable snapshot used by createAdapter. Secret fields are
|
|
17
|
+
* rejected upstream by the control plane.
|
|
18
|
+
* - `createAdapter` — resolves `appSecretRef` via the injected credentials seam
|
|
19
|
+
* and throws a stable error when either the AppId or the
|
|
20
|
+
* credential is missing (fail closed; the official SDK is
|
|
21
|
+
* the only upstream driver).
|
|
22
|
+
* - `setup.setupUrl` — points at the official Feishu/Lark console. Console
|
|
23
|
+
* navigation is not modeled as an auth session.
|
|
24
|
+
*
|
|
25
|
+
* Fully offline-testable: inject a fake credentials seam and fake
|
|
26
|
+
* sdk/openapi clients via `deps` — no network, no host.
|
|
27
|
+
*/
|
|
28
|
+
import type { ChannelDefinition } from '@krischoichoi/channel-control';
|
|
29
|
+
import type { LarkConfig } from './config.js';
|
|
30
|
+
import { type LarkAdapterDeps } from './adapter.js';
|
|
31
|
+
/**
|
|
32
|
+
* Structural credential seam used by the definition. Mirrors the tiny slice of
|
|
33
|
+
* `ctx.credentials` the control plane needs; injected so the definition stays
|
|
34
|
+
* host-agnostic and offline-testable. Resolution is per call and must not be
|
|
35
|
+
* cached across calls.
|
|
36
|
+
*/
|
|
37
|
+
export interface LarkCredentialSeam {
|
|
38
|
+
resolve(ref: string): Promise<{
|
|
39
|
+
value: string;
|
|
40
|
+
source: string;
|
|
41
|
+
} | undefined>;
|
|
42
|
+
describe(ref: string): Promise<{
|
|
43
|
+
configured: boolean;
|
|
44
|
+
source?: string;
|
|
45
|
+
writable: boolean;
|
|
46
|
+
}>;
|
|
47
|
+
set(ref: string, value: string): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export interface CreateLarkDefinitionOptions {
|
|
50
|
+
config: LarkConfig;
|
|
51
|
+
deps?: LarkAdapterDeps;
|
|
52
|
+
/** Injected credentials seam (wraps ctx.credentials in apply()). */
|
|
53
|
+
credentials: LarkCredentialSeam;
|
|
54
|
+
/** Durable store for the non-secret setup field when the host provides one. */
|
|
55
|
+
persistSetup?: (patch: {
|
|
56
|
+
upstream: Pick<LarkConfig['upstream'], 'appId'>;
|
|
57
|
+
}) => Promise<void>;
|
|
58
|
+
/** Durable store for the enabled intent (doc §21) when the host provides one. */
|
|
59
|
+
persistEnabled?: (enabled: boolean) => Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Feishu/Lark open-platform console "Apps" URL derived from the configured API
|
|
63
|
+
* domain (doc §39/§40). Mirrors `resolveDomain`: the well-known 'feishu' and
|
|
64
|
+
* 'lark' map to their official consoles; any other value is treated as a custom
|
|
65
|
+
* base domain and prefixed with https + '/app'. When the app's appId is known
|
|
66
|
+
* the link deep-links to that app (`/app/<appId>`), mirroring openclaw-toolkit.
|
|
67
|
+
*/
|
|
68
|
+
export declare function larkConsoleAppUrl(domain: string | undefined, appId?: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Build the lark ChannelDefinition for the control plane. Returns a fresh object
|
|
71
|
+
* each call (cheap) so a plugin can register it against any control instance.
|
|
72
|
+
*/
|
|
73
|
+
export declare function createLarkDefinition(options: CreateLarkDefinitionOptions): ChannelDefinition;
|
|
74
|
+
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAMjE;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC7E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,oEAAoE;IACpE,WAAW,EAAE,kBAAkB,CAAC;IAChC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,iFAAiF;IACjF,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAoBD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CASpF;AAKD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,iBAAiB,CAuJnB"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { ControlError } from '@krischoichoi/channel-control';
|
|
2
|
+
import { ChannelError, resolveVolatileConfig } from '@krischoichoi/channel-core';
|
|
3
|
+
import { LARK_APP_SECRET_REF } from './config.js';
|
|
4
|
+
import { LarkAdapter } from './adapter.js';
|
|
5
|
+
import { beginLarkDeviceAuthorization, pollLarkDeviceAuthorization, } from './auth/device-authorization.js';
|
|
6
|
+
/** Allowed non-secret nested sub-config keys merged by saveConfig. */
|
|
7
|
+
const NESTED_KEYS = ['reconnect', 'dedup', 'card'];
|
|
8
|
+
/** Allowed non-secret 'upstream.*' keys merged by saveConfig (doc §30). */
|
|
9
|
+
const UPSTREAM_KEYS = ['appId', 'domain'];
|
|
10
|
+
/** Deep-copy a LarkConfig into an independent mutable snapshot. */
|
|
11
|
+
function snapshotOf(config) {
|
|
12
|
+
// Harness 0.2.0: volatile fields arrive as `Volatile<T>` handles; unwrap
|
|
13
|
+
// them once so the snapshot (and everything reading it) sees plain values.
|
|
14
|
+
const plain = resolveVolatileConfig(config);
|
|
15
|
+
const copy = { ...plain };
|
|
16
|
+
copy.reconnect = { ...plain.reconnect };
|
|
17
|
+
copy.dedup = { ...plain.dedup };
|
|
18
|
+
copy.card = { ...plain.card };
|
|
19
|
+
copy.upstream = { ...plain.upstream };
|
|
20
|
+
return copy;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Feishu/Lark open-platform console "Apps" URL derived from the configured API
|
|
24
|
+
* domain (doc §39/§40). Mirrors `resolveDomain`: the well-known 'feishu' and
|
|
25
|
+
* 'lark' map to their official consoles; any other value is treated as a custom
|
|
26
|
+
* base domain and prefixed with https + '/app'. When the app's appId is known
|
|
27
|
+
* the link deep-links to that app (`/app/<appId>`), mirroring openclaw-toolkit.
|
|
28
|
+
*/
|
|
29
|
+
export function larkConsoleAppUrl(domain, appId) {
|
|
30
|
+
const base = domain === 'lark'
|
|
31
|
+
? 'https://open.larksuite.com/app'
|
|
32
|
+
: domain && domain !== 'feishu'
|
|
33
|
+
? `https://${domain.replace(originRE, '').replace(trailRE, '')}/app`
|
|
34
|
+
: 'https://open.feishu.cn/app';
|
|
35
|
+
const id = appId?.trim();
|
|
36
|
+
return id ? `${base}/${encodeURIComponent(id)}` : base;
|
|
37
|
+
}
|
|
38
|
+
const originRE = /^https?:\/\//;
|
|
39
|
+
const trailRE = /\/+$/;
|
|
40
|
+
/**
|
|
41
|
+
* Build the lark ChannelDefinition for the control plane. Returns a fresh object
|
|
42
|
+
* each call (cheap) so a plugin can register it against any control instance.
|
|
43
|
+
*/
|
|
44
|
+
export function createLarkDefinition(options) {
|
|
45
|
+
const credentials = options.credentials;
|
|
46
|
+
const deps = options.deps ?? {};
|
|
47
|
+
// Mutable snapshot: saveConfig merges non-secret patches into this; the same
|
|
48
|
+
// object feeds getConfiguredState + createAdapter so both always agree.
|
|
49
|
+
const state = snapshotOf(options.config);
|
|
50
|
+
const appSecretRef = () => state.upstream.appSecretRef ?? LARK_APP_SECRET_REF;
|
|
51
|
+
const setup = {
|
|
52
|
+
fields: [
|
|
53
|
+
{
|
|
54
|
+
name: 'appId',
|
|
55
|
+
kind: 'text',
|
|
56
|
+
secret: false,
|
|
57
|
+
configured: Boolean(state.upstream.appId),
|
|
58
|
+
writable: true,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'appSecret',
|
|
62
|
+
kind: 'secret',
|
|
63
|
+
secret: true,
|
|
64
|
+
configured: false,
|
|
65
|
+
writable: true,
|
|
66
|
+
ref: appSecretRef(),
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
authMethods: ['credentials', 'hybrid'],
|
|
70
|
+
setupUrl: larkConsoleAppUrl(state.upstream.domain, state.upstream.appId),
|
|
71
|
+
};
|
|
72
|
+
const configuredState = async () => {
|
|
73
|
+
const appIdConfigured = Boolean(state.upstream.appId);
|
|
74
|
+
const secret = await credentials.describe(appSecretRef());
|
|
75
|
+
const configured = appIdConfigured && secret.configured;
|
|
76
|
+
return {
|
|
77
|
+
configured,
|
|
78
|
+
fields: {
|
|
79
|
+
appId: { configured: appIdConfigured, writable: true, value: state.upstream.appId },
|
|
80
|
+
appSecret: {
|
|
81
|
+
configured: secret.configured,
|
|
82
|
+
writable: secret.writable,
|
|
83
|
+
source: secret.source,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
const saveConfig = async (patch) => {
|
|
89
|
+
// Nested sub-objects (deep-merge): reconnect / dedup / card.
|
|
90
|
+
for (const key of NESTED_KEYS) {
|
|
91
|
+
const value = patch[key];
|
|
92
|
+
if (value && typeof value === 'object') {
|
|
93
|
+
Object.assign(state[key], value);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Object-form 'upstream' non-secret keys.
|
|
97
|
+
const upstreamPatch = patch.upstream;
|
|
98
|
+
if (upstreamPatch && typeof upstreamPatch === 'object') {
|
|
99
|
+
const target = state.upstream;
|
|
100
|
+
for (const key of UPSTREAM_KEYS) {
|
|
101
|
+
const value = upstreamPatch[key];
|
|
102
|
+
if (value !== undefined)
|
|
103
|
+
target[key] = value;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Dot-path 'upstream.*' non-secret keys.
|
|
107
|
+
for (const key of UPSTREAM_KEYS.map((k) => `upstream.${k}`)) {
|
|
108
|
+
const value = patch[key];
|
|
109
|
+
if (value === undefined)
|
|
110
|
+
continue;
|
|
111
|
+
const field = key.slice('upstream.'.length);
|
|
112
|
+
state.upstream[field] = value;
|
|
113
|
+
}
|
|
114
|
+
if (typeof patch.appId === 'string')
|
|
115
|
+
state.upstream.appId = patch.appId;
|
|
116
|
+
if (patch.accountId !== undefined)
|
|
117
|
+
state.accountId = String(patch.accountId);
|
|
118
|
+
if (patch.enabled !== undefined)
|
|
119
|
+
state.enabled = Boolean(patch.enabled);
|
|
120
|
+
setup.setupUrl = larkConsoleAppUrl(state.upstream.domain, state.upstream.appId);
|
|
121
|
+
const hasUpstreamAppId = patch.upstream !== null &&
|
|
122
|
+
typeof patch.upstream === 'object' &&
|
|
123
|
+
!Array.isArray(patch.upstream) &&
|
|
124
|
+
patch.upstream.appId !== undefined;
|
|
125
|
+
if (patch.appId !== undefined || hasUpstreamAppId) {
|
|
126
|
+
await options.persistSetup?.({ upstream: { appId: state.upstream.appId } });
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const restoreConfig = async (saved) => {
|
|
130
|
+
const restored = snapshotOf(saved);
|
|
131
|
+
Object.assign(state, restored);
|
|
132
|
+
state.reconnect = restored.reconnect;
|
|
133
|
+
state.dedup = restored.dedup;
|
|
134
|
+
state.card = restored.card;
|
|
135
|
+
state.upstream = restored.upstream;
|
|
136
|
+
setup.setupUrl = larkConsoleAppUrl(state.upstream.domain, state.upstream.appId);
|
|
137
|
+
await options.persistSetup?.({ upstream: { appId: state.upstream.appId } });
|
|
138
|
+
};
|
|
139
|
+
const createAdapter = async () => {
|
|
140
|
+
const appId = state.upstream.appId;
|
|
141
|
+
const resolved = await credentials.resolve(appSecretRef());
|
|
142
|
+
const appSecret = resolved?.value;
|
|
143
|
+
if (!appId || !appSecret) {
|
|
144
|
+
// Stable, logged-out error — never includes the secret value.
|
|
145
|
+
throw new ChannelError('CHANNEL_ERROR', `lark upstream requires configured appId (config) and appSecret (credentials ref ${appSecretRef()})`);
|
|
146
|
+
}
|
|
147
|
+
return new LarkAdapter(state, { ...deps, appId, appSecret });
|
|
148
|
+
};
|
|
149
|
+
return {
|
|
150
|
+
id: 'lark',
|
|
151
|
+
get enabled() {
|
|
152
|
+
return state.enabled;
|
|
153
|
+
},
|
|
154
|
+
async setEnabled(enabled) {
|
|
155
|
+
state.enabled = enabled;
|
|
156
|
+
await options.persistEnabled?.(enabled);
|
|
157
|
+
},
|
|
158
|
+
setup,
|
|
159
|
+
getConfiguredState: configuredState,
|
|
160
|
+
saveConfig,
|
|
161
|
+
snapshotConfig: () => snapshotOf(state),
|
|
162
|
+
restoreConfig,
|
|
163
|
+
async beginAuth(input) {
|
|
164
|
+
if (input.method !== 'hybrid' && input.method !== 'device') {
|
|
165
|
+
throw new ControlError('AUTH_NOT_SUPPORTED', 'lark supports device authorization after credentials setup');
|
|
166
|
+
}
|
|
167
|
+
const resolved = await credentials.resolve(appSecretRef());
|
|
168
|
+
return beginLarkDeviceAuthorization({
|
|
169
|
+
appId: state.upstream.appId ?? '',
|
|
170
|
+
appSecret: resolved?.value ?? '',
|
|
171
|
+
domain: state.upstream.domain,
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
async pollAuth(session) {
|
|
175
|
+
return pollLarkDeviceAuthorization(session);
|
|
176
|
+
},
|
|
177
|
+
createAdapter,
|
|
178
|
+
autoStart: true,
|
|
179
|
+
// Lark exposes message.mentions[] but this adapter does not yet inject a
|
|
180
|
+
// trusted bot open_id, so mention activation remains deliberately disabled.
|
|
181
|
+
access: {
|
|
182
|
+
directMessages: true,
|
|
183
|
+
groups: true,
|
|
184
|
+
mentions: false,
|
|
185
|
+
ownerDiscovery: 'claim',
|
|
186
|
+
identityLabels: { user: 'Lark User ID', group: 'Lark Chat ID' },
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"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"}
|
package/lib/inbound.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbound processing: dedup window + structured mapping + emit.
|
|
3
|
+
*
|
|
4
|
+
* Message payloads map to `message.received`; interaction callbacks (card
|
|
5
|
+
* button presses) route to `interaction.received` (Task 12.3). Both paths
|
|
6
|
+
* share the same dedup window so webhook retries cannot double-deliver.
|
|
7
|
+
*/
|
|
8
|
+
import type { ChannelAdapterContext } from '@krischoichoi/channel-core';
|
|
9
|
+
import { type LarkInboundMeta } from './mapper.js';
|
|
10
|
+
import type { LarkMediaPort } from './upstream/media-port.js';
|
|
11
|
+
export interface InboundProcessorOptions {
|
|
12
|
+
ctx: ChannelAdapterContext;
|
|
13
|
+
meta: LarkInboundMeta;
|
|
14
|
+
dedupEnabled: boolean;
|
|
15
|
+
dedupWindowMs: number;
|
|
16
|
+
/** Injectable clock (tests). */
|
|
17
|
+
now?: () => number;
|
|
18
|
+
/**
|
|
19
|
+
* Optional media port used to hydrate inbound binary resourceRefs into bytes
|
|
20
|
+
* before emit (Milestone M2A). When absent, binary parts keep
|
|
21
|
+
* their resourceRef untouched (no ingress).
|
|
22
|
+
*/
|
|
23
|
+
mediaPort?: LarkMediaPort;
|
|
24
|
+
/** Test/embedding override; production defaults to two concurrent downloads. */
|
|
25
|
+
mediaHydrationConcurrency?: number;
|
|
26
|
+
/** Test/embedding override; production defaults to the Lark 100 MiB cap. */
|
|
27
|
+
maxMediaBytes?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class InboundProcessor {
|
|
30
|
+
private readonly options;
|
|
31
|
+
private readonly now;
|
|
32
|
+
/** dedup key -> last-seen timestamp, pruned on every handle. */
|
|
33
|
+
private readonly seen;
|
|
34
|
+
/** Resolves inbound binary resourceRefs into bytes before emit (M2A/§23-A4). */
|
|
35
|
+
private readonly hydrator;
|
|
36
|
+
constructor(options: InboundProcessorOptions);
|
|
37
|
+
/** Process one raw payload from the upstream; dedup then emit. */
|
|
38
|
+
handle(raw: unknown): Promise<void>;
|
|
39
|
+
private prune;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=inbound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,qBAAqB,EAAqD,MAAM,4BAA4B,CAAC;AA+C3H,OAAO,EAAwC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,qBAAqB,CAAC;IAC3B,IAAI,EAAE,eAAe,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,gFAAgF;IAChF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,gBAAgB;IAOf,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAEZ,OAAO,EAAE,uBAAuB;IAW7D,kEAAkE;IAC5D,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCzC,OAAO,CAAC,KAAK;CAKd"}
|
package/lib/inbound.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** Compact per-part summary for inbound message logs (debug diagnostics). */
|
|
2
|
+
function summarizeParts(parts) {
|
|
3
|
+
return parts.map((part) => {
|
|
4
|
+
switch (part.type) {
|
|
5
|
+
case 'text':
|
|
6
|
+
return { type: 'text', text: part.text.slice(0, 80) };
|
|
7
|
+
case 'image':
|
|
8
|
+
return {
|
|
9
|
+
type: 'image',
|
|
10
|
+
url: part.url,
|
|
11
|
+
resourceRef: part.resourceRef,
|
|
12
|
+
mimeType: part.mimeType,
|
|
13
|
+
localDataBytes: part.localData?.byteLength,
|
|
14
|
+
ingressFailure: part.ingressFailure,
|
|
15
|
+
};
|
|
16
|
+
case 'file':
|
|
17
|
+
return {
|
|
18
|
+
type: 'file',
|
|
19
|
+
name: part.name,
|
|
20
|
+
size: part.size,
|
|
21
|
+
mimeType: part.mimeType,
|
|
22
|
+
localDataBytes: part.localData?.byteLength,
|
|
23
|
+
ingressFailure: part.ingressFailure,
|
|
24
|
+
};
|
|
25
|
+
case 'audio':
|
|
26
|
+
return {
|
|
27
|
+
type: 'audio',
|
|
28
|
+
durationMs: part.durationMs,
|
|
29
|
+
mimeType: part.mimeType,
|
|
30
|
+
localDataBytes: part.localData?.byteLength,
|
|
31
|
+
ingressFailure: part.ingressFailure,
|
|
32
|
+
};
|
|
33
|
+
case 'video':
|
|
34
|
+
return {
|
|
35
|
+
type: 'video',
|
|
36
|
+
durationMs: part.durationMs,
|
|
37
|
+
mimeType: part.mimeType,
|
|
38
|
+
localDataBytes: part.localData?.byteLength,
|
|
39
|
+
ingressFailure: part.ingressFailure,
|
|
40
|
+
};
|
|
41
|
+
default:
|
|
42
|
+
return { type: part.type };
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
import { dedupKey, mapInbound, mapInteraction } from './mapper.js';
|
|
47
|
+
import { MediaHydrator } from './media-hydrator.js';
|
|
48
|
+
export class InboundProcessor {
|
|
49
|
+
options;
|
|
50
|
+
now;
|
|
51
|
+
/** dedup key -> last-seen timestamp, pruned on every handle. */
|
|
52
|
+
seen = new Map();
|
|
53
|
+
/** Resolves inbound binary resourceRefs into bytes before emit (M2A/§23-A4). */
|
|
54
|
+
hydrator;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.options = options;
|
|
57
|
+
this.now = options.now ?? Date.now;
|
|
58
|
+
this.hydrator = new MediaHydrator({
|
|
59
|
+
mediaPort: options.mediaPort,
|
|
60
|
+
signal: options.ctx.signal,
|
|
61
|
+
logger: options.ctx.logger,
|
|
62
|
+
maxConcurrency: options.mediaHydrationConcurrency,
|
|
63
|
+
maxBytes: options.maxMediaBytes,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Process one raw payload from the upstream; dedup then emit. */
|
|
67
|
+
async handle(raw) {
|
|
68
|
+
const key = dedupKey(raw);
|
|
69
|
+
if (this.options.dedupEnabled) {
|
|
70
|
+
const now = this.now();
|
|
71
|
+
const last = this.seen.get(key);
|
|
72
|
+
if (last !== undefined && now - last < this.options.dedupWindowMs) {
|
|
73
|
+
this.options.ctx.logger.debug(`[channel-lark] dropped duplicate payload '${key}'`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.seen.set(key, now);
|
|
77
|
+
this.prune(now);
|
|
78
|
+
}
|
|
79
|
+
const kind = raw?.type;
|
|
80
|
+
if (kind === 'interaction') {
|
|
81
|
+
const event = mapInteraction(raw, this.options.meta);
|
|
82
|
+
await this.options.ctx.emit(event);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const event = mapInbound(raw, this.options.meta);
|
|
86
|
+
// Hydrate binary resourceRefs (image/file/audio/video) into bytes before
|
|
87
|
+
// emit; failures mark the part (ingressFailure) and never block text
|
|
88
|
+
// delivery.
|
|
89
|
+
await this.hydrator.hydrateMedia(event);
|
|
90
|
+
// Inbound message log (debug diagnostics): visible in web:debug with
|
|
91
|
+
// DSH_CHANNELS_DEBUG=1, shows mapped parts incl. hydration result.
|
|
92
|
+
this.options.ctx.logger.info(`[channel-lark] inbound message ${event.message.id} from ${event.sender.id} in ${event.conversation.id}`, { parts: summarizeParts(event.message.content) });
|
|
93
|
+
await this.options.ctx.emit(event);
|
|
94
|
+
}
|
|
95
|
+
prune(now) {
|
|
96
|
+
for (const [key, ts] of this.seen) {
|
|
97
|
+
if (now - ts >= this.options.dedupWindowMs)
|
|
98
|
+
this.seen.delete(key);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=inbound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound.js","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
|