@thesashadev/girl-agent 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cli.js +71 -21
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.15
4
+
5
+ Дата: 2026-05-08
6
+
7
+ - Merge pull request #62 from TheSashaDev/devin/1778239329-fix-proactive-memory-and-username
8
+ - fix: proactive messages account for conversation memory + add TG identity to system prompt
9
+
10
+ ## 0.1.14
11
+
12
+ Дата: 2026-05-08
13
+
14
+ - Merge pull request #59 from TheSashaDev/devin/1778231542-oauth-fixed-port
15
+ - fix: update OAuth client credentials and add client_secret to token requests
16
+ - fix: use fixed port 3000 for OAuth callback
17
+
3
18
  ## 0.1.13
4
19
 
5
20
  Дата: 2026-05-08
package/dist/cli.js CHANGED
@@ -209,6 +209,16 @@ function makeUserbotAdapter(cfg) {
209
209
  const peer = await resolvePeer(chatId);
210
210
  await client.deleteMessages(peer, messageIds, { revoke });
211
211
  },
212
+ getSelf() {
213
+ if (!me) return {};
214
+ const parts = [];
215
+ if (me.firstName) parts.push(me.firstName);
216
+ if (me.lastName) parts.push(me.lastName);
217
+ return {
218
+ username: me.username ?? void 0,
219
+ displayName: parts.join(" ") || void 0
220
+ };
221
+ },
212
222
  async stop() {
213
223
  await client.disconnect();
214
224
  }
@@ -282,6 +292,7 @@ function makeBotAdapter(cfg) {
282
292
  const token = cfg.telegram.botToken;
283
293
  if (!token) throw new Error("BOT_TOKEN missing");
284
294
  const bot = new Bot(token);
295
+ let selfInfo = {};
285
296
  return {
286
297
  async start(onMessage) {
287
298
  bot.on("message", async (ctx) => {
@@ -301,6 +312,14 @@ function makeBotAdapter(cfg) {
301
312
  });
302
313
  bot.start({ drop_pending_updates: true }).catch(() => {
303
314
  });
315
+ try {
316
+ const me = await bot.api.getMe();
317
+ selfInfo = {
318
+ username: me.username ?? void 0,
319
+ displayName: [me.first_name, me.last_name].filter(Boolean).join(" ") || void 0
320
+ };
321
+ } catch {
322
+ }
304
323
  },
305
324
  async sendText(chatId, text) {
306
325
  if (hasSpoilers(text)) {
@@ -332,6 +351,9 @@ function makeBotAdapter(cfg) {
332
351
  async sendSticker(chatId, fileId) {
333
352
  await bot.api.sendSticker(chatId, fileId);
334
353
  },
354
+ getSelf() {
355
+ return selfInfo;
356
+ },
335
357
  async stop() {
336
358
  await bot.stop();
337
359
  }
@@ -1070,14 +1092,16 @@ var GIRLAI_BASE = "https://api.girl-agent.com";
1070
1092
  var AUTHORIZE_URL = `${GIRLAI_BASE}/oauth/authorize`;
1071
1093
  var TOKEN_URL = `${GIRLAI_BASE}/oauth/token`;
1072
1094
  var REVOKE_URL = `${GIRLAI_BASE}/oauth/revoke`;
1073
- var CLIENT_ID = "girl-agent-cli";
1095
+ var CLIENT_ID = "oac_dcce490e74a452a9ed20";
1096
+ var CLIENT_SECRET = "abnfSGmeisM7SFdMn_c1MwFYAHaqzgs7";
1097
+ var CALLBACK_PORT = 3e3;
1098
+ var REDIRECT_URI = `http://localhost:${CALLBACK_PORT}/callback`;
1074
1099
  async function runOAuthFlow(log) {
1075
1100
  const state = crypto.randomBytes(16).toString("hex");
1076
- const { port, waitForCode, close } = await startCallbackServer(state);
1077
- const redirectUri = `http://localhost:${port}/callback`;
1101
+ const { waitForCode, close } = await startCallbackServer(state);
1078
1102
  const authorizeParams = new URLSearchParams({
1079
1103
  client_id: CLIENT_ID,
1080
- redirect_uri: redirectUri,
1104
+ redirect_uri: REDIRECT_URI,
1081
1105
  response_type: "code",
1082
1106
  state
1083
1107
  });
@@ -1091,13 +1115,14 @@ async function runOAuthFlow(log) {
1091
1115
  close();
1092
1116
  }
1093
1117
  log("\u043A\u043E\u0434 \u043F\u043E\u043B\u0443\u0447\u0435\u043D, \u043E\u0431\u043C\u0435\u043D\u0438\u0432\u0430\u044E \u043D\u0430 \u0442\u043E\u043A\u0435\u043D...");
1094
- return exchangeCode(code, redirectUri);
1118
+ return exchangeCode(code, REDIRECT_URI);
1095
1119
  }
1096
- async function exchangeCode(code, redirectUri) {
1120
+ async function exchangeCode(code, redirectUri = REDIRECT_URI) {
1097
1121
  const body = new URLSearchParams({
1098
1122
  grant_type: "authorization_code",
1099
1123
  code,
1100
1124
  client_id: CLIENT_ID,
1125
+ client_secret: CLIENT_SECRET,
1101
1126
  redirect_uri: redirectUri
1102
1127
  });
1103
1128
  const res = await fetch(TOKEN_URL, {
@@ -1120,7 +1145,8 @@ async function refreshAccessToken(refreshToken) {
1120
1145
  const body = new URLSearchParams({
1121
1146
  grant_type: "refresh_token",
1122
1147
  refresh_token: refreshToken,
1123
- client_id: CLIENT_ID
1148
+ client_id: CLIENT_ID,
1149
+ client_secret: CLIENT_SECRET
1124
1150
  });
1125
1151
  const res = await fetch(TOKEN_URL, {
1126
1152
  method: "POST",
@@ -1180,11 +1206,8 @@ function startCallbackServer(expectedState) {
1180
1206
  clearTimeout(timeout);
1181
1207
  resolveCode(code);
1182
1208
  });
1183
- server.listen(0, "127.0.0.1", () => {
1184
- const addr = server.address();
1185
- const port = typeof addr === "object" && addr ? addr.port : 0;
1209
+ server.listen(CALLBACK_PORT, "127.0.0.1", () => {
1186
1210
  resolveSetup({
1187
- port,
1188
1211
  waitForCode,
1189
1212
  close: () => server.close()
1190
1213
  });
@@ -4005,6 +4028,10 @@ ${ctx.romanticApproach ? `\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435
4005
4028
  ANTI_AI_RULES,
4006
4029
  communicationFragment,
4007
4030
  `# \u0422\u042B \u2014 ${cfg.name}, ${cfg.age}, ${cfg.nationality === "UA" ? "\u0423\u043A\u0440\u0430\u0438\u043D\u0430" : "\u0420\u043E\u0441\u0441\u0438\u044F / \u0421\u041D\u0413"}`,
4031
+ ctx.tgUsername || ctx.tgDisplayName ? `# \u0422\u0432\u043E\u0439 \u0430\u043A\u043A\u0430\u0443\u043D\u0442 \u0432 \u0422\u0413${ctx.tgUsername ? `
4032
+ \u0422\u0432\u043E\u0439 \u044E\u0437\u0435\u0440\u043D\u0435\u0439\u043C \u0432 \u0442\u0433: @${ctx.tgUsername.replace(/^@/, "")}` : ""}${ctx.tgDisplayName ? `
4033
+ \u0422\u0432\u043E\u0451 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0435 \u0438\u043C\u044F \u0432 \u0442\u0433: ${ctx.tgDisplayName}` : ""}
4034
+ \u0423\u0447\u0442\u0438: \u0438\u043C\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u044B (${cfg.name}) \u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0435 \u0438\u043C\u044F \u0432 \u0442\u0433 \u043C\u043E\u0433\u0443\u0442 \u043E\u0442\u043B\u0438\u0447\u0430\u0442\u044C\u0441\u044F.` : "",
4008
4035
  `\u0427\u0430\u0441\u043E\u0432\u043E\u0439 \u043F\u043E\u044F\u0441: ${cfg.tz}. \u0423 \u0442\u0435\u0431\u044F \u0441\u0435\u0439\u0447\u0430\u0441: ${localTime}. \u041F\u0430\u0442\u0442\u0435\u0440\u043D \u043F\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044F \u0432 \u0442\u0433: ${presenceProfile.pattern}. \u0423\u0447\u0438\u0442\u044B\u0432\u0430\u0439 \u2014 \u0433\u043B\u0443\u0431\u043E\u043A\u0430\u044F \u043D\u043E\u0447\u044C = \u043B\u0438\u0431\u043E \u0441\u043F\u0438\u0448\u044C \u0438 \u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0448\u044C, \u043B\u0438\u0431\u043E \u0442\u0440\u0435\u0432\u043E\u0436\u043D\u043E. \u0423\u0442\u0440\u043E = \u0432\u044F\u043B\u043E. \u0414\u0435\u043D\u044C/\u0432\u0435\u0447\u0435\u0440 = \u0430\u043A\u0442\u0438\u0432\u043D\u0430.`,
4009
4036
  cfg.nationality === "UA" ? `# \u042F\u0437\u044B\u043A
4010
4037
  \u041F\u0438\u0448\u0435\u0448\u044C \u041D\u0410 \u0420\u0423\u0421\u0421\u041A\u041E\u041C. \u0420\u0435\u0430\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0432\u0443\u0448\u043A\u0438 \u0432 \u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u043E\u043C \u0442\u0433 \u0447\u0430\u0449\u0435 \u043F\u0438\u0448\u0443\u0442 \u0440\u0443\u0441\u0441\u043A\u0438\u043C \u2014 \u043D\u0435 \u0432\u044B\u043F\u0435\u043D\u0434\u0440\u0438\u0432\u0430\u0439\u0441\u044F \u0447\u0438\u0441\u0442\u043E-\u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0438\u043C. \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C \u043B\u0451\u0433\u043A\u0438\u0439 \u0441\u0443\u0440\u0436\u0438\u043A: \u043F\u0430\u0440\u0430 \u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u0438\u0445 \u0441\u043B\u043E\u0432 \u0432 \u043D\u0435\u0434\u0435\u043B\u044E \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0438 ('\u0448\u043E', '\u043C\u0430\u0431\u0443\u0442\u044C', '\u0442\u0440\u043E\u0445\u0438', '\u044F\u043A', '\u043D\u0443 \u0448\u043E', '\u0434\u044F\u043A\u0443\u044E') \u2014 \u043D\u043E \u043D\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 ~10% \u0442\u0435\u043A\u0441\u0442\u0430. \u041F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u043D\u0430 \u0443\u043A\u0440\u0430\u0438\u043D\u0441\u043A\u043E\u043C \u041D\u0415 \u043F\u0438\u0448\u0438, \u044D\u0442\u043E \u043D\u0435\u0440\u0435\u0430\u043B\u0438\u0441\u0442\u0438\u0447\u043D\u043E \u0434\u043B\u044F \u0442\u0433.` : `# \u042F\u0437\u044B\u043A
@@ -4555,6 +4582,8 @@ var SYS_AUTONOMOUS = `\u0422\u044B \u2014 \u0432\u043D\u0443\u0442\u0440\u0435\u
4555
4582
 
4556
4583
  \u0417\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0440\u0435\u0430\u043B\u0438\u0441\u0442\u0438\u0447\u043D\u044B\u0435 \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u043F\u043E\u0432\u043E\u0434\u044B \u043D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0435\u043C\u0443 \u0441\u0435\u0433\u043E\u0434\u043D\u044F/\u0437\u0430\u0432\u0442\u0440\u0430. \u042D\u0442\u043E \u041D\u0415 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C \u0438 \u041D\u0415 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442. \u042D\u0442\u043E \u0436\u0438\u0432\u0430\u044F \u0434\u0435\u0432\u0443\u0448\u043A\u0430.
4557
4584
 
4585
+ \u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u041D\u0415 \u041F\u0420\u0418\u0414\u0423\u041C\u042B\u0412\u0410\u0419 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0438 \u0442\u0435\u043C\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435 \u0431\u044B\u043B\u043E \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435. \u0415\u0441\u043B\u0438 \u0442\u044B \u0441\u0441\u044B\u043B\u0430\u0435\u0448\u044C\u0441\u044F \u043D\u0430 \u0442\u043E \u0447\u0442\u043E \u043E\u043D \u0440\u0430\u0441\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u043B \u043F\u0440\u043E X \u2014 \u043F\u0440\u043E\u0432\u0435\u0440\u044C \u0447\u0442\u043E X \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u0435\u0441\u0442\u044C \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435 \u0438\u043B\u0438 long-term memory. \u041D\u0435\u043B\u044C\u0437\u044F \u043F\u0438\u0441\u0430\u0442\u044C \u043F\u0440\u043E \u0442\u0435\u043C\u0443 \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u0432\u044B \u041D\u0418\u041A\u041E\u0413\u0414\u0410 \u043D\u0435 \u043E\u0431\u0441\u0443\u0436\u0434\u0430\u043B\u0438. \u041B\u0443\u0447\u0448\u0435 \u043F\u0438\u0448\u0438 \u043F\u0440\u043E \u0441\u0432\u043E\u044E \u0436\u0438\u0437\u043D\u044C (\u0441\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0439 \u0434\u0435\u043D\u044C, \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0438\u0437 daily-life) \u0447\u0435\u043C \u0441\u0441\u044B\u043B\u0430\u0439\u0441\u044F \u043D\u0430 \u043D\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0439 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440.
4586
+
4558
4587
  \u0412\u0435\u0440\u043D\u0438 \u0421\u0422\u0420\u041E\u0413\u041E JSON:
4559
4588
  {
4560
4589
  "items": [
@@ -4592,6 +4621,7 @@ ${currentAgenda.length ? JSON.stringify(currentAgenda.filter((a) => a.state ===
4592
4621
  - \u042D\u0442\u043E \u0438\u043C\u0435\u043D\u043D\u043E \u0415\u0401 \u0438\u043D\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u044B: "\u0431\u043B\u0438\u043D \u0443 \u043D\u0430\u0441 \u0449\u0430\u0441...", "\u0442\u044B \u0433\u0434\u0435 \u043F\u0440\u043E\u043F\u0430\u043B", "\u044F \u0449\u0430\u0441 \u0442\u0430\u043A\u043E\u0435 \u0443\u0432\u0438\u0434\u0435\u043B\u0430", "\u043C\u043D\u0435 \u0441\u043D\u0438\u043B\u0430\u0441\u044C \u0444\u0438\u0433\u043D\u044F", "\u043C\u0430\u043C\u0430 \u0431\u0435\u0441\u0438\u0442", "\u0441\u043A\u0438\u043D\u0443\u0442\u044C \u0431\u044B \u0442\u0435\u0431\u0435 \u043D\u043E \u043B\u0430\u0434\u043D\u043E", "\u044F \u0443\u0441\u0442\u0430\u043B\u0430".
4593
4622
  - \u041D\u0435 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0439 \u0441\u043A\u0443\u0447\u043D\u043E\u0435 "\u043A\u0430\u043A \u0434\u0435\u043B\u0430" \u0431\u0435\u0437 \u043F\u0440\u0438\u0447\u0438\u043D\u044B.
4594
4623
  - \u041D\u0435 \u0431\u0443\u0434\u044C \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043B\u0438\u043F\u043A\u043E\u0439 \u043D\u0430 \u0445\u043E\u043B\u043E\u0434\u043D\u044B\u0445 \u0441\u0442\u0430\u0434\u0438\u044F\u0445.
4624
+ - \u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u041D\u0415 \u0412\u042B\u0414\u0423\u041C\u042B\u0412\u0410\u0419 \u0442\u0435\u043C\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435 \u0431\u044B\u043B\u043E \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435 \u0438\u043B\u0438 long-term memory. \u041D\u0435 \u0441\u0441\u044B\u043B\u0430\u0439\u0441\u044F \u043D\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u044F/\u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u041D\u0415 \u0431\u044B\u043B\u043E. \u0415\u0441\u043B\u0438 \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u043D\u0435\u0442 \u0443\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u044F \u0442\u0435\u043C\u044B \u2014 \u043D\u0435 \u043F\u0438\u0448\u0438 \u043F\u0440\u043E \u043D\u0435\u0451. \u041B\u0443\u0447\u0448\u0435 \u0441\u043E\u0437\u0434\u0430\u0439 item \u043F\u0440\u043E \u0441\u0432\u043E\u044E \u0436\u0438\u0437\u043D\u044C/\u0434\u0435\u043D\u044C/\u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u0435.
4595
4625
  - \u041D\u0430 dating-early+ \u043C\u043E\u0436\u043D\u043E \u0441\u043A\u0443\u0447\u0430\u0442\u044C, \u0440\u0435\u0432\u043D\u043E\u0432\u0430\u0442\u044C, \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C, \u043F\u0438\u0441\u0430\u0442\u044C \u0431\u044B\u0442\u043E\u0432\u043E\u0435.
4596
4626
  - pingAt \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043C, \u043D\u0435 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0441\u043D\u0430 \u0438 \u043D\u0435 \u0432\u043E \u0432\u0440\u0435\u043C\u044F blocks \u0441 phoneAvailable=false.
4597
4627
  - \u0420\u0430\u0437\u043D\u043E\u0441\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043C\u0438\u043D\u0438\u043C\u0443\u043C \u043D\u0430 45 \u043C\u0438\u043D\u0443\u0442.
@@ -4697,6 +4727,7 @@ autonomous:${dateKey} created=0`.trim() + "\n");
4697
4727
  const rel = await readRelationship(cfg.slug);
4698
4728
  const persona = (await readMd(cfg.slug, "persona.md")).slice(0, 900);
4699
4729
  const speech = (await readMd(cfg.slug, "speech.md")).slice(0, 600);
4730
+ const longTerm = (await readMd(cfg.slug, "memory/long-term.md")).slice(0, 1200);
4700
4731
  const histStr = history.slice(-16).map((m) => `${m.role === "user" ? "\u043E\u043D" : "\u043E\u043D\u0430"}: ${m.content}`).join("\n");
4701
4732
  const stateBlock = [
4702
4733
  `# \u0421\u0442\u0430\u0434\u0438\u044F: ${stage.label} (${cfg.stage})`,
@@ -4706,8 +4737,10 @@ autonomous:${dateKey} created=0`.trim() + "\n");
4706
4737
  `# persona:
4707
4738
  ${persona}`,
4708
4739
  `# speech:
4709
- ${speech}`
4710
- ].join("\n\n");
4740
+ ${speech}`,
4741
+ longTerm ? `# long-term memory (\u0447\u0442\u043E \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u043E \u043E \u043D\u0451\u043C):
4742
+ ${longTerm}` : "# long-term memory: (\u043F\u0443\u0441\u0442\u043E \u2014 \u043F\u043E\u043A\u0430 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0437\u043D\u0430\u0435\u0448\u044C \u043E \u043D\u0451\u043C, \u041D\u0415 \u043F\u0440\u0438\u0434\u0443\u043C\u044B\u0432\u0430\u0439 \u0444\u0430\u043A\u0442\u044B)"
4743
+ ].filter(Boolean).join("\n\n");
4711
4744
  let items = [];
4712
4745
  try {
4713
4746
  const raw = await llm.chat(
@@ -5001,12 +5034,14 @@ var Runtime = class extends EventEmitter {
5001
5034
  pendingReplySeq = /* @__PURE__ */ new Map();
5002
5035
  pendingReplyIncoming = /* @__PURE__ */ new Map();
5003
5036
  incomingSeq = /* @__PURE__ */ new Map();
5037
+ tgSelf = {};
5004
5038
  async start() {
5005
5039
  this.presenceProfile = computePresenceProfile(this.cfg);
5006
5040
  this.mcps = await startMcpServers(this.cfg);
5007
5041
  this.emit("event", { type: "info", text: `MCP started: ${this.mcps.map((m) => m.id).join(", ") || "none"}` });
5008
5042
  this.tg = await makeTgAdapter(this.cfg);
5009
5043
  await this.tg.start((m) => this.handleIncoming(m));
5044
+ if (this.tg.getSelf) this.tgSelf = this.tg.getSelf();
5010
5045
  this.emit("event", { type: "info", text: `Telegram ${this.cfg.mode} \u0437\u0430\u043F\u0443\u0449\u0435\u043D. \u041F\u0440\u043E\u0444\u0438\u043B\u044C: ${this.cfg.slug} | presence: ${this.presenceProfile.pattern} | communication: ${communicationProfileLabel(normalizeCommunicationProfile(this.cfg))}` });
5011
5046
  this.lastStage = this.cfg.stage;
5012
5047
  this.refreshDailyLife().catch(() => {
@@ -5204,7 +5239,9 @@ ${m.text}` : media;
5204
5239
  incoming: incomingText,
5205
5240
  relationshipScope: scope,
5206
5241
  committedPrimary: this.primaryIsCommitted(),
5207
- realism
5242
+ realism,
5243
+ tgUsername: this.tgSelf.username,
5244
+ tgDisplayName: this.tgSelf.displayName
5208
5245
  });
5209
5246
  const reply = sanitizeModelReply(await this.llm.chat([
5210
5247
  {
@@ -5229,7 +5266,9 @@ ${m.text}` : media;
5229
5266
  incoming: incomingText,
5230
5267
  relationshipScope: scope,
5231
5268
  committedPrimary: this.primaryIsCommitted(),
5232
- realism
5269
+ realism,
5270
+ tgUsername: this.tgSelf.username,
5271
+ tgDisplayName: this.tgSelf.displayName
5233
5272
  });
5234
5273
  const label = kind === "photo" ? "\u0444\u043E\u0442\u043E/\u0441\u0435\u043B\u0444\u0438" : kind === "video" ? "\u0432\u0438\u0434\u0435\u043E" : kind === "voice" ? "\u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435" : "\u043A\u0440\u0443\u0436\u043E\u0447\u0435\u043A";
5235
5274
  const reply = sanitizeModelReply(await this.llm.chat([
@@ -5478,7 +5517,9 @@ ${m.text}` : media;
5478
5517
  committedPrimary: this.primaryIsCommitted(),
5479
5518
  romanticApproach,
5480
5519
  realism,
5481
- media: incoming?.media
5520
+ media: incoming?.media,
5521
+ tgUsername: this.tgSelf.username,
5522
+ tgDisplayName: this.tgSelf.displayName
5482
5523
  });
5483
5524
  const scopeHint = scope === "acquaintance" ? "\n\u042D\u0442\u043E \u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0438\u0439 \u043B\u0438\u0447\u043D\u044B\u0439 \u0447\u0430\u0442, \u043D\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043F\u0430\u0440\u0435\u043D\u044C. \u041D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u043F\u0430\u043C\u044F\u0442\u044C/\u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u044F \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0433\u043E \u043F\u0430\u0440\u043D\u044F. \u0415\u0441\u043B\u0438 \u0437\u0430\u0445\u043E\u0434 \u0440\u043E\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u2014 \u043F\u043E\u0441\u0442\u0430\u0432\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0443. \u0415\u0441\u043B\u0438 \u0432\u043E\u043F\u0440\u043E\u0441 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 \u2014 \u043E\u0442\u0432\u0435\u0442\u044C \u043F\u043E \u043B\u0435\u0433\u0435\u043D\u0434\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u043E." : "";
5484
5525
  const messages = [
@@ -5608,27 +5649,36 @@ ${tick.intent === "short" ? "\u041E\u0442\u0432\u0435\u0447\u0430\u0439 \u043E\u
5608
5649
  async composeProactiveMessage(item, hist) {
5609
5650
  const conflict = await readConflict(this.cfg.slug);
5610
5651
  const realism = await loadRealismContext(this.cfg, item.about);
5611
- const sys = await buildSystemPrompt(this.cfg, { dailyLife: this.dailyLife, conflict, realism });
5652
+ const sys = await buildSystemPrompt(this.cfg, { dailyLife: this.dailyLife, conflict, realism, tgUsername: this.tgSelf.username, tgDisplayName: this.tgSelf.displayName });
5653
+ const lastMessages = hist.slice(-10);
5654
+ const herLastMessages = lastMessages.filter((t) => t.role === "assistant").map((t) => t.content);
5655
+ const alreadySaidHint = herLastMessages.length ? `
5656
+
5657
+ \u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0422\u0412\u041E\u0418 (\u0443\u0436\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0435) \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u044D\u0442\u043E\u043C \u0447\u0430\u0442\u0435:
5658
+ ${herLastMessages.map((m) => `- "${m}"`).join("\n")}
5659
+ \u041D\u0415 \u041F\u041E\u0412\u0422\u041E\u0420\u042F\u0419 \u0442\u043E \u0447\u0442\u043E \u0442\u044B \u0443\u0436\u0435 \u043F\u0438\u0441\u0430\u043B\u0430. \u0415\u0441\u043B\u0438 \u0442\u044B \u0443\u0436\u0435 \u0437\u0434\u043E\u0440\u043E\u0432\u0430\u043B\u0430\u0441\u044C \u2014 \u041D\u0415 \u0437\u0434\u043E\u0440\u043E\u0432\u0430\u0439\u0441\u044F \u0441\u043D\u043E\u0432\u0430. \u0415\u0441\u043B\u0438 \u0442\u044B \u0443\u0436\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u0430 \u2014 \u043D\u0435 \u0434\u0443\u0431\u043B\u0438\u0440\u0443\u0439 \u0441\u0432\u043E\u0439 \u043E\u0442\u0432\u0435\u0442.` : "";
5612
5660
  const proactiveHint = `
5613
5661
 
5614
5662
  # \u041F\u0420\u041E\u0410\u041A\u0422\u0418\u0412\u041D\u041E\u0415 \u0421\u041E\u041E\u0411\u0429\u0415\u041D\u0418\u0415
5615
5663
  \u0422\u044B \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0430\u043C\u0430 \u043F\u0438\u0448\u0435\u0448\u044C \u0435\u043C\u0443 \u043F\u0435\u0440\u0432\u0430\u044F. \u041D\u0435 \u043E\u043D \u0442\u0435\u0431\u0435. \u041A\u043E\u043D\u0442\u0435\u043A\u0441\u0442:
5616
- - \u0427\u0442\u043E \u0443 \u041D\u0415\u0413\u041E \u0437\u0430 \u0441\u043E\u0431\u044B\u0442\u0438\u0435/\u0442\u0435\u043C\u0430: "${item.about}"
5664
+ - \u0422\u0435\u043C\u0430/\u043F\u043E\u0432\u043E\u0434: "${item.about}"
5617
5665
  - \u041F\u043E\u0447\u0435\u043C\u0443 \u0442\u044B \u043F\u0438\u0448\u0435\u0448\u044C: "${item.reason}"
5618
5666
  - \u0412\u0430\u0436\u043D\u043E\u0441\u0442\u044C \u0434\u043B\u044F \u0442\u0435\u0431\u044F: ${item.importance}/3
5619
5667
  - \u041F\u043E\u043F\u044B\u0442\u043A\u0430 \u2116${item.attempts + 1}
5620
5668
 
5621
5669
  \u0412\u0410\u0416\u041D\u041E:
5622
- - \u041D\u0435 \u043F\u0438\u0448\u0438 "\u043F\u0440\u0438\u0432\u0435\u0442, \u043A\u0430\u043A \u0434\u0435\u043B\u0430" \u0441\u0443\u0445\u043E. \u041F\u0438\u0448\u0438 \u043A\u0430\u043A \u0436\u0438\u0432\u043E\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A, \u0412\u0421\u041F\u041E\u041C\u041D\u0418\u0412 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442.
5670
+ - \u041D\u0435 \u043F\u0438\u0448\u0438 "\u043F\u0440\u0438\u0432\u0435\u0442, \u043A\u0430\u043A \u0434\u0435\u043B\u0430" \u0441\u0443\u0445\u043E. \u041F\u0438\u0448\u0438 \u043A\u0430\u043A \u0436\u0438\u0432\u043E\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A.
5623
5671
  - \u0415\u0441\u043B\u0438 \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u044C 1 \u2014 \u043A\u043E\u0440\u043E\u0442\u043A\u043E\u0435 \u043B\u044E\u0431\u043E\u043F\u044B\u0442\u0441\u0442\u0432\u043E ("\u043D\u0443 \u043A\u0430\u043A \u0442\u0430\u043C")
5624
5672
  - \u0415\u0441\u043B\u0438 2 \u2014 \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0435\u0441 ("\u043D\u0443 \u043A\u0430\u043A, \u043F\u0440\u043E\u0448\u043B\u043E \u0443\u0436\u0435?")
5625
5673
  - \u0415\u0441\u043B\u0438 3 \u2014 \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u043F\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0448\u044C, \u043C\u043E\u0436\u043D\u043E 2-3 \u043F\u0443\u0437\u044B\u0440\u044F, \u044D\u043C\u043E\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E.
5626
5674
  - \u041D\u0415 \u0443\u043F\u043E\u043C\u0438\u043D\u0430\u0439 \u0447\u0442\u043E "\u043F\u043E\u043C\u043D\u0438\u043B\u0430" \u0438\u043B\u0438 "\u0437\u0430\u043F\u0438\u0441\u0430\u043B\u0430" \u2014 \u043F\u0440\u043E\u0441\u0442\u043E \u043F\u0438\u0448\u0435\u0448\u044C \u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u0430\u044F \u0434\u0435\u0432\u0443\u0448\u043A\u0430.
5627
- - \u0415\u0441\u043B\u0438 \u044D\u0442\u043E \u0443\u0436\u0435 \u043D\u0435 \u043F\u0435\u0440\u0432\u0430\u044F \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u2014 \u0443\u0447\u0442\u0438 \u044D\u0442\u043E (\u043C\u0431 \u043E\u0431\u0438\u0436\u0435\u043D\u043D\u043E "\u043D\u0443 \u0442\u044B \u0438 \u043D\u0435 \u043F\u0438\u0448\u0435\u0448\u044C" \u0438\u043B\u0438 \u043C\u044F\u0433\u043A\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0438).`;
5675
+ - \u0415\u0441\u043B\u0438 \u044D\u0442\u043E \u0443\u0436\u0435 \u043D\u0435 \u043F\u0435\u0440\u0432\u0430\u044F \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u2014 \u0443\u0447\u0442\u0438 \u044D\u0442\u043E (\u043C\u0431 \u043E\u0431\u0438\u0436\u0435\u043D\u043D\u043E "\u043D\u0443 \u0442\u044B \u0438 \u043D\u0435 \u043F\u0438\u0448\u0435\u0448\u044C" \u0438\u043B\u0438 \u043C\u044F\u0433\u043A\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0438).
5676
+ - \u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 \u0422\u041E\u041B\u042C\u041A\u041E \u0442\u0435\u043C\u044B \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0420\u0415\u0410\u041B\u042C\u041D\u041E \u043E\u0431\u0441\u0443\u0436\u0434\u0430\u043B\u0438\u0441\u044C \u0432 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0435 \u0438\u043B\u0438 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u044B \u0432 long-term memory. \u041D\u0415 \u041F\u0420\u0418\u0414\u0423\u041C\u042B\u0412\u0410\u0419 \u0444\u0430\u043A\u0442\u044B \u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043D\u0435 \u0431\u044B\u043B\u043E. \u0415\u0441\u043B\u0438 \u0442\u0435\u043C\u0430 "${item.about}" \u041D\u0415 \u0443\u043F\u043E\u043C\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0438 \u0438 \u043D\u0435 \u0432 long-term memory \u2014 \u041D\u0415 \u0441\u0441\u044B\u043B\u0430\u0439\u0441\u044F \u043D\u0430 \u043D\u0435\u0451 \u043A\u0430\u043A \u043D\u0430 \u043E\u0431\u0449\u0443\u044E \u0442\u0435\u043C\u0443, \u0430 \u043D\u0430\u043F\u0438\u0448\u0438 \u043E\u0442 \u0441\u0435\u0431\u044F \u043A\u0430\u043A \u0441\u0432\u043E\u044E \u043D\u043E\u0432\u043E\u0441\u0442\u044C/\u043C\u044B\u0441\u043B\u044C.
5677
+ - \u041A\u0420\u0418\u0422\u0418\u0427\u041D\u041E: \u043F\u043E\u0441\u043C\u043E\u0442\u0440\u0438 \u043D\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0438. \u0415\u0441\u043B\u0438 \u0442\u044B \u0423\u0416\u0415 \u0437\u0434\u043E\u0440\u043E\u0432\u0430\u043B\u0430\u0441\u044C \u0438\u043B\u0438 \u043E\u0442\u0432\u0435\u0447\u0430\u043B\u0430 \u2014 \u041D\u0415 \u043D\u0430\u0447\u0438\u043D\u0430\u0439 \u0441\u043D\u043E\u0432\u0430 \u0441 "\u043F\u0440\u0438\u0432\u0435\u0442". \u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0439 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E.${alreadySaidHint}`;
5628
5678
  const messages = [
5629
5679
  { role: "system", content: sys + proactiveHint },
5630
5680
  ...hist.slice(-20).map((t) => ({ role: t.role, content: t.content })),
5631
- { role: "user", content: "[system: \u043F\u043E\u0440\u0430 \u043F\u0438\u0441\u0430\u0442\u044C \u0435\u043C\u0443 \u043F\u0435\u0440\u0432\u043E\u0439 \u043F\u043E \u0442\u0435\u043C\u0435 \u0432\u044B\u0448\u0435. \u0421\u0444\u043E\u0440\u043C\u0443\u043B\u0438\u0440\u0443\u0439 \u0435\u0451 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435.]" }
5681
+ { role: "user", content: "[system: \u043F\u043E\u0440\u0430 \u043F\u0438\u0441\u0430\u0442\u044C \u0435\u043C\u0443 \u043F\u0435\u0440\u0432\u043E\u0439 \u043F\u043E \u0442\u0435\u043C\u0435 \u0432\u044B\u0448\u0435. \u0421\u0444\u043E\u0440\u043C\u0443\u043B\u0438\u0440\u0443\u0439 \u0435\u0451 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435. \u041D\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0439 \u0442\u043E \u0447\u0442\u043E \u0443\u0436\u0435 \u0433\u043E\u0432\u043E\u0440\u0438\u043B\u0430.]" }
5632
5682
  ];
5633
5683
  const reply = sanitizeModelReply(await this.llm.chat(messages, { temperature: 0.95, maxTokens: 3500 }));
5634
5684
  return reply.trim();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thesashadev/girl-agent",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Telegram AI persona engine with memory, schedule, relationship state and MTProto userbot mode.",
5
5
  "type": "module",
6
6
  "bin": {