@dsh-enhanced/lark-channel 0.1.3

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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +342 -0
  3. package/bin/dsh-lark-setup.js +8 -0
  4. package/bin/dsh-supervised-growth-setup.js +8 -0
  5. package/cordis.patch.yml +21 -0
  6. package/lib/adapter.d.ts +135 -0
  7. package/lib/adapter.d.ts.map +1 -0
  8. package/lib/adapter.js +965 -0
  9. package/lib/adapter.js.map +1 -0
  10. package/lib/approval.d.ts +26 -0
  11. package/lib/approval.d.ts.map +1 -0
  12. package/lib/approval.js +104 -0
  13. package/lib/approval.js.map +1 -0
  14. package/lib/config.d.ts +21 -0
  15. package/lib/config.d.ts.map +1 -0
  16. package/lib/config.js +56 -0
  17. package/lib/config.js.map +1 -0
  18. package/lib/group-thread.d.ts +11 -0
  19. package/lib/group-thread.d.ts.map +1 -0
  20. package/lib/group-thread.js +22 -0
  21. package/lib/group-thread.js.map +1 -0
  22. package/lib/index.d.ts +27 -0
  23. package/lib/index.d.ts.map +1 -0
  24. package/lib/index.js +30 -0
  25. package/lib/index.js.map +1 -0
  26. package/lib/launchd.d.ts +44 -0
  27. package/lib/launchd.d.ts.map +1 -0
  28. package/lib/launchd.js +205 -0
  29. package/lib/launchd.js.map +1 -0
  30. package/lib/model-picker.d.ts +24 -0
  31. package/lib/model-picker.d.ts.map +1 -0
  32. package/lib/model-picker.js +95 -0
  33. package/lib/model-picker.js.map +1 -0
  34. package/lib/normalize.d.ts +12 -0
  35. package/lib/normalize.d.ts.map +1 -0
  36. package/lib/normalize.js +77 -0
  37. package/lib/normalize.js.map +1 -0
  38. package/lib/permission-picker.d.ts +29 -0
  39. package/lib/permission-picker.d.ts.map +1 -0
  40. package/lib/permission-picker.js +145 -0
  41. package/lib/permission-picker.js.map +1 -0
  42. package/lib/progress.d.ts +15 -0
  43. package/lib/progress.d.ts.map +1 -0
  44. package/lib/progress.js +137 -0
  45. package/lib/progress.js.map +1 -0
  46. package/lib/resident.d.ts +13 -0
  47. package/lib/resident.d.ts.map +1 -0
  48. package/lib/resident.js +41 -0
  49. package/lib/resident.js.map +1 -0
  50. package/lib/sdk.d.ts +131 -0
  51. package/lib/sdk.d.ts.map +1 -0
  52. package/lib/sdk.js +945 -0
  53. package/lib/sdk.js.map +1 -0
  54. package/lib/service.d.ts +30 -0
  55. package/lib/service.d.ts.map +1 -0
  56. package/lib/service.js +157 -0
  57. package/lib/service.js.map +1 -0
  58. package/lib/setup-materialization.d.ts +15 -0
  59. package/lib/setup-materialization.d.ts.map +1 -0
  60. package/lib/setup-materialization.js +221 -0
  61. package/lib/setup-materialization.js.map +1 -0
  62. package/lib/setup-profile.d.ts +23 -0
  63. package/lib/setup-profile.d.ts.map +1 -0
  64. package/lib/setup-profile.js +1126 -0
  65. package/lib/setup-profile.js.map +1 -0
  66. package/lib/setup.d.ts +206 -0
  67. package/lib/setup.d.ts.map +1 -0
  68. package/lib/setup.js +2143 -0
  69. package/lib/setup.js.map +1 -0
  70. package/lib/supervised-growth-profile.d.ts +74 -0
  71. package/lib/supervised-growth-profile.d.ts.map +1 -0
  72. package/lib/supervised-growth-profile.js +485 -0
  73. package/lib/supervised-growth-profile.js.map +1 -0
  74. package/lib/supervised-growth-setup.d.ts +85 -0
  75. package/lib/supervised-growth-setup.d.ts.map +1 -0
  76. package/lib/supervised-growth-setup.js +371 -0
  77. package/lib/supervised-growth-setup.js.map +1 -0
  78. package/lib/systemd.d.ts +39 -0
  79. package/lib/systemd.d.ts.map +1 -0
  80. package/lib/systemd.js +142 -0
  81. package/lib/systemd.js.map +1 -0
  82. package/lib/tool-approval.d.ts +22 -0
  83. package/lib/tool-approval.d.ts.map +1 -0
  84. package/lib/tool-approval.js +107 -0
  85. package/lib/tool-approval.js.map +1 -0
  86. package/lib/types.d.ts +158 -0
  87. package/lib/types.d.ts.map +1 -0
  88. package/lib/types.js +11 -0
  89. package/lib/types.js.map +1 -0
  90. package/lib/version.d.ts +2 -0
  91. package/lib/version.d.ts.map +1 -0
  92. package/lib/version.js +2 -0
  93. package/lib/version.js.map +1 -0
  94. package/lib/windows-task.d.ts +39 -0
  95. package/lib/windows-task.d.ts.map +1 -0
  96. package/lib/windows-task.js +117 -0
  97. package/lib/windows-task.js.map +1 -0
  98. package/lib/ws-card-callback.d.ts +7 -0
  99. package/lib/ws-card-callback.d.ts.map +1 -0
  100. package/lib/ws-card-callback.js +51 -0
  101. package/lib/ws-card-callback.js.map +1 -0
  102. package/package.json +96 -0
@@ -0,0 +1,107 @@
1
+ import { createHmac, timingSafeEqual } from 'node:crypto';
2
+ export class LarkToolApprovalError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.code = code;
7
+ this.name = 'LarkToolApprovalError';
8
+ }
9
+ }
10
+ const TOKEN_MAX_CHARS = 4_096;
11
+ const CLAIM_MAX_BYTES = 512;
12
+ const SIGNATURE_DOMAIN = 'dsh-lark-tool-approval:v1\0';
13
+ const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9._@:-]{0,255}$/u;
14
+ const routeComponentPattern = /^[A-Za-z0-9][A-Za-z0-9._@/-]{0,255}$/u;
15
+ function validateSecret(secret) {
16
+ if (typeof secret !== 'string' || Buffer.byteLength(secret, 'utf8') < 16) {
17
+ throw new LarkToolApprovalError('invalid', 'tool approval signing key is invalid');
18
+ }
19
+ }
20
+ function boundedReviewClaim(value) {
21
+ return typeof value === 'string'
22
+ && value.length > 0
23
+ && Buffer.byteLength(value, 'utf8') <= CLAIM_MAX_BYTES
24
+ && !/(?:\p{Cc}|\p{Bidi_Control})/u.test(value);
25
+ }
26
+ function canonical(input) {
27
+ const fields = [
28
+ 'version', 'channel', 'account', 'tenant', 'operationId', 'bindingId', 'chatId',
29
+ 'ownerUser', 'actionHash', 'toolName', 'callId', 'expiresAt', 'decision',
30
+ ];
31
+ if (input === null || typeof input !== 'object' || Array.isArray(input)
32
+ || Object.keys(input).length !== fields.length
33
+ || Object.keys(input).some(field => !fields.includes(field))
34
+ || input.version !== 1
35
+ || !routeComponentPattern.test(input.channel)
36
+ || !routeComponentPattern.test(input.account)
37
+ || !routeComponentPattern.test(input.tenant)
38
+ || !identifierPattern.test(input.operationId)
39
+ || !identifierPattern.test(input.bindingId)
40
+ || !identifierPattern.test(input.chatId)
41
+ || !identifierPattern.test(input.ownerUser)
42
+ || !/^[a-f0-9]{64}$/u.test(input.actionHash)
43
+ || !boundedReviewClaim(input.toolName)
44
+ || !boundedReviewClaim(input.callId)
45
+ || !Number.isSafeInteger(input.expiresAt) || input.expiresAt < 1
46
+ || (input.decision !== 'allowed-once' && input.decision !== 'rejected')) {
47
+ throw new LarkToolApprovalError('invalid', 'tool approval action payload is invalid');
48
+ }
49
+ return {
50
+ version: 1,
51
+ channel: input.channel,
52
+ account: input.account,
53
+ tenant: input.tenant,
54
+ operationId: input.operationId,
55
+ bindingId: input.bindingId,
56
+ chatId: input.chatId,
57
+ ownerUser: input.ownerUser,
58
+ actionHash: input.actionHash,
59
+ toolName: input.toolName,
60
+ callId: input.callId,
61
+ expiresAt: input.expiresAt,
62
+ decision: input.decision,
63
+ };
64
+ }
65
+ function signature(secret, encoded) {
66
+ return createHmac('sha256', secret).update(SIGNATURE_DOMAIN).update(encoded).digest();
67
+ }
68
+ export function signLarkToolApprovalAction(secret, input) {
69
+ validateSecret(secret);
70
+ const encoded = Buffer.from(JSON.stringify(canonical(input)), 'utf8').toString('base64url');
71
+ const token = `${encoded}.${signature(secret, encoded).toString('base64url')}`;
72
+ if (token.length > TOKEN_MAX_CHARS) {
73
+ throw new LarkToolApprovalError('invalid', 'tool approval action token is invalid');
74
+ }
75
+ return token;
76
+ }
77
+ export function verifyLarkToolApprovalAction(secret, token, now) {
78
+ validateSecret(secret);
79
+ if (typeof token !== 'string' || token.length < 40 || token.length > TOKEN_MAX_CHARS
80
+ || !Number.isSafeInteger(now)) {
81
+ throw new LarkToolApprovalError('invalid', 'tool approval action token is invalid');
82
+ }
83
+ const parts = token.split('.');
84
+ if (parts.length !== 2)
85
+ throw new LarkToolApprovalError('invalid', 'tool approval action token is invalid');
86
+ const supplied = Buffer.from(parts[1], 'utf8');
87
+ const expected = Buffer.from(signature(secret, parts[0]).toString('base64url'), 'utf8');
88
+ if (supplied.length !== expected.length || !timingSafeEqual(supplied, expected)) {
89
+ throw new LarkToolApprovalError('invalid', 'tool approval action signature is invalid');
90
+ }
91
+ let payload;
92
+ try {
93
+ payload = canonical(JSON.parse(Buffer.from(parts[0], 'base64url').toString('utf8')));
94
+ }
95
+ catch (error) {
96
+ if (error instanceof LarkToolApprovalError)
97
+ throw error;
98
+ throw new LarkToolApprovalError('invalid', 'tool approval action payload is invalid');
99
+ }
100
+ if (parts[0] !== Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url')) {
101
+ throw new LarkToolApprovalError('invalid', 'tool approval action payload is not canonical');
102
+ }
103
+ if (now >= payload.expiresAt)
104
+ throw new LarkToolApprovalError('expired', 'tool approval action expired');
105
+ return payload;
106
+ }
107
+ //# sourceMappingURL=tool-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-approval.js","sourceRoot":"","sources":["../src/tool-approval.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,158 @@
1
+ export interface LarkInboundConfig {
2
+ account: string;
3
+ tenant: string;
4
+ requireMentionInGroups: boolean;
5
+ maxTextBytes: number;
6
+ staleAfterMs: number;
7
+ }
8
+ export interface LarkResource {
9
+ type: 'audio' | 'file' | 'image' | 'sticker' | 'video';
10
+ fileKey: string;
11
+ fileName?: string;
12
+ durationMs?: number;
13
+ coverImageKey?: string;
14
+ }
15
+ export interface LarkMessage {
16
+ messageId: string;
17
+ chatId: string;
18
+ chatType: 'group' | 'p2p';
19
+ senderId: string;
20
+ content: string;
21
+ rawContentType: string;
22
+ resources: readonly LarkResource[];
23
+ mentionAll: boolean;
24
+ mentionedBot: boolean;
25
+ rootId?: string;
26
+ threadId?: string;
27
+ replyToMessageId?: string;
28
+ createTime: number;
29
+ raw?: unknown;
30
+ }
31
+ export interface LarkApprovalCard {
32
+ title: string;
33
+ body: string;
34
+ approveValue: {
35
+ approval: string;
36
+ };
37
+ rejectValue: {
38
+ approval: string;
39
+ };
40
+ }
41
+ export interface LarkToolApprovalCard {
42
+ title: string;
43
+ toolName: string;
44
+ reason?: string;
45
+ arguments: string;
46
+ allowValue: {
47
+ toolApproval: string;
48
+ };
49
+ rejectValue: {
50
+ toolApproval: string;
51
+ };
52
+ }
53
+ export interface LarkModelPickerCard {
54
+ title: string;
55
+ body: string;
56
+ providerOptions: readonly LarkSelectOption[];
57
+ modelOptions: readonly LarkSelectOption[];
58
+ effortOptions: readonly LarkSelectOption[];
59
+ initialProvider?: string;
60
+ initialModel?: string;
61
+ initialEffort?: string;
62
+ callbackValues: Readonly<Record<'confirm' | 'effort' | 'model' | 'provider', {
63
+ modelPicker: string;
64
+ }>>;
65
+ }
66
+ export type LarkPermissionLevel = 'ask' | 'auto' | 'full';
67
+ export interface LarkPermissionPickerCard {
68
+ title: string;
69
+ body: string;
70
+ current: LarkPermissionLevel | 'custom';
71
+ callbackValues: Readonly<Record<LarkPermissionLevel, {
72
+ permissionPicker: string;
73
+ }>>;
74
+ }
75
+ export interface LarkSelectOption {
76
+ value: string;
77
+ label: string;
78
+ }
79
+ export type LarkSendInput = {
80
+ approval: LarkApprovalCard;
81
+ } | {
82
+ markdown: string;
83
+ } | {
84
+ modelPicker: LarkModelPickerCard;
85
+ } | {
86
+ permissionPicker: LarkPermissionPickerCard;
87
+ } | {
88
+ text: string;
89
+ } | {
90
+ toolApproval: LarkToolApprovalCard;
91
+ };
92
+ export interface LarkSendOptions {
93
+ replyTo?: string;
94
+ replyInThread?: boolean;
95
+ requestKey?: string;
96
+ }
97
+ export interface LarkSendResult {
98
+ messageId: string;
99
+ chunkIds?: readonly string[];
100
+ }
101
+ export interface LarkProgressHandle {
102
+ cotId: string;
103
+ messageId: string;
104
+ }
105
+ export interface LarkProgressEvent {
106
+ eventType: string;
107
+ content: string;
108
+ timestamp: string;
109
+ }
110
+ export interface LarkInboundImage {
111
+ data: Uint8Array;
112
+ mediaType: 'image/gif' | 'image/jpeg' | 'image/png' | 'image/webp';
113
+ }
114
+ export type LarkTransportErrorCode = 'format_error' | 'not_connected' | 'permission_denied' | 'rate_limited' | 'send_timeout' | 'ssrf_blocked' | 'target_revoked' | 'unknown' | 'upload_failed';
115
+ export declare class LarkTransportError extends Error {
116
+ readonly code: LarkTransportErrorCode;
117
+ readonly retryAfterMs?: number | undefined;
118
+ constructor(code: LarkTransportErrorCode, message: string, retryAfterMs?: number | undefined);
119
+ }
120
+ export interface LarkTransportHandlers {
121
+ message(message: LarkMessage): Promise<void>;
122
+ cardAction(action: LarkCardAction): Promise<unknown>;
123
+ reconnecting(): void;
124
+ reconnected(): void;
125
+ error(error: LarkTransportError): void;
126
+ }
127
+ export interface LarkCardAction {
128
+ messageId: string;
129
+ chatId: string;
130
+ operatorId: string;
131
+ value: unknown;
132
+ tag?: string;
133
+ name?: string;
134
+ option?: string;
135
+ }
136
+ export interface LarkTransport {
137
+ subscribe(handlers: LarkTransportHandlers): () => void;
138
+ connect(): Promise<void>;
139
+ disconnect(): Promise<void>;
140
+ addReaction(messageId: string, emojiType: string): Promise<string>;
141
+ createProgress(chatId: string, options: {
142
+ replyTo: string;
143
+ hidden: boolean;
144
+ }): Promise<LarkProgressHandle>;
145
+ writeProgress(handle: LarkProgressHandle, events: readonly LarkProgressEvent[]): Promise<void>;
146
+ downloadMessageImage?(messageId: string, fileKey: string, options: {
147
+ maxBytes: number;
148
+ signal: AbortSignal;
149
+ }): Promise<LarkInboundImage>;
150
+ send(chatId: string, input: LarkSendInput, options?: LarkSendOptions): Promise<LarkSendResult>;
151
+ }
152
+ export type LarkConnectionState = 'connected' | 'connected-with-gap' | 'connecting' | 'disabled' | 'disconnected' | 'reconnecting';
153
+ export interface LarkChannelHealth {
154
+ state: LarkConnectionState;
155
+ gapGeneration: number;
156
+ lastErrorCode?: LarkTransportErrorCode;
157
+ }
158
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/lib/types.js ADDED
@@ -0,0 +1,11 @@
1
+ export class LarkTransportError extends Error {
2
+ code;
3
+ retryAfterMs;
4
+ constructor(code, message, retryAfterMs) {
5
+ super(message);
6
+ this.code = code;
7
+ this.retryAfterMs = retryAfterMs;
8
+ this.name = 'LarkTransportError';
9
+ }
10
+ }
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyHA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC;IAEA;IAHX,YACW,IAA4B,EACrC,OAAe,EACN,YAAqB;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAA;QAJL,SAAI,GAAJ,IAAI,CAAwB;QAE5B,iBAAY,GAAZ,YAAY,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare const version = "0.1.3";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAA"}
package/lib/version.js ADDED
@@ -0,0 +1,2 @@
1
+ export const version = '0.1.3';
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA"}
@@ -0,0 +1,39 @@
1
+ export interface WindowsTaskPaths {
2
+ taskName: string;
3
+ launcherPath: string;
4
+ stdoutPath: string;
5
+ stderrPath: string;
6
+ }
7
+ export interface WindowsLauncherInput {
8
+ dshHome: string;
9
+ profile: string;
10
+ profileDirectory: string;
11
+ nodePath: string;
12
+ dshPath: string;
13
+ stdoutPath: string;
14
+ stderrPath: string;
15
+ }
16
+ export interface InstalledWindowsTask extends WindowsTaskPaths {
17
+ target: string;
18
+ logCommand: string;
19
+ }
20
+ export interface WindowsTaskInstallOptions {
21
+ platform?: NodeJS.Platform;
22
+ nodePath?: string;
23
+ dshPath?: string;
24
+ path?: string;
25
+ run?: (command: string, args: readonly string[]) => {
26
+ status: number | null;
27
+ stderr: string;
28
+ };
29
+ }
30
+ export declare function windowsTaskPaths(input: {
31
+ dshHome: string;
32
+ profile: string;
33
+ }): WindowsTaskPaths;
34
+ export declare function createWindowsLauncher(input: WindowsLauncherInput): string;
35
+ export declare function installDshWindowsTask(input: {
36
+ dshHome: string;
37
+ profile: string;
38
+ }, options?: WindowsTaskInstallOptions): Promise<InstalledWindowsTask>;
39
+ //# sourceMappingURL=windows-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-task.d.ts","sourceRoot":"","sources":["../src/windows-task.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9F;AAyBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAW9F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAmBzE;AAsBD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC3C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,oBAAoB,CAAC,CA6B/B"}
@@ -0,0 +1,117 @@
1
+ import { accessSync, constants } from 'node:fs';
2
+ import { access, chmod, mkdir, open, rename } from 'node:fs/promises';
3
+ import { delimiter, dirname, isAbsolute, join, win32 } from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+ const profilePattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
6
+ function absolute(value) {
7
+ return isAbsolute(value) || win32.isAbsolute(value);
8
+ }
9
+ function cmdValue(value) {
10
+ if (value.includes('\0') || /[\r\n"]/u.test(value))
11
+ throw new Error('lark-channel setup: invalid Windows task value');
12
+ return value.replace(/%/gu, '%%');
13
+ }
14
+ function findExecutable(names, pathValue = process.env.PATH) {
15
+ for (const directory of (pathValue ?? '').split(delimiter)) {
16
+ if (directory === '' || !absolute(directory))
17
+ continue;
18
+ for (const name of names) {
19
+ const candidate = join(directory, name);
20
+ try {
21
+ accessSync(candidate, constants.X_OK);
22
+ return candidate;
23
+ }
24
+ catch { }
25
+ }
26
+ }
27
+ throw new Error(`lark-channel setup: cannot find ${names[0]} on PATH`);
28
+ }
29
+ export function windowsTaskPaths(input) {
30
+ if (!profilePattern.test(input.profile))
31
+ throw new Error('lark-channel setup: invalid profile');
32
+ if (!absolute(input.dshHome))
33
+ throw new Error('lark-channel setup: DSH_HOME must be absolute');
34
+ const serviceDirectory = join(input.dshHome, 'services');
35
+ const logsDirectory = join(input.dshHome, 'logs');
36
+ return {
37
+ taskName: `DSH profile ${input.profile}`,
38
+ launcherPath: join(serviceDirectory, `${input.profile}.cmd`),
39
+ stdoutPath: join(logsDirectory, `${input.profile}-host.log`),
40
+ stderrPath: join(logsDirectory, `${input.profile}-host.error.log`),
41
+ };
42
+ }
43
+ export function createWindowsLauncher(input) {
44
+ if (!profilePattern.test(input.profile))
45
+ throw new Error('lark-channel setup: invalid profile');
46
+ for (const value of [input.dshHome, input.profileDirectory, input.nodePath, input.dshPath,
47
+ input.stdoutPath, input.stderrPath]) {
48
+ if (!absolute(value))
49
+ throw new Error('lark-channel setup: Windows task paths must be absolute');
50
+ }
51
+ const dsh = cmdValue(input.dshPath);
52
+ const command = /\.(?:bat|cmd)$/iu.test(input.dshPath)
53
+ ? `call "${dsh}"`
54
+ : /\.exe$/iu.test(input.dshPath)
55
+ ? `"${dsh}"`
56
+ : `"${cmdValue(input.nodePath)}" "${dsh}"`;
57
+ return `@echo off\r
58
+ setlocal DisableDelayedExpansion\r
59
+ set "DSH_HOME=${cmdValue(input.dshHome)}"\r
60
+ set "NODE_OPTIONS=--disable-warning=ExperimentalWarning"\r
61
+ cd /d "${cmdValue(input.profileDirectory)}"\r
62
+ ${command} --profile "${input.profile}" --no-open >> "${cmdValue(input.stdoutPath)}" 2>> "${cmdValue(input.stderrPath)}"\r
63
+ `;
64
+ }
65
+ async function atomicWrite(path, value) {
66
+ const temporary = `${path}.tmp-${process.pid}`;
67
+ const file = await open(temporary, 'w', 0o600);
68
+ try {
69
+ await file.writeFile(value, 'utf8');
70
+ await file.sync();
71
+ }
72
+ finally {
73
+ await file.close();
74
+ }
75
+ await rename(temporary, path);
76
+ await chmod(path, 0o600);
77
+ }
78
+ function defaultRun(command, args) {
79
+ const result = spawnSync(command, [...args], {
80
+ encoding: 'utf8', stdio: ['ignore', 'ignore', 'pipe'], windowsHide: true,
81
+ });
82
+ return { status: result.status, stderr: typeof result.stderr === 'string' ? result.stderr : '' };
83
+ }
84
+ export async function installDshWindowsTask(input, options = {}) {
85
+ if ((options.platform ?? process.platform) !== 'win32') {
86
+ throw new Error('lark-channel setup: Windows task installer requires Windows');
87
+ }
88
+ const paths = windowsTaskPaths(input);
89
+ const profileDirectory = join(input.dshHome, 'profiles', input.profile);
90
+ await access(profileDirectory, constants.R_OK);
91
+ const nodePath = options.nodePath ?? findExecutable(['node.exe', 'node'], options.path);
92
+ const dshPath = options.dshPath ?? findExecutable(['dsh.cmd', 'dsh.exe', 'dsh'], options.path);
93
+ await mkdir(dirname(paths.launcherPath), { recursive: true, mode: 0o700 });
94
+ await mkdir(dirname(paths.stdoutPath), { recursive: true, mode: 0o700 });
95
+ await atomicWrite(paths.launcherPath, createWindowsLauncher({
96
+ ...paths, dshHome: input.dshHome, profile: input.profile, profileDirectory, nodePath, dshPath,
97
+ }));
98
+ const run = options.run ?? defaultRun;
99
+ const create = run('schtasks.exe', [
100
+ '/Create', '/F', '/SC', 'ONLOGON', '/TN', paths.taskName, '/TR', `cmd.exe /d /c "${paths.launcherPath}"`,
101
+ ]);
102
+ if (create.status !== 0)
103
+ throw new Error('lark-channel setup: Windows scheduled task creation failed');
104
+ run('schtasks.exe', ['/End', '/TN', paths.taskName]);
105
+ const start = run('schtasks.exe', ['/Run', '/TN', paths.taskName]);
106
+ if (start.status !== 0)
107
+ throw new Error('lark-channel setup: Windows scheduled task start failed');
108
+ const query = run('schtasks.exe', ['/Query', '/TN', paths.taskName]);
109
+ if (query.status !== 0)
110
+ throw new Error('lark-channel setup: Windows scheduled task verification failed');
111
+ return {
112
+ ...paths,
113
+ target: paths.taskName,
114
+ logCommand: `Get-Content -Wait '${paths.stderrPath.replace(/'/gu, "''")}'`,
115
+ };
116
+ }
117
+ //# sourceMappingURL=windows-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-task.js","sourceRoot":"","sources":["../src/windows-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Bridge CardKit callback frames dropped by @larksuiteoapi/node-sdk 1.73.0.
3
+ * The pinned SDK only dispatches `type=event`; Feishu may deliver
4
+ * `card.action.trigger` as `type=card`, which still requires the same ACK.
5
+ */
6
+ export declare function installLarkCardCallbackBridge(client: object): void;
7
+ //# sourceMappingURL=ws-card-callback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-card-callback.d.ts","sourceRoot":"","sources":["../src/ws-card-callback.ts"],"names":[],"mappings":"AAoCA;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAoClE"}
@@ -0,0 +1,51 @@
1
+ const installed = new WeakSet();
2
+ function headers(frame) {
3
+ return Object.fromEntries(frame.headers.map(header => [header.key, header.value]));
4
+ }
5
+ /**
6
+ * Bridge CardKit callback frames dropped by @larksuiteoapi/node-sdk 1.73.0.
7
+ * The pinned SDK only dispatches `type=event`; Feishu may deliver
8
+ * `card.action.trigger` as `type=card`, which still requires the same ACK.
9
+ */
10
+ export function installLarkCardCallbackBridge(client) {
11
+ if (installed.has(client))
12
+ return;
13
+ const ws = client;
14
+ if (typeof ws.handleEventData !== 'function' || typeof ws.sendMessage !== 'function'
15
+ || typeof ws.dataCache?.mergeData !== 'function') {
16
+ throw new Error('lark-channel: pinned Lark WS internals do not support the CardKit callback bridge');
17
+ }
18
+ const original = ws.handleEventData.bind(ws);
19
+ ws.handleEventData = async (frame) => {
20
+ const values = headers(frame);
21
+ if (values.type !== 'card')
22
+ return await original(frame);
23
+ const response = { code: 200 };
24
+ const startedAt = Date.now();
25
+ try {
26
+ const merged = ws.dataCache.mergeData({
27
+ message_id: values.message_id ?? '',
28
+ sum: Number(values.sum ?? '1'),
29
+ seq: Number(values.seq ?? '0'),
30
+ trace_id: values.trace_id ?? '',
31
+ data: frame.payload,
32
+ });
33
+ if (merged == null)
34
+ return;
35
+ const result = await ws.eventDispatcher?.invoke(merged, { needCheck: false });
36
+ if (result !== undefined && result !== null) {
37
+ response.data = Buffer.from(JSON.stringify(result), 'utf8').toString('base64');
38
+ }
39
+ }
40
+ catch {
41
+ response.code = 500;
42
+ }
43
+ ws.sendMessage({
44
+ ...frame,
45
+ headers: [...frame.headers, { key: 'biz_rt', value: String(Date.now() - startedAt) }],
46
+ payload: new TextEncoder().encode(JSON.stringify(response)),
47
+ });
48
+ };
49
+ installed.add(client);
50
+ }
51
+ //# sourceMappingURL=ws-card-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-card-callback.js","sourceRoot":"","sources":["../src/ws-card-callback.ts"],"names":[],"mappings":"AA8BA,MAAM,SAAS,GAAG,IAAI,OAAO,EAAU,CAAA;AAEvC,SAAS,OAAO,CAAC,KAAkB;IACjC,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACpF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAc;IAC1D,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAM;IACjC,MAAM,EAAE,GAAG,MAA+B,CAAA;IAC1C,IAAI,OAAO,EAAE,CAAC,eAAe,KAAK,UAAU,IAAI,OAAO,EAAE,CAAC,WAAW,KAAK,UAAU;WAC/E,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtG,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5C,EAAE,CAAC,eAAe,GAAG,KAAK,EAAC,KAAK,EAAC,EAAE;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxD,MAAM,QAAQ,GAAoC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC;gBACpC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;gBACnC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC;gBAC9B,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC;gBAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAC/B,IAAI,EAAE,KAAK,CAAC,OAAO;aACpB,CAAC,CAAA;YACF,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAM;YAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;YAC7E,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC5C,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAChF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAA;QACrB,CAAC;QACD,EAAE,CAAC,WAAW,CAAC;YACb,GAAG,KAAK;YACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;YACrF,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;SAC5D,CAAC,CAAA;IACJ,CAAC,CAAA;IACD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "@dsh-enhanced/lark-channel",
3
+ "version": "0.1.3",
4
+ "description": "A thin Feishu/Lark WebSocket adapter for the durable DSH assistant-delivery core.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./lib/index.js",
8
+ "types": "./lib/index.d.ts",
9
+ "bin": {
10
+ "dsh-lark-setup": "./bin/dsh-lark-setup.js",
11
+ "dsh-supervised-growth-setup": "./bin/dsh-supervised-growth-setup.js"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "types": "./lib/index.d.ts",
16
+ "default": "./lib/index.js"
17
+ },
18
+ "./cordis.patch.yml": "./cordis.patch.yml",
19
+ "./package.json": "./package.json"
20
+ },
21
+ "files": [
22
+ "bin",
23
+ "lib",
24
+ "cordis.patch.yml",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "engines": {
29
+ "node": "^22.19.0 || >=24.0.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/22-ai-00/dsh-enhanced.git",
37
+ "directory": "plugins/lark-channel"
38
+ },
39
+ "keywords": [
40
+ "deepseek",
41
+ "deepseek-harness",
42
+ "dsh-plugin"
43
+ ],
44
+ "dsh": {
45
+ "bundle": {
46
+ "patch": "./cordis.patch.yml"
47
+ }
48
+ },
49
+ "dependencies": {
50
+ "@deepseek-ai/schemastery": "3.18.1",
51
+ "@larksuiteoapi/node-sdk": "1.73.0",
52
+ "qrcode": "1.5.4",
53
+ "yaml": "2.9.0"
54
+ },
55
+ "peerDependencies": {
56
+ "@deepseek-ai/cordis": "^4.0.1",
57
+ "@dsh-enhanced/assistant-automations": ">=0.1.0 <0.2.0",
58
+ "@dsh-enhanced/assistant-delivery": ">=0.1.0 <0.2.0",
59
+ "@dsh-enhanced/credentials-keychain": ">=0.1.0 <0.2.0",
60
+ "@dsh-enhanced/traex-acp-provider": ">=0.1.0 <0.2.0"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "@deepseek-ai/cordis": {
64
+ "optional": true
65
+ },
66
+ "@dsh-enhanced/assistant-delivery": {
67
+ "optional": true
68
+ },
69
+ "@dsh-enhanced/assistant-automations": {
70
+ "optional": true
71
+ },
72
+ "@dsh-enhanced/credentials-keychain": {
73
+ "optional": true
74
+ },
75
+ "@dsh-enhanced/traex-acp-provider": {
76
+ "optional": true
77
+ }
78
+ },
79
+ "devDependencies": {
80
+ "@deepseek-ai/cordis": "4.0.1",
81
+ "@types/node": "22.20.0",
82
+ "@types/qrcode": "1.5.6",
83
+ "typescript": "6.0.3",
84
+ "vitest": "4.1.8",
85
+ "@dsh-enhanced/assistant-delivery": "0.1.3",
86
+ "@dsh-enhanced/assistant-automations": "0.1.3",
87
+ "@dsh-enhanced/credentials-keychain": "0.1.3",
88
+ "@dsh-enhanced/traex-acp-provider": "0.1.3"
89
+ },
90
+ "scripts": {
91
+ "build": "tsc -p tsconfig.build.json",
92
+ "onboard": "node ./lib/setup.js",
93
+ "test": "vitest run",
94
+ "typecheck": "tsc -p tsconfig.json --noEmit"
95
+ }
96
+ }