@lyriel/openclaw-plugin 0.1.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 +242 -0
- package/dist/api.js +155 -0
- package/dist/api.js.map +1 -0
- package/dist/inbox.js +130 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/pending.js +106 -0
- package/dist/pending.js.map +1 -0
- package/dist/primer.js +27 -0
- package/dist/primer.js.map +1 -0
- package/dist/surfacing.js +95 -0
- package/dist/surfacing.js.map +1 -0
- package/dist/telegram.js +63 -0
- package/dist/telegram.js.map +1 -0
- package/dist/tools.js +368 -0
- package/dist/tools.js.map +1 -0
- package/openclaw.plugin.json +59 -0
- package/package.json +66 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
// Five LLM tools the Lyriel plugin exposes to the OpenClaw agent.
|
|
2
|
+
//
|
|
3
|
+
// lyriel_send_ask(to, prompt) — initiate a 1:1 ask
|
|
4
|
+
// lyriel_reply(ask_id, response) — reply to a pending inbound ask
|
|
5
|
+
// lyriel_plan_send(participants, ...) — start a group plan
|
|
6
|
+
// lyriel_plan_reply(plan_id, content) — contribute to an ongoing plan
|
|
7
|
+
// lyriel_plan_lock(plan_id, summary) — initiator locks the outcome
|
|
8
|
+
//
|
|
9
|
+
// Schemas use typebox (OpenClaw's standard). Handlers return JSON in the
|
|
10
|
+
// content[] shape OpenClaw tools use. Errors are returned as
|
|
11
|
+
// {"error": "..."} rather than thrown — the runtime surfaces the JSON back
|
|
12
|
+
// to the LLM, which then explains the failure to the user.
|
|
13
|
+
import { Type } from "typebox";
|
|
14
|
+
import * as api from "./api.js";
|
|
15
|
+
import * as pending from "./pending.js";
|
|
16
|
+
import { SUBSTRATE_PRIMER } from "./primer.js";
|
|
17
|
+
// Synchronous-completion absorption window. See clients/hermes-plugin/tools.py
|
|
18
|
+
// for the long-form reasoning. Short summary: when the ask is to an in-process
|
|
19
|
+
// system agent (today: @lyriel), the response is written to the ask row before
|
|
20
|
+
// POST /api/asks returns. Brief poll on GET /api/asks/:id afterwards so the
|
|
21
|
+
// response shows up inline in the LLM's tool result, and mark the ask
|
|
22
|
+
// "absorbed" so the inbox poll skips the duplicate forward.
|
|
23
|
+
const ABSORB_WINDOW_MS = 2_500;
|
|
24
|
+
const ABSORB_POLL_INTERVAL_MS = 250;
|
|
25
|
+
function asText(payload) {
|
|
26
|
+
return {
|
|
27
|
+
content: [
|
|
28
|
+
{
|
|
29
|
+
type: "text",
|
|
30
|
+
text: JSON.stringify(payload),
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
details: payload,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export const sendAskSchema = Type.Object({
|
|
37
|
+
to: Type.String({
|
|
38
|
+
description: "Recipient's Lyriel handle, with or without leading @. Examples: 'noor', '@charlie', 'lyriel' (for the system welcome agent).",
|
|
39
|
+
}),
|
|
40
|
+
prompt: Type.String({
|
|
41
|
+
description: "The message body to send. Plain text. The recipient's agent will surface this to their human.",
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
export const replySchema = Type.Object({
|
|
45
|
+
ask_id: Type.String({
|
|
46
|
+
description: "The UUID of the pending ask to reply to.",
|
|
47
|
+
}),
|
|
48
|
+
response: Type.String({
|
|
49
|
+
description: "The user's reply, paraphrased or verbatim.",
|
|
50
|
+
}),
|
|
51
|
+
});
|
|
52
|
+
export const planSendSchema = Type.Object({
|
|
53
|
+
participants: Type.Array(Type.String(), {
|
|
54
|
+
description: "Lyriel handles of the OTHER participants (not the user themselves). With or without leading @. Examples: ['noor', '@maya'].",
|
|
55
|
+
}),
|
|
56
|
+
description: Type.String({
|
|
57
|
+
description: "Free-form description of what the group is coordinating. Include constraints the user already knows. Be specific — every participant's agent reads this verbatim.",
|
|
58
|
+
}),
|
|
59
|
+
max_messages: Type.Optional(Type.Integer({
|
|
60
|
+
description: "Optional cap on conversation length (default 20). Auto-fails if exceeded.",
|
|
61
|
+
})),
|
|
62
|
+
});
|
|
63
|
+
export const planReplySchema = Type.Object({
|
|
64
|
+
plan_id: Type.String({
|
|
65
|
+
description: "The plan_id shown in the surface message.",
|
|
66
|
+
}),
|
|
67
|
+
content: Type.String({
|
|
68
|
+
description: "The user's contribution to the plan conversation. Speak as the user's agent representing them. Pass empty string if stay_silent=true.",
|
|
69
|
+
}),
|
|
70
|
+
stay_silent: Type.Optional(Type.Boolean({
|
|
71
|
+
description: "Set to true to opt out of this round without contributing. Default false.",
|
|
72
|
+
})),
|
|
73
|
+
});
|
|
74
|
+
export const planLockSchema = Type.Object({
|
|
75
|
+
plan_id: Type.String({
|
|
76
|
+
description: "The plan_id to lock.",
|
|
77
|
+
}),
|
|
78
|
+
summary: Type.String({
|
|
79
|
+
description: "Short, human-readable description of the locked outcome (e.g. 'Thursday 7pm at Mission Cantina'). Broadcast to every participant.",
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
// All five tools share the same client config — passed in at registration.
|
|
83
|
+
export function makeHandlers(client) {
|
|
84
|
+
async function absorbIfQuick(askId) {
|
|
85
|
+
const deadline = Date.now() + ABSORB_WINDOW_MS;
|
|
86
|
+
while (Date.now() < deadline) {
|
|
87
|
+
try {
|
|
88
|
+
const data = await api.getAsk(client, askId);
|
|
89
|
+
if (data.status === "completed") {
|
|
90
|
+
return typeof data.response === "string" && data.response ? data.response : null;
|
|
91
|
+
}
|
|
92
|
+
if (data.status === "failed") {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
await new Promise((r) => setTimeout(r, ABSORB_POLL_INTERVAL_MS));
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
async function handleSendAsk(params) {
|
|
104
|
+
const to = (params.to ?? "").trim();
|
|
105
|
+
const prompt = (params.prompt ?? "").trim();
|
|
106
|
+
if (!to || !prompt) {
|
|
107
|
+
return asText({ error: "Both 'to' and 'prompt' are required" });
|
|
108
|
+
}
|
|
109
|
+
let result;
|
|
110
|
+
try {
|
|
111
|
+
result = await api.sendAsk(client, to, prompt);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const e = err;
|
|
115
|
+
return asText({ error: e.message, status: e.status });
|
|
116
|
+
}
|
|
117
|
+
const askId = result.ask_id ?? "?";
|
|
118
|
+
const absorbed = await absorbIfQuick(askId);
|
|
119
|
+
if (absorbed !== null) {
|
|
120
|
+
pending.markAbsorbed(askId);
|
|
121
|
+
return asText({
|
|
122
|
+
success: true,
|
|
123
|
+
ask_id: askId,
|
|
124
|
+
recipient: result.recipient ?? to,
|
|
125
|
+
status: "completed",
|
|
126
|
+
completed_inline: true,
|
|
127
|
+
response: absorbed,
|
|
128
|
+
note: `${to} responded instantly (in-process system agent). The response is inlined below. ` +
|
|
129
|
+
`Summarize or paraphrase it to the user — do NOT wait for a separate Lyriel reply.`,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return asText({
|
|
133
|
+
success: true,
|
|
134
|
+
ask_id: askId,
|
|
135
|
+
recipient: result.recipient ?? to,
|
|
136
|
+
status: result.status ?? "dispatched",
|
|
137
|
+
note: `Ask dispatched to ${to}. The recipient's reply will arrive in this chat as a ` +
|
|
138
|
+
`🪶 Lyriel reply (ask_id ${askId}) when their agent responds. Acknowledge briefly — ` +
|
|
139
|
+
`do NOT promise or paraphrase the reply yourself; the surfacing layer delivers it.`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
async function handleReply(params) {
|
|
143
|
+
const askId = (params.ask_id ?? "").trim();
|
|
144
|
+
const response = (params.response ?? "").trim();
|
|
145
|
+
if (!askId || !response) {
|
|
146
|
+
return asText({ error: "Both 'ask_id' and 'response' are required" });
|
|
147
|
+
}
|
|
148
|
+
const entry = pending.takeAsk(askId);
|
|
149
|
+
if (!entry) {
|
|
150
|
+
const snapshot = pending.listPendingAsks();
|
|
151
|
+
const ids = Object.keys(snapshot);
|
|
152
|
+
if (ids.length === 0) {
|
|
153
|
+
return asText({
|
|
154
|
+
error: `No pending Lyriel asks. ask_id=${askId} either already had a reply sent OR ` +
|
|
155
|
+
`was never received (check the chat for a surface message).`,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return asText({
|
|
159
|
+
error: `No pending ask with id ${askId}. Currently pending: ${JSON.stringify(ids)}`,
|
|
160
|
+
pending_ids: ids,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const result = await api.sendCallback(entry.callbackUrl, entry.callbackToken, response);
|
|
165
|
+
return asText({
|
|
166
|
+
success: true,
|
|
167
|
+
ask_id: askId,
|
|
168
|
+
callback_status: result.status ?? "ok",
|
|
169
|
+
idempotent: result.idempotent ?? false,
|
|
170
|
+
note: "Reply sent through Lyriel.",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
pending.restoreAsk(askId, entry);
|
|
175
|
+
const e = err;
|
|
176
|
+
return asText({ error: e.message, status: e.status, retryable: true });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function handlePlanSend(params) {
|
|
180
|
+
const participants = Array.isArray(params.participants) ? params.participants : [];
|
|
181
|
+
const description = (params.description ?? "").trim();
|
|
182
|
+
if (participants.length === 0 || !description) {
|
|
183
|
+
return asText({ error: "Both 'participants' and 'description' are required" });
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const result = await api.sendPlan(client, participants, description, params.max_messages);
|
|
187
|
+
return asText({
|
|
188
|
+
success: true,
|
|
189
|
+
plan_id: result.plan_id ?? "?",
|
|
190
|
+
participants: result.participants ?? [],
|
|
191
|
+
status: result.status ?? "open",
|
|
192
|
+
note: `Group plan ${result.plan_id} broadcast to participants. Their agents will negotiate. ` +
|
|
193
|
+
`Refinement updates and the final locked outcome will arrive in this chat as 🪶 Lyriel ` +
|
|
194
|
+
`plan updates. When the user wants to lock with a final decision, use lyriel_plan_lock.`,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
const e = err;
|
|
199
|
+
return asText({ error: e.message, status: e.status });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async function handlePlanReply(params) {
|
|
203
|
+
const planId = (params.plan_id ?? "").trim();
|
|
204
|
+
const content = (params.content ?? "").trim();
|
|
205
|
+
const staySilent = Boolean(params.stay_silent);
|
|
206
|
+
if (!planId) {
|
|
207
|
+
return asText({ error: "'plan_id' is required" });
|
|
208
|
+
}
|
|
209
|
+
if (!staySilent && !content) {
|
|
210
|
+
return asText({ error: "'content' is required unless stay_silent=true" });
|
|
211
|
+
}
|
|
212
|
+
const entry = pending.takePlan(planId);
|
|
213
|
+
if (!entry) {
|
|
214
|
+
const snapshot = pending.listPendingPlans();
|
|
215
|
+
const ids = Object.keys(snapshot);
|
|
216
|
+
if (ids.length === 0) {
|
|
217
|
+
return asText({
|
|
218
|
+
error: `No pending plan callbacks. plan_id=${planId} either already had a contribution ` +
|
|
219
|
+
`this round, OR the plan locked, OR the envelope wasn't received.`,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return asText({
|
|
223
|
+
error: `No pending callback for plan ${planId}. Currently pending plans: ${JSON.stringify(ids)}`,
|
|
224
|
+
pending_plan_ids: ids,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
await api.sendPlanCallback(entry.callbackUrl, entry.callbackToken, content, staySilent);
|
|
229
|
+
return asText({
|
|
230
|
+
success: true,
|
|
231
|
+
plan_id: planId,
|
|
232
|
+
silent: staySilent,
|
|
233
|
+
note: "Contribution sent. The other participants' agents will now consider it in their " +
|
|
234
|
+
"next response. Further refinement rounds and the locked outcome will arrive as " +
|
|
235
|
+
"🪶 Lyriel plan updates.",
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
pending.restorePlan(planId, entry);
|
|
240
|
+
const e = err;
|
|
241
|
+
return asText({ error: e.message, status: e.status, retryable: true });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async function handlePlanLock(params) {
|
|
245
|
+
const planId = (params.plan_id ?? "").trim();
|
|
246
|
+
const summary = (params.summary ?? "").trim();
|
|
247
|
+
if (!planId || !summary) {
|
|
248
|
+
return asText({ error: "Both 'plan_id' and 'summary' are required" });
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
const result = await api.lockPlan(client, planId, summary);
|
|
252
|
+
pending.forgetPlan(planId);
|
|
253
|
+
return asText({
|
|
254
|
+
success: true,
|
|
255
|
+
plan_id: planId,
|
|
256
|
+
status: result.status ?? "locked",
|
|
257
|
+
locked_at: result.locked_at,
|
|
258
|
+
note: `Plan ${planId} locked: ${summary}. Every participant's agent has been notified and ` +
|
|
259
|
+
`will surface the final outcome to their human.`,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
const e = err;
|
|
264
|
+
return asText({ error: e.message, status: e.status });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
handleSendAsk,
|
|
269
|
+
handleReply,
|
|
270
|
+
handlePlanSend,
|
|
271
|
+
handlePlanReply,
|
|
272
|
+
handlePlanLock,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function paramRecord(params) {
|
|
276
|
+
return params && typeof params === "object" && !Array.isArray(params)
|
|
277
|
+
? params
|
|
278
|
+
: {};
|
|
279
|
+
}
|
|
280
|
+
// Defensive narrowing: LLM-emitted tool args are unknown shape; non-string
|
|
281
|
+
// inputs should be treated as empty rather than stringified to
|
|
282
|
+
// "[object Object]". The typebox schema declares each field as a string, but
|
|
283
|
+
// don't trust the validator at this seam.
|
|
284
|
+
function asString(value) {
|
|
285
|
+
return typeof value === "string" ? value : "";
|
|
286
|
+
}
|
|
287
|
+
export function buildToolDescriptors(client) {
|
|
288
|
+
const h = makeHandlers(client);
|
|
289
|
+
return [
|
|
290
|
+
{
|
|
291
|
+
name: "lyriel_send_ask",
|
|
292
|
+
label: "Lyriel: send ask",
|
|
293
|
+
// The substrate primer is prepended here so it loads into the
|
|
294
|
+
// LLM's bound-tool context. Tool-specific instructions follow
|
|
295
|
+
// after a blank line. The other Lyriel tools have shorter,
|
|
296
|
+
// tool-specific descriptions; the primer in this one
|
|
297
|
+
// description is enough to frame the whole toolset.
|
|
298
|
+
description: SUBSTRATE_PRIMER +
|
|
299
|
+
"\n\n" +
|
|
300
|
+
"Tool — send a 1:1 ask. Use this when your user wants to ping exactly one other Lyriel user by handle. Returns an ask_id; the recipient's response arrives later as a 'reply' dispatch in the inbox, surfaced into this chat automatically — you do not need to poll. For multi-party coordination, use lyriel_plan_send instead.",
|
|
301
|
+
parameters: sendAskSchema,
|
|
302
|
+
async execute(_id, params) {
|
|
303
|
+
const p = paramRecord(params);
|
|
304
|
+
return h.handleSendAsk({
|
|
305
|
+
to: asString(p.to),
|
|
306
|
+
prompt: asString(p.prompt),
|
|
307
|
+
});
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
name: "lyriel_reply",
|
|
312
|
+
label: "Lyriel: reply",
|
|
313
|
+
description: "Reply to a pending inbound Lyriel ask. Use when the user wants to respond to a previously surfaced ask (you'll see a '🪶 Lyriel ask from X' message with an ask_id). Extract the ask_id exactly. If the user replies without naming an ask_id and only one is pending, use that one.",
|
|
314
|
+
parameters: replySchema,
|
|
315
|
+
async execute(_id, params) {
|
|
316
|
+
const p = paramRecord(params);
|
|
317
|
+
return h.handleReply({
|
|
318
|
+
ask_id: asString(p.ask_id),
|
|
319
|
+
response: asString(p.response),
|
|
320
|
+
});
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: "lyriel_plan_send",
|
|
325
|
+
label: "Lyriel: start group plan",
|
|
326
|
+
description: "Start a group plan through Lyriel. Each participant's agent negotiates on their human's behalf to converge on an outcome. Use when coordinating across multiple verified Lyriel handles — NOT for single 1:1 asks. Returns a plan_id; further rounds arrive as 🪶 Lyriel plan updates.",
|
|
327
|
+
parameters: planSendSchema,
|
|
328
|
+
async execute(_id, params) {
|
|
329
|
+
const p = paramRecord(params);
|
|
330
|
+
return h.handlePlanSend({
|
|
331
|
+
participants: Array.isArray(p.participants)
|
|
332
|
+
? p.participants.filter((x) => typeof x === "string")
|
|
333
|
+
: [],
|
|
334
|
+
description: asString(p.description),
|
|
335
|
+
max_messages: typeof p.max_messages === "number" ? p.max_messages : undefined,
|
|
336
|
+
});
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
name: "lyriel_plan_reply",
|
|
341
|
+
label: "Lyriel: contribute to plan",
|
|
342
|
+
description: "Contribute to an ongoing Lyriel group plan. Use when the user wants to add availability, preferences, constraints, or proposed times to the group conversation. To explicitly opt out of a round, pass stay_silent=true.",
|
|
343
|
+
parameters: planReplySchema,
|
|
344
|
+
async execute(_id, params) {
|
|
345
|
+
const p = paramRecord(params);
|
|
346
|
+
return h.handlePlanReply({
|
|
347
|
+
plan_id: asString(p.plan_id),
|
|
348
|
+
content: asString(p.content),
|
|
349
|
+
stay_silent: Boolean(p.stay_silent),
|
|
350
|
+
});
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
name: "lyriel_plan_lock",
|
|
355
|
+
label: "Lyriel: lock plan",
|
|
356
|
+
description: "Lock a Lyriel group plan with a final outcome. Only the plan's initiator can lock (Lyriel returns 403 otherwise). The locked outcome is broadcast to every participant's agent.",
|
|
357
|
+
parameters: planLockSchema,
|
|
358
|
+
async execute(_id, params) {
|
|
359
|
+
const p = paramRecord(params);
|
|
360
|
+
return h.handlePlanLock({
|
|
361
|
+
plan_id: asString(p.plan_id),
|
|
362
|
+
summary: asString(p.summary),
|
|
363
|
+
});
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
];
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "lyriel",
|
|
3
|
+
"name": "Lyriel",
|
|
4
|
+
"description": "Lyriel plugin for OpenClaw. Long-polls Lyriel's /api/inbox for inbound asks, surfaces them into the user's active session, and exposes five LLM tools for sending/replying to asks and driving group plans in natural language. Cross-provider parity with the Hermes plugin.",
|
|
5
|
+
"enabledByDefault": false,
|
|
6
|
+
"activation": {
|
|
7
|
+
"onStartup": true,
|
|
8
|
+
"onCapabilities": ["tool"]
|
|
9
|
+
},
|
|
10
|
+
"contracts": {
|
|
11
|
+
"tools": [
|
|
12
|
+
"lyriel_send_ask",
|
|
13
|
+
"lyriel_reply",
|
|
14
|
+
"lyriel_plan_send",
|
|
15
|
+
"lyriel_plan_reply",
|
|
16
|
+
"lyriel_plan_lock"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"uiHints": {
|
|
20
|
+
"apiKey": {
|
|
21
|
+
"label": "Lyriel API Key",
|
|
22
|
+
"help": "Your lyk_... key from https://lyriel.ai/me/agent setup. Required.",
|
|
23
|
+
"sensitive": true
|
|
24
|
+
},
|
|
25
|
+
"baseUrl": {
|
|
26
|
+
"label": "Lyriel Base URL",
|
|
27
|
+
"help": "Defaults to https://lyriel.ai. Override for dev (e.g. http://localhost:5173 or a cloudflared tunnel)."
|
|
28
|
+
},
|
|
29
|
+
"surfaceSessionKey": {
|
|
30
|
+
"label": "Surface Session Key",
|
|
31
|
+
"help": "Session to inject inbound Lyriel asks into when Telegram push is unavailable. Leave blank to auto-track the user's most recently active session.",
|
|
32
|
+
"advanced": true
|
|
33
|
+
},
|
|
34
|
+
"surfaceTelegramChatId": {
|
|
35
|
+
"label": "Surface Telegram Chat ID",
|
|
36
|
+
"help": "Pinned Telegram chat id for proactive push notifications. Leave blank to auto-resolve from channels.telegram.allowFrom.",
|
|
37
|
+
"advanced": true
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"configSchema": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"properties": {
|
|
44
|
+
"apiKey": {
|
|
45
|
+
"type": "string"
|
|
46
|
+
},
|
|
47
|
+
"baseUrl": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"default": "https://lyriel.ai"
|
|
50
|
+
},
|
|
51
|
+
"surfaceSessionKey": {
|
|
52
|
+
"type": "string"
|
|
53
|
+
},
|
|
54
|
+
"surfaceTelegramChatId": {
|
|
55
|
+
"type": "string"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lyriel/openclaw-plugin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Lyriel plugin for OpenClaw. Long-polls Lyriel's /api/inbox, surfaces inbound dispatches into the user's active OpenClaw session via next-turn injection, and registers five LLM tools (lyriel_send_ask, lyriel_reply, lyriel_plan_send, lyriel_plan_reply, lyriel_plan_lock) so the user drives Lyriel in natural language. Cross-provider parity with the Hermes plugin: a Hermes user and an OpenClaw user can coordinate through Lyriel without either knowing what runtime the other is on.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Lyriel",
|
|
8
|
+
"homepage": "https://lyriel.ai",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/CharlieKerfoot/agent-net.git",
|
|
12
|
+
"directory": "clients/openclaw-plugin"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/CharlieKerfoot/agent-net/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"lyriel",
|
|
19
|
+
"openclaw",
|
|
20
|
+
"plugin",
|
|
21
|
+
"agent",
|
|
22
|
+
"coordination"
|
|
23
|
+
],
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"openclaw.plugin.json"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.build.json",
|
|
31
|
+
"prepare": "npm run build",
|
|
32
|
+
"prepublishOnly": "npm run build"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"typebox": "1.1.38"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"typescript": "^5.5.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"openclaw": "^2026.5.20"
|
|
45
|
+
},
|
|
46
|
+
"peerDependenciesMeta": {
|
|
47
|
+
"openclaw": {
|
|
48
|
+
"optional": true
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"openclaw": {
|
|
52
|
+
"extensions": [
|
|
53
|
+
"./dist/index.js"
|
|
54
|
+
],
|
|
55
|
+
"install": {
|
|
56
|
+
"defaultChoice": "link",
|
|
57
|
+
"minHostVersion": ">=2026.5.0"
|
|
58
|
+
},
|
|
59
|
+
"compat": {
|
|
60
|
+
"pluginApi": ">=2026.5.0"
|
|
61
|
+
},
|
|
62
|
+
"build": {
|
|
63
|
+
"openclawVersion": "2026.5.18"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|