harubashi 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.
Files changed (172) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +293 -0
  3. package/README.ru.md +293 -0
  4. package/dist/agent/agent.module.d.ts +2 -0
  5. package/dist/agent/agent.module.js +34 -0
  6. package/dist/agent/agent.module.js.map +1 -0
  7. package/dist/agent/agent.processor.d.ts +31 -0
  8. package/dist/agent/agent.processor.js +266 -0
  9. package/dist/agent/agent.processor.js.map +1 -0
  10. package/dist/agent/command-guard.service.d.ts +10 -0
  11. package/dist/agent/command-guard.service.js +48 -0
  12. package/dist/agent/command-guard.service.js.map +1 -0
  13. package/dist/agent/interruption.service.d.ts +11 -0
  14. package/dist/agent/interruption.service.js +52 -0
  15. package/dist/agent/interruption.service.js.map +1 -0
  16. package/dist/agent/system-executor.service.d.ts +32 -0
  17. package/dist/agent/system-executor.service.js +200 -0
  18. package/dist/agent/system-executor.service.js.map +1 -0
  19. package/dist/app.module.d.ts +2 -0
  20. package/dist/app.module.js +38 -0
  21. package/dist/app.module.js.map +1 -0
  22. package/dist/bin.d.ts +2 -0
  23. package/dist/bin.js +137 -0
  24. package/dist/bin.js.map +1 -0
  25. package/dist/cli.d.ts +2 -0
  26. package/dist/cli.js +141 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/commands/config.command.d.ts +2 -0
  29. package/dist/commands/config.command.js +83 -0
  30. package/dist/commands/config.command.js.map +1 -0
  31. package/dist/commands/logs.command.d.ts +5 -0
  32. package/dist/commands/logs.command.js +130 -0
  33. package/dist/commands/logs.command.js.map +1 -0
  34. package/dist/commands/profile.command.d.ts +5 -0
  35. package/dist/commands/profile.command.js +293 -0
  36. package/dist/commands/profile.command.js.map +1 -0
  37. package/dist/commands/setup.command.d.ts +1 -0
  38. package/dist/commands/setup.command.js +94 -0
  39. package/dist/commands/setup.command.js.map +1 -0
  40. package/dist/commands/setup.helpers.d.ts +34 -0
  41. package/dist/commands/setup.helpers.js +265 -0
  42. package/dist/commands/setup.helpers.js.map +1 -0
  43. package/dist/commands/skills.command.d.ts +2 -0
  44. package/dist/commands/skills.command.js +111 -0
  45. package/dist/commands/skills.command.js.map +1 -0
  46. package/dist/common/adapters/cli-interaction.adapter.d.ts +8 -0
  47. package/dist/common/adapters/cli-interaction.adapter.js +67 -0
  48. package/dist/common/adapters/cli-interaction.adapter.js.map +1 -0
  49. package/dist/common/adapters/interaction-adapter.interface.d.ts +6 -0
  50. package/dist/common/adapters/interaction-adapter.interface.js +10 -0
  51. package/dist/common/adapters/interaction-adapter.interface.js.map +1 -0
  52. package/dist/common/constants.d.ts +3 -0
  53. package/dist/common/constants.js +7 -0
  54. package/dist/common/constants.js.map +1 -0
  55. package/dist/common/index.d.ts +4 -0
  56. package/dist/common/index.js +21 -0
  57. package/dist/common/index.js.map +1 -0
  58. package/dist/common/logger.d.ts +9 -0
  59. package/dist/common/logger.js +87 -0
  60. package/dist/common/logger.js.map +1 -0
  61. package/dist/common/paths.d.ts +12 -0
  62. package/dist/common/paths.js +28 -0
  63. package/dist/common/paths.js.map +1 -0
  64. package/dist/common/types/message.types.d.ts +48 -0
  65. package/dist/common/types/message.types.js +18 -0
  66. package/dist/common/types/message.types.js.map +1 -0
  67. package/dist/common/types/tool.types.d.ts +20 -0
  68. package/dist/common/types/tool.types.js +3 -0
  69. package/dist/common/types/tool.types.js.map +1 -0
  70. package/dist/common/utils/type-guards.d.ts +8 -0
  71. package/dist/common/utils/type-guards.js +46 -0
  72. package/dist/common/utils/type-guards.js.map +1 -0
  73. package/dist/config/config-loader.d.ts +6 -0
  74. package/dist/config/config-loader.js +90 -0
  75. package/dist/config/config-loader.js.map +1 -0
  76. package/dist/config/config.module.d.ts +2 -0
  77. package/dist/config/config.module.js +28 -0
  78. package/dist/config/config.module.js.map +1 -0
  79. package/dist/config/config.types.d.ts +55 -0
  80. package/dist/config/config.types.js +21 -0
  81. package/dist/config/config.types.js.map +1 -0
  82. package/dist/daemon.d.ts +2 -0
  83. package/dist/daemon.js +28 -0
  84. package/dist/daemon.js.map +1 -0
  85. package/dist/llm/anthropic/anthropic.provider.d.ts +15 -0
  86. package/dist/llm/anthropic/anthropic.provider.js +162 -0
  87. package/dist/llm/anthropic/anthropic.provider.js.map +1 -0
  88. package/dist/llm/google/google.provider.d.ts +14 -0
  89. package/dist/llm/google/google.provider.js +189 -0
  90. package/dist/llm/google/google.provider.js.map +1 -0
  91. package/dist/llm/llm-factory.service.d.ts +24 -0
  92. package/dist/llm/llm-factory.service.js +76 -0
  93. package/dist/llm/llm-factory.service.js.map +1 -0
  94. package/dist/llm/llm.interface.d.ts +19 -0
  95. package/dist/llm/llm.interface.js +5 -0
  96. package/dist/llm/llm.interface.js.map +1 -0
  97. package/dist/llm/llm.module.d.ts +2 -0
  98. package/dist/llm/llm.module.js +34 -0
  99. package/dist/llm/llm.module.js.map +1 -0
  100. package/dist/llm/nvidia/nvidia.provider.d.ts +11 -0
  101. package/dist/llm/nvidia/nvidia.provider.js +49 -0
  102. package/dist/llm/nvidia/nvidia.provider.js.map +1 -0
  103. package/dist/llm/openai/openai.provider.d.ts +9 -0
  104. package/dist/llm/openai/openai.provider.js +35 -0
  105. package/dist/llm/openai/openai.provider.js.map +1 -0
  106. package/dist/llm/openai-compatible/openai-compatible.helper.d.ts +4 -0
  107. package/dist/llm/openai-compatible/openai-compatible.helper.js +155 -0
  108. package/dist/llm/openai-compatible/openai-compatible.helper.js.map +1 -0
  109. package/dist/llm/proxy/proxy.provider.d.ts +9 -0
  110. package/dist/llm/proxy/proxy.provider.js +35 -0
  111. package/dist/llm/proxy/proxy.provider.js.map +1 -0
  112. package/dist/main.d.ts +1 -0
  113. package/dist/main.js +14 -0
  114. package/dist/main.js.map +1 -0
  115. package/dist/prisma/prisma.module.d.ts +2 -0
  116. package/dist/prisma/prisma.module.js +22 -0
  117. package/dist/prisma/prisma.module.js.map +1 -0
  118. package/dist/prisma/prisma.service.d.ts +9 -0
  119. package/dist/prisma/prisma.service.js +40 -0
  120. package/dist/prisma/prisma.service.js.map +1 -0
  121. package/dist/sessions/sessions.module.d.ts +2 -0
  122. package/dist/sessions/sessions.module.js +23 -0
  123. package/dist/sessions/sessions.module.js.map +1 -0
  124. package/dist/sessions/sessions.service.d.ts +21 -0
  125. package/dist/sessions/sessions.service.js +82 -0
  126. package/dist/sessions/sessions.service.js.map +1 -0
  127. package/dist/skills/definitions/directory_explorer.md +69 -0
  128. package/dist/skills/definitions/execute_command.md +27 -0
  129. package/dist/skills/definitions/git_manager.md +98 -0
  130. package/dist/skills/definitions/read_file.md +25 -0
  131. package/dist/skills/skills-bundle.d.ts +7 -0
  132. package/dist/skills/skills-bundle.js +27 -0
  133. package/dist/skills/skills-bundle.js.map +1 -0
  134. package/dist/skills/skills-parser.d.ts +8 -0
  135. package/dist/skills/skills-parser.js +67 -0
  136. package/dist/skills/skills-parser.js.map +1 -0
  137. package/dist/skills/skills.module.d.ts +2 -0
  138. package/dist/skills/skills.module.js +22 -0
  139. package/dist/skills/skills.module.js.map +1 -0
  140. package/dist/skills/skills.service.d.ts +22 -0
  141. package/dist/skills/skills.service.js +150 -0
  142. package/dist/skills/skills.service.js.map +1 -0
  143. package/dist/skills/skills.types.d.ts +16 -0
  144. package/dist/skills/skills.types.js +3 -0
  145. package/dist/skills/skills.types.js.map +1 -0
  146. package/dist/soul/prompts/core.md +28 -0
  147. package/dist/soul/prompts/rules.md +40 -0
  148. package/dist/soul/prompts/runtime.md +13 -0
  149. package/dist/soul/prompts/voice.md +45 -0
  150. package/dist/soul/soul.module.d.ts +2 -0
  151. package/dist/soul/soul.module.js +22 -0
  152. package/dist/soul/soul.module.js.map +1 -0
  153. package/dist/soul/soul.service.d.ts +22 -0
  154. package/dist/soul/soul.service.js +89 -0
  155. package/dist/soul/soul.service.js.map +1 -0
  156. package/dist/telegram/pairing.service.d.ts +11 -0
  157. package/dist/telegram/pairing.service.js +81 -0
  158. package/dist/telegram/pairing.service.js.map +1 -0
  159. package/dist/telegram/telegram-interaction.adapter.d.ts +16 -0
  160. package/dist/telegram/telegram-interaction.adapter.js +54 -0
  161. package/dist/telegram/telegram-interaction.adapter.js.map +1 -0
  162. package/dist/telegram/telegram.module.d.ts +2 -0
  163. package/dist/telegram/telegram.module.js +25 -0
  164. package/dist/telegram/telegram.module.js.map +1 -0
  165. package/dist/telegram/telegram.service.d.ts +28 -0
  166. package/dist/telegram/telegram.service.js +255 -0
  167. package/dist/telegram/telegram.service.js.map +1 -0
  168. package/dist/tsconfig.build.tsbuildinfo +1 -0
  169. package/package.json +68 -0
  170. package/prisma/migrations/20260403134611_init/migration.sql +40 -0
  171. package/prisma/migrations/migration_lock.toml +3 -0
  172. package/prisma/schema.prisma +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soul.module.js","sourceRoot":"","sources":["../../src/soul/soul.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,iDAA6C;AAOtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IALtB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,0BAAW,CAAC;QACxB,OAAO,EAAE,CAAC,0BAAW,CAAC;KACvB,CAAC;GACW,UAAU,CAAG"}
@@ -0,0 +1,22 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ export interface SoulContext {
3
+ userName: string;
4
+ now: string;
5
+ os: string;
6
+ host: string;
7
+ nodeVersion: string;
8
+ cwd: string;
9
+ llmProvider: string;
10
+ }
11
+ export declare class SoulService implements OnModuleInit {
12
+ private readonly logger;
13
+ private readonly promptsDir;
14
+ private readonly prompts;
15
+ constructor();
16
+ onModuleInit(): void;
17
+ getSystemPrompt(ctx: SoulContext, skillInstructions?: string): string;
18
+ getPrompt(name: string): string | undefined;
19
+ private toTemplateVars;
20
+ private renderTemplate;
21
+ private loadAllPrompts;
22
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var SoulService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SoulService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const fs = require("fs");
16
+ const path = require("path");
17
+ const FRAGMENT_ORDER = ['core', 'voice', 'rules'];
18
+ const RUNTIME_FRAGMENT = 'runtime';
19
+ let SoulService = SoulService_1 = class SoulService {
20
+ logger = new common_1.Logger(SoulService_1.name);
21
+ promptsDir;
22
+ prompts = new Map();
23
+ constructor() {
24
+ this.promptsDir = path.resolve(__dirname, 'prompts');
25
+ }
26
+ onModuleInit() {
27
+ this.loadAllPrompts();
28
+ }
29
+ getSystemPrompt(ctx, skillInstructions) {
30
+ const vars = this.toTemplateVars(ctx);
31
+ const parts = [];
32
+ for (const name of FRAGMENT_ORDER) {
33
+ const raw = this.prompts.get(name);
34
+ if (raw)
35
+ parts.push(this.renderTemplate(raw, vars));
36
+ }
37
+ if (skillInstructions?.trim()) {
38
+ parts.push(`# Tools\n\n${skillInstructions}`);
39
+ }
40
+ const runtime = this.prompts.get(RUNTIME_FRAGMENT);
41
+ if (runtime)
42
+ parts.push(this.renderTemplate(runtime, vars));
43
+ return parts.join('\n\n---\n\n');
44
+ }
45
+ getPrompt(name) {
46
+ return this.prompts.get(name);
47
+ }
48
+ toTemplateVars(ctx) {
49
+ return {
50
+ USER_NAME: ctx.userName,
51
+ NOW: ctx.now,
52
+ OS: ctx.os,
53
+ HOST: ctx.host,
54
+ NODE_VERSION: ctx.nodeVersion,
55
+ CWD: ctx.cwd,
56
+ LLM_PROVIDER: ctx.llmProvider,
57
+ };
58
+ }
59
+ renderTemplate(template, vars) {
60
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
61
+ if (key in vars)
62
+ return vars[key];
63
+ this.logger.warn(`Template variable "${key}" has no value — rendering as empty`);
64
+ return '';
65
+ });
66
+ }
67
+ loadAllPrompts() {
68
+ if (!fs.existsSync(this.promptsDir)) {
69
+ this.logger.warn(`Soul prompts directory not found: ${this.promptsDir}`);
70
+ return;
71
+ }
72
+ const files = fs
73
+ .readdirSync(this.promptsDir)
74
+ .filter((f) => f.endsWith('.md'));
75
+ for (const file of files) {
76
+ const name = path.basename(file, '.md');
77
+ const content = fs.readFileSync(path.join(this.promptsDir, file), 'utf-8');
78
+ this.prompts.set(name, content.trim());
79
+ this.logger.debug(`Loaded soul prompt: ${name}`);
80
+ }
81
+ this.logger.log(`Loaded ${this.prompts.size} soul prompt(s): [${Array.from(this.prompts.keys()).join(', ')}]`);
82
+ }
83
+ };
84
+ exports.SoulService = SoulService;
85
+ exports.SoulService = SoulService = SoulService_1 = __decorate([
86
+ (0, common_1.Injectable)(),
87
+ __metadata("design:paramtypes", [])
88
+ ], SoulService);
89
+ //# sourceMappingURL=soul.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soul.service.js","sourceRoot":"","sources":["../../src/soul/soul.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { SessionsService } from '../sessions/sessions.service';
2
+ export declare class PairingService {
3
+ private readonly sessions;
4
+ private readonly logger;
5
+ private pending;
6
+ constructor(sessions: SessionsService);
7
+ generate(): string;
8
+ claim(code: string, telegramId: string): Promise<boolean>;
9
+ getPairedTelegramId(): Promise<string | null>;
10
+ hasActivePendingCode(): boolean;
11
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var PairingService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PairingService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const crypto = require("crypto");
16
+ const sessions_service_1 = require("../sessions/sessions.service");
17
+ const CODE_LENGTH = 9;
18
+ const CODE_TTL_MS = 5 * 60 * 1000;
19
+ let PairingService = PairingService_1 = class PairingService {
20
+ sessions;
21
+ logger = new common_1.Logger(PairingService_1.name);
22
+ pending = null;
23
+ constructor(sessions) {
24
+ this.sessions = sessions;
25
+ }
26
+ generate() {
27
+ const code = crypto
28
+ .randomBytes(8)
29
+ .toString('base64url')
30
+ .replace(/[^A-Za-z0-9]/g, '')
31
+ .slice(0, CODE_LENGTH)
32
+ .toUpperCase();
33
+ this.pending = {
34
+ code,
35
+ expiresAt: Date.now() + CODE_TTL_MS,
36
+ };
37
+ this.logger.warn(`\n` +
38
+ `╔══════════════════════════════════════════════════════╗\n` +
39
+ `║ Bot is not paired! ║\n` +
40
+ `║ Send this command to the Telegram bot to connect: ║\n` +
41
+ `║ ║\n` +
42
+ `║ /pair ${code} ║\n` +
43
+ `║ ║\n` +
44
+ `║ Code expires in 5 minutes. ║\n` +
45
+ `╚══════════════════════════════════════════════════════╝`);
46
+ return code;
47
+ }
48
+ async claim(code, telegramId) {
49
+ if (!this.pending)
50
+ return false;
51
+ if (this.pending.code !== code.toUpperCase())
52
+ return false;
53
+ if (Date.now() > this.pending.expiresAt) {
54
+ this.logger.warn('Pairing code expired. Send /start to get a new one.');
55
+ this.pending = null;
56
+ return false;
57
+ }
58
+ await this.sessions.setTelegramPairing(telegramId);
59
+ this.pending = null;
60
+ this.logger.log(`Paired successfully with Telegram user ${telegramId}`);
61
+ return true;
62
+ }
63
+ async getPairedTelegramId() {
64
+ return this.sessions.getPairedTelegramId();
65
+ }
66
+ hasActivePendingCode() {
67
+ if (!this.pending)
68
+ return false;
69
+ if (Date.now() > this.pending.expiresAt) {
70
+ this.pending = null;
71
+ return false;
72
+ }
73
+ return true;
74
+ }
75
+ };
76
+ exports.PairingService = PairingService;
77
+ exports.PairingService = PairingService = PairingService_1 = __decorate([
78
+ (0, common_1.Injectable)(),
79
+ __metadata("design:paramtypes", [sessions_service_1.SessionsService])
80
+ ], PairingService);
81
+ //# sourceMappingURL=pairing.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.service.js","sourceRoot":"","sources":["../../src/telegram/pairing.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,iCAAiC;AACjC,mEAA+D;AAE/D,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAmB3B,IAAM,cAAc,sBAApB,MAAM,cAAc;IAII;IAHZ,MAAM,GAAG,IAAI,eAAM,CAAC,gBAAc,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,GAAuB,IAAI,CAAC;IAE3C,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAQ1D,QAAQ;QACN,MAAM,IAAI,GAAG,MAAM;aAChB,WAAW,CAAC,CAAC,CAAC;aACd,QAAQ,CAAC,WAAW,CAAC;aACrB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;aAC5B,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;aACrB,WAAW,EAAE,CAAC;QAEjB,IAAI,CAAC,OAAO,GAAG;YACb,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW;SACpC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAI;YACF,4DAA4D;YAC5D,2DAA2D;YAC3D,2DAA2D;YAC3D,2DAA2D;YAC3D,cAAc,IAAI,mCAAmC;YACrD,2DAA2D;YAC3D,2DAA2D;YAC3D,0DAA0D,CAC7D,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,UAAkB;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACxE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,KAAK,CAAC,mBAAmB;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;IAC7C,CAAC;IAKD,oBAAoB;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAnFY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAK4B,kCAAe;GAJ3C,cAAc,CAmF1B"}
@@ -0,0 +1,16 @@
1
+ import { Telegraf } from 'telegraf';
2
+ import { IInteractionAdapter } from '../common/adapters/interaction-adapter.interface';
3
+ export declare class TelegramInteractionAdapter implements IInteractionAdapter {
4
+ private readonly bot;
5
+ private readonly chatId;
6
+ private readonly logger;
7
+ static readonly pendingApprovals: Map<string, {
8
+ resolve: (approved: boolean) => void;
9
+ chatId: number;
10
+ messageId: number;
11
+ }>;
12
+ private static nonceCounter;
13
+ constructor(bot: Telegraf, chatId: number);
14
+ askForApproval(command: string): Promise<boolean>;
15
+ static handleCallback(bot: Telegraf, nonce: string, approved: boolean): Promise<boolean>;
16
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TelegramInteractionAdapter = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class TelegramInteractionAdapter {
6
+ bot;
7
+ chatId;
8
+ logger = new common_1.Logger(TelegramInteractionAdapter.name);
9
+ static pendingApprovals = new Map();
10
+ static nonceCounter = 0;
11
+ constructor(bot, chatId) {
12
+ this.bot = bot;
13
+ this.chatId = chatId;
14
+ }
15
+ async askForApproval(command) {
16
+ const nonce = `approval_${Date.now()}_${++TelegramInteractionAdapter.nonceCounter}`;
17
+ const displayCmd = command.length > 200 ? command.slice(0, 197) + '...' : command;
18
+ const msg = await this.bot.telegram.sendMessage(this.chatId, `⚠️ *Agent wants to execute:*\n\`\`\`\n${displayCmd}\n\`\`\`\nAllow?`, {
19
+ parse_mode: 'Markdown',
20
+ reply_markup: {
21
+ inline_keyboard: [
22
+ [
23
+ { text: '✅ Yes', callback_data: `${nonce}:yes` },
24
+ { text: '❌ No', callback_data: `${nonce}:no` },
25
+ ],
26
+ ],
27
+ },
28
+ });
29
+ return new Promise((resolve) => {
30
+ TelegramInteractionAdapter.pendingApprovals.set(nonce, {
31
+ resolve,
32
+ chatId: this.chatId,
33
+ messageId: msg.message_id,
34
+ });
35
+ });
36
+ }
37
+ static async handleCallback(bot, nonce, approved) {
38
+ const entry = TelegramInteractionAdapter.pendingApprovals.get(nonce);
39
+ if (!entry)
40
+ return false;
41
+ TelegramInteractionAdapter.pendingApprovals.delete(nonce);
42
+ const verdict = approved ? '✅ Approved' : '❌ Rejected';
43
+ try {
44
+ await bot.telegram.editMessageReplyMarkup(entry.chatId, entry.messageId, undefined, { inline_keyboard: [] });
45
+ await bot.telegram.sendMessage(entry.chatId, verdict);
46
+ }
47
+ catch {
48
+ }
49
+ entry.resolve(approved);
50
+ return true;
51
+ }
52
+ }
53
+ exports.TelegramInteractionAdapter = TelegramInteractionAdapter;
54
+ //# sourceMappingURL=telegram-interaction.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-interaction.adapter.js","sourceRoot":"","sources":["../../src/telegram/telegram-interaction.adapter.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAUxC,MAAa,0BAA0B;IAgBlB;IACA;IAhBF,MAAM,GAAG,IAAI,eAAM,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAOtE,MAAM,CAAU,gBAAgB,GAAG,IAAI,GAAG,EAGvC,CAAC;IAEI,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IAEhC,YACmB,GAAa,EACb,MAAc;QADd,QAAG,GAAH,GAAG,CAAU;QACb,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC;QAEpF,MAAM,UAAU,GACd,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QAEjE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAC7C,IAAI,CAAC,MAAM,EACX,yCAAyC,UAAU,kBAAkB,EACrE;YACE,UAAU,EAAE,UAAU;YACtB,YAAY,EAAE;gBACZ,eAAe,EAAE;oBACf;wBACE,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,MAAM,EAAE;wBAChD,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,KAAK,EAAE;qBAC/C;iBACF;aACF;SACF,CACF,CAAC;QAEF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACtC,0BAA0B,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE;gBACrD,OAAO;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS,EAAE,GAAG,CAAC,UAAU;aAC1B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAQD,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,GAAa,EACb,KAAa,EACb,QAAiB;QAEjB,MAAM,KAAK,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,0BAA0B,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CACvC,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,SAAS,EACf,SAAS,EACT,EAAE,eAAe,EAAE,EAAE,EAAE,CACxB,CAAC;YACF,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;;AAnFH,gEAoFC"}
@@ -0,0 +1,2 @@
1
+ export declare class TelegramModule {
2
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TelegramModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const agent_module_1 = require("../agent/agent.module");
12
+ const sessions_module_1 = require("../sessions/sessions.module");
13
+ const pairing_service_1 = require("./pairing.service");
14
+ const telegram_service_1 = require("./telegram.service");
15
+ let TelegramModule = class TelegramModule {
16
+ };
17
+ exports.TelegramModule = TelegramModule;
18
+ exports.TelegramModule = TelegramModule = __decorate([
19
+ (0, common_1.Module)({
20
+ imports: [agent_module_1.AgentModule, sessions_module_1.SessionsModule],
21
+ providers: [pairing_service_1.PairingService, telegram_service_1.TelegramService],
22
+ exports: [telegram_service_1.TelegramService, pairing_service_1.PairingService],
23
+ })
24
+ ], TelegramModule);
25
+ //# sourceMappingURL=telegram.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.module.js","sourceRoot":"","sources":["../../src/telegram/telegram.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,wDAAoD;AACpD,iEAA6D;AAC7D,uDAAmD;AACnD,yDAAqD;AAO9C,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAL1B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,0BAAW,EAAE,gCAAc,CAAC;QACtC,SAAS,EAAE,CAAC,gCAAc,EAAE,kCAAe,CAAC;QAC5C,OAAO,EAAE,CAAC,kCAAe,EAAE,gCAAc,CAAC;KAC3C,CAAC;GACW,cAAc,CAAG"}
@@ -0,0 +1,28 @@
1
+ import { ConfigService } from '@nestjs/config';
2
+ import { AgentProcessorService } from '../agent/agent.processor';
3
+ import { SessionsService } from '../sessions/sessions.service';
4
+ import { PairingService } from './pairing.service';
5
+ export declare class TelegramService {
6
+ private readonly config;
7
+ private readonly processor;
8
+ private readonly sessions;
9
+ private readonly pairing;
10
+ private readonly logger;
11
+ private bot;
12
+ private pairedTelegramId;
13
+ private readonly sessionMap;
14
+ private readonly busyChats;
15
+ constructor(config: ConfigService, processor: AgentProcessorService, sessions: SessionsService, pairing: PairingService);
16
+ start(): Promise<void>;
17
+ private onStart;
18
+ private onPair;
19
+ private onNew;
20
+ private onSessions;
21
+ private onSwitch;
22
+ private onTextMessage;
23
+ private runAgent;
24
+ private onCallbackQuery;
25
+ private isAuthorised;
26
+ private resolveSessionId;
27
+ private sendLongMessage;
28
+ }
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var TelegramService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.TelegramService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const config_1 = require("@nestjs/config");
16
+ const telegraf_1 = require("telegraf");
17
+ const filters_1 = require("telegraf/filters");
18
+ const agent_processor_1 = require("../agent/agent.processor");
19
+ const sessions_service_1 = require("../sessions/sessions.service");
20
+ const pairing_service_1 = require("./pairing.service");
21
+ const telegram_interaction_adapter_1 = require("./telegram-interaction.adapter");
22
+ const constants_1 = require("../common/constants");
23
+ const MAX_TG_MESSAGE_LENGTH = 4096;
24
+ let TelegramService = TelegramService_1 = class TelegramService {
25
+ config;
26
+ processor;
27
+ sessions;
28
+ pairing;
29
+ logger = new common_1.Logger(TelegramService_1.name);
30
+ bot = null;
31
+ pairedTelegramId = null;
32
+ sessionMap = new Map();
33
+ busyChats = new Set();
34
+ constructor(config, processor, sessions, pairing) {
35
+ this.config = config;
36
+ this.processor = processor;
37
+ this.sessions = sessions;
38
+ this.pairing = pairing;
39
+ }
40
+ async start() {
41
+ const token = this.config.get('TELEGRAM_BOT_TOKEN');
42
+ if (!token) {
43
+ this.logger.error('TELEGRAM_BOT_TOKEN is not set. Cannot start Telegram bot.');
44
+ process.exit(1);
45
+ }
46
+ this.bot = new telegraf_1.Telegraf(token, { handlerTimeout: Infinity });
47
+ this.pairedTelegramId = await this.pairing.getPairedTelegramId();
48
+ if (this.pairedTelegramId) {
49
+ this.logger.log(`Bot is paired with Telegram user ${this.pairedTelegramId}`);
50
+ }
51
+ else {
52
+ this.pairing.generate();
53
+ }
54
+ this.bot.start((ctx) => this.onStart(ctx));
55
+ this.bot.command('pair', (ctx) => this.onPair(ctx));
56
+ this.bot.command('new', (ctx) => this.onNew(ctx));
57
+ this.bot.command('sessions', (ctx) => this.onSessions(ctx));
58
+ this.bot.command('switch', (ctx) => this.onSwitch(ctx));
59
+ this.bot.on('callback_query', (ctx) => this.onCallbackQuery(ctx));
60
+ this.bot.on((0, filters_1.message)('text'), (ctx) => this.onTextMessage(ctx));
61
+ await this.bot.telegram.setMyCommands([
62
+ { command: 'start', description: 'Show welcome and pairing status' },
63
+ { command: 'pair', description: 'Pair device with Harubashi (usage: /pair <code>)' },
64
+ { command: 'new', description: 'Create or switch to a new session' },
65
+ { command: 'switch', description: 'Switch to an existing session' },
66
+ { command: 'sessions', description: 'List all your active sessions' },
67
+ ]);
68
+ this.bot.launch();
69
+ this.logger.log('Telegram bot started (polling mode)');
70
+ const stop = () => {
71
+ this.bot?.stop('SIGINT');
72
+ };
73
+ process.once('SIGINT', stop);
74
+ process.once('SIGTERM', stop);
75
+ }
76
+ async onStart(ctx) {
77
+ const userId = String(ctx.from?.id);
78
+ if (this.pairedTelegramId && userId === this.pairedTelegramId) {
79
+ await ctx.reply('Already paired. Send me a message to get started.');
80
+ return;
81
+ }
82
+ if (this.pairedTelegramId)
83
+ return;
84
+ this.pairing.generate();
85
+ await ctx.reply('Welcome to Harubashi!\n\n' +
86
+ 'This bot is not yet paired to an operator.\n' +
87
+ 'Check the server console for the pairing code, then send:\n' +
88
+ '/pair <CODE>');
89
+ }
90
+ async onPair(ctx) {
91
+ if (this.pairedTelegramId)
92
+ return;
93
+ const text = ctx.message?.text || '';
94
+ const parts = text.split(/\s+/);
95
+ const code = parts[1] || '';
96
+ if (!code)
97
+ return;
98
+ const userId = String(ctx.from?.id);
99
+ const success = await this.pairing.claim(code, userId);
100
+ if (!success)
101
+ return;
102
+ this.pairedTelegramId = userId;
103
+ await ctx.reply('✅ Successfully paired! You are now connected to Harubashi.\n' +
104
+ 'Send me a message to start chatting with your agent.');
105
+ }
106
+ async onNew(ctx) {
107
+ if (!this.isAuthorised(ctx))
108
+ return;
109
+ const text = ctx.message?.text || '';
110
+ const parts = text.split(/\s+/);
111
+ const name = parts[1] || '';
112
+ const chatId = ctx.chat.id;
113
+ if (!name) {
114
+ await ctx.reply('Usage: /new <session-name>');
115
+ return;
116
+ }
117
+ await this.sessions.switchOrCreate(constants_1.DEFAULT_USER_ID, name);
118
+ this.sessionMap.set(chatId, name);
119
+ await ctx.reply(`✅ Switched to session: "${name}".`);
120
+ }
121
+ async onSessions(ctx) {
122
+ if (!this.isAuthorised(ctx))
123
+ return;
124
+ const chatId = ctx.chat.id;
125
+ const currentSessionId = this.sessionMap.get(chatId) ?? `tg-${chatId}`;
126
+ const sessions = await this.sessions.listSessions(constants_1.DEFAULT_USER_ID);
127
+ if (sessions.length === 0) {
128
+ await ctx.reply('No sessions found.');
129
+ return;
130
+ }
131
+ const lines = sessions.map((s) => {
132
+ const marker = s.id === currentSessionId ? ' ← current' : '';
133
+ const date = s.updatedAt.toLocaleString();
134
+ return `• ${s.id} (${date})${marker}`;
135
+ });
136
+ await ctx.reply(`Sessions:\n\n${lines.join('\n')}`);
137
+ }
138
+ async onSwitch(ctx) {
139
+ if (!this.isAuthorised(ctx))
140
+ return;
141
+ const text = ctx.message?.text || '';
142
+ const parts = text.split(/\s+/);
143
+ const name = parts[1] || '';
144
+ const chatId = ctx.chat.id;
145
+ if (!name) {
146
+ await ctx.reply('Usage: /switch <session-name>');
147
+ return;
148
+ }
149
+ const session = await this.sessions.getSession(name);
150
+ if (!session) {
151
+ await ctx.reply(`No session named "${name}". Use /sessions to list or /new <name> to create.`);
152
+ return;
153
+ }
154
+ this.sessionMap.set(chatId, name);
155
+ const lastActive = session.updatedAt.toLocaleString();
156
+ await ctx.reply(`✅ Switched to "${name}". Last active: ${lastActive}`);
157
+ }
158
+ async onTextMessage(ctx) {
159
+ if (!this.isAuthorised(ctx))
160
+ return;
161
+ const chatId = ctx.chat.id;
162
+ const text = ctx.message?.text || '';
163
+ if (!text.trim())
164
+ return;
165
+ if (this.busyChats.has(chatId)) {
166
+ await ctx.reply('⏳ Still processing the previous message. Please wait.');
167
+ return;
168
+ }
169
+ this.busyChats.add(chatId);
170
+ void this.runAgent(chatId, text);
171
+ }
172
+ async runAgent(chatId, text) {
173
+ try {
174
+ const sessionId = await this.resolveSessionId(chatId);
175
+ const adapter = new telegram_interaction_adapter_1.TelegramInteractionAdapter(this.bot, chatId);
176
+ const result = await this.processor.process(sessionId, text, adapter);
177
+ const reply = result.finalText || '(no text response)';
178
+ await this.sendLongMessage(chatId, reply);
179
+ }
180
+ catch (err) {
181
+ this.logger.error(`Agent error for chat ${chatId}: ${err.message}`, err.stack);
182
+ try {
183
+ await this.bot.telegram.sendMessage(chatId, `❌ Error: ${err.message}`);
184
+ }
185
+ catch {
186
+ }
187
+ }
188
+ finally {
189
+ this.busyChats.delete(chatId);
190
+ }
191
+ }
192
+ async onCallbackQuery(ctx) {
193
+ if (!this.isAuthorised(ctx))
194
+ return;
195
+ const data = ctx.callbackQuery?.data || '';
196
+ const lastColon = data.lastIndexOf(':');
197
+ if (lastColon === -1) {
198
+ await ctx.answerCbQuery().catch(() => { });
199
+ return;
200
+ }
201
+ const nonce = data.slice(0, lastColon);
202
+ const answer = data.slice(lastColon + 1);
203
+ const approved = answer === 'yes';
204
+ await ctx.answerCbQuery(approved ? 'Approved' : 'Rejected').catch(() => { });
205
+ const handled = await telegram_interaction_adapter_1.TelegramInteractionAdapter.handleCallback(this.bot, nonce, approved);
206
+ if (!handled) {
207
+ this.logger.warn(`Callback nonce not found (expired?): ${nonce}`);
208
+ }
209
+ }
210
+ isAuthorised(ctx) {
211
+ if (!this.pairedTelegramId)
212
+ return false;
213
+ return String(ctx.from?.id) === this.pairedTelegramId;
214
+ }
215
+ async resolveSessionId(chatId) {
216
+ const existing = this.sessionMap.get(chatId);
217
+ if (existing)
218
+ return existing;
219
+ const sessionId = `tg-${chatId}`;
220
+ await this.sessions.ensureSession(sessionId, constants_1.DEFAULT_USER_ID, `Telegram ${chatId}`);
221
+ this.sessionMap.set(chatId, sessionId);
222
+ return sessionId;
223
+ }
224
+ async sendLongMessage(chatId, text) {
225
+ if (text.length <= MAX_TG_MESSAGE_LENGTH) {
226
+ await this.bot.telegram.sendMessage(chatId, text);
227
+ return;
228
+ }
229
+ const chunks = [];
230
+ let remaining = text;
231
+ while (remaining.length > 0) {
232
+ if (remaining.length <= MAX_TG_MESSAGE_LENGTH) {
233
+ chunks.push(remaining);
234
+ break;
235
+ }
236
+ let splitAt = remaining.lastIndexOf('\n', MAX_TG_MESSAGE_LENGTH);
237
+ if (splitAt <= 0)
238
+ splitAt = MAX_TG_MESSAGE_LENGTH;
239
+ chunks.push(remaining.slice(0, splitAt));
240
+ remaining = remaining.slice(splitAt).replace(/^\n/, '');
241
+ }
242
+ for (const chunk of chunks) {
243
+ await this.bot.telegram.sendMessage(chatId, chunk);
244
+ }
245
+ }
246
+ };
247
+ exports.TelegramService = TelegramService;
248
+ exports.TelegramService = TelegramService = TelegramService_1 = __decorate([
249
+ (0, common_1.Injectable)(),
250
+ __metadata("design:paramtypes", [config_1.ConfigService,
251
+ agent_processor_1.AgentProcessorService,
252
+ sessions_service_1.SessionsService,
253
+ pairing_service_1.PairingService])
254
+ ], TelegramService);
255
+ //# sourceMappingURL=telegram.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.service.js","sourceRoot":"","sources":["../../src/telegram/telegram.service.ts"],"names":[],"mappings":"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"}