@elizaos/plugin-line 2.0.0-alpha.6 → 2.0.0-beta.1
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 +185 -0
- package/dist/accounts.d.ts.map +1 -1
- package/dist/accounts.js +1 -3
- package/dist/accounts.js.map +1 -1
- package/dist/actions/index.d.ts +0 -6
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +2 -6
- package/dist/actions/index.js.map +1 -1
- package/dist/connector-account-provider.d.ts +16 -0
- package/dist/connector-account-provider.d.ts.map +1 -0
- package/dist/connector-account-provider.js +82 -0
- package/dist/connector-account-provider.js.map +1 -0
- package/dist/index.d.ts +2 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -12
- package/dist/index.js.map +1 -1
- package/dist/messaging.d.ts.map +1 -1
- package/dist/messaging.js +9 -3
- package/dist/messaging.js.map +1 -1
- package/dist/providers/index.d.ts +3 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +4 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/service.d.ts +10 -2
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +352 -29
- package/dist/service.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/workflow-credential-provider.d.ts +21 -0
- package/dist/workflow-credential-provider.d.ts.map +1 -0
- package/dist/workflow-credential-provider.js +32 -0
- package/dist/workflow-credential-provider.js.map +1 -0
- package/package.json +11 -10
- package/dist/actions/sendFlexMessage.d.ts +0 -6
- package/dist/actions/sendFlexMessage.d.ts.map +0 -1
- package/dist/actions/sendFlexMessage.js +0 -178
- package/dist/actions/sendFlexMessage.js.map +0 -1
- package/dist/actions/sendLocation.d.ts +0 -6
- package/dist/actions/sendLocation.d.ts.map +0 -1
- package/dist/actions/sendLocation.js +0 -160
- package/dist/actions/sendLocation.js.map +0 -1
- package/dist/actions/sendMessage.d.ts +0 -6
- package/dist/actions/sendMessage.d.ts.map +0 -1
- package/dist/actions/sendMessage.js +0 -146
- package/dist/actions/sendMessage.js.map +0 -1
- package/dist/providers/chatContext.d.ts +0 -6
- package/dist/providers/chatContext.d.ts.map +0 -1
- package/dist/providers/chatContext.js +0 -85
- package/dist/providers/chatContext.js.map +0 -1
- package/dist/providers/userContext.d.ts +0 -6
- package/dist/providers/userContext.d.ts.map +0 -1
- package/dist/providers/userContext.js +0 -72
- package/dist/providers/userContext.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type IAgentRuntime, Service } from "@elizaos/core";
|
|
2
|
+
type CredentialProviderResult = {
|
|
3
|
+
status: "credential_data";
|
|
4
|
+
data: Record<string, unknown>;
|
|
5
|
+
} | {
|
|
6
|
+
status: "needs_auth";
|
|
7
|
+
authUrl: string;
|
|
8
|
+
} | null;
|
|
9
|
+
export declare class LineWorkflowCredentialProvider extends Service {
|
|
10
|
+
static readonly serviceType = "workflow_credential_provider";
|
|
11
|
+
capabilityDescription: string;
|
|
12
|
+
static start(runtime: IAgentRuntime): Promise<LineWorkflowCredentialProvider>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
resolve(_userId: string, credType: string): Promise<CredentialProviderResult>;
|
|
15
|
+
checkCredentialTypes(credTypes: string[]): {
|
|
16
|
+
supported: string[];
|
|
17
|
+
unsupported: string[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=workflow-credential-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-credential-provider.d.ts","sourceRoot":"","sources":["../src/workflow-credential-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAK5D,KAAK,wBAAwB,GACzB;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC,IAAI,CAAC;AAKT,qBAAa,8BAA+B,SAAQ,OAAO;IACzD,gBAAyB,WAAW,kCAAqC;IAChE,qBAAqB,SAAuD;WAExE,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,8BAA8B,CAAC;IAI7E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAErB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAUnF,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE;CAM1F"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Service } from "@elizaos/core";
|
|
2
|
+
// Inlined to avoid adding @elizaos/plugin-workflow as a compile-time dependency.
|
|
3
|
+
// The runtime duck-types the service — only the serviceType string and resolve() shape matter.
|
|
4
|
+
const WORKFLOW_CREDENTIAL_PROVIDER_TYPE = "workflow_credential_provider";
|
|
5
|
+
// LINE has no dedicated workflow node. Use HTTP Request node with httpHeaderAuth.
|
|
6
|
+
const SUPPORTED = ["httpHeaderAuth"];
|
|
7
|
+
export class LineWorkflowCredentialProvider extends Service {
|
|
8
|
+
static serviceType = WORKFLOW_CREDENTIAL_PROVIDER_TYPE;
|
|
9
|
+
capabilityDescription = "Supplies LINE credentials to the workflow plugin.";
|
|
10
|
+
static async start(runtime) {
|
|
11
|
+
return new LineWorkflowCredentialProvider(runtime);
|
|
12
|
+
}
|
|
13
|
+
async stop() { }
|
|
14
|
+
async resolve(_userId, credType) {
|
|
15
|
+
if (credType !== "httpHeaderAuth")
|
|
16
|
+
return null;
|
|
17
|
+
const accessToken = this.runtime.getSetting("LINE_CHANNEL_ACCESS_TOKEN");
|
|
18
|
+
if (!accessToken?.trim())
|
|
19
|
+
return null;
|
|
20
|
+
return {
|
|
21
|
+
status: "credential_data",
|
|
22
|
+
data: { name: "Authorization", value: `Bearer ${accessToken.trim()}` },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
checkCredentialTypes(credTypes) {
|
|
26
|
+
return {
|
|
27
|
+
supported: credTypes.filter((t) => SUPPORTED.includes(t)),
|
|
28
|
+
unsupported: credTypes.filter((t) => !SUPPORTED.includes(t)),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=workflow-credential-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-credential-provider.js","sourceRoot":"","sources":["../src/workflow-credential-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,OAAO,EAAE,MAAM,eAAe,CAAC;AAE5D,iFAAiF;AACjF,+FAA+F;AAC/F,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;AAMzE,kFAAkF;AAClF,MAAM,SAAS,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAErC,MAAM,OAAO,8BAA+B,SAAQ,OAAO;IACzD,MAAM,CAAmB,WAAW,GAAG,iCAAiC,CAAC;IAChE,qBAAqB,GAAG,mDAAmD,CAAC;IAErF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAsB;QACvC,OAAO,IAAI,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,QAAgB;QAC7C,IAAI,QAAQ,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,2BAA2B,CAAuB,CAAC;QAC/F,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE;SACvE,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,SAAmB;QACtC,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzD,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC7D,CAAC;IACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-line",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "bun run build.ts",
|
|
19
|
-
"test": "vitest run",
|
|
19
|
+
"test": "vitest run --config vitest.config.ts",
|
|
20
|
+
"test:watch": "vitest --config vitest.config.ts",
|
|
20
21
|
"lint": "bunx @biomejs/biome check --write --unsafe .",
|
|
21
22
|
"lint:check": "bunx @biomejs/biome check .",
|
|
22
23
|
"format": "bunx @biomejs/biome format --write .",
|
|
@@ -24,20 +25,20 @@
|
|
|
24
25
|
"typecheck": "tsc --noEmit"
|
|
25
26
|
},
|
|
26
27
|
"dependencies": {
|
|
27
|
-
"@elizaos/core": "2.0.0-
|
|
28
|
-
"@line/bot-sdk": "^
|
|
29
|
-
"zod": "^4.3
|
|
28
|
+
"@elizaos/core": "2.0.0-beta.1",
|
|
29
|
+
"@line/bot-sdk": "^11.0.0",
|
|
30
|
+
"zod": "^4.4.3"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
|
-
"@
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
33
|
+
"@biomejs/biome": "^2.4.14",
|
|
34
|
+
"@types/node": "^22.19.17",
|
|
35
|
+
"typescript": "^6.0.3",
|
|
36
|
+
"vitest": "^4.0.0"
|
|
36
37
|
},
|
|
37
38
|
"publishConfig": {
|
|
38
39
|
"access": "public"
|
|
39
40
|
},
|
|
40
|
-
"
|
|
41
|
+
"eliza": {
|
|
41
42
|
"platforms": [
|
|
42
43
|
"node"
|
|
43
44
|
],
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sendFlexMessage.d.ts","sourceRoot":"","sources":["../../src/actions/sendFlexMessage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,MAAM,EAMP,MAAM,eAAe,CAAC;AAgFvB,eAAO,MAAM,eAAe,EAAE,MAuJ7B,CAAC"}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Send flex message action for the LINE plugin.
|
|
3
|
-
*/
|
|
4
|
-
import { composePromptFromState, logger, ModelType, parseJSONObjectFromText, } from "@elizaos/core";
|
|
5
|
-
import { isValidLineId, LINE_SERVICE_NAME, normalizeLineTarget, } from "../types.js";
|
|
6
|
-
const SEND_FLEX_TEMPLATE = `# Task: Extract LINE Flex message parameters
|
|
7
|
-
|
|
8
|
-
Based on the conversation, determine the flex message content to send.
|
|
9
|
-
|
|
10
|
-
Recent conversation:
|
|
11
|
-
{{recentMessages}}
|
|
12
|
-
|
|
13
|
-
Extract the following:
|
|
14
|
-
1. altText: Alternative text for notifications (short summary)
|
|
15
|
-
2. title: Card title
|
|
16
|
-
3. body: Card body text
|
|
17
|
-
4. to: The target user/group/room ID (or "current" to reply to the current chat)
|
|
18
|
-
5. cardType: Type of card (info, image, action, list)
|
|
19
|
-
|
|
20
|
-
Respond with a JSON object:
|
|
21
|
-
\`\`\`json
|
|
22
|
-
{
|
|
23
|
-
"altText": "notification text",
|
|
24
|
-
"title": "Card Title",
|
|
25
|
-
"body": "Card body text",
|
|
26
|
-
"to": "target ID or 'current'",
|
|
27
|
-
"cardType": "info"
|
|
28
|
-
}
|
|
29
|
-
\`\`\`
|
|
30
|
-
`;
|
|
31
|
-
/**
|
|
32
|
-
* Create a simple info card bubble
|
|
33
|
-
*/
|
|
34
|
-
function createInfoBubble(title, body) {
|
|
35
|
-
return {
|
|
36
|
-
type: "bubble",
|
|
37
|
-
body: {
|
|
38
|
-
type: "box",
|
|
39
|
-
layout: "vertical",
|
|
40
|
-
contents: [
|
|
41
|
-
{
|
|
42
|
-
type: "text",
|
|
43
|
-
text: title,
|
|
44
|
-
weight: "bold",
|
|
45
|
-
size: "xl",
|
|
46
|
-
wrap: true,
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
type: "text",
|
|
50
|
-
text: body,
|
|
51
|
-
margin: "md",
|
|
52
|
-
wrap: true,
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
export const sendFlexMessage = {
|
|
59
|
-
name: "LINE_SEND_FLEX_MESSAGE",
|
|
60
|
-
similes: ["SEND_LINE_CARD", "LINE_FLEX", "LINE_CARD", "SEND_LINE_FLEX"],
|
|
61
|
-
description: "Send a rich flex message/card via LINE",
|
|
62
|
-
validate: async (_runtime, message, _state) => {
|
|
63
|
-
return message.content.source === "line";
|
|
64
|
-
},
|
|
65
|
-
handler: async (runtime, message, state, _options, callback) => {
|
|
66
|
-
const lineService = runtime.getService(LINE_SERVICE_NAME);
|
|
67
|
-
if (!lineService || !lineService.isConnected()) {
|
|
68
|
-
if (callback) {
|
|
69
|
-
callback({ text: "LINE service is not available.", source: "line" });
|
|
70
|
-
}
|
|
71
|
-
return { success: false, error: "LINE service not available" };
|
|
72
|
-
}
|
|
73
|
-
const currentState = state ?? (await runtime.composeState(message));
|
|
74
|
-
const prompt = composePromptFromState({
|
|
75
|
-
template: SEND_FLEX_TEMPLATE,
|
|
76
|
-
state: currentState,
|
|
77
|
-
});
|
|
78
|
-
let flexInfo = null;
|
|
79
|
-
for (let attempt = 0; attempt < 3; attempt++) {
|
|
80
|
-
const response = await runtime.useModel(ModelType.TEXT_SMALL, {
|
|
81
|
-
prompt,
|
|
82
|
-
});
|
|
83
|
-
const parsed = parseJSONObjectFromText(response);
|
|
84
|
-
if (parsed?.title && parsed?.body) {
|
|
85
|
-
flexInfo = {
|
|
86
|
-
altText: String(parsed.altText || `${parsed.title}: ${parsed.body}`),
|
|
87
|
-
title: String(parsed.title),
|
|
88
|
-
body: String(parsed.body),
|
|
89
|
-
to: String(parsed.to || "current"),
|
|
90
|
-
cardType: String(parsed.cardType || "info"),
|
|
91
|
-
};
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (!flexInfo || !flexInfo.title) {
|
|
96
|
-
if (callback) {
|
|
97
|
-
callback({
|
|
98
|
-
text: "I couldn't understand the flex message content. Please try again.",
|
|
99
|
-
source: "line",
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
success: false,
|
|
104
|
-
error: "Could not extract flex message parameters",
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
// Determine target
|
|
108
|
-
let targetId;
|
|
109
|
-
if (flexInfo.to && flexInfo.to !== "current") {
|
|
110
|
-
const normalized = normalizeLineTarget(flexInfo.to);
|
|
111
|
-
if (normalized && isValidLineId(normalized)) {
|
|
112
|
-
targetId = normalized;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Fall back to current chat
|
|
116
|
-
if (!targetId) {
|
|
117
|
-
const stateData = (currentState.data || {});
|
|
118
|
-
targetId =
|
|
119
|
-
stateData.groupId ||
|
|
120
|
-
stateData.roomId ||
|
|
121
|
-
stateData.userId;
|
|
122
|
-
}
|
|
123
|
-
if (!targetId) {
|
|
124
|
-
if (callback) {
|
|
125
|
-
callback({
|
|
126
|
-
text: "I couldn't determine where to send the message. Please specify a target.",
|
|
127
|
-
source: "line",
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
return { success: false, error: "Could not determine target" };
|
|
131
|
-
}
|
|
132
|
-
// Create flex message
|
|
133
|
-
const flexMessage = {
|
|
134
|
-
altText: flexInfo.altText.slice(0, 400),
|
|
135
|
-
contents: createInfoBubble(flexInfo.title, flexInfo.body),
|
|
136
|
-
};
|
|
137
|
-
// Send message
|
|
138
|
-
const result = await lineService.sendFlexMessage(targetId, flexMessage);
|
|
139
|
-
if (!result.success) {
|
|
140
|
-
if (callback) {
|
|
141
|
-
callback({
|
|
142
|
-
text: `Failed to send flex message: ${result.error}`,
|
|
143
|
-
source: "line",
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
return { success: false, error: result.error };
|
|
147
|
-
}
|
|
148
|
-
logger.debug(`Sent LINE flex message to ${targetId}`);
|
|
149
|
-
if (callback) {
|
|
150
|
-
callback({
|
|
151
|
-
text: "Card message sent successfully.",
|
|
152
|
-
source: message.content.source,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
return {
|
|
156
|
-
success: true,
|
|
157
|
-
text: "Card message sent successfully",
|
|
158
|
-
};
|
|
159
|
-
},
|
|
160
|
-
examples: [
|
|
161
|
-
[
|
|
162
|
-
{
|
|
163
|
-
name: "{{user1}}",
|
|
164
|
-
content: {
|
|
165
|
-
text: "Send them an info card with title 'Update' and body 'New features are available'",
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
name: "{{agent}}",
|
|
170
|
-
content: {
|
|
171
|
-
text: "I'll send that as a card message.",
|
|
172
|
-
actions: ["LINE_SEND_FLEX_MESSAGE"],
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
],
|
|
176
|
-
],
|
|
177
|
-
};
|
|
178
|
-
//# sourceMappingURL=sendFlexMessage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sendFlexMessage.js","sourceRoot":"","sources":["../../src/actions/sendFlexMessage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sendLocation.d.ts","sourceRoot":"","sources":["../../src/actions/sendLocation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,MAAM,EAMP,MAAM,eAAe,CAAC;AAiDvB,eAAO,MAAM,YAAY,EAAE,MAkK1B,CAAC"}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Send location action for the LINE plugin.
|
|
3
|
-
*/
|
|
4
|
-
import { composePromptFromState, logger, ModelType, parseJSONObjectFromText, } from "@elizaos/core";
|
|
5
|
-
import { isValidLineId, LINE_SERVICE_NAME, normalizeLineTarget, } from "../types.js";
|
|
6
|
-
const SEND_LOCATION_TEMPLATE = `# Task: Extract LINE location message parameters
|
|
7
|
-
|
|
8
|
-
Based on the conversation, determine the location to send.
|
|
9
|
-
|
|
10
|
-
Recent conversation:
|
|
11
|
-
{{recentMessages}}
|
|
12
|
-
|
|
13
|
-
Extract the following:
|
|
14
|
-
1. title: Place name
|
|
15
|
-
2. address: Full address
|
|
16
|
-
3. latitude: Latitude coordinate (number)
|
|
17
|
-
4. longitude: Longitude coordinate (number)
|
|
18
|
-
5. to: The target user/group/room ID (or "current" to reply to the current chat)
|
|
19
|
-
|
|
20
|
-
Respond with a JSON object:
|
|
21
|
-
\`\`\`json
|
|
22
|
-
{
|
|
23
|
-
"title": "Place Name",
|
|
24
|
-
"address": "123 Main St, City",
|
|
25
|
-
"latitude": 35.6762,
|
|
26
|
-
"longitude": 139.6503,
|
|
27
|
-
"to": "target ID or 'current'"
|
|
28
|
-
}
|
|
29
|
-
\`\`\`
|
|
30
|
-
`;
|
|
31
|
-
export const sendLocation = {
|
|
32
|
-
name: "LINE_SEND_LOCATION",
|
|
33
|
-
similes: [
|
|
34
|
-
"SEND_LINE_LOCATION",
|
|
35
|
-
"LINE_LOCATION",
|
|
36
|
-
"LINE_MAP",
|
|
37
|
-
"SHARE_LOCATION_LINE",
|
|
38
|
-
],
|
|
39
|
-
description: "Send a location message via LINE",
|
|
40
|
-
validate: async (_runtime, message, _state) => {
|
|
41
|
-
return message.content.source === "line";
|
|
42
|
-
},
|
|
43
|
-
handler: async (runtime, message, state, _options, callback) => {
|
|
44
|
-
const lineService = runtime.getService(LINE_SERVICE_NAME);
|
|
45
|
-
if (!lineService || !lineService.isConnected()) {
|
|
46
|
-
if (callback) {
|
|
47
|
-
callback({ text: "LINE service is not available.", source: "line" });
|
|
48
|
-
}
|
|
49
|
-
return { success: false, error: "LINE service not available" };
|
|
50
|
-
}
|
|
51
|
-
const currentState = state ?? (await runtime.composeState(message));
|
|
52
|
-
// Extract parameters using LLM
|
|
53
|
-
const prompt = composePromptFromState({
|
|
54
|
-
template: SEND_LOCATION_TEMPLATE,
|
|
55
|
-
state: currentState,
|
|
56
|
-
});
|
|
57
|
-
let locationInfo = null;
|
|
58
|
-
for (let attempt = 0; attempt < 3; attempt++) {
|
|
59
|
-
const response = await runtime.useModel(ModelType.TEXT_SMALL, {
|
|
60
|
-
prompt,
|
|
61
|
-
});
|
|
62
|
-
const parsed = parseJSONObjectFromText(response);
|
|
63
|
-
if (parsed?.title &&
|
|
64
|
-
parsed?.address &&
|
|
65
|
-
typeof parsed?.latitude === "number" &&
|
|
66
|
-
typeof parsed?.longitude === "number") {
|
|
67
|
-
locationInfo = {
|
|
68
|
-
title: String(parsed.title),
|
|
69
|
-
address: String(parsed.address),
|
|
70
|
-
latitude: Number(parsed.latitude),
|
|
71
|
-
longitude: Number(parsed.longitude),
|
|
72
|
-
to: String(parsed.to || "current"),
|
|
73
|
-
};
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (!locationInfo) {
|
|
78
|
-
if (callback) {
|
|
79
|
-
callback({
|
|
80
|
-
text: "I couldn't understand the location information. Please provide title, address, and coordinates.",
|
|
81
|
-
source: "line",
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
return { success: false, error: "Could not extract location parameters" };
|
|
85
|
-
}
|
|
86
|
-
// Determine target
|
|
87
|
-
let targetId;
|
|
88
|
-
if (locationInfo.to && locationInfo.to !== "current") {
|
|
89
|
-
const normalized = normalizeLineTarget(locationInfo.to);
|
|
90
|
-
if (normalized && isValidLineId(normalized)) {
|
|
91
|
-
targetId = normalized;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Fall back to current chat
|
|
95
|
-
if (!targetId) {
|
|
96
|
-
const stateData = (currentState.data || {});
|
|
97
|
-
targetId =
|
|
98
|
-
stateData.groupId ||
|
|
99
|
-
stateData.roomId ||
|
|
100
|
-
stateData.userId;
|
|
101
|
-
}
|
|
102
|
-
if (!targetId) {
|
|
103
|
-
if (callback) {
|
|
104
|
-
callback({
|
|
105
|
-
text: "I couldn't determine where to send the location. Please specify a target.",
|
|
106
|
-
source: "line",
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
return { success: false, error: "Could not determine target" };
|
|
110
|
-
}
|
|
111
|
-
// Create location message
|
|
112
|
-
const location = {
|
|
113
|
-
type: "location",
|
|
114
|
-
title: locationInfo.title,
|
|
115
|
-
address: locationInfo.address,
|
|
116
|
-
latitude: locationInfo.latitude,
|
|
117
|
-
longitude: locationInfo.longitude,
|
|
118
|
-
};
|
|
119
|
-
// Send message
|
|
120
|
-
const result = await lineService.sendLocationMessage(targetId, location);
|
|
121
|
-
if (!result.success) {
|
|
122
|
-
if (callback) {
|
|
123
|
-
callback({
|
|
124
|
-
text: `Failed to send location: ${result.error}`,
|
|
125
|
-
source: "line",
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
return { success: false, error: result.error };
|
|
129
|
-
}
|
|
130
|
-
logger.debug(`Sent LINE location to ${targetId}`);
|
|
131
|
-
if (callback) {
|
|
132
|
-
callback({
|
|
133
|
-
text: "Location sent successfully.",
|
|
134
|
-
source: message.content.source,
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
success: true,
|
|
139
|
-
text: "Location sent successfully",
|
|
140
|
-
};
|
|
141
|
-
},
|
|
142
|
-
examples: [
|
|
143
|
-
[
|
|
144
|
-
{
|
|
145
|
-
name: "{{user1}}",
|
|
146
|
-
content: {
|
|
147
|
-
text: "Send them the location of Tokyo Tower",
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
name: "{{agent}}",
|
|
152
|
-
content: {
|
|
153
|
-
text: "I'll send the location.",
|
|
154
|
-
actions: ["LINE_SEND_LOCATION"],
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
],
|
|
158
|
-
],
|
|
159
|
-
};
|
|
160
|
-
//# sourceMappingURL=sendLocation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sendLocation.js","sourceRoot":"","sources":["../../src/actions/sendLocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sendMessage.d.ts","sourceRoot":"","sources":["../../src/actions/sendMessage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,MAAM,EAMP,MAAM,eAAe,CAAC;AAuCvB,eAAO,MAAM,WAAW,EAAE,MAuJzB,CAAC"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Send message action for the LINE plugin.
|
|
3
|
-
*/
|
|
4
|
-
import { composePromptFromState, logger, ModelType, parseJSONObjectFromText, } from "@elizaos/core";
|
|
5
|
-
import { isValidLineId, LINE_SERVICE_NAME, normalizeLineTarget, } from "../types.js";
|
|
6
|
-
const SEND_MESSAGE_TEMPLATE = `# Task: Extract LINE message parameters
|
|
7
|
-
|
|
8
|
-
Based on the conversation, determine what message to send and to whom.
|
|
9
|
-
|
|
10
|
-
Recent conversation:
|
|
11
|
-
{{recentMessages}}
|
|
12
|
-
|
|
13
|
-
Extract the following:
|
|
14
|
-
1. text: The message content to send
|
|
15
|
-
2. to: The target user/group/room ID (or "current" to reply to the current chat)
|
|
16
|
-
|
|
17
|
-
Respond with a JSON object:
|
|
18
|
-
\`\`\`json
|
|
19
|
-
{
|
|
20
|
-
"text": "message to send",
|
|
21
|
-
"to": "target ID or 'current'"
|
|
22
|
-
}
|
|
23
|
-
\`\`\`
|
|
24
|
-
`;
|
|
25
|
-
export const sendMessage = {
|
|
26
|
-
name: "LINE_SEND_MESSAGE",
|
|
27
|
-
similes: ["SEND_LINE_MESSAGE", "LINE_MESSAGE", "LINE_TEXT", "MESSAGE_LINE"],
|
|
28
|
-
description: "Send a text message via LINE",
|
|
29
|
-
validate: async (_runtime, message, _state) => {
|
|
30
|
-
return message.content.source === "line";
|
|
31
|
-
},
|
|
32
|
-
handler: async (runtime, message, state, _options, callback) => {
|
|
33
|
-
const lineService = runtime.getService(LINE_SERVICE_NAME);
|
|
34
|
-
if (!lineService || !lineService.isConnected()) {
|
|
35
|
-
if (callback) {
|
|
36
|
-
callback({ text: "LINE service is not available.", source: "line" });
|
|
37
|
-
}
|
|
38
|
-
return { success: false, error: "LINE service not available" };
|
|
39
|
-
}
|
|
40
|
-
const currentState = state ?? (await runtime.composeState(message));
|
|
41
|
-
// Extract parameters using LLM
|
|
42
|
-
const prompt = composePromptFromState({
|
|
43
|
-
template: SEND_MESSAGE_TEMPLATE,
|
|
44
|
-
state: currentState,
|
|
45
|
-
});
|
|
46
|
-
let msgInfo = null;
|
|
47
|
-
for (let attempt = 0; attempt < 3; attempt++) {
|
|
48
|
-
const response = await runtime.useModel(ModelType.TEXT_SMALL, {
|
|
49
|
-
prompt,
|
|
50
|
-
});
|
|
51
|
-
const parsed = parseJSONObjectFromText(response);
|
|
52
|
-
if (parsed?.text) {
|
|
53
|
-
msgInfo = {
|
|
54
|
-
text: String(parsed.text),
|
|
55
|
-
to: String(parsed.to || "current"),
|
|
56
|
-
};
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
if (!msgInfo || !msgInfo.text) {
|
|
61
|
-
if (callback) {
|
|
62
|
-
callback({
|
|
63
|
-
text: "I couldn't understand what message you want me to send. Please try again.",
|
|
64
|
-
source: "line",
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
return { success: false, error: "Could not extract message parameters" };
|
|
68
|
-
}
|
|
69
|
-
// Determine target
|
|
70
|
-
let targetId;
|
|
71
|
-
if (msgInfo.to && msgInfo.to !== "current") {
|
|
72
|
-
const normalized = normalizeLineTarget(msgInfo.to);
|
|
73
|
-
if (normalized && isValidLineId(normalized)) {
|
|
74
|
-
targetId = normalized;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// Fall back to current chat
|
|
78
|
-
if (!targetId) {
|
|
79
|
-
const stateData = (currentState.data || {});
|
|
80
|
-
targetId =
|
|
81
|
-
stateData.groupId ||
|
|
82
|
-
stateData.roomId ||
|
|
83
|
-
stateData.userId;
|
|
84
|
-
}
|
|
85
|
-
if (!targetId) {
|
|
86
|
-
if (callback) {
|
|
87
|
-
callback({
|
|
88
|
-
text: "I couldn't determine where to send the message. Please specify a target.",
|
|
89
|
-
source: "line",
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
return { success: false, error: "Could not determine target" };
|
|
93
|
-
}
|
|
94
|
-
// Send message
|
|
95
|
-
const result = await lineService.sendMessage(targetId, msgInfo.text);
|
|
96
|
-
if (!result.success) {
|
|
97
|
-
if (callback) {
|
|
98
|
-
callback({
|
|
99
|
-
text: `Failed to send message: ${result.error}`,
|
|
100
|
-
source: "line",
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
return { success: false, error: result.error };
|
|
104
|
-
}
|
|
105
|
-
logger.debug(`Sent LINE message to ${targetId}`);
|
|
106
|
-
if (callback) {
|
|
107
|
-
callback({
|
|
108
|
-
text: "Message sent successfully.",
|
|
109
|
-
source: message.content.source,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
success: true,
|
|
114
|
-
text: "Message sent successfully",
|
|
115
|
-
};
|
|
116
|
-
},
|
|
117
|
-
examples: [
|
|
118
|
-
[
|
|
119
|
-
{
|
|
120
|
-
name: "{{user1}}",
|
|
121
|
-
content: { text: "Send them a message saying 'Hello!'" },
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
name: "{{agent}}",
|
|
125
|
-
content: {
|
|
126
|
-
text: "I'll send that message via LINE.",
|
|
127
|
-
actions: ["LINE_SEND_MESSAGE"],
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
],
|
|
131
|
-
[
|
|
132
|
-
{
|
|
133
|
-
name: "{{user1}}",
|
|
134
|
-
content: { text: "Message the group saying 'Meeting in 5 minutes'" },
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
name: "{{agent}}",
|
|
138
|
-
content: {
|
|
139
|
-
text: "I'll send that to the group.",
|
|
140
|
-
actions: ["LINE_SEND_MESSAGE"],
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
],
|
|
144
|
-
],
|
|
145
|
-
};
|
|
146
|
-
//# sourceMappingURL=sendMessage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sendMessage.js","sourceRoot":"","sources":["../../src/actions/sendMessage.ts"],"names":[],"mappings":"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"}
|