@rynx-ai/plugin-channel-lark 0.1.9
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/cli-mirror/mirror-index.d.ts +46 -0
- package/dist/cli-mirror/mirror-index.js +48 -0
- package/dist/cli-mirror/rollout-mirror.d.ts +85 -0
- package/dist/cli-mirror/rollout-mirror.js +333 -0
- package/dist/cli-mirror/rollout-watcher.d.ts +109 -0
- package/dist/cli-mirror/rollout-watcher.js +347 -0
- package/dist/host-adapters.d.ts +82 -0
- package/dist/host-adapters.js +404 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/lark-card-stream.d.ts +363 -0
- package/dist/lark-card-stream.js +1335 -0
- package/dist/lark-content.d.ts +30 -0
- package/dist/lark-content.js +138 -0
- package/dist/lark-conversation-directory.d.ts +65 -0
- package/dist/lark-conversation-directory.js +106 -0
- package/dist/lark-diff-card.d.ts +25 -0
- package/dist/lark-diff-card.js +58 -0
- package/dist/lark-fork-transcript.d.ts +16 -0
- package/dist/lark-fork-transcript.js +141 -0
- package/dist/lark-resume-card.d.ts +31 -0
- package/dist/lark-resume-card.js +105 -0
- package/dist/lark-sdk/client.d.ts +8 -0
- package/dist/lark-sdk/client.js +32 -0
- package/dist/lark-sdk/index.d.ts +1 -0
- package/dist/lark-sdk/index.js +1 -0
- package/dist/lark-sender.d.ts +114 -0
- package/dist/lark-sender.js +323 -0
- package/dist/lark-session-store.d.ts +13 -0
- package/dist/lark-session-store.js +14 -0
- package/dist/lark-settings-card.d.ts +55 -0
- package/dist/lark-settings-card.js +158 -0
- package/dist/lark-setup.d.ts +17 -0
- package/dist/lark-setup.js +86 -0
- package/dist/lark.d.ts +500 -0
- package/dist/lark.js +2010 -0
- package/dist/runtime.d.ts +16 -0
- package/dist/runtime.js +157 -0
- package/dist/runtime.mjs +130863 -0
- package/package.json +35 -0
- package/rynx-plugin.json +42 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { AgentRuntimeError, } from "@rynx-ai/core";
|
|
4
|
+
import { FileLarkActiveSessionStore, } from "./lark-session-store.js";
|
|
5
|
+
/** Slow consumers fail the run instead of retaining an unbounded event stream. */
|
|
6
|
+
export const LARK_RUN_EVENT_QUEUE_MAX_ITEMS = 256;
|
|
7
|
+
export const LARK_RUN_EVENT_QUEUE_MAX_BYTES = 8 * 1024 * 1024;
|
|
8
|
+
/**
|
|
9
|
+
* ConversationRuntime-shaped adapter backed exclusively by capability-checked
|
|
10
|
+
* Host RPC. The plugin never receives the daemon's runtime, abort controller,
|
|
11
|
+
* steer controller, or session bus.
|
|
12
|
+
*/
|
|
13
|
+
export class HostConversationRuntime {
|
|
14
|
+
host;
|
|
15
|
+
constructor(host) {
|
|
16
|
+
this.host = host;
|
|
17
|
+
}
|
|
18
|
+
async runLive(input) {
|
|
19
|
+
if (!input.threadId) {
|
|
20
|
+
throw new AgentRuntimeError("a daemon-provisioned session id is required", 400, "session_required");
|
|
21
|
+
}
|
|
22
|
+
if (input.signal?.aborted) {
|
|
23
|
+
throw new AgentRuntimeError("conversation run was cancelled", 499, "codex_cancelled");
|
|
24
|
+
}
|
|
25
|
+
const queue = new AsyncEventQueue({
|
|
26
|
+
maxItems: LARK_RUN_EVENT_QUEUE_MAX_ITEMS,
|
|
27
|
+
maxBytes: LARK_RUN_EVENT_QUEUE_MAX_BYTES,
|
|
28
|
+
sizeOf: jsonByteLength,
|
|
29
|
+
overflowError: runEventQueueOverflowError,
|
|
30
|
+
});
|
|
31
|
+
let runId;
|
|
32
|
+
let terminal = false;
|
|
33
|
+
const earlyEvents = [];
|
|
34
|
+
let earlyEventBytes = 0;
|
|
35
|
+
let earlyOverflow = false;
|
|
36
|
+
let unsubscribeEvents = () => { };
|
|
37
|
+
const interrupt = () => {
|
|
38
|
+
if (!runId || terminal)
|
|
39
|
+
return;
|
|
40
|
+
void this.host.call("session.interrupt", { runId }).catch(() => undefined);
|
|
41
|
+
};
|
|
42
|
+
const accept = (event, payload) => {
|
|
43
|
+
if (!runId) {
|
|
44
|
+
if (earlyOverflow)
|
|
45
|
+
return;
|
|
46
|
+
const bytes = jsonByteLength({ event, payload });
|
|
47
|
+
if (earlyEvents.length >= LARK_RUN_EVENT_QUEUE_MAX_ITEMS
|
|
48
|
+
|| bytes > LARK_RUN_EVENT_QUEUE_MAX_BYTES - earlyEventBytes) {
|
|
49
|
+
earlyOverflow = true;
|
|
50
|
+
earlyEvents.length = 0;
|
|
51
|
+
earlyEventBytes = 0;
|
|
52
|
+
unsubscribeEvents();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
earlyEvents.push({ event, payload });
|
|
56
|
+
earlyEventBytes += bytes;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (event === "session.run.event") {
|
|
60
|
+
const value = runEventPayload(payload);
|
|
61
|
+
if (value?.runId === runId && queue.push(value.event) === "overflow") {
|
|
62
|
+
interrupt();
|
|
63
|
+
terminal = true;
|
|
64
|
+
unsubscribeEvents();
|
|
65
|
+
}
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (event === "session.run.completed") {
|
|
69
|
+
const value = runTerminalPayload(payload);
|
|
70
|
+
if (value?.runId === runId) {
|
|
71
|
+
terminal = true;
|
|
72
|
+
queue.end();
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (event === "session.run.failed") {
|
|
77
|
+
const value = runTerminalPayload(payload);
|
|
78
|
+
if (value?.runId === runId) {
|
|
79
|
+
terminal = true;
|
|
80
|
+
queue.fail(hostRunError(value));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
unsubscribeEvents = this.host.events.subscribe(({ event, payload }) => accept(event, payload));
|
|
85
|
+
if (earlyOverflow)
|
|
86
|
+
unsubscribeEvents();
|
|
87
|
+
let started;
|
|
88
|
+
try {
|
|
89
|
+
started = await this.host.call("session.run", {
|
|
90
|
+
sessionId: input.threadId,
|
|
91
|
+
message: input.message,
|
|
92
|
+
...(input.provider ? { provider: input.provider } : {}),
|
|
93
|
+
...(input.model ? { model: input.model } : {}),
|
|
94
|
+
...(input.reasoningEffort ? { reasoningEffort: input.reasoningEffort } : {}),
|
|
95
|
+
...(input.cwd ? { cwd: input.cwd } : {}),
|
|
96
|
+
...(input.agentName ? { agent: input.agentName } : {}),
|
|
97
|
+
...(input.developerInstructions
|
|
98
|
+
? { developerInstructions: input.developerInstructions }
|
|
99
|
+
: {}),
|
|
100
|
+
});
|
|
101
|
+
runId = started.runId;
|
|
102
|
+
if (earlyOverflow) {
|
|
103
|
+
queue.fail(runEventQueueOverflowError(), true);
|
|
104
|
+
interrupt();
|
|
105
|
+
terminal = true;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
for (const early of earlyEvents.splice(0))
|
|
109
|
+
accept(early.event, early.payload);
|
|
110
|
+
earlyEventBytes = 0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
unsubscribeEvents();
|
|
115
|
+
throw toAgentRuntimeError(error);
|
|
116
|
+
}
|
|
117
|
+
const unsteer = input.steer?.subscribe((text) => {
|
|
118
|
+
if (!runId || terminal)
|
|
119
|
+
return;
|
|
120
|
+
void this.host.call("session.steer", { runId, text }).catch(() => undefined);
|
|
121
|
+
});
|
|
122
|
+
input.signal?.addEventListener("abort", interrupt, { once: true });
|
|
123
|
+
const generator = (async function* () {
|
|
124
|
+
try {
|
|
125
|
+
for await (const event of queue)
|
|
126
|
+
yield event;
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
if (!terminal)
|
|
130
|
+
interrupt();
|
|
131
|
+
input.signal?.removeEventListener("abort", interrupt);
|
|
132
|
+
unsteer?.();
|
|
133
|
+
unsubscribeEvents();
|
|
134
|
+
}
|
|
135
|
+
})();
|
|
136
|
+
return {
|
|
137
|
+
provider: started.provider,
|
|
138
|
+
threadId: started.sessionId,
|
|
139
|
+
model: started.model,
|
|
140
|
+
authSource: started.authSource,
|
|
141
|
+
generator,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Agent command adapter used by /models, /goal, and /fork. */
|
|
146
|
+
export class HostAgentCapabilities {
|
|
147
|
+
host;
|
|
148
|
+
constructor(host) {
|
|
149
|
+
this.host = host;
|
|
150
|
+
}
|
|
151
|
+
listModels(runtime) {
|
|
152
|
+
return this.host.call("session.models", runtime ? { runtime } : {});
|
|
153
|
+
}
|
|
154
|
+
getGoal(sessionId) {
|
|
155
|
+
return this.host.call("session.goal.get", { sessionId });
|
|
156
|
+
}
|
|
157
|
+
setGoal(sessionId, objective) {
|
|
158
|
+
return this.host.call("session.goal.set", { sessionId, objective });
|
|
159
|
+
}
|
|
160
|
+
clearGoal(sessionId) {
|
|
161
|
+
return this.host.call("session.goal.clear", { sessionId });
|
|
162
|
+
}
|
|
163
|
+
forkSession(fromSessionId, toSessionId) {
|
|
164
|
+
return this.host.call("session.fork", { fromSessionId, toSessionId });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** Narrow agent catalog + first-turn execution resolver backed by Host RPC. */
|
|
168
|
+
export class HostAgentCatalog {
|
|
169
|
+
host;
|
|
170
|
+
constructor(host) {
|
|
171
|
+
this.host = host;
|
|
172
|
+
}
|
|
173
|
+
list() {
|
|
174
|
+
return this.host.call("agent.catalog.list", {});
|
|
175
|
+
}
|
|
176
|
+
get(id) {
|
|
177
|
+
return this.host.call("agent.catalog.get", { id });
|
|
178
|
+
}
|
|
179
|
+
resolveExecution(input) {
|
|
180
|
+
return this.host.call("agent.execution.resolve", input);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** Daemon-owned session allocator. operationId must identify one allocation attempt durably. */
|
|
184
|
+
export class HostSessionProvisioner {
|
|
185
|
+
host;
|
|
186
|
+
instanceId;
|
|
187
|
+
constructor(host, instanceId) {
|
|
188
|
+
this.host = host;
|
|
189
|
+
this.instanceId = instanceId;
|
|
190
|
+
}
|
|
191
|
+
async provision(operationId) {
|
|
192
|
+
const result = await this.host.call("session.ensure", {
|
|
193
|
+
scopeId: this.instanceId,
|
|
194
|
+
operationId,
|
|
195
|
+
session: {},
|
|
196
|
+
});
|
|
197
|
+
if (!result?.sessionId)
|
|
198
|
+
throw new Error("host did not return a provisioned session id");
|
|
199
|
+
return result.sessionId;
|
|
200
|
+
}
|
|
201
|
+
allocationOperationId(sessionKey, previousSessionId) {
|
|
202
|
+
return stableOperationId("allocate", this.instanceId, sessionKey, previousSessionId ?? "initial");
|
|
203
|
+
}
|
|
204
|
+
forkOperationId(fromSessionId, newSessionKey) {
|
|
205
|
+
return stableOperationId("fork", this.instanceId, fromSessionId, newSessionKey);
|
|
206
|
+
}
|
|
207
|
+
async setTitle(sessionId, title) {
|
|
208
|
+
await this.host.call("session.meta.setTitle", { sessionId, title });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* File-backed Lark routing state whose every newly allocated machine session is
|
|
213
|
+
* minted by the daemon. Allocation operation ids are derived from the previous
|
|
214
|
+
* committed routing record, so a child crash between RPC and file commit replays
|
|
215
|
+
* the same host operation instead of creating a duplicate session.
|
|
216
|
+
*/
|
|
217
|
+
export class HostProvisionedLarkSessionStore extends FileLarkActiveSessionStore {
|
|
218
|
+
operation;
|
|
219
|
+
mutationTail = Promise.resolve();
|
|
220
|
+
constructor(options) {
|
|
221
|
+
const operation = new AsyncLocalStorage();
|
|
222
|
+
super({
|
|
223
|
+
filePath: options.filePath,
|
|
224
|
+
defaultAgent: options.defaultAgent,
|
|
225
|
+
now: options.now,
|
|
226
|
+
createSessionId: async () => {
|
|
227
|
+
const operationId = operation.getStore();
|
|
228
|
+
if (!operationId)
|
|
229
|
+
throw new Error("session allocation is missing its stable operation id");
|
|
230
|
+
return options.provisioner.provision(operationId);
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
this.operation = operation;
|
|
234
|
+
this.provisioner = options.provisioner;
|
|
235
|
+
}
|
|
236
|
+
provisioner;
|
|
237
|
+
async ensure(sessionKey) {
|
|
238
|
+
return this.runMutation(async () => {
|
|
239
|
+
const current = await super.get(sessionKey);
|
|
240
|
+
if (current)
|
|
241
|
+
return { ...current, source: "existing" };
|
|
242
|
+
return this.withAllocation(sessionKey, undefined, () => super.ensure(sessionKey));
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
async set(sessionKey, sessionId, cwd) {
|
|
246
|
+
return this.runMutation(() => super.set(sessionKey, sessionId, cwd));
|
|
247
|
+
}
|
|
248
|
+
async rotate(sessionKey) {
|
|
249
|
+
return this.runMutation(async () => {
|
|
250
|
+
const current = await super.get(sessionKey);
|
|
251
|
+
return this.withAllocation(sessionKey, current?.sessionId, () => super.rotate(sessionKey));
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async bindCwd(sessionKey, cwd) {
|
|
255
|
+
return this.runMutation(async () => {
|
|
256
|
+
const current = await super.get(sessionKey);
|
|
257
|
+
return this.withAllocation(sessionKey, current?.sessionId, () => super.bindCwd(sessionKey, cwd));
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
async applySettings(sessionKey, settings) {
|
|
261
|
+
return this.runMutation(async () => {
|
|
262
|
+
if (!settings.rotate && (await super.get(sessionKey))) {
|
|
263
|
+
return super.applySettings(sessionKey, settings);
|
|
264
|
+
}
|
|
265
|
+
const current = await super.get(sessionKey);
|
|
266
|
+
return this.withAllocation(sessionKey, current?.sessionId, () => super.applySettings(sessionKey, settings));
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
async setAgent(sessionKey, agentName) {
|
|
270
|
+
return this.runMutation(async () => {
|
|
271
|
+
const current = await super.get(sessionKey);
|
|
272
|
+
return this.withAllocation(sessionKey, current?.sessionId, () => super.setAgent(sessionKey, agentName));
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
async freeze(sessionKey, execution) {
|
|
276
|
+
return this.runMutation(async () => {
|
|
277
|
+
const current = await super.get(sessionKey);
|
|
278
|
+
if (current)
|
|
279
|
+
return super.freeze(sessionKey, execution);
|
|
280
|
+
return this.withAllocation(sessionKey, undefined, () => super.freeze(sessionKey, execution));
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
withAllocation(sessionKey, previousSessionId, run) {
|
|
284
|
+
return this.operation.run(this.provisioner.allocationOperationId(sessionKey, previousSessionId), run);
|
|
285
|
+
}
|
|
286
|
+
async runMutation(run) {
|
|
287
|
+
const previous = this.mutationTail;
|
|
288
|
+
let release;
|
|
289
|
+
this.mutationTail = new Promise((resolve) => {
|
|
290
|
+
release = resolve;
|
|
291
|
+
});
|
|
292
|
+
await previous.catch(() => undefined);
|
|
293
|
+
try {
|
|
294
|
+
return await run();
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
297
|
+
release();
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
export function stableOperationId(kind, ...parts) {
|
|
302
|
+
const digest = createHash("sha256").update(parts.join("\0")).digest("hex");
|
|
303
|
+
return `${kind}-${digest}`;
|
|
304
|
+
}
|
|
305
|
+
class AsyncEventQueue {
|
|
306
|
+
options;
|
|
307
|
+
values = [];
|
|
308
|
+
waiters = [];
|
|
309
|
+
bufferedBytes = 0;
|
|
310
|
+
ended = false;
|
|
311
|
+
failure;
|
|
312
|
+
constructor(options) {
|
|
313
|
+
this.options = options;
|
|
314
|
+
}
|
|
315
|
+
push(value) {
|
|
316
|
+
if (this.ended || this.failure)
|
|
317
|
+
return "closed";
|
|
318
|
+
const waiter = this.waiters.shift();
|
|
319
|
+
if (waiter) {
|
|
320
|
+
waiter.resolve({ value, done: false });
|
|
321
|
+
return "accepted";
|
|
322
|
+
}
|
|
323
|
+
const bytes = this.options.sizeOf(value);
|
|
324
|
+
if (this.values.length >= this.options.maxItems
|
|
325
|
+
|| !Number.isSafeInteger(bytes)
|
|
326
|
+
|| bytes < 0
|
|
327
|
+
|| bytes > this.options.maxBytes - this.bufferedBytes) {
|
|
328
|
+
this.fail(this.options.overflowError(), true);
|
|
329
|
+
return "overflow";
|
|
330
|
+
}
|
|
331
|
+
this.values.push({ value, bytes });
|
|
332
|
+
this.bufferedBytes += bytes;
|
|
333
|
+
return "accepted";
|
|
334
|
+
}
|
|
335
|
+
end() {
|
|
336
|
+
if (this.ended || this.failure)
|
|
337
|
+
return;
|
|
338
|
+
this.ended = true;
|
|
339
|
+
for (const waiter of this.waiters.splice(0))
|
|
340
|
+
waiter.resolve({ value: undefined, done: true });
|
|
341
|
+
}
|
|
342
|
+
fail(error, discardBuffered = false) {
|
|
343
|
+
if (this.ended || this.failure)
|
|
344
|
+
return;
|
|
345
|
+
this.failure = error;
|
|
346
|
+
if (discardBuffered) {
|
|
347
|
+
this.values.length = 0;
|
|
348
|
+
this.bufferedBytes = 0;
|
|
349
|
+
}
|
|
350
|
+
for (const waiter of this.waiters.splice(0))
|
|
351
|
+
waiter.reject(error);
|
|
352
|
+
}
|
|
353
|
+
[Symbol.asyncIterator]() {
|
|
354
|
+
return {
|
|
355
|
+
next: () => {
|
|
356
|
+
const entry = this.values.shift();
|
|
357
|
+
if (entry) {
|
|
358
|
+
this.bufferedBytes -= entry.bytes;
|
|
359
|
+
return Promise.resolve({ value: entry.value, done: false });
|
|
360
|
+
}
|
|
361
|
+
if (this.failure)
|
|
362
|
+
return Promise.reject(this.failure);
|
|
363
|
+
if (this.ended)
|
|
364
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
365
|
+
return new Promise((resolve, reject) => this.waiters.push({ resolve, reject }));
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
function jsonByteLength(value) {
|
|
371
|
+
try {
|
|
372
|
+
const encoded = JSON.stringify(value);
|
|
373
|
+
return encoded === undefined ? 0 : Buffer.byteLength(encoded, "utf8");
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return Number.POSITIVE_INFINITY;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
function runEventQueueOverflowError() {
|
|
380
|
+
return new AgentRuntimeError(`host run event queue exceeded ${LARK_RUN_EVENT_QUEUE_MAX_ITEMS} items or ${LARK_RUN_EVENT_QUEUE_MAX_BYTES} bytes; the run was interrupted`, 503, "plugin_event_queue_overflow");
|
|
381
|
+
}
|
|
382
|
+
function runEventPayload(value) {
|
|
383
|
+
if (!isRecord(value) || typeof value.runId !== "string" || !isRecord(value.event))
|
|
384
|
+
return undefined;
|
|
385
|
+
return value;
|
|
386
|
+
}
|
|
387
|
+
function runTerminalPayload(value) {
|
|
388
|
+
if (!isRecord(value) || typeof value.runId !== "string")
|
|
389
|
+
return undefined;
|
|
390
|
+
return value;
|
|
391
|
+
}
|
|
392
|
+
function hostRunError(payload) {
|
|
393
|
+
const code = payload.error?.code || "plugin_host_run_failed";
|
|
394
|
+
return new AgentRuntimeError(payload.error?.message || "host conversation run failed", code === "codex_cancelled" ? 499 : 500, code);
|
|
395
|
+
}
|
|
396
|
+
function toAgentRuntimeError(error) {
|
|
397
|
+
if (error instanceof AgentRuntimeError)
|
|
398
|
+
return error;
|
|
399
|
+
const code = isRecord(error) && typeof error.code === "string" ? error.code : "plugin_host_call_failed";
|
|
400
|
+
return new AgentRuntimeError(error instanceof Error ? error.message : String(error), 500, code);
|
|
401
|
+
}
|
|
402
|
+
function isRecord(value) {
|
|
403
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
404
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Public Lark plugin API. The manifest executable is the self-contained
|
|
2
|
+
* `dist/runtime.mjs`, loaded only by @rynx-ai/plugin-runner; this module exports
|
|
3
|
+
* no legacy in-process `RynxPlugin` manifest or daemon Channel factory. */
|
|
4
|
+
export { LocalLarkBotRuntime } from "./lark.js";
|
|
5
|
+
export { authorizeLark, larkConfigSchema, LARK_BOT_SCOPES, LARK_BOT_EVENTS, } from "./lark-setup.js";
|
|
6
|
+
export { activate, createLarkPluginRuntime, LARK_CHANNEL_ID, type LarkPluginRuntimeOptions, } from "./runtime.js";
|
|
7
|
+
export { HostAgentCapabilities, HostAgentCatalog, HostConversationRuntime, HostProvisionedLarkSessionStore, HostSessionProvisioner, stableOperationId, } from "./host-adapters.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Public Lark plugin API. The manifest executable is the self-contained
|
|
2
|
+
* `dist/runtime.mjs`, loaded only by @rynx-ai/plugin-runner; this module exports
|
|
3
|
+
* no legacy in-process `RynxPlugin` manifest or daemon Channel factory. */
|
|
4
|
+
export { LocalLarkBotRuntime } from "./lark.js";
|
|
5
|
+
export { authorizeLark, larkConfigSchema, LARK_BOT_SCOPES, LARK_BOT_EVENTS, } from "./lark-setup.js";
|
|
6
|
+
export { activate, createLarkPluginRuntime, LARK_CHANNEL_ID, } from "./runtime.js";
|
|
7
|
+
export { HostAgentCapabilities, HostAgentCatalog, HostConversationRuntime, HostProvisionedLarkSessionStore, HostSessionProvisioner, stableOperationId, } from "./host-adapters.js";
|