@zoulabo/line-hive 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/LICENSE +21 -0
- package/README.md +457 -0
- package/bin/line-hive.js +44 -0
- package/dist/cli/config-writer.js +320 -0
- package/dist/cli/config-writer.js.map +1 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init.js +85 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/prompts.js +35 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/test-connection.js +135 -0
- package/dist/cli/test-connection.js.map +1 -0
- package/dist/cli/webhook-capture.js +31 -0
- package/dist/cli/webhook-capture.js.map +1 -0
- package/dist/config.js +62 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -0
- package/dist/i18n.js +100 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.js +126 -0
- package/dist/index.js.map +1 -0
- package/dist/line/client.js +72 -0
- package/dist/line/client.js.map +1 -0
- package/dist/line/messages.js +217 -0
- package/dist/line/messages.js.map +1 -0
- package/dist/line/webhook.js +485 -0
- package/dist/line/webhook.js.map +1 -0
- package/dist/logger.js +5 -0
- package/dist/logger.js.map +1 -0
- package/dist/server.js +143 -0
- package/dist/server.js.map +1 -0
- package/dist/src/cli/config-writer.js +18 -0
- package/dist/src/cli/config-writer.js.map +1 -0
- package/dist/src/cli/init.js +11 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/prompts.js +38 -0
- package/dist/src/cli/prompts.js.map +1 -0
- package/dist/src/cli/webhook-capture.js +37 -0
- package/dist/src/cli/webhook-capture.js.map +1 -0
- package/dist/src/config.js +44 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.js +53 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/line/client.js +20 -0
- package/dist/src/line/client.js.map +1 -0
- package/dist/src/line/webhook.js +131 -0
- package/dist/src/line/webhook.js.map +1 -0
- package/dist/src/logger.js +11 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/server.js +140 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/store/messageStore.js +222 -0
- package/dist/src/store/messageStore.js.map +1 -0
- package/dist/src/store/statusStore.js +87 -0
- package/dist/src/store/statusStore.js.map +1 -0
- package/dist/src/tools/cancelWait.js +26 -0
- package/dist/src/tools/cancelWait.js.map +1 -0
- package/dist/src/tools/checkMessages.js +16 -0
- package/dist/src/tools/checkMessages.js.map +1 -0
- package/dist/src/tools/getReply.js +15 -0
- package/dist/src/tools/getReply.js.map +1 -0
- package/dist/src/tools/sendMessage.js +58 -0
- package/dist/src/tools/sendMessage.js.map +1 -0
- package/dist/src/tools/setStatus.js +23 -0
- package/dist/src/tools/setStatus.js.map +1 -0
- package/dist/src/tools/waitForReply.js +85 -0
- package/dist/src/tools/waitForReply.js.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/store/messageStore.js +513 -0
- package/dist/store/messageStore.js.map +1 -0
- package/dist/store/statusStore.js +320 -0
- package/dist/store/statusStore.js.map +1 -0
- package/dist/tools/ask.js +240 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/cancelWait.js +30 -0
- package/dist/tools/cancelWait.js.map +1 -0
- package/dist/tools/checkMessages.js +23 -0
- package/dist/tools/checkMessages.js.map +1 -0
- package/dist/tools/getReply.js +12 -0
- package/dist/tools/getReply.js.map +1 -0
- package/dist/tools/listAgents.js +25 -0
- package/dist/tools/listAgents.js.map +1 -0
- package/dist/tools/sendMessage.js +99 -0
- package/dist/tools/sendMessage.js.map +1 -0
- package/dist/tools/setStatus.js +48 -0
- package/dist/tools/setStatus.js.map +1 -0
- package/dist/tools/waitForReply.js +36 -0
- package/dist/tools/waitForReply.js.map +1 -0
- package/dist/tools/waitForReplyInternal.js +66 -0
- package/dist/tools/waitForReplyInternal.js.map +1 -0
- package/dist/tunnel.js +124 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/util/persistUserId.js.map +1 -0
- package/dist/util/sendWithTokenPool.js +51 -0
- package/dist/util/sendWithTokenPool.js.map +1 -0
- package/dist/util/sleep.js +5 -0
- package/dist/util/sleep.js.map +1 -0
- package/dist/util/toolHelpers.js +60 -0
- package/dist/util/toolHelpers.js.map +1 -0
- package/package.json +61 -0
- package/templates/line-notification.instructions.md +105 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createServer = createServer;
|
|
4
|
+
const server_1 = require("@modelcontextprotocol/sdk/server");
|
|
5
|
+
const types_1 = require("@modelcontextprotocol/sdk/types");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const logger_1 = require("./logger");
|
|
8
|
+
const setStatus_1 = require("./tools/setStatus");
|
|
9
|
+
const getReply_1 = require("./tools/getReply");
|
|
10
|
+
const sendMessage_1 = require("./tools/sendMessage");
|
|
11
|
+
const waitForReply_1 = require("./tools/waitForReply");
|
|
12
|
+
const checkMessages_1 = require("./tools/checkMessages");
|
|
13
|
+
const cancelWait_1 = require("./tools/cancelWait");
|
|
14
|
+
function createServer({ config, messageStore, statusStore, lineClient, logger = logger_1.logger }) {
|
|
15
|
+
const server = new server_1.Server({
|
|
16
|
+
name: "line-mcp-service",
|
|
17
|
+
version: "0.1.0"
|
|
18
|
+
}, {
|
|
19
|
+
capabilities: {
|
|
20
|
+
tools: {}
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
server.setRequestHandler(types_1.ListToolsRequestSchema, async () => {
|
|
24
|
+
return {
|
|
25
|
+
tools: [
|
|
26
|
+
{
|
|
27
|
+
name: "line_set_status",
|
|
28
|
+
description: "Set agent status for poll-centric LINE updates.",
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
status: {
|
|
33
|
+
type: "string",
|
|
34
|
+
enum: ["idle", "working", "needs_input", "completed"]
|
|
35
|
+
},
|
|
36
|
+
description: { type: "string", nullable: true },
|
|
37
|
+
prompt: { type: "string", nullable: true },
|
|
38
|
+
result: { type: "string", nullable: true }
|
|
39
|
+
},
|
|
40
|
+
required: ["status"]
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "line_get_reply",
|
|
45
|
+
description: "Check for a reply captured after needs_input status.",
|
|
46
|
+
inputSchema: { type: "object", properties: {} }
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "line_send_message",
|
|
50
|
+
description: "Push a message to LINE (use sparingly).",
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {
|
|
54
|
+
text: { type: "string" },
|
|
55
|
+
correlationId: { type: "string", nullable: true }
|
|
56
|
+
},
|
|
57
|
+
required: ["text"]
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "line_wait_for_reply",
|
|
62
|
+
description: "Block until the user replies to a message.",
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: "object",
|
|
65
|
+
properties: {
|
|
66
|
+
correlationId: { type: "string" },
|
|
67
|
+
timeoutMs: { type: "number", nullable: true }
|
|
68
|
+
},
|
|
69
|
+
required: ["correlationId"]
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "line_check_messages",
|
|
74
|
+
description: "Fetch unclaimed inbound messages.",
|
|
75
|
+
inputSchema: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
limit: { type: "number", nullable: true }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "line_cancel_wait",
|
|
84
|
+
description: "Cancel a pending wait_for_reply session.",
|
|
85
|
+
inputSchema: {
|
|
86
|
+
type: "object",
|
|
87
|
+
properties: {
|
|
88
|
+
correlationId: { type: "string" }
|
|
89
|
+
},
|
|
90
|
+
required: ["correlationId"]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
server.setRequestHandler(types_1.CallToolRequestSchema, async (request) => {
|
|
97
|
+
const { name, arguments: args } = request.params;
|
|
98
|
+
switch (name) {
|
|
99
|
+
case "line_set_status":
|
|
100
|
+
return (0, setStatus_1.handleSetStatus)({ statusStore, logger }, args ?? {});
|
|
101
|
+
case "line_get_reply":
|
|
102
|
+
return (0, getReply_1.handleGetReply)({ statusStore });
|
|
103
|
+
case "line_send_message":
|
|
104
|
+
return (0, sendMessage_1.handleSendMessage)({
|
|
105
|
+
config,
|
|
106
|
+
messageStore,
|
|
107
|
+
lineClient,
|
|
108
|
+
logger,
|
|
109
|
+
args: args ?? {},
|
|
110
|
+
correlationId: args?.correlationId || (0, crypto_1.randomUUID)()
|
|
111
|
+
});
|
|
112
|
+
case "line_wait_for_reply":
|
|
113
|
+
return (0, waitForReply_1.handleWaitForReply)({
|
|
114
|
+
config,
|
|
115
|
+
messageStore,
|
|
116
|
+
logger,
|
|
117
|
+
args: args ?? {}
|
|
118
|
+
});
|
|
119
|
+
case "line_check_messages":
|
|
120
|
+
return (0, checkMessages_1.handleCheckMessages)({ messageStore, args: args ?? {} });
|
|
121
|
+
case "line_cancel_wait":
|
|
122
|
+
return (0, cancelWait_1.handleCancelWait)({ messageStore, args: args ?? {} });
|
|
123
|
+
default:
|
|
124
|
+
return {
|
|
125
|
+
content: [
|
|
126
|
+
{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: `Unknown tool: ${name}`
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
logger.info({
|
|
135
|
+
webhookPath: config.webhookPath,
|
|
136
|
+
webhookPort: config.webhookPort
|
|
137
|
+
}, "LINE MCP server initialized");
|
|
138
|
+
return server;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessageStore = void 0;
|
|
4
|
+
class MessageStore {
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
this.init();
|
|
8
|
+
}
|
|
9
|
+
init() {
|
|
10
|
+
this.db.exec(`
|
|
11
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
12
|
+
id INTEGER PRIMARY KEY,
|
|
13
|
+
webhook_event_id TEXT UNIQUE,
|
|
14
|
+
user_id TEXT NOT NULL,
|
|
15
|
+
text TEXT,
|
|
16
|
+
reply_token TEXT,
|
|
17
|
+
timestamp INTEGER NOT NULL,
|
|
18
|
+
consumed INTEGER DEFAULT 0,
|
|
19
|
+
correlation_id TEXT
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
23
|
+
id TEXT PRIMARY KEY,
|
|
24
|
+
created_at INTEGER NOT NULL,
|
|
25
|
+
expires_at INTEGER NOT NULL,
|
|
26
|
+
status TEXT DEFAULT 'waiting'
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
CREATE TABLE IF NOT EXISTS outgoing (
|
|
30
|
+
id INTEGER PRIMARY KEY,
|
|
31
|
+
correlation_id TEXT NOT NULL,
|
|
32
|
+
text TEXT NOT NULL,
|
|
33
|
+
user_id TEXT NOT NULL,
|
|
34
|
+
line_message_id TEXT,
|
|
35
|
+
timestamp INTEGER NOT NULL
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS config (
|
|
39
|
+
key TEXT PRIMARY KEY,
|
|
40
|
+
value TEXT NOT NULL,
|
|
41
|
+
updated_at INTEGER NOT NULL
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE TABLE IF NOT EXISTS agent_status (
|
|
45
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
46
|
+
status TEXT DEFAULT 'idle',
|
|
47
|
+
description TEXT,
|
|
48
|
+
prompt TEXT,
|
|
49
|
+
result TEXT,
|
|
50
|
+
pending_reply TEXT,
|
|
51
|
+
updated_at INTEGER NOT NULL
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_messages_unconsumed ON messages(consumed, timestamp);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status, expires_at);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_outgoing_correlation ON outgoing(correlation_id);
|
|
57
|
+
`);
|
|
58
|
+
this.db
|
|
59
|
+
.prepare(`INSERT OR IGNORE INTO agent_status (id, status, updated_at)
|
|
60
|
+
VALUES (1, 'idle', ?)`)
|
|
61
|
+
.run(Date.now());
|
|
62
|
+
}
|
|
63
|
+
insertIncomingMessage(params) {
|
|
64
|
+
const insertMessage = this.db.prepare(`INSERT OR IGNORE INTO messages
|
|
65
|
+
(webhook_event_id, user_id, text, reply_token, timestamp, consumed, correlation_id)
|
|
66
|
+
VALUES (?, ?, ?, ?, ?, 0, NULL)`);
|
|
67
|
+
const selectOldestSession = this.db.prepare(`SELECT id FROM sessions
|
|
68
|
+
WHERE status = 'waiting' AND expires_at > ?
|
|
69
|
+
ORDER BY created_at ASC
|
|
70
|
+
LIMIT 1`);
|
|
71
|
+
const fulfillSession = this.db.prepare(`UPDATE sessions SET status = 'fulfilled' WHERE id = ?`);
|
|
72
|
+
const attachCorrelation = this.db.prepare(`UPDATE messages SET correlation_id = ? WHERE id = ?`);
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
const transaction = this.db.transaction(() => {
|
|
75
|
+
const result = insertMessage.run(params.webhookEventId, params.userId, params.text, params.replyToken ?? null, params.timestamp);
|
|
76
|
+
if (result.changes === 0) {
|
|
77
|
+
return { deduped: true, fulfilled: false, correlationId: null, messageId: null };
|
|
78
|
+
}
|
|
79
|
+
const messageId = result.lastInsertRowid;
|
|
80
|
+
const session = selectOldestSession.get(now);
|
|
81
|
+
if (session) {
|
|
82
|
+
attachCorrelation.run(session.id, messageId);
|
|
83
|
+
fulfillSession.run(session.id);
|
|
84
|
+
return {
|
|
85
|
+
deduped: false,
|
|
86
|
+
fulfilled: true,
|
|
87
|
+
correlationId: session.id,
|
|
88
|
+
messageId
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return { deduped: false, fulfilled: false, correlationId: null, messageId };
|
|
92
|
+
});
|
|
93
|
+
return transaction();
|
|
94
|
+
}
|
|
95
|
+
markMessageConsumed(messageId) {
|
|
96
|
+
this.db.prepare(`UPDATE messages SET consumed = 1 WHERE id = ?`).run(messageId);
|
|
97
|
+
}
|
|
98
|
+
createSession(id, expiresAt) {
|
|
99
|
+
this.db
|
|
100
|
+
.prepare(`INSERT OR IGNORE INTO sessions (id, created_at, expires_at, status)
|
|
101
|
+
VALUES (?, ?, ?, 'waiting')`)
|
|
102
|
+
.run(id, Date.now(), expiresAt);
|
|
103
|
+
}
|
|
104
|
+
getSession(id) {
|
|
105
|
+
const row = this.db
|
|
106
|
+
.prepare(`SELECT id, status, expires_at as expiresAt FROM sessions WHERE id = ?`)
|
|
107
|
+
.get(id);
|
|
108
|
+
return row ?? null;
|
|
109
|
+
}
|
|
110
|
+
cancelSession(id) {
|
|
111
|
+
this.db.prepare(`UPDATE sessions SET status = 'cancelled' WHERE id = ?`).run(id);
|
|
112
|
+
}
|
|
113
|
+
expireSessions(now) {
|
|
114
|
+
this.db
|
|
115
|
+
.prepare(`UPDATE sessions
|
|
116
|
+
SET status = 'expired'
|
|
117
|
+
WHERE status = 'waiting' AND expires_at <= ?`)
|
|
118
|
+
.run(now);
|
|
119
|
+
}
|
|
120
|
+
adoptUnclaimedMessageForSession(correlationId, outgoingTimestamp) {
|
|
121
|
+
const selectMessage = this.db.prepare(`SELECT id FROM messages
|
|
122
|
+
WHERE correlation_id IS NULL
|
|
123
|
+
AND consumed = 0
|
|
124
|
+
AND timestamp > ?
|
|
125
|
+
ORDER BY timestamp ASC
|
|
126
|
+
LIMIT 1`);
|
|
127
|
+
const updateMessage = this.db.prepare(`UPDATE messages SET correlation_id = ? WHERE id = ?`);
|
|
128
|
+
const fulfillSession = this.db.prepare(`UPDATE sessions SET status = 'fulfilled' WHERE id = ?`);
|
|
129
|
+
const transaction = this.db.transaction(() => {
|
|
130
|
+
const row = selectMessage.get(outgoingTimestamp);
|
|
131
|
+
if (!row) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
updateMessage.run(correlationId, row.id);
|
|
135
|
+
fulfillSession.run(correlationId);
|
|
136
|
+
return true;
|
|
137
|
+
});
|
|
138
|
+
return transaction();
|
|
139
|
+
}
|
|
140
|
+
consumeMessageByCorrelationId(correlationId) {
|
|
141
|
+
const selectMessage = this.db.prepare(`SELECT id, text FROM messages
|
|
142
|
+
WHERE correlation_id = ? AND consumed = 0
|
|
143
|
+
ORDER BY timestamp ASC
|
|
144
|
+
LIMIT 1`);
|
|
145
|
+
const markConsumed = this.db.prepare(`UPDATE messages SET consumed = 1 WHERE id = ?`);
|
|
146
|
+
const transaction = this.db.transaction(() => {
|
|
147
|
+
const row = selectMessage.get(correlationId);
|
|
148
|
+
if (!row) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
markConsumed.run(row.id);
|
|
152
|
+
return row.text;
|
|
153
|
+
});
|
|
154
|
+
return transaction();
|
|
155
|
+
}
|
|
156
|
+
getUnclaimedMessages(limit) {
|
|
157
|
+
const selectMessages = this.db.prepare(`SELECT id, text, timestamp FROM messages
|
|
158
|
+
WHERE correlation_id IS NULL AND consumed = 0
|
|
159
|
+
ORDER BY timestamp ASC
|
|
160
|
+
LIMIT ?`);
|
|
161
|
+
const markConsumed = this.db.prepare(`UPDATE messages SET consumed = 1 WHERE id = ?`);
|
|
162
|
+
const transaction = this.db.transaction(() => {
|
|
163
|
+
const rows = selectMessages.all(limit);
|
|
164
|
+
for (const row of rows) {
|
|
165
|
+
markConsumed.run(row.id);
|
|
166
|
+
}
|
|
167
|
+
return rows.map((row) => ({ text: row.text, timestamp: row.timestamp }));
|
|
168
|
+
});
|
|
169
|
+
return transaction();
|
|
170
|
+
}
|
|
171
|
+
insertOutgoing(params) {
|
|
172
|
+
this.db
|
|
173
|
+
.prepare(`INSERT INTO outgoing
|
|
174
|
+
(correlation_id, text, user_id, line_message_id, timestamp)
|
|
175
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
176
|
+
.run(params.correlationId, params.text, params.userId, params.lineMessageId ?? null, params.timestamp);
|
|
177
|
+
}
|
|
178
|
+
getOutgoingTimestamp(correlationId) {
|
|
179
|
+
const row = this.db
|
|
180
|
+
.prepare(`SELECT timestamp FROM outgoing WHERE correlation_id = ?`)
|
|
181
|
+
.get(correlationId);
|
|
182
|
+
return row?.timestamp ?? null;
|
|
183
|
+
}
|
|
184
|
+
setConfig(key, value) {
|
|
185
|
+
this.db
|
|
186
|
+
.prepare(`INSERT INTO config (key, value, updated_at)
|
|
187
|
+
VALUES (?, ?, ?)
|
|
188
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`)
|
|
189
|
+
.run(key, value, Date.now());
|
|
190
|
+
}
|
|
191
|
+
getConfig(key) {
|
|
192
|
+
const row = this.db
|
|
193
|
+
.prepare(`SELECT value FROM config WHERE key = ?`)
|
|
194
|
+
.get(key);
|
|
195
|
+
return row?.value ?? null;
|
|
196
|
+
}
|
|
197
|
+
registerDefaultUserIfMissing(userId) {
|
|
198
|
+
const current = this.getConfig("default_user_id");
|
|
199
|
+
if (current) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
this.setConfig("default_user_id", userId);
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
getDefaultUserId() {
|
|
206
|
+
return this.getConfig("default_user_id");
|
|
207
|
+
}
|
|
208
|
+
cleanup() {
|
|
209
|
+
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
210
|
+
this.db
|
|
211
|
+
.prepare(`DELETE FROM messages WHERE consumed = 1 AND timestamp < ?`)
|
|
212
|
+
.run(cutoff);
|
|
213
|
+
this.db
|
|
214
|
+
.prepare(`DELETE FROM messages WHERE consumed = 0 AND timestamp < ?`)
|
|
215
|
+
.run(cutoff);
|
|
216
|
+
this.db
|
|
217
|
+
.prepare(`DELETE FROM sessions WHERE status IN ('expired', 'cancelled')`)
|
|
218
|
+
.run();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.MessageStore = MessageStore;
|
|
222
|
+
//# sourceMappingURL=messageStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageStore.js","sourceRoot":"","sources":["../../../src/store/messageStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatusStore = void 0;
|
|
4
|
+
class StatusStore {
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
this.init();
|
|
8
|
+
}
|
|
9
|
+
init() {
|
|
10
|
+
this.db
|
|
11
|
+
.prepare(`INSERT OR IGNORE INTO agent_status (id, status, updated_at)
|
|
12
|
+
VALUES (1, 'idle', ?)`)
|
|
13
|
+
.run(Date.now());
|
|
14
|
+
}
|
|
15
|
+
getStatus() {
|
|
16
|
+
const row = this.db
|
|
17
|
+
.prepare(`SELECT status,
|
|
18
|
+
description,
|
|
19
|
+
prompt,
|
|
20
|
+
result,
|
|
21
|
+
pending_reply as pendingReply,
|
|
22
|
+
updated_at as updatedAt
|
|
23
|
+
FROM agent_status WHERE id = 1`)
|
|
24
|
+
.get();
|
|
25
|
+
if (!row) {
|
|
26
|
+
return {
|
|
27
|
+
status: "idle",
|
|
28
|
+
description: null,
|
|
29
|
+
prompt: null,
|
|
30
|
+
result: null,
|
|
31
|
+
pendingReply: null,
|
|
32
|
+
updatedAt: Date.now()
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return row;
|
|
36
|
+
}
|
|
37
|
+
setStatus(input) {
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
const status = input.status;
|
|
40
|
+
if (status === "idle") {
|
|
41
|
+
this.db
|
|
42
|
+
.prepare(`UPDATE agent_status
|
|
43
|
+
SET status = 'idle',
|
|
44
|
+
description = NULL,
|
|
45
|
+
prompt = NULL,
|
|
46
|
+
result = NULL,
|
|
47
|
+
pending_reply = NULL,
|
|
48
|
+
updated_at = ?
|
|
49
|
+
WHERE id = 1`)
|
|
50
|
+
.run(now);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.db
|
|
54
|
+
.prepare(`UPDATE agent_status
|
|
55
|
+
SET status = ?,
|
|
56
|
+
description = ?,
|
|
57
|
+
prompt = ?,
|
|
58
|
+
result = ?,
|
|
59
|
+
updated_at = ?
|
|
60
|
+
WHERE id = 1`)
|
|
61
|
+
.run(status, input.description ?? null, input.prompt ?? null, input.result ?? null, now);
|
|
62
|
+
}
|
|
63
|
+
setPendingReply(text) {
|
|
64
|
+
this.db
|
|
65
|
+
.prepare(`UPDATE agent_status
|
|
66
|
+
SET pending_reply = ?, updated_at = ?
|
|
67
|
+
WHERE id = 1`)
|
|
68
|
+
.run(text, Date.now());
|
|
69
|
+
}
|
|
70
|
+
consumePendingReply() {
|
|
71
|
+
const row = this.db
|
|
72
|
+
.prepare(`SELECT pending_reply as pendingReply FROM agent_status WHERE id = 1`)
|
|
73
|
+
.get();
|
|
74
|
+
if (!row?.pendingReply) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
this.db
|
|
78
|
+
.prepare(`UPDATE agent_status SET pending_reply = NULL, updated_at = ? WHERE id = 1`)
|
|
79
|
+
.run(Date.now());
|
|
80
|
+
return row.pendingReply;
|
|
81
|
+
}
|
|
82
|
+
markCompletedToIdle() {
|
|
83
|
+
this.setStatus({ status: "idle" });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.StatusStore = StatusStore;
|
|
87
|
+
//# sourceMappingURL=statusStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusStore.js","sourceRoot":"","sources":["../../../src/store/statusStore.ts"],"names":[],"mappings":";;;AAGA,MAAa,WAAW;IAGtB,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;+BACuB,CACxB;aACA,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACrB,CAAC;IAED,SAAS;QACP,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;;;wCAMgC,CACjC;aACA,GAAG,EAA2B,CAAC;QAElC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,IAAI;gBACZ,YAAY,EAAE,IAAI;gBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,CAAC,KAAqB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;;;;;;wBAOc,CACf;iBACA,GAAG,CAAC,GAAG,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;;;;sBAMc,CACf;aACA,GAAG,CACF,MAAM,EACN,KAAK,CAAC,WAAW,IAAI,IAAI,EACzB,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,GAAG,CACJ,CAAC;IACN,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;sBAEc,CACf;aACA,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,mBAAmB;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,qEAAqE,CAAC;aAC9E,GAAG,EAAiD,CAAC;QAExD,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEnB,OAAO,GAAG,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AAhHD,kCAgHC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleCancelWait = handleCancelWait;
|
|
4
|
+
function handleCancelWait({ messageStore, args }) {
|
|
5
|
+
const correlationId = args.correlationId;
|
|
6
|
+
if (!correlationId) {
|
|
7
|
+
return {
|
|
8
|
+
content: [
|
|
9
|
+
{
|
|
10
|
+
type: "text",
|
|
11
|
+
text: JSON.stringify({ success: false, error: "missing_correlation_id" })
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
messageStore.cancelSession(correlationId);
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{
|
|
20
|
+
type: "text",
|
|
21
|
+
text: JSON.stringify({ success: true })
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cancelWait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancelWait.js","sourceRoot":"","sources":["../../../src/tools/cancelWait.ts"],"names":[],"mappings":";;AAEA,4CA6BC;AA7BD,SAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,IAAI,EAIL;IACC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAmC,CAAC;IAC/D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;iBAC1E;aACF;SACF,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAE1C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aACxC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleCheckMessages = handleCheckMessages;
|
|
4
|
+
function handleCheckMessages({ messageStore, args }) {
|
|
5
|
+
const limit = typeof args.limit === "number" ? args.limit : 10;
|
|
6
|
+
const messages = messageStore.getUnclaimedMessages(limit);
|
|
7
|
+
return {
|
|
8
|
+
content: [
|
|
9
|
+
{
|
|
10
|
+
type: "text",
|
|
11
|
+
text: JSON.stringify({ messages })
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=checkMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkMessages.js","sourceRoot":"","sources":["../../../src/tools/checkMessages.ts"],"names":[],"mappings":";;AAEA,kDAkBC;AAlBD,SAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,IAAI,EAIL;IACC,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;aACnC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleGetReply = handleGetReply;
|
|
4
|
+
function handleGetReply({ statusStore }) {
|
|
5
|
+
const reply = statusStore.consumePendingReply();
|
|
6
|
+
return {
|
|
7
|
+
content: [
|
|
8
|
+
{
|
|
9
|
+
type: "text",
|
|
10
|
+
text: JSON.stringify({ hasReply: Boolean(reply), reply })
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=getReply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getReply.js","sourceRoot":"","sources":["../../../src/tools/getReply.ts"],"names":[],"mappings":";;AAEA,wCAWC;AAXD,SAAgB,cAAc,CAAC,EAAE,WAAW,EAAgC;IAC1E,MAAM,KAAK,GAAG,WAAW,CAAC,mBAAmB,EAAE,CAAC;IAEhD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;aAC1D;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleSendMessage = handleSendMessage;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
5
|
+
async function handleSendMessage({ config, messageStore, lineClient, logger = logger_1.logger, args, correlationId }) {
|
|
6
|
+
const text = args.text;
|
|
7
|
+
if (!text) {
|
|
8
|
+
return {
|
|
9
|
+
content: [
|
|
10
|
+
{
|
|
11
|
+
type: "text",
|
|
12
|
+
text: JSON.stringify({ error: "missing_text" })
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const userId = config.lineDefaultUserId || messageStore.getDefaultUserId();
|
|
18
|
+
if (!userId) {
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{
|
|
22
|
+
type: "text",
|
|
23
|
+
text: JSON.stringify({ error: "no_user_registered" })
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const response = await lineClient.pushText(userId, text);
|
|
30
|
+
messageStore.insertOutgoing({
|
|
31
|
+
correlationId,
|
|
32
|
+
text,
|
|
33
|
+
userId,
|
|
34
|
+
lineMessageId: response.messageId,
|
|
35
|
+
timestamp: Date.now()
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: JSON.stringify({ success: true, correlationId })
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
logger.error({ error }, "LINE push failed");
|
|
48
|
+
return {
|
|
49
|
+
content: [
|
|
50
|
+
{
|
|
51
|
+
type: "text",
|
|
52
|
+
text: JSON.stringify({ error: "push_failed" })
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=sendMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendMessage.js","sourceRoot":"","sources":["../../../src/tools/sendMessage.ts"],"names":[],"mappings":";;AAKA,8CAoEC;AAtED,sCAAoD;AAE7C,KAAK,UAAU,iBAAiB,CAAC,EACtC,MAAM,EACN,YAAY,EACZ,UAAU,EACV,MAAM,GAAG,eAAa,EACtB,IAAI,EACJ,aAAa,EAQd;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0B,CAAC;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;iBAChD;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,IAAI,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;iBACtD;aACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzD,YAAY,CAAC,cAAc,CAAC;YAC1B,aAAa;YACb,IAAI;YACJ,MAAM;YACN,aAAa,EAAE,QAAQ,CAAC,SAAS;YACjC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;iBACvD;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;iBAC/C;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleSetStatus = handleSetStatus;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
5
|
+
function handleSetStatus({ statusStore, logger = logger_1.logger }, args) {
|
|
6
|
+
const input = args;
|
|
7
|
+
statusStore.setStatus({
|
|
8
|
+
status: input.status,
|
|
9
|
+
description: input.description ?? null,
|
|
10
|
+
prompt: input.prompt ?? null,
|
|
11
|
+
result: input.result ?? null
|
|
12
|
+
});
|
|
13
|
+
logger.info({ status: input.status }, "Status updated");
|
|
14
|
+
return {
|
|
15
|
+
content: [
|
|
16
|
+
{
|
|
17
|
+
type: "text",
|
|
18
|
+
text: "ok"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=setStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setStatus.js","sourceRoot":"","sources":["../../../src/tools/setStatus.ts"],"names":[],"mappings":";;AAIA,0CA0BC;AA7BD,sCAAoD;AAGpD,SAAgB,eAAe,CAC7B,EACE,WAAW,EACX,MAAM,GAAG,eAAa,EACsC,EAC9D,IAA6B;IAE7B,MAAM,KAAK,GAAG,IAAsB,CAAC;IAErC,WAAW,CAAC,SAAS,CAAC;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;QACtC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;QAC5B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;KAC7B,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAExD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI;aACX;SACF;KACF,CAAC;AACJ,CAAC"}
|