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,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROVIDERS = void 0;
4
+ exports.prettyProviderName = prettyProviderName;
5
+ exports.askSelectOrCreateProfile = askSelectOrCreateProfile;
6
+ exports.askProfileName = askProfileName;
7
+ exports.askProvider = askProvider;
8
+ exports.askProviderCredentials = askProviderCredentials;
9
+ exports.askModel = askModel;
10
+ exports.askTelegram = askTelegram;
11
+ exports.databaseExists = databaseExists;
12
+ exports.createDirectories = createDirectories;
13
+ exports.copyBundledSkills = copyBundledSkills;
14
+ exports.initializeDatabase = initializeDatabase;
15
+ exports.upsertDefaultUser = upsertDefaultUser;
16
+ exports.printStep = printStep;
17
+ const fs = require("fs");
18
+ const child_process_1 = require("child_process");
19
+ const prompts_1 = require("@inquirer/prompts");
20
+ const paths_1 = require("../common/paths");
21
+ const constants_1 = require("../common/constants");
22
+ const skills_bundle_1 = require("../skills/skills-bundle");
23
+ exports.PROVIDERS = [
24
+ {
25
+ value: 'nvidia',
26
+ label: 'NVIDIA NIM',
27
+ comingSoon: false,
28
+ models: ['meta/llama-3.1-70b-instruct', 'meta/llama-3.1-405b-instruct'],
29
+ },
30
+ {
31
+ value: 'google',
32
+ label: 'Google Gemini (AI Studio)',
33
+ comingSoon: false,
34
+ models: ['gemini-1.5-pro', 'gemini-1.5-flash', 'gemini-2.5-flash'],
35
+ },
36
+ { value: 'anthropic', label: 'Anthropic', comingSoon: true, models: null },
37
+ { value: 'openai', label: 'OpenAI', comingSoon: true, models: null },
38
+ { value: 'proxy', label: 'OpenAI-compatible Proxy', comingSoon: true, models: null },
39
+ ];
40
+ function prettyProviderName(name) {
41
+ return exports.PROVIDERS.find((p) => p.value === name)?.label || name;
42
+ }
43
+ const CUSTOM_MODEL_SENTINEL = '__custom__';
44
+ async function askSelectOrCreateProfile(config) {
45
+ const CREATE = '__create__';
46
+ const names = Object.keys(config.profiles);
47
+ const choices = [
48
+ {
49
+ name: '\x1b[32m[+] Create new profile...\x1b[0m',
50
+ value: CREATE,
51
+ },
52
+ ...names.map((n) => {
53
+ const profile = config.profiles[n];
54
+ const provider = profile.llmProvider;
55
+ const block = profile.providers[provider];
56
+ const model = block?.model || '(no model)';
57
+ const isActive = n === config.activeProfile;
58
+ const activeTag = isActive ? ' \x1b[90m(active)\x1b[0m' : '';
59
+ return {
60
+ name: `${n}${activeTag} \x1b[90m· ${provider} · ${model}\x1b[0m`,
61
+ value: n,
62
+ };
63
+ }),
64
+ ];
65
+ const selected = await (0, prompts_1.select)({
66
+ message: 'Select profile to configure:',
67
+ default: config.activeProfile,
68
+ choices,
69
+ });
70
+ return selected === CREATE
71
+ ? { mode: 'create' }
72
+ : { mode: 'edit', name: selected };
73
+ }
74
+ async function askProfileName(defaults) {
75
+ return (0, prompts_1.input)({
76
+ message: 'Profile name:',
77
+ default: defaults?.name ?? 'default',
78
+ validate: (v) => {
79
+ if (!/^[a-z0-9_-]+$/i.test(v)) {
80
+ return 'Use only letters, numbers, dashes, underscores';
81
+ }
82
+ if (defaults?.forbidden?.has(v)) {
83
+ return `Profile "${v}" already exists`;
84
+ }
85
+ return true;
86
+ },
87
+ });
88
+ }
89
+ async function askProvider(defaults) {
90
+ return (0, prompts_1.select)({
91
+ message: 'Choose your LLM provider:',
92
+ default: defaults?.provider,
93
+ choices: exports.PROVIDERS.map((p) => ({
94
+ name: p.comingSoon ? `${p.label} \x1b[33m(coming soon)\x1b[0m` : p.label,
95
+ value: p.value,
96
+ })),
97
+ });
98
+ }
99
+ async function askProviderCredentials(name, defaults) {
100
+ if (name === 'proxy') {
101
+ const prev = defaults?.proxy;
102
+ if (prev?.apiKey) {
103
+ console.log('\x1b[90m ↪ Press Enter to keep the existing API key.\x1b[0m');
104
+ }
105
+ const baseURL = await (0, prompts_1.input)({
106
+ message: 'Proxy Base URL:',
107
+ default: prev?.baseURL,
108
+ validate: (v) => /^https?:\/\//.test(v) || 'Must be a valid http(s) URL',
109
+ });
110
+ const apiKey = await (0, prompts_1.password)({
111
+ message: 'Proxy API Key:',
112
+ mask: '*',
113
+ ...(prev?.apiKey ? { default: prev.apiKey } : {}),
114
+ });
115
+ return { proxy: { baseURL, apiKey } };
116
+ }
117
+ const prev = defaults?.[name];
118
+ if (prev?.apiKey) {
119
+ console.log('\x1b[90m ↪ Press Enter to keep the existing API key.\x1b[0m');
120
+ }
121
+ const apiKey = await (0, prompts_1.password)({
122
+ message: `${prettyProviderName(name)} API Key:`,
123
+ mask: '*',
124
+ ...(prev?.apiKey ? { default: prev.apiKey } : {}),
125
+ });
126
+ return { [name]: { apiKey } };
127
+ }
128
+ async function askModel(name, defaults) {
129
+ const meta = exports.PROVIDERS.find((p) => p.value === name);
130
+ const curated = meta.models;
131
+ if (!curated) {
132
+ return (0, prompts_1.input)({
133
+ message: `${prettyProviderName(name)} model:`,
134
+ default: defaults?.model,
135
+ validate: (v) => v.trim().length > 0 || 'Model id required',
136
+ });
137
+ }
138
+ const defaultModel = defaults?.model;
139
+ let preselected;
140
+ if (defaultModel && curated.includes(defaultModel)) {
141
+ preselected = defaultModel;
142
+ }
143
+ else if (defaultModel) {
144
+ preselected = CUSTOM_MODEL_SENTINEL;
145
+ }
146
+ const choice = await (0, prompts_1.select)({
147
+ message: `${prettyProviderName(name)} model:`,
148
+ default: preselected,
149
+ choices: [
150
+ ...curated.map((m) => ({ name: m, value: m })),
151
+ { name: 'Custom...', value: CUSTOM_MODEL_SENTINEL },
152
+ ],
153
+ });
154
+ if (choice !== CUSTOM_MODEL_SENTINEL) {
155
+ return choice;
156
+ }
157
+ return (0, prompts_1.input)({
158
+ message: 'Custom model id:',
159
+ default: defaultModel && !curated.includes(defaultModel) ? defaultModel : undefined,
160
+ validate: (v) => v.trim().length > 0 || 'Model id required',
161
+ });
162
+ }
163
+ async function askTelegram(defaults) {
164
+ const wantsTelegram = await (0, prompts_1.confirm)({
165
+ message: 'Set up Telegram right now?',
166
+ default: defaults?.enabled === true,
167
+ });
168
+ if (!wantsTelegram) {
169
+ console.log('\x1b[90m ↪ Skipped. You can configure it later by editing config.yaml.\x1b[0m');
170
+ return undefined;
171
+ }
172
+ if (defaults?.botToken) {
173
+ console.log('\x1b[90m ↪ Press Enter to keep the existing bot token.\x1b[0m');
174
+ }
175
+ const botToken = await (0, prompts_1.password)({
176
+ message: 'Telegram Bot Token:',
177
+ mask: '*',
178
+ ...(defaults?.botToken ? { default: defaults.botToken } : {}),
179
+ });
180
+ return { enabled: true, botToken };
181
+ }
182
+ function databaseExists(profileName) {
183
+ return fs.existsSync(paths_1.HarubashiPaths.databaseFile(profileName));
184
+ }
185
+ function createDirectories() {
186
+ fs.mkdirSync(paths_1.HarubashiPaths.databasesDir, { recursive: true });
187
+ fs.mkdirSync(paths_1.HarubashiPaths.skillsDir, { recursive: true });
188
+ fs.mkdirSync(paths_1.HarubashiPaths.logsDir, { recursive: true });
189
+ console.log(` \x1b[32m✓\x1b[0m Created ${paths_1.HarubashiPaths.root}`);
190
+ }
191
+ function copyBundledSkills() {
192
+ const result = (0, skills_bundle_1.copyBundledSkillsTo)(paths_1.HarubashiPaths.skillsDir);
193
+ if (result.bundleMissing) {
194
+ console.log(` \x1b[33m⚠\x1b[0m No bundled skills found at ${result.src}. Skipping.`);
195
+ return;
196
+ }
197
+ if (result.added.length > 0 && result.kept.length === 0) {
198
+ console.log(` \x1b[32m✓\x1b[0m Installed ${result.added.length} skill(s) → ${paths_1.HarubashiPaths.skillsDir}`);
199
+ }
200
+ else if (result.added.length > 0) {
201
+ console.log(` \x1b[32m✓\x1b[0m Added ${result.added.length} new skill(s) ` +
202
+ `\x1b[90m(kept ${result.kept.length} existing)\x1b[0m → ${paths_1.HarubashiPaths.skillsDir}`);
203
+ }
204
+ else {
205
+ console.log(` \x1b[90m↪\x1b[0m All ${result.kept.length} bundled skill(s) already present in ${paths_1.HarubashiPaths.skillsDir}`);
206
+ }
207
+ }
208
+ async function initializeDatabase(profileName) {
209
+ const schemaPath = paths_1.HarubashiPaths.bundledSchemaPath();
210
+ const dbUrl = paths_1.HarubashiPaths.databaseUrl(profileName);
211
+ if (!fs.existsSync(schemaPath)) {
212
+ throw new Error(`Bundled Prisma schema not found at ${schemaPath}. ` +
213
+ `Did you forget to run \`npm run build\`?`);
214
+ }
215
+ console.log(` \x1b[90m↪ prisma db push (schema: ${schemaPath})\x1b[0m`);
216
+ await new Promise((resolve, reject) => {
217
+ const child = (0, child_process_1.spawn)('npx', [
218
+ 'prisma',
219
+ 'db',
220
+ 'push',
221
+ '--schema',
222
+ schemaPath,
223
+ '--skip-generate',
224
+ '--accept-data-loss',
225
+ ], {
226
+ env: { ...process.env, DATABASE_URL: dbUrl },
227
+ stdio: ['ignore', 'pipe', 'pipe'],
228
+ shell: true,
229
+ });
230
+ let stderr = '';
231
+ child.stderr?.on('data', (chunk) => (stderr += chunk.toString()));
232
+ child.stdout?.on('data', () => {
233
+ });
234
+ child.on('error', reject);
235
+ child.on('close', (code) => {
236
+ if (code === 0) {
237
+ resolve();
238
+ }
239
+ else {
240
+ reject(new Error(`prisma db push failed with exit code ${code}\n${stderr.trim()}`));
241
+ }
242
+ });
243
+ });
244
+ console.log(` \x1b[32m✓\x1b[0m Created database at ${paths_1.HarubashiPaths.databaseFile(profileName)}`);
245
+ }
246
+ async function upsertDefaultUser(profileName) {
247
+ const { PrismaClient } = await Promise.resolve().then(() => require('@prisma/client'));
248
+ const url = paths_1.HarubashiPaths.databaseUrl(profileName);
249
+ const prisma = new PrismaClient({ datasources: { db: { url } } });
250
+ try {
251
+ await prisma.user.upsert({
252
+ where: { id: constants_1.DEFAULT_USER_ID },
253
+ update: { name: constants_1.DEFAULT_USER_NAME },
254
+ create: { id: constants_1.DEFAULT_USER_ID, name: constants_1.DEFAULT_USER_NAME },
255
+ });
256
+ console.log(` \x1b[32m✓\x1b[0m Upserted default user "${constants_1.DEFAULT_USER_NAME}"`);
257
+ }
258
+ finally {
259
+ await prisma.$disconnect();
260
+ }
261
+ }
262
+ function printStep(n, title) {
263
+ console.log(`\n\x1b[36m── Step ${n}: ${title} ──────────────────────────\x1b[0m`);
264
+ }
265
+ //# sourceMappingURL=setup.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.helpers.js","sourceRoot":"","sources":["../../src/commands/setup.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runSkillsList(): void;
2
+ export declare function runSkillsOpen(): void;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSkillsList = runSkillsList;
4
+ exports.runSkillsOpen = runSkillsOpen;
5
+ const child_process_1 = require("child_process");
6
+ const fs = require("fs");
7
+ const paths_1 = require("../common/paths");
8
+ const skills_parser_1 = require("../skills/skills-parser");
9
+ const skills_bundle_1 = require("../skills/skills-bundle");
10
+ function runSkillsList() {
11
+ const dir = paths_1.HarubashiPaths.skillsDir;
12
+ const copy = (0, skills_bundle_1.copyBundledSkillsTo)(dir);
13
+ if (!fs.existsSync(dir)) {
14
+ printEmpty('directory does not exist');
15
+ return;
16
+ }
17
+ const skills = (0, skills_parser_1.loadAllSkillFiles)(dir);
18
+ if (skills.length === 0) {
19
+ printEmpty('directory is empty');
20
+ return;
21
+ }
22
+ const tools = skills.filter((s) => s.tool);
23
+ const guidance = skills.filter((s) => !s.tool);
24
+ console.log();
25
+ console.log(`\x1b[36m── Skills (in ${dir}) ──\x1b[0m`);
26
+ if (copy.added.length > 0) {
27
+ console.log(` \x1b[32m+ added ${copy.added.length} new bundled skill(s):\x1b[0m \x1b[90m${copy.added.join(', ')}\x1b[0m`);
28
+ }
29
+ console.log();
30
+ if (tools.length > 0) {
31
+ console.log(` \x1b[32mTools (${tools.length}):\x1b[0m`);
32
+ printSection(tools);
33
+ console.log();
34
+ }
35
+ if (guidance.length > 0) {
36
+ console.log(` \x1b[33mGuidance (${guidance.length}):\x1b[0m`);
37
+ printSection(guidance);
38
+ console.log();
39
+ }
40
+ console.log('\x1b[36m────────────────────────────────────────────────────\x1b[0m');
41
+ console.log();
42
+ }
43
+ function printSection(skills) {
44
+ const nameWidth = Math.max(...skills.map((s) => s.name.length));
45
+ const termWidth = process.stdout.columns || 100;
46
+ const descBudget = Math.max(20, termWidth - 4 - nameWidth - 2 - 1);
47
+ for (const skill of skills) {
48
+ const desc = describe(skill);
49
+ const truncated = desc.length > descBudget ? desc.slice(0, descBudget - 1) + '…' : desc;
50
+ console.log(` \x1b[36m${skill.name.padEnd(nameWidth)}\x1b[0m \x1b[90m${truncated}\x1b[0m`);
51
+ }
52
+ }
53
+ function describe(skill) {
54
+ if (skill.tool?.description)
55
+ return skill.tool.description;
56
+ const firstLine = skill.instructions
57
+ .split(/\r?\n/)
58
+ .map((l) => l.trim())
59
+ .find((l) => l.length > 0 && !l.startsWith('#'));
60
+ return firstLine || '(no description)';
61
+ }
62
+ function printEmpty(reason) {
63
+ console.log();
64
+ console.log(`\x1b[33m No skills found (${reason}).\x1b[0m`);
65
+ console.log();
66
+ console.log(` \x1b[90mSkills directory: ${paths_1.HarubashiPaths.skillsDir}\x1b[0m`);
67
+ console.log();
68
+ console.log('\x1b[90m Run setup to install bundled skills:\x1b[0m');
69
+ console.log(' \x1b[32m$\x1b[0m harubashi setup');
70
+ console.log();
71
+ }
72
+ function runSkillsOpen() {
73
+ const dir = paths_1.HarubashiPaths.skillsDir;
74
+ if (!fs.existsSync(dir)) {
75
+ fs.mkdirSync(dir, { recursive: true });
76
+ }
77
+ const platform = process.platform;
78
+ let command;
79
+ let args;
80
+ if (platform === 'win32') {
81
+ command = 'explorer.exe';
82
+ args = [dir];
83
+ }
84
+ else if (platform === 'darwin') {
85
+ command = 'open';
86
+ args = [dir];
87
+ }
88
+ else {
89
+ command = 'xdg-open';
90
+ args = [dir];
91
+ }
92
+ try {
93
+ const child = (0, child_process_1.spawn)(command, args, {
94
+ detached: true,
95
+ stdio: 'ignore',
96
+ });
97
+ child.on('error', () => printFallback(dir));
98
+ child.unref();
99
+ console.log(`\x1b[32m✓\x1b[0m Opening ${dir}`);
100
+ }
101
+ catch {
102
+ printFallback(dir);
103
+ }
104
+ }
105
+ function printFallback(dir) {
106
+ console.log();
107
+ console.log('\x1b[33m Could not auto-open the folder.\x1b[0m');
108
+ console.log(` Path: \x1b[36m${dir}\x1b[0m`);
109
+ console.log();
110
+ }
111
+ //# sourceMappingURL=skills.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.command.js","sourceRoot":"","sources":["../../src/commands/skills.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import * as readline from 'readline';
2
+ import { IInteractionAdapter } from './interaction-adapter.interface';
3
+ export declare class CliInteractionAdapter implements IInteractionAdapter {
4
+ private readonly hostRl?;
5
+ private readonly logger;
6
+ constructor(hostRl?: readline.Interface | undefined);
7
+ askForApproval(command: string): Promise<boolean>;
8
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CliInteractionAdapter = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const readline = require("readline");
6
+ class CliInteractionAdapter {
7
+ hostRl;
8
+ logger = new common_1.Logger(CliInteractionAdapter.name);
9
+ constructor(hostRl) {
10
+ this.hostRl = hostRl;
11
+ }
12
+ askForApproval(command) {
13
+ const displayCmd = command.length > 120 ? command.slice(0, 117) + '...' : command;
14
+ const hadHost = !!this.hostRl;
15
+ if (hadHost) {
16
+ this.hostRl.pause();
17
+ this.hostRl.terminal = false;
18
+ }
19
+ return new Promise((resolve) => {
20
+ const rl = readline.createInterface({
21
+ input: process.stdin,
22
+ output: process.stderr,
23
+ terminal: false,
24
+ });
25
+ const writePrompt = () => {
26
+ process.stderr.write(`\n⚠️ [Command Guard] Agent wants to execute:\n` +
27
+ ` $ ${displayCmd}\n` +
28
+ ` Allow? (y/n): `);
29
+ };
30
+ writePrompt();
31
+ const finish = (approved) => {
32
+ rl.off('line', onLine);
33
+ rl.close();
34
+ if (hadHost) {
35
+ this.hostRl.terminal = true;
36
+ this.hostRl.resume();
37
+ }
38
+ if (approved) {
39
+ this.logger.log(`User approved: ${displayCmd}`);
40
+ }
41
+ else {
42
+ this.logger.log(`User rejected: ${displayCmd}`);
43
+ }
44
+ resolve(approved);
45
+ };
46
+ const onLine = (answer) => {
47
+ const normalized = answer.trim().toLowerCase();
48
+ if (normalized === '') {
49
+ writePrompt();
50
+ return;
51
+ }
52
+ if (normalized === 'y' || normalized === 'yes') {
53
+ finish(true);
54
+ return;
55
+ }
56
+ if (normalized === 'n' || normalized === 'no') {
57
+ finish(false);
58
+ return;
59
+ }
60
+ process.stderr.write(` Please type "y" to allow or "n" to reject: `);
61
+ };
62
+ rl.on('line', onLine);
63
+ });
64
+ }
65
+ }
66
+ exports.CliInteractionAdapter = CliInteractionAdapter;
67
+ //# sourceMappingURL=cli-interaction.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-interaction.adapter.js","sourceRoot":"","sources":["../../../src/common/adapters/cli-interaction.adapter.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AACxC,qCAAqC;AAkBrC,MAAa,qBAAqB;IAQH;IAPZ,MAAM,GAAG,IAAI,eAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAOjE,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D,cAAc,CAAC,OAAe;QAC5B,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;QAGjE,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAO,CAAC,KAAK,EAAE,CAAC;YAEpB,IAAI,CAAC,MAA2C,CAAC,QAAQ,GAAG,KAAK,CAAC;QACrE,CAAC;QAED,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,GAAG,EAAE;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iDAAiD;oBAC/C,QAAQ,UAAU,IAAI;oBACtB,mBAAmB,CACtB,CAAC;YACJ,CAAC,CAAC;YAEF,WAAW,EAAE,CAAC;YAEd,MAAM,MAAM,GAAG,CAAC,QAAiB,EAAE,EAAE;gBACnC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACvB,EAAE,CAAC,KAAK,EAAE,CAAC;gBAEX,IAAI,OAAO,EAAE,CAAC;oBACX,IAAI,CAAC,MAA2C,CAAC,QAAQ,GAAG,IAAI,CAAC;oBAClE,IAAI,CAAC,MAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,CAAC;gBAED,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;gBAClD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;gBAClD,CAAC;gBAED,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,EAAE;gBAChC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAG/C,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;oBACtB,WAAW,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;oBAC/C,MAAM,CAAC,IAAI,CAAC,CAAC;oBACb,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBAC9C,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;gBAGD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gDAAgD,CACjD,CAAC;YACJ,CAAC,CAAC;YAEF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AArFD,sDAqFC"}
@@ -0,0 +1,6 @@
1
+ export interface IInteractionAdapter {
2
+ askForApproval(command: string): Promise<boolean>;
3
+ }
4
+ export declare class NoopInteractionAdapter implements IInteractionAdapter {
5
+ askForApproval(_command: string): Promise<boolean>;
6
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoopInteractionAdapter = void 0;
4
+ class NoopInteractionAdapter {
5
+ async askForApproval(_command) {
6
+ return false;
7
+ }
8
+ }
9
+ exports.NoopInteractionAdapter = NoopInteractionAdapter;
10
+ //# sourceMappingURL=interaction-adapter.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-adapter.interface.js","sourceRoot":"","sources":["../../../src/common/adapters/interaction-adapter.interface.ts"],"names":[],"mappings":";;;AAsBA,MAAa,sBAAsB;IACjC,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAJD,wDAIC"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_SESSION_ID = "main";
2
+ export declare const DEFAULT_USER_ID = "default";
3
+ export declare const DEFAULT_USER_NAME = "Harunauts";
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_USER_NAME = exports.DEFAULT_USER_ID = exports.DEFAULT_SESSION_ID = void 0;
4
+ exports.DEFAULT_SESSION_ID = 'main';
5
+ exports.DEFAULT_USER_ID = 'default';
6
+ exports.DEFAULT_USER_NAME = 'Harunauts';
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG,MAAM,CAAC;AAC5B,QAAA,eAAe,GAAG,SAAS,CAAC;AAC5B,QAAA,iBAAiB,GAAG,WAAW,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types/message.types';
2
+ export * from './types/tool.types';
3
+ export * from './utils/type-guards';
4
+ export * from './constants';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types/message.types"), exports);
18
+ __exportStar(require("./types/tool.types"), exports);
19
+ __exportStar(require("./utils/type-guards"), exports);
20
+ __exportStar(require("./constants"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,qDAAmC;AACnC,sDAAoC;AACpC,8CAA4B"}
@@ -0,0 +1,9 @@
1
+ import 'winston-daily-rotate-file';
2
+ import { LoggerService } from '@nestjs/common';
3
+ export interface LoggerOptions {
4
+ appName?: string;
5
+ level?: string;
6
+ }
7
+ export declare function createHarubashiLogger(opts?: LoggerOptions): LoggerService;
8
+ export declare function listLogFiles(): string[];
9
+ export declare function latestLogFile(): string | null;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createHarubashiLogger = createHarubashiLogger;
4
+ exports.listLogFiles = listLogFiles;
5
+ exports.latestLogFile = latestLogFile;
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const winston = require("winston");
9
+ require("winston-daily-rotate-file");
10
+ const nest_winston_1 = require("nest-winston");
11
+ const paths_1 = require("./paths");
12
+ const SECRET_PATTERNS = [
13
+ { regex: /(nvapi-)[A-Za-z0-9_\-]{20,}/g, redact: () => 'nvapi-***' },
14
+ { regex: /(sk-ant-[A-Za-z0-9_\-]{8,})/g, redact: () => 'sk-ant-***' },
15
+ { regex: /\b(sk-)(?!ant-)[A-Za-z0-9_\-]{20,}/g, redact: () => 'sk-***' },
16
+ { regex: /\b(AIza)[A-Za-z0-9_\-]{30,}/g, redact: () => 'AIza***' },
17
+ { regex: /\b\d{6,}:[A-Za-z0-9_-]{30,}\b/g, redact: () => '***BOT_TOKEN***' },
18
+ { regex: /(Bearer\s+)[A-Za-z0-9._\-]+/gi, redact: () => 'Bearer ***' },
19
+ ];
20
+ function maskString(s) {
21
+ let out = s;
22
+ for (const { regex, redact } of SECRET_PATTERNS) {
23
+ out = out.replace(regex, redact);
24
+ }
25
+ return out;
26
+ }
27
+ function maskAny(value, depth = 0) {
28
+ if (depth > 6)
29
+ return value;
30
+ if (typeof value === 'string')
31
+ return maskString(value);
32
+ if (Array.isArray(value))
33
+ return value.map((v) => maskAny(v, depth + 1));
34
+ if (value && typeof value === 'object') {
35
+ const out = {};
36
+ for (const [k, v] of Object.entries(value)) {
37
+ out[k] = maskAny(v, depth + 1);
38
+ }
39
+ return out;
40
+ }
41
+ return value;
42
+ }
43
+ const secretMasker = winston.format((info) => {
44
+ for (const key of Object.keys(info)) {
45
+ info[key] = maskAny(info[key]);
46
+ }
47
+ return info;
48
+ });
49
+ function createHarubashiLogger(opts = {}) {
50
+ fs.mkdirSync(paths_1.HarubashiPaths.logsDir, { recursive: true });
51
+ const level = opts.level || process.env.LOG_LEVEL || 'info';
52
+ const appName = opts.appName || 'Harubashi';
53
+ return nest_winston_1.WinstonModule.createLogger({
54
+ level,
55
+ transports: [
56
+ new winston.transports.Console({
57
+ format: winston.format.combine(secretMasker(), winston.format.timestamp(), winston.format.ms(), nest_winston_1.utilities.format.nestLike(appName, {
58
+ colors: true,
59
+ prettyPrint: true,
60
+ })),
61
+ }),
62
+ new winston.transports.DailyRotateFile({
63
+ dirname: paths_1.HarubashiPaths.logsDir,
64
+ filename: 'harubashi-%DATE%.log',
65
+ datePattern: 'YYYY-MM-DD',
66
+ maxFiles: '14d',
67
+ maxSize: '20m',
68
+ zippedArchive: false,
69
+ format: winston.format.combine(secretMasker(), winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.json()),
70
+ }),
71
+ ],
72
+ });
73
+ }
74
+ function listLogFiles() {
75
+ if (!fs.existsSync(paths_1.HarubashiPaths.logsDir))
76
+ return [];
77
+ const entries = fs.readdirSync(paths_1.HarubashiPaths.logsDir);
78
+ const matches = entries.filter((f) => /^harubashi-\d{4}-\d{2}-\d{2}\.log$/.test(f));
79
+ return matches
80
+ .map((f) => path.join(paths_1.HarubashiPaths.logsDir, f))
81
+ .sort();
82
+ }
83
+ function latestLogFile() {
84
+ const files = listLogFiles();
85
+ return files.length === 0 ? null : files[files.length - 1];
86
+ }
87
+ //# sourceMappingURL=logger.js.map