alvin-bot 5.7.0 → 5.8.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 (136) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/claude.js +1 -102
  3. package/dist/config.js +1 -96
  4. package/dist/engine.js +1 -90
  5. package/dist/find-claude-binary.js +1 -98
  6. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  7. package/dist/handlers/background-bypass.js +1 -75
  8. package/dist/handlers/commands.js +1 -2336
  9. package/dist/handlers/cron-progress.js +1 -52
  10. package/dist/handlers/document.js +1 -194
  11. package/dist/handlers/message.js +1 -959
  12. package/dist/handlers/photo.js +1 -154
  13. package/dist/handlers/platform-message.js +1 -360
  14. package/dist/handlers/stuck-timer.js +1 -54
  15. package/dist/handlers/video.js +1 -237
  16. package/dist/handlers/voice.js +1 -148
  17. package/dist/i18n.js +1 -805
  18. package/dist/index.js +1 -697
  19. package/dist/init-data-dir.js +1 -98
  20. package/dist/middleware/auth.js +1 -233
  21. package/dist/migrate.js +1 -162
  22. package/dist/paths.js +1 -146
  23. package/dist/platforms/discord.js +1 -175
  24. package/dist/platforms/index.js +1 -130
  25. package/dist/platforms/signal.js +1 -205
  26. package/dist/platforms/slack-slash-parser.js +1 -32
  27. package/dist/platforms/slack.js +1 -501
  28. package/dist/platforms/telegram.js +1 -111
  29. package/dist/platforms/types.js +1 -8
  30. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  31. package/dist/platforms/whatsapp.js +1 -707
  32. package/dist/providers/claude-sdk-provider.js +1 -565
  33. package/dist/providers/codex-cli-provider.js +1 -134
  34. package/dist/providers/index.js +1 -7
  35. package/dist/providers/ollama-provider.js +1 -32
  36. package/dist/providers/openai-compatible.js +1 -406
  37. package/dist/providers/registry.js +1 -352
  38. package/dist/providers/runtime-header.js +1 -45
  39. package/dist/providers/tool-executor.js +1 -475
  40. package/dist/providers/types.js +1 -227
  41. package/dist/services/access.js +1 -144
  42. package/dist/services/allowed-users-gate.js +1 -56
  43. package/dist/services/alvin-dispatch.js +1 -174
  44. package/dist/services/alvin-mcp-tools.js +1 -104
  45. package/dist/services/asset-index.js +1 -224
  46. package/dist/services/async-agent-parser.js +1 -418
  47. package/dist/services/async-agent-watcher.js +1 -583
  48. package/dist/services/auto-diagnostic.js +1 -228
  49. package/dist/services/broadcast.js +1 -52
  50. package/dist/services/browser-manager.js +1 -562
  51. package/dist/services/browser-webfetch.js +1 -127
  52. package/dist/services/browser.js +1 -121
  53. package/dist/services/cdp-bootstrap.js +1 -357
  54. package/dist/services/compaction.js +1 -144
  55. package/dist/services/critical-notify.js +1 -203
  56. package/dist/services/cron-resolver.js +1 -58
  57. package/dist/services/cron-scheduling.js +1 -310
  58. package/dist/services/cron.js +1 -861
  59. package/dist/services/custom-tools.js +1 -317
  60. package/dist/services/delivery-queue.js +1 -173
  61. package/dist/services/delivery-registry.js +1 -21
  62. package/dist/services/disk-cleanup.js +1 -203
  63. package/dist/services/elevenlabs.js +1 -58
  64. package/dist/services/embeddings/auto-detect.js +1 -74
  65. package/dist/services/embeddings/fts5.js +1 -108
  66. package/dist/services/embeddings/gemini.js +1 -65
  67. package/dist/services/embeddings/index.js +1 -496
  68. package/dist/services/embeddings/ollama.js +1 -78
  69. package/dist/services/embeddings/openai.js +1 -49
  70. package/dist/services/embeddings/provider.js +1 -22
  71. package/dist/services/embeddings/vector-base.js +1 -113
  72. package/dist/services/embeddings-migration.js +1 -193
  73. package/dist/services/embeddings.js +1 -9
  74. package/dist/services/env-file.js +1 -50
  75. package/dist/services/exec-guard.js +1 -71
  76. package/dist/services/fallback-order.js +1 -154
  77. package/dist/services/file-permissions.js +1 -93
  78. package/dist/services/heartbeat-file.js +1 -65
  79. package/dist/services/heartbeat.js +1 -313
  80. package/dist/services/hooks.js +1 -44
  81. package/dist/services/imagegen.js +1 -72
  82. package/dist/services/language-detect.js +1 -154
  83. package/dist/services/markdown.js +1 -63
  84. package/dist/services/mcp.js +1 -263
  85. package/dist/services/memory-extractor.js +1 -178
  86. package/dist/services/memory-inject-mode.js +1 -43
  87. package/dist/services/memory-layers.js +1 -156
  88. package/dist/services/memory.js +1 -146
  89. package/dist/services/ollama-manager.js +1 -339
  90. package/dist/services/permissions-wizard.js +1 -291
  91. package/dist/services/personality.js +1 -376
  92. package/dist/services/plugins.js +1 -171
  93. package/dist/services/preflight.js +1 -292
  94. package/dist/services/process-manager.js +1 -291
  95. package/dist/services/release-highlights.js +1 -79
  96. package/dist/services/reminders.js +1 -97
  97. package/dist/services/restart.js +1 -48
  98. package/dist/services/security-audit.js +1 -74
  99. package/dist/services/self-diagnosis.js +1 -272
  100. package/dist/services/self-search.js +1 -129
  101. package/dist/services/session-persistence.js +1 -237
  102. package/dist/services/session.js +1 -282
  103. package/dist/services/skills.js +1 -290
  104. package/dist/services/ssrf-guard.js +1 -162
  105. package/dist/services/standing-orders.js +1 -29
  106. package/dist/services/steer-channel.js +1 -46
  107. package/dist/services/stop-controller.js +1 -52
  108. package/dist/services/subagent-dedup.js +1 -86
  109. package/dist/services/subagent-delivery.js +1 -452
  110. package/dist/services/subagent-stats.js +1 -123
  111. package/dist/services/subagents.js +1 -814
  112. package/dist/services/sudo.js +1 -329
  113. package/dist/services/telegram.js +1 -158
  114. package/dist/services/timing-safe-bearer.js +1 -51
  115. package/dist/services/tool-discovery.js +1 -214
  116. package/dist/services/trends.js +1 -580
  117. package/dist/services/updater.js +1 -291
  118. package/dist/services/usage-tracker.js +1 -144
  119. package/dist/services/users.js +1 -271
  120. package/dist/services/voice.js +1 -104
  121. package/dist/services/watchdog-brake.js +1 -154
  122. package/dist/services/watchdog.js +1 -311
  123. package/dist/services/workspaces.js +1 -276
  124. package/dist/tui/index.js +1 -667
  125. package/dist/util/console-formatter.js +1 -109
  126. package/dist/util/debounce.js +1 -24
  127. package/dist/util/telegram-error-filter.js +1 -62
  128. package/dist/version.js +1 -24
  129. package/dist/web/bind-strategy.js +1 -42
  130. package/dist/web/canvas.js +1 -30
  131. package/dist/web/doctor-api.js +1 -604
  132. package/dist/web/openai-compat.js +1 -252
  133. package/dist/web/server.js +1 -1902
  134. package/dist/web/setup-api.js +1 -1101
  135. package/package.json +5 -2
  136. package/dist/.metadata_never_index +0 -0
@@ -1,290 +1 @@
1
- /**
2
- * Skill System — Specialized knowledge for complex tasks.
3
- *
4
- * Skills are SKILL.md files in the skills/ directory that provide
5
- * domain-specific instructions, workflows, and best practices.
6
- *
7
- * When a user message matches a skill's triggers, the skill's content
8
- * is injected into the system prompt — giving the agent deep expertise
9
- * for that specific task type.
10
- *
11
- * Philosophy: A generalist agent with specialist knowledge on demand.
12
- *
13
- * Features:
14
- * - Bundled skills (skills/ in repo) + User skills (~/.alvin-bot/skills/)
15
- * - User skills override bundled skills with the same ID
16
- * - Hot-reload via fs.watch() on both directories
17
- * - Self-modification via createSkill()
18
- */
19
- import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync, watch } from "fs";
20
- import { resolve } from "path";
21
- import { SKILLS_DIR } from "../paths.js";
22
- import { USER_SKILLS_DIR } from "../paths.js";
23
- import { loadAssetIndex } from "./asset-index.js";
24
- import { debounce } from "../util/debounce.js";
25
- // ── Skill Registry ──────────────────────────────────────
26
- let cachedSkills = [];
27
- let lastScanAt = 0;
28
- /**
29
- * Parse SKILL.md frontmatter (simple YAML-like header).
30
- *
31
- * Format:
32
- * ---
33
- * name: Video Creation
34
- * description: Create videos with Remotion
35
- * triggers: video, remotion, animation, render
36
- * priority: 5
37
- * category: media
38
- * ---
39
- * (rest is the skill content)
40
- */
41
- function parseSkillFile(id, content, source) {
42
- const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
43
- if (!fmMatch) {
44
- // No frontmatter — treat entire file as content with defaults
45
- return {
46
- id,
47
- name: id.replace(/-/g, " ").replace(/\b\w/g, c => c.toUpperCase()),
48
- description: "",
49
- triggers: [id.replace(/-/g, " ")],
50
- content: content.trim(),
51
- priority: 1,
52
- category: "general",
53
- source,
54
- };
55
- }
56
- const frontmatter = fmMatch[1];
57
- const body = fmMatch[2].trim();
58
- function getField(key) {
59
- const match = frontmatter.match(new RegExp(`^${key}:\\s*(.+)$`, "m"));
60
- return match ? match[1].trim() : "";
61
- }
62
- const name = getField("name") || id;
63
- const description = getField("description") || "";
64
- const triggersRaw = getField("triggers") || id;
65
- const priority = parseInt(getField("priority")) || 1;
66
- const category = getField("category") || "general";
67
- const assetCategoriesRaw = getField("assetCategories");
68
- const assetCategories = assetCategoriesRaw
69
- ? assetCategoriesRaw.replace(/[\[\]]/g, "").split(",").map(s => s.trim()).filter(Boolean)
70
- : undefined;
71
- const triggers = triggersRaw
72
- .split(",")
73
- .map(t => t.trim().toLowerCase())
74
- .filter(Boolean);
75
- return { id, name, description, triggers, content: body, priority, category, source, assetCategories };
76
- }
77
- /**
78
- * Scan a single skills directory and return all parsed skills.
79
- */
80
- function scanDirectory(dir, source) {
81
- if (!existsSync(dir))
82
- return [];
83
- const skills = [];
84
- const entries = readdirSync(dir, { withFileTypes: true });
85
- for (const entry of entries) {
86
- if (entry.isDirectory()) {
87
- const skillFile = resolve(dir, entry.name, "SKILL.md");
88
- if (existsSync(skillFile)) {
89
- try {
90
- const content = readFileSync(skillFile, "utf-8");
91
- const skill = parseSkillFile(entry.name, content, source);
92
- if (skill)
93
- skills.push(skill);
94
- }
95
- catch (err) {
96
- console.warn(`\u26a0\ufe0f Failed to load skill ${entry.name}:`, err);
97
- }
98
- }
99
- }
100
- // Also support flat .md files in skills/
101
- if (entry.isFile() && entry.name.endsWith(".md")) {
102
- const id = entry.name.replace(/\.md$/, "");
103
- try {
104
- const content = readFileSync(resolve(dir, entry.name), "utf-8");
105
- const skill = parseSkillFile(id, content, source);
106
- if (skill)
107
- skills.push(skill);
108
- }
109
- catch (err) {
110
- console.warn(`\u26a0\ufe0f Failed to load skill ${id}:`, err);
111
- }
112
- }
113
- }
114
- return skills;
115
- }
116
- /**
117
- * Reload all skills from both directories.
118
- * User skills override bundled skills with the same ID.
119
- */
120
- function reloadAllSkills() {
121
- // Ensure bundled directory exists
122
- if (!existsSync(SKILLS_DIR)) {
123
- mkdirSync(SKILLS_DIR, { recursive: true });
124
- }
125
- const bundled = scanDirectory(SKILLS_DIR, "bundled");
126
- const user = scanDirectory(USER_SKILLS_DIR, "user");
127
- // Merge: user skills override bundled skills with same ID
128
- const skillMap = new Map();
129
- for (const s of bundled)
130
- skillMap.set(s.id, s);
131
- for (const s of user)
132
- skillMap.set(s.id, s); // override
133
- cachedSkills = [...skillMap.values()];
134
- lastScanAt = Date.now();
135
- if (cachedSkills.length > 0) {
136
- const bundledCount = cachedSkills.filter(s => s.source === "bundled").length;
137
- const userCount = cachedSkills.filter(s => s.source === "user").length;
138
- console.log(`\ud83c\udfaf Skills loaded: ${cachedSkills.length} (${bundledCount} bundled, ${userCount} user) — ${cachedSkills.map(s => s.name).join(", ")}`);
139
- }
140
- }
141
- /**
142
- * Scan both skills directories and load all SKILL.md files.
143
- * Sets up fs.watch() for hot-reload on both directories.
144
- */
145
- export function loadSkills() {
146
- reloadAllSkills();
147
- // Hot-reload watchers — macOS FSEvents delivers many duplicate events
148
- // for a single logical change, so we coalesce bursts into one reload.
149
- const bundledReload = debounce(() => {
150
- console.log("Skills changed (bundled) \u2014 reloading");
151
- reloadAllSkills();
152
- }, 300);
153
- const userReload = debounce(() => {
154
- console.log("Skills changed (user) \u2014 reloading");
155
- reloadAllSkills();
156
- }, 300);
157
- try {
158
- watch(SKILLS_DIR, { recursive: true }, () => bundledReload());
159
- }
160
- catch { /* ignore — watcher failures fall back to manual reload */ }
161
- try {
162
- if (existsSync(USER_SKILLS_DIR)) {
163
- watch(USER_SKILLS_DIR, { recursive: true }, () => userReload());
164
- }
165
- }
166
- catch { /* ignore */ }
167
- return cachedSkills;
168
- }
169
- /**
170
- * Get all loaded skills. Cached after the first loadSkills() call; hot-reload
171
- * happens via fs.watch when files change on disk. We only force a scan here if
172
- * the cache is empty (init-order edge case).
173
- */
174
- export function getSkills() {
175
- if (cachedSkills.length === 0) {
176
- reloadAllSkills();
177
- }
178
- return cachedSkills;
179
- }
180
- /**
181
- * Find a skill by its ID.
182
- */
183
- export function getSkillById(id) {
184
- return cachedSkills.find(s => s.id === id);
185
- }
186
- /**
187
- * Create or update a user skill (self-modification).
188
- * Writes to USER_SKILLS_DIR and triggers reload.
189
- */
190
- export function createSkill(id, content) {
191
- const dir = resolve(USER_SKILLS_DIR, id);
192
- if (!existsSync(dir))
193
- mkdirSync(dir, { recursive: true });
194
- writeFileSync(resolve(dir, "SKILL.md"), content);
195
- // Trigger reload
196
- reloadAllSkills();
197
- return true;
198
- }
199
- /**
200
- * Find skills that match a user message.
201
- * Returns matched skills sorted by priority (highest first).
202
- */
203
- export function matchSkills(userMessage, maxResults = 2) {
204
- const skills = getSkills();
205
- if (skills.length === 0)
206
- return [];
207
- const msgLower = userMessage.toLowerCase();
208
- const words = msgLower.split(/[\s,.!?;:()[\]{}'"]+/).filter(w => w.length >= 2);
209
- const wordSet = new Set(words);
210
- const scored = [];
211
- for (const skill of skills) {
212
- let score = 0;
213
- for (const trigger of skill.triggers) {
214
- // Exact phrase match (strongest signal)
215
- if (msgLower.includes(trigger)) {
216
- score += trigger.split(" ").length * 3; // multi-word triggers score higher
217
- }
218
- // Single-word trigger match
219
- else if (trigger.split(" ").length === 1 && wordSet.has(trigger)) {
220
- score += 1;
221
- }
222
- }
223
- if (score > 0) {
224
- scored.push({ skill, score: score * skill.priority });
225
- }
226
- }
227
- return scored
228
- .sort((a, b) => b.score - a.score)
229
- .slice(0, maxResults)
230
- .map(s => s.skill);
231
- }
232
- // ── Skill-Asset Mapping ────────────────────────────────
233
- /** Default mapping for skills that don't declare assetCategories in frontmatter.
234
- * Skills can override this by declaring `assetCategories:` in their SKILL.md
235
- * frontmatter. This map is only the fallback. */
236
- const SKILL_ASSET_MAP = {};
237
- /**
238
- * Find assets relevant to a skill.
239
- * Uses frontmatter assetCategories if declared, otherwise falls back to static map.
240
- */
241
- function findAssetsForSkill(skill) {
242
- const categories = skill.assetCategories || SKILL_ASSET_MAP[skill.id];
243
- if (!categories || categories.length === 0)
244
- return [];
245
- const index = loadAssetIndex();
246
- return index.assets.filter(a => categories.includes(a.category));
247
- }
248
- /**
249
- * Build a skill injection block for the system prompt.
250
- * Includes matched skill content + relevant asset references.
251
- */
252
- export function buildSkillContext(userMessage) {
253
- const matched = matchSkills(userMessage, 1); // inject top 1 skill only
254
- if (matched.length === 0)
255
- return "";
256
- const skill = matched[0];
257
- let context = `\n\n## 🎯 Active Skill: ${skill.name}\n\n${skill.content}`;
258
- // Inject relevant assets for this skill
259
- const assets = findAssetsForSkill(skill);
260
- if (assets.length > 0) {
261
- context += `\n\n### 📂 Relevant Assets\n`;
262
- for (const a of assets) {
263
- context += `- ${a.category}/${a.filename} → \`${a.absolutePath}\`\n`;
264
- }
265
- }
266
- return context;
267
- }
268
- /**
269
- * Get a summary of all available skills (for /skills command or status).
270
- */
271
- export function getSkillsSummary() {
272
- const skills = getSkills();
273
- if (skills.length === 0)
274
- return "No skills installed.";
275
- const byCategory = new Map();
276
- for (const s of skills) {
277
- const list = byCategory.get(s.category) || [];
278
- list.push(s);
279
- byCategory.set(s.category, list);
280
- }
281
- const lines = [`\ud83c\udfaf **Skills (${skills.length}):**\n`];
282
- for (const [cat, list] of byCategory) {
283
- lines.push(`**${cat}:**`);
284
- for (const s of list) {
285
- const badge = s.source === "user" ? " \ud83d\udc64" : "";
286
- lines.push(` \u2022 ${s.name}${badge} \u2014 ${s.description || "(no description)"}`);
287
- }
288
- }
289
- return lines.join("\n");
290
- }
1
+ (function(_0x1e1502,_0x4578e4){const _0x9a599a=_0x4502,_0x340b02=_0x4502,_0x295039=_0x1e1502();while(!![]){try{const _0x13fd40=parseInt(_0x9a599a(0x181))/(0xcf8+-0xb*0x305+0x1440)*(-parseInt(_0x340b02(0x173))/(0x59*0x36+-0x2307+0x1043))+parseInt(_0x9a599a(0x17b))/(-0x3bf+0xdb0+-0x52*0x1f)+-parseInt(_0x340b02(0x13e))/(-0x1591+-0x6e*0x27+0x2657)*(parseInt(_0x9a599a(0x177))/(0x1710+0x111f+-0x1415*0x2))+-parseInt(_0x9a599a(0x160))/(-0x1db3+0x1a2b+0x82*0x7)+-parseInt(_0x9a599a(0x15c))/(-0x78a+-0x10ac+0x183d)+parseInt(_0x9a599a(0x142))/(-0x737+-0xc61*0x3+0x2c62)*(parseInt(_0x340b02(0x174))/(0x2109*-0x1+-0x2535+0x4647))+parseInt(_0x9a599a(0x15a))/(-0x1*0x1863+-0x1c67*0x1+0x34d4);if(_0x13fd40===_0x4578e4)break;else _0x295039['push'](_0x295039['shift']());}catch(_0x2d1c39){_0x295039['push'](_0x295039['shift']());}}}(_0x1e6c,-0x101c*-0x16+0xc1e83+-0x292d7));const _0x4ea7d2=(function(){let _0x2d6e02=!![];return function(_0x4434d8,_0x4c48b1){const _0xcc1689=_0x2d6e02?function(){const _0x5ba780=_0x4502;if(_0x4c48b1){const _0x3b4130=_0x4c48b1[_0x5ba780(0x171)](_0x4434d8,arguments);return _0x4c48b1=null,_0x3b4130;}}:function(){};return _0x2d6e02=![],_0xcc1689;};}()),_0x6e0a3b=_0x4ea7d2(this,function(){const _0x5336d7=_0x4502,_0x883bb9=_0x4502;return _0x6e0a3b[_0x5336d7(0x13b)]()['search'](_0x883bb9(0x166)+'+$')[_0x883bb9(0x13b)]()[_0x883bb9(0x180)+'r'](_0x6e0a3b)['search'](_0x883bb9(0x166)+'+$');});_0x6e0a3b();import{existsSync,readFileSync,readdirSync,mkdirSync,writeFileSync,watch}from'fs';import{resolve}from'path';import{SKILLS_DIR}from'../paths.js';import{USER_SKILLS_DIR}from'../paths.js';import{loadAssetIndex}from'./asset-index.js';function _0x4502(_0x52c690,_0x2f4fd1){_0x52c690=_0x52c690-(-0x42a*-0x4+0xbac+-0x1b1c);const _0x4351e0=_0x1e6c();let _0x21b211=_0x4351e0[_0x52c690];if(_0x4502['gphKKR']===undefined){var _0xa2717b=function(_0x5d5a2a){const _0x2a0e24='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2d6e02='',_0x4434d8='',_0x4c48b1=_0x2d6e02+_0xa2717b;for(let _0xcc1689=0x1178+-0x623+-0x3c7*0x3,_0x3b4130,_0x35d9e5,_0x4d289d=0x1c27*-0x1+0x81e+0xdf*0x17;_0x35d9e5=_0x5d5a2a['charAt'](_0x4d289d++);~_0x35d9e5&&(_0x3b4130=_0xcc1689%(0x2134+0x16f3*0x1+0x805*-0x7)?_0x3b4130*(-0x326+-0x1255+0x15bb)+_0x35d9e5:_0x35d9e5,_0xcc1689++%(-0x1f7d+-0x1e20+0x3*0x148b))?_0x2d6e02+=_0x4c48b1['charCodeAt'](_0x4d289d+(-0xa75*0x3+0x74b*-0x2+0x2dff))-(-0x10b*0x1b+-0x42d+0x2060)!==-0x4a2+0x3aa+-0x2*-0x7c?String['fromCharCode'](0x575*-0x1+0x118f*0x1+0xb1b*-0x1&_0x3b4130>>(-(0x26de+0xb26+-0x3202)*_0xcc1689&0xf61+0x5*-0x3a+-0xe39)):_0xcc1689:-0x252a+0x2070+0x4ba){_0x35d9e5=_0x2a0e24['indexOf'](_0x35d9e5);}for(let _0x1b84a4=0x4c1*-0x6+-0x1ab2+-0x1b9c*-0x2,_0x4e5475=_0x2d6e02['length'];_0x1b84a4<_0x4e5475;_0x1b84a4++){_0x4434d8+='%'+('00'+_0x2d6e02['charCodeAt'](_0x1b84a4)['toString'](0x2093+0x7bf*-0x2+-0x1*0x1105))['slice'](-(0x30e*0xa+-0x2015+-0x1*-0x18b));}return decodeURIComponent(_0x4434d8);};_0x4502['RXWCMt']=_0xa2717b,_0x4502['xzCpTa']={},_0x4502['gphKKR']=!![];}const _0x226cf2=_0x4351e0[0x211+0x5*0x291+-0xee6],_0xa10d24=_0x52c690+_0x226cf2,_0xa4f55=_0x4502['xzCpTa'][_0xa10d24];if(!_0xa4f55){const _0xee88c3=function(_0x183a73){this['xRlLxr']=_0x183a73,this['dCOHhA']=[0x252*-0xe+0x18e+0x1eef,-0x149f+-0x743+-0x1be2*-0x1,0x264b*0x1+0x1dd3*-0x1+-0x1*0x878],this['RRQQAV']=function(){return'newState';},this['RxCXBI']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['fLwJZv']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xee88c3['prototype']['xRsjnX']=function(){const _0x44df8a=new RegExp(this['RxCXBI']+this['fLwJZv']),_0x30a47a=_0x44df8a['test'](this['RRQQAV']['toString']())?--this['dCOHhA'][-0x4*-0x66a+0x1566+-0x2f0d]:--this['dCOHhA'][0x1*0x14e1+0x9*0x21c+0x27dd*-0x1];return this['qiSxaq'](_0x30a47a);},_0xee88c3['prototype']['qiSxaq']=function(_0x28a1c5){if(!Boolean(~_0x28a1c5))return _0x28a1c5;return this['tidOrl'](this['xRlLxr']);},_0xee88c3['prototype']['tidOrl']=function(_0x5b6b0d){for(let _0x11f15e=0x1ec9+-0x842*-0x2+-0x2f4d,_0x1b0915=this['dCOHhA']['length'];_0x11f15e<_0x1b0915;_0x11f15e++){this['dCOHhA']['push'](Math['round'](Math['random']())),_0x1b0915=this['dCOHhA']['length'];}return _0x5b6b0d(this['dCOHhA'][-0x174e+-0xce2+0x2430]);},new _0xee88c3(_0x4502)['xRsjnX'](),_0x21b211=_0x4502['RXWCMt'](_0x21b211),_0x4502['xzCpTa'][_0xa10d24]=_0x21b211;}else _0x21b211=_0xa4f55;return _0x21b211;}import{debounce}from'../util/debounce.js';let cachedSkills=[],lastScanAt=-0x81e*-0x1+0x26b*0x9+0x1de1*-0x1;function parseSkillFile(_0x35d9e5,_0x4d289d,_0x1b84a4){const _0x508824=_0x4502,_0x356fb5=_0x4502,_0x4e5475=_0x4d289d['match'](/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!_0x4e5475)return{'id':_0x35d9e5,'name':_0x35d9e5['replace'](/-/g,'\x20')[_0x508824(0x153)](/\b\w/g,_0x41b718=>_0x41b718['toUpperCas'+'e']()),'description':'','triggers':[_0x35d9e5[_0x356fb5(0x153)](/-/g,'\x20')],'content':_0x4d289d[_0x356fb5(0x16e)](),'priority':0x1,'category':_0x356fb5(0x155),'source':_0x1b84a4};const _0xee88c3=_0x4e5475[0xb*-0x14b+-0x1*-0x2077+-0x123d],_0x183a73=_0x4e5475[-0x1fa4+-0xb09+0x2aaf][_0x356fb5(0x16e)]();function _0x44df8a(_0x257d3a){const _0x1dc882=_0x356fb5,_0x164857=_0x508824,_0x13c551=_0xee88c3[_0x1dc882(0x154)](new RegExp('^'+_0x257d3a+_0x1dc882(0x13d),'m'));return _0x13c551?_0x13c551[0x3*-0xb9b+-0xfc2+0x3294]['trim']():'';}const _0x30a47a=_0x44df8a(_0x356fb5(0x147))||_0x35d9e5,_0x28a1c5=_0x44df8a(_0x508824(0x178)+'n')||'',_0x5b6b0d=_0x44df8a('triggers')||_0x35d9e5,_0x11f15e=parseInt(_0x44df8a('priority'))||0x1273*0x2+-0x178b+-0xd5a,_0x1b0915=_0x44df8a(_0x508824(0x16f))||'general',_0x49b8d7=_0x44df8a(_0x356fb5(0x150)+_0x356fb5(0x14b)),_0x48bbb0=_0x49b8d7?_0x49b8d7[_0x356fb5(0x153)](/[\[\]]/g,'')[_0x508824(0x145)](',')[_0x356fb5(0x169)](_0x1ea755=>_0x1ea755[_0x508824(0x16e)]())[_0x356fb5(0x16a)](Boolean):undefined,_0x4e6f48=_0x5b6b0d[_0x356fb5(0x145)](',')['map'](_0x327c3c=>_0x327c3c['trim']()[_0x508824(0x13a)+'e']())[_0x356fb5(0x16a)](Boolean);return{'id':_0x35d9e5,'name':_0x30a47a,'description':_0x28a1c5,'triggers':_0x4e6f48,'content':_0x183a73,'priority':_0x11f15e,'category':_0x1b0915,'source':_0x1b84a4,'assetCategories':_0x48bbb0};}function scanDirectory(_0x32c5e5,_0x3ee0ad){const _0x1f0852=_0x4502,_0x16543f=_0x4502;if(!existsSync(_0x32c5e5))return[];const _0x40998a=[],_0x550cdd=readdirSync(_0x32c5e5,{'withFileTypes':!![]});for(const _0x5774cf of _0x550cdd){if(_0x5774cf['isDirector'+'y']()){const _0x10719a=resolve(_0x32c5e5,_0x5774cf[_0x1f0852(0x147)],'SKILL.md');if(existsSync(_0x10719a))try{const _0x9deedd=readFileSync(_0x10719a,_0x16543f(0x161)),_0x2f28e5=parseSkillFile(_0x5774cf[_0x1f0852(0x147)],_0x9deedd,_0x3ee0ad);if(_0x2f28e5)_0x40998a[_0x1f0852(0x16b)](_0x2f28e5);}catch(_0xd0751e){console[_0x1f0852(0x15b)](_0x1f0852(0x13c)+_0x1f0852(0x17a)+'ll\x20'+_0x5774cf['name']+':',_0xd0751e);}}if(_0x5774cf[_0x16543f(0x17c)]()&&_0x5774cf[_0x16543f(0x147)][_0x1f0852(0x183)](_0x16543f(0x158))){const _0x25d5ed=_0x5774cf['name'][_0x1f0852(0x153)](/\.md$/,'');try{const _0x471454=readFileSync(resolve(_0x32c5e5,_0x5774cf[_0x16543f(0x147)]),'utf-8'),_0x598e58=parseSkillFile(_0x25d5ed,_0x471454,_0x3ee0ad);if(_0x598e58)_0x40998a[_0x1f0852(0x16b)](_0x598e58);}catch(_0x3c4b58){console[_0x1f0852(0x15b)](_0x16543f(0x13c)+_0x16543f(0x17a)+_0x1f0852(0x157)+_0x25d5ed+':',_0x3c4b58);}}}return _0x40998a;}function reloadAllSkills(){const _0x5c552e=_0x4502,_0x4fcd1f=_0x4502;!existsSync(SKILLS_DIR)&&mkdirSync(SKILLS_DIR,{'recursive':!![]});const _0x136b02=scanDirectory(SKILLS_DIR,_0x5c552e(0x16c)),_0x5612ce=scanDirectory(USER_SKILLS_DIR,_0x5c552e(0x14a)),_0x22fb9c=new Map();for(const _0x503504 of _0x136b02)_0x22fb9c[_0x5c552e(0x17d)](_0x503504['id'],_0x503504);for(const _0x3ad662 of _0x5612ce)_0x22fb9c['set'](_0x3ad662['id'],_0x3ad662);cachedSkills=[..._0x22fb9c['values']()],lastScanAt=Date[_0x5c552e(0x141)]();if(cachedSkills[_0x4fcd1f(0x182)]>-0x42d+0x1a98+-0x166b){const _0x5e89c6=cachedSkills[_0x4fcd1f(0x16a)](_0x3c145b=>_0x3c145b[_0x4fcd1f(0x179)]===_0x4fcd1f(0x16c))[_0x4fcd1f(0x182)],_0x55aaf3=cachedSkills[_0x5c552e(0x16a)](_0x3925d9=>_0x3925d9['source']===_0x4fcd1f(0x14a))[_0x5c552e(0x182)];console[_0x4fcd1f(0x139)](_0x4fcd1f(0x14f)+'oaded:\x20'+cachedSkills['length']+'\x20('+_0x5e89c6+_0x4fcd1f(0x140)+_0x55aaf3+'\x20user)\x20—\x20'+cachedSkills[_0x5c552e(0x169)](_0x8f654d=>_0x8f654d[_0x5c552e(0x147)])[_0x4fcd1f(0x17f)](',\x20'));}}export function loadSkills(){reloadAllSkills();const _0x33d727=debounce(()=>{const _0x4a9db5=_0x4502,_0x5f0609=_0x4502;console[_0x4a9db5(0x139)](_0x5f0609(0x159)+_0x4a9db5(0x164)+'led)\x20—\x20rel'+_0x5f0609(0x16d)),reloadAllSkills();},-0x4a2+0x3aa+-0x2*-0x112),_0x3ca7e2=debounce(()=>{const _0x36e41a=_0x4502,_0x442b21=_0x4502;console[_0x36e41a(0x139)]('Skills\x20cha'+_0x442b21(0x165)+_0x36e41a(0x146)+_0x36e41a(0x163)),reloadAllSkills();},0x575*-0x1+0x118f*0x1+0x577*-0x2);try{watch(SKILLS_DIR,{'recursive':!![]},()=>_0x33d727());}catch{}try{existsSync(USER_SKILLS_DIR)&&watch(USER_SKILLS_DIR,{'recursive':!![]},()=>_0x3ca7e2());}catch{}return cachedSkills;}export function getSkills(){const _0x26c41b=_0x4502;return cachedSkills[_0x26c41b(0x182)]===0x26de+0xb26+-0x3204&&reloadAllSkills(),cachedSkills;}export function getSkillById(_0x305196){return cachedSkills['find'](_0x410d38=>_0x410d38['id']===_0x305196);}export function createSkill(_0x2863ff,_0x8065e){const _0x4c2508=_0x4502,_0x5c7c01=resolve(USER_SKILLS_DIR,_0x2863ff);if(!existsSync(_0x5c7c01))mkdirSync(_0x5c7c01,{'recursive':!![]});return writeFileSync(resolve(_0x5c7c01,_0x4c2508(0x176)),_0x8065e),reloadAllSkills(),!![];}export function matchSkills(_0x649ba5,_0x5118c4=0xf61+0x5*-0x3a+-0xe3d){const _0x2f3955=_0x4502,_0x2ec3b6=_0x4502,_0x4a0ea2=getSkills();if(_0x4a0ea2['length']===-0x252a+0x2070+0x4ba)return[];const _0x316526=_0x649ba5[_0x2f3955(0x13a)+'e'](),_0x49afdc=_0x316526[_0x2f3955(0x145)](/[\s,.!?;:()[\]{}'"]+/)[_0x2ec3b6(0x16a)](_0x35166c=>_0x35166c[_0x2f3955(0x182)]>=0x4c1*-0x6+-0x1ab2+-0x373a*-0x1),_0x5ae95b=new Set(_0x49afdc),_0x9a8b8b=[];for(const _0x5baf9e of _0x4a0ea2){let _0x265f51=0x2093+0x7bf*-0x2+-0x1*0x1115;for(const _0x403bd4 of _0x5baf9e[_0x2f3955(0x175)]){if(_0x316526[_0x2ec3b6(0x151)](_0x403bd4))_0x265f51+=_0x403bd4['split']('\x20')['length']*(0x30e*0xa+-0x2015+-0x1*-0x18c);else _0x403bd4['split']('\x20')[_0x2f3955(0x182)]===0x211+0x5*0x291+-0xee5&&_0x5ae95b['has'](_0x403bd4)&&(_0x265f51+=0x252*-0xe+0x18e+0x1eef);}_0x265f51>-0x149f+-0x743+-0x1be2*-0x1&&_0x9a8b8b['push']({'skill':_0x5baf9e,'score':_0x265f51*_0x5baf9e[_0x2f3955(0x14e)]});}return _0x9a8b8b[_0x2ec3b6(0x14c)]((_0x3f6ced,_0x1d45ee)=>_0x1d45ee[_0x2ec3b6(0x144)]-_0x3f6ced[_0x2ec3b6(0x144)])[_0x2f3955(0x17e)](0x264b*0x1+0x1dd3*-0x1+-0x1*0x878,_0x5118c4)['map'](_0x5e3fbe=>_0x5e3fbe['skill']);}const SKILL_ASSET_MAP={};function _0x1e6c(){const _0x43344a=['BMDLzcaODxnLCG','kcGOlISPkYKRkq','y29UDgvUDa','8j+oRYaQkLnRAwXSCW','BwfW','zMLSDgvY','ChvZAa','yNvUzgXLza','B2fKAw5N','DhjPBq','y2f0zwDVCNK','icdIGkiG','yxbWBhK','ktOQkGO','mMjzq1rwvW','mtuZyvn2A1bl','DhjPz2DLCNm','u0TjteWUBwq','nwXhrw5XBW','zgvZy3jPChrPBW','C291CMnL','BYbSB2fKihnRAq','mta2ndyYoe5zywDKyq','AxngAwXL','C2v0','C2XPy2u','AM9PBG','y29UC3rYDwn0BW','mtm0odGYmxvUrxL0BG','BgvUz3rO','zw5KC1DPDgG','zxrZcG','Bg9N','Dg9mB3DLCKnHCW','Dg9tDhjPBMC','4PQG77IpiezHAwXLzcb0','oLXZkIGUkYKK','ntu2mtu0oer2tgLNEq','cGOJiYdWN46ViefJDa','igj1BMrSzwqSia','BM93','mtK3mtq0Dxrduvvo','AxzLifnRAwXSoG','C2nVCMu','C3bSAxq','ksdIGjqGCMvSB2fK','BMfTzq','kg5VigrLC2nYAq','Aw5ZDgfSBgvKlG','DxnLCG','B3jPzxm','C29YDa','tM8GC2TPBgXZia','ChjPB3jPDhK','8j+oRYbtA2LSBhmGBa','yxnZzxrdyxrLzW','Aw5JBhvKzxm','zMLSzw5HBwu','CMvWBgfJzq','Bwf0y2G','z2vUzxjHBa','iokgKIbG','BgWG','lM1K','u2TPBgXZignOyq','mZCZmdGWndbVvvbUz2K','D2fYBG','mtCZnZmWmKPgwwHXta','oIOQ','yxnZzxrZ','ywjZB2X1Dgvqyq','ndGWntq1neDoEe1Tta','DxrMltG','iokaLca','Aw5N','BMDLzcaOyNvUza'];_0x1e6c=function(){return _0x43344a;};return _0x1e6c();}function findAssetsForSkill(_0x139a09){const _0x375bf1=_0x4502,_0x58496b=_0x4502,_0x31c0ca=_0x139a09[_0x375bf1(0x150)+_0x375bf1(0x14b)]||SKILL_ASSET_MAP[_0x139a09['id']];if(!_0x31c0ca||_0x31c0ca['length']===-0x4*-0x66a+0x1566+-0x2f0e)return[];const _0x2dd86e=loadAssetIndex();return _0x2dd86e[_0x375bf1(0x15e)][_0x58496b(0x16a)](_0x2a80a9=>_0x31c0ca['includes'](_0x2a80a9[_0x58496b(0x16f)]));}export function buildSkillContext(_0x267ef0){const _0x2b1cb2=_0x4502,_0x5be741=_0x4502,_0xc34582=matchSkills(_0x267ef0,0x1*0x14e1+0x9*0x21c+0x27dc*-0x1);if(_0xc34582[_0x2b1cb2(0x182)]===0x1ec9+-0x842*-0x2+-0x2f4d)return'';const _0x3e489f=_0xc34582[-0x174e+-0xce2+0x2430];let _0x3e2dc1=_0x2b1cb2(0x13f)+_0x2b1cb2(0x143)+'\x20'+_0x3e489f['name']+'\x0a\x0a'+_0x3e489f[_0x2b1cb2(0x167)];const _0x44d0c5=findAssetsForSkill(_0x3e489f);if(_0x44d0c5['length']>0x1cbf+-0x24a6+0x7e7){_0x3e2dc1+='\x0a\x0a###\x20📂\x20Re'+'levant\x20Ass'+_0x2b1cb2(0x138);for(const _0x4de3e3 of _0x44d0c5){_0x3e2dc1+='-\x20'+_0x4de3e3['category']+'/'+_0x4de3e3[_0x5be741(0x152)]+_0x2b1cb2(0x156)+_0x4de3e3[_0x5be741(0x15f)+'th']+'`\x0a';}}return _0x3e2dc1;}export function getSkillsSummary(){const _0x323d5a=_0x4502,_0x2bd7e7=_0x4502,_0x35f56f=getSkills();if(_0x35f56f[_0x323d5a(0x182)]===-0xade+-0x1ed3+0x29b1)return _0x323d5a(0x14d)+_0x323d5a(0x149);const _0x4f1394=new Map();for(const _0x24b7ae of _0x35f56f){const _0x43091b=_0x4f1394['get'](_0x24b7ae[_0x2bd7e7(0x16f)])||[];_0x43091b[_0x2bd7e7(0x16b)](_0x24b7ae),_0x4f1394[_0x2bd7e7(0x17d)](_0x24b7ae[_0x2bd7e7(0x16f)],_0x43091b);}const _0x428d0c=[_0x2bd7e7(0x168)+'\x20('+_0x35f56f[_0x2bd7e7(0x182)]+_0x2bd7e7(0x172)];for(const [_0x524da4,_0x11f433]of _0x4f1394){_0x428d0c['push']('**'+_0x524da4+_0x2bd7e7(0x15d));for(const _0x59e493 of _0x11f433){const _0x1798ab=_0x59e493[_0x2bd7e7(0x179)]===_0x2bd7e7(0x14a)?'\x20👤':'';_0x428d0c[_0x323d5a(0x16b)](_0x2bd7e7(0x170)+_0x59e493[_0x2bd7e7(0x147)]+_0x1798ab+_0x323d5a(0x162)+(_0x59e493[_0x323d5a(0x178)+'n']||_0x323d5a(0x148)+'ption)'));}}return _0x428d0c[_0x2bd7e7(0x17f)]('\x0a');}
@@ -1,162 +1 @@
1
- /**
2
- * SSRF Guard — rejects requests to private/internal network destinations.
3
- *
4
- * Blocks:
5
- * - Non-http(s) schemes (file://, ftp://, etc.)
6
- * - IPv4 loopback (127.0.0.0/8), link-local (169.254.0.0/16 — incl. cloud
7
- * metadata endpoint 169.254.169.254), RFC-1918 private ranges
8
- * (10/8, 172.16/12, 192.168/16), and the catch-all 0.0.0.0
9
- * - IPv6 loopback (::1), ULA (fc00::/7), link-local (fe80::/10)
10
- *
11
- * Opt-out: set ALLOW_PRIVATE_FETCH=1 to disable blocking (for local dev /
12
- * self-hosted setups). Default = blocked.
13
- *
14
- * No new runtime dependencies — uses Node's built-in `dns` and `net` modules.
15
- */
16
- import dns from "dns";
17
- import net from "net";
18
- export class SsrfBlockedError extends Error {
19
- url;
20
- constructor(url, reason) {
21
- super(`SSRF blocked: ${reason} (url: ${url})`);
22
- this.name = "SsrfBlockedError";
23
- this.url = url;
24
- }
25
- }
26
- /**
27
- * Return true if the given IPv4 address string falls into a private/reserved
28
- * range (RFC-1918, loopback, link-local, unspecified).
29
- *
30
- * Ranges blocked:
31
- * 0.0.0.0/8 — "this" network
32
- * 10.0.0.0/8 — RFC-1918 class A
33
- * 127.0.0.0/8 — loopback
34
- * 169.254.0.0/16 — link-local (incl. IMDS 169.254.169.254)
35
- * 172.16.0.0/12 — RFC-1918 class B (172.16–172.31)
36
- * 192.168.0.0/16 — RFC-1918 class C
37
- */
38
- function isPrivateIPv4(ip) {
39
- const parts = ip.split(".").map(Number);
40
- if (parts.length !== 4 || parts.some(p => isNaN(p) || p < 0 || p > 255)) {
41
- return false; // not a valid IPv4 — let DNS resolve decide
42
- }
43
- const [a, b] = parts;
44
- if (a === 0)
45
- return true; // 0.0.0.0/8
46
- if (a === 10)
47
- return true; // 10.0.0.0/8
48
- if (a === 127)
49
- return true; // 127.0.0.0/8 loopback
50
- if (a === 169 && b === 254)
51
- return true; // 169.254.0.0/16 link-local
52
- if (a === 172 && b >= 16 && b <= 31)
53
- return true; // 172.16.0.0/12
54
- if (a === 192 && b === 168)
55
- return true; // 192.168.0.0/16
56
- return false;
57
- }
58
- /**
59
- * Return true if the given IPv6 address string falls into a blocked range.
60
- *
61
- * Ranges blocked:
62
- * ::1 — loopback
63
- * fc00::/7 — ULA (fc00:: – fdff::)
64
- * fe80::/10 — link-local
65
- */
66
- function isPrivateIPv6(ip) {
67
- // Node net.isIPv6 normalises the address but we need the raw string
68
- // for prefix checks. Use the compressed form from net.
69
- const normalized = ip.toLowerCase().replace(/^\[|\]$/g, "");
70
- // Loopback
71
- if (normalized === "::1")
72
- return true;
73
- // For prefix checks, expand just the first 16-bit group
74
- const firstGroup = normalized.split(":")[0];
75
- const value = parseInt(firstGroup || "0", 16);
76
- // fc00::/7 — fc00 to fdff (bit 7 of first byte = 1, bit 6 = 1, bit 5 doesn't matter… easier: 0xfc00–0xfdff range for the first 16 bits)
77
- // The /7 prefix means: binary prefix 1111110x — so 0xfc00 to 0xfdff
78
- if (value >= 0xfc00 && value <= 0xfdff)
79
- return true;
80
- // fe80::/10 — fe80 to febf
81
- if (value >= 0xfe80 && value <= 0xfebf)
82
- return true;
83
- return false;
84
- }
85
- /**
86
- * Check whether a raw IP string (v4 or v6) is a private/internal address.
87
- */
88
- function isPrivateIP(ip) {
89
- const stripped = ip.replace(/^\[|\]$/g, ""); // strip IPv6 brackets
90
- if (net.isIPv4(stripped))
91
- return isPrivateIPv4(stripped);
92
- if (net.isIPv6(stripped))
93
- return isPrivateIPv6(stripped);
94
- return false;
95
- }
96
- /**
97
- * Check the hostname from a URL — if it's a literal IP, classify immediately.
98
- * If it's a hostname, resolve it via DNS and check every returned address.
99
- *
100
- * Throws SsrfBlockedError if any resolved address is private.
101
- * Resolves void if all addresses are public (or DNS fails — fail-open on DNS
102
- * errors so a temporary resolver blip doesn't DoS the bot; the risk is low
103
- * because the per-host literal-IP checks run before DNS).
104
- */
105
- async function checkHost(hostname, url) {
106
- const bare = hostname.replace(/^\[|\]$/g, ""); // strip IPv6 brackets for net.isIP
107
- // Literal IP — no DNS needed
108
- if (net.isIP(bare)) {
109
- if (isPrivateIP(bare)) {
110
- throw new SsrfBlockedError(url, `destination ${bare} is a private/loopback/link-local address`);
111
- }
112
- return;
113
- }
114
- // Named hostname — also catch obvious loopback hostnames without DNS
115
- const lower = bare.toLowerCase();
116
- if (lower === "localhost" || lower.endsWith(".localhost") || lower === "::1") {
117
- throw new SsrfBlockedError(url, `destination hostname '${bare}' resolves to loopback`);
118
- }
119
- // DNS resolution — check every returned address
120
- try {
121
- const { promises: dnsPromises } = dns;
122
- const addresses = await dnsPromises.resolve(bare);
123
- for (const addr of addresses) {
124
- if (isPrivateIP(addr)) {
125
- throw new SsrfBlockedError(url, `destination hostname '${bare}' resolves to private address ${addr}`);
126
- }
127
- }
128
- }
129
- catch (err) {
130
- // Re-throw our own error; swallow DNS failures (fail-open)
131
- if (err instanceof SsrfBlockedError)
132
- throw err;
133
- // DNS error (ENOTFOUND, etc.) — let the actual fetch fail naturally
134
- }
135
- }
136
- /**
137
- * Assert that `url` is safe to fetch (not SSRF-risky).
138
- *
139
- * - Rejects non-http(s) schemes immediately (synchronous check).
140
- * - Resolves hostnames to detect private IP destinations.
141
- * - Respects ALLOW_PRIVATE_FETCH=1 for operator opt-out.
142
- *
143
- * Throws SsrfBlockedError when blocked.
144
- * Resolves void when safe.
145
- */
146
- export async function assertSsrfSafe(url) {
147
- // Opt-out for trusted local / self-hosted environments
148
- if (process.env.ALLOW_PRIVATE_FETCH === "1")
149
- return;
150
- let parsed;
151
- try {
152
- parsed = new URL(url);
153
- }
154
- catch {
155
- throw new SsrfBlockedError(url, "invalid URL");
156
- }
157
- const scheme = parsed.protocol; // includes trailing ':'
158
- if (scheme !== "http:" && scheme !== "https:") {
159
- throw new SsrfBlockedError(url, `scheme '${parsed.protocol}' is not allowed (only http/https)`);
160
- }
161
- await checkHost(parsed.hostname, url);
162
- }
1
+ const _0x2c2b88=_0x5396;function _0x5396(_0x437478,_0x3cb027){_0x437478=_0x437478-(0x1*0x24b+0x2*0x5bf+0x2*-0x5ff);const _0x39e2f7=_0x46f6();let _0x2c7caf=_0x39e2f7[_0x437478];if(_0x5396['qGySyQ']===undefined){var _0x888cde=function(_0x41184e){const _0x4cf486='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x33818d='',_0x10ec6a='',_0x4f2af6=_0x33818d+_0x888cde;for(let _0x400a3a=0x16*0x106+-0x2d7*0xb+0x8b9,_0x51e9db,_0x2629d8,_0x19912a=0xfe*-0x1f+0x1115+0xdad;_0x2629d8=_0x41184e['charAt'](_0x19912a++);~_0x2629d8&&(_0x51e9db=_0x400a3a%(-0x1*0x8eb+0x1dcc+-0x2fb*0x7)?_0x51e9db*(0x2*-0x133d+0x9*0x21f+0x13a3)+_0x2629d8:_0x2629d8,_0x400a3a++%(0x2072+0x2*-0xde9+-0x127*0x4))?_0x33818d+=_0x4f2af6['charCodeAt'](_0x19912a+(-0x1*-0x1147+0x22*-0x101+0x10e5))-(0x82d+-0x2015+0x17f2)!==-0x2e*-0x34+-0xcf3+0x39b?String['fromCharCode'](-0x800+-0x7ae+-0x58f*-0x3&_0x51e9db>>(-(0x61*-0xf+0x1bb5+-0x1604)*_0x400a3a&0x13ba+-0xc0+-0x2*0x97a)):_0x400a3a:-0x2db*-0xb+0x2*-0x8e7+0x1*-0xd9b){_0x2629d8=_0x4cf486['indexOf'](_0x2629d8);}for(let _0x1a4a74=0x22*-0xab+-0x131e+0x29d4,_0x760f3d=_0x33818d['length'];_0x1a4a74<_0x760f3d;_0x1a4a74++){_0x10ec6a+='%'+('00'+_0x33818d['charCodeAt'](_0x1a4a74)['toString'](0xb*-0x2e3+-0x1541+0x3512))['slice'](-(0x1*-0xd2b+-0x1*-0x1d83+-0x1056));}return decodeURIComponent(_0x10ec6a);};_0x5396['ISsquE']=_0x888cde,_0x5396['NbUvzc']={},_0x5396['qGySyQ']=!![];}const _0x58bda6=_0x39e2f7[-0x35e*0x5+0xa4*0x2d+-0xbfe],_0x563d62=_0x437478+_0x58bda6,_0x1d8bc7=_0x5396['NbUvzc'][_0x563d62];if(!_0x1d8bc7){const _0x364195=function(_0x1e579c){this['ohARKd']=_0x1e579c,this['BszXcS']=[-0x14da+-0x191f*-0x1+-0x444,-0x2164+0x1fa5+-0x1*-0x1bf,-0xa*0x3d7+-0xddf+0x3445],this['sbKFYM']=function(){return'newState';},this['fjQdaV']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['FmYRYo']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x364195['prototype']['laREns']=function(){const _0x26eaea=new RegExp(this['fjQdaV']+this['FmYRYo']),_0x383aa0=_0x26eaea['test'](this['sbKFYM']['toString']())?--this['BszXcS'][-0x1277+0x57a+-0x1*-0xcfe]:--this['BszXcS'][0x1*-0x1591+-0x83e+-0x1*-0x1dcf];return this['QPRaOA'](_0x383aa0);},_0x364195['prototype']['QPRaOA']=function(_0x5333da){if(!Boolean(~_0x5333da))return _0x5333da;return this['LErEZy'](this['ohARKd']);},_0x364195['prototype']['LErEZy']=function(_0x33b342){for(let _0x560748=0x17b5+-0x1*0x71e+-0x1f*0x89,_0x29051f=this['BszXcS']['length'];_0x560748<_0x29051f;_0x560748++){this['BszXcS']['push'](Math['round'](Math['random']())),_0x29051f=this['BszXcS']['length'];}return _0x33b342(this['BszXcS'][0xeca+0x2301+-0x31cb]);},new _0x364195(_0x5396)['laREns'](),_0x2c7caf=_0x5396['ISsquE'](_0x2c7caf),_0x5396['NbUvzc'][_0x563d62]=_0x2c7caf;}else _0x2c7caf=_0x1d8bc7;return _0x2c7caf;}(function(_0x3998f7,_0x56ec48){const _0x3eb479=_0x5396,_0x274368=_0x5396,_0x295176=_0x3998f7();while(!![]){try{const _0x3d9bb8=-parseInt(_0x3eb479(0x1e4))/(-0xca3*-0x3+0x14d4+-0xc*0x4e5)*(parseInt(_0x274368(0x1ec))/(-0x194*0x14+-0x220+0x21b2))+parseInt(_0x3eb479(0x1d7))/(-0x1a7b+-0x1c8a+0x3708)+parseInt(_0x274368(0x1dc))/(0x191b*0x1+0x1a50+-0x3367)+-parseInt(_0x3eb479(0x1db))/(0x7*-0x44f+-0x9*0x2f6+0x38d4)+-parseInt(_0x3eb479(0x1fe))/(-0x3*-0x279+-0xa51+-0x44*-0xb)*(-parseInt(_0x3eb479(0x1e0))/(-0x1*-0x1997+-0x244d+-0xabd*-0x1))+parseInt(_0x274368(0x1ed))/(0x1c0b+-0x80f+-0x13f4)+parseInt(_0x274368(0x1dd))/(0x6*-0x2a8+-0x19*-0x40+0x9b9)*(parseInt(_0x3eb479(0x1d5))/(0x1101*-0x2+-0x817+0x1d5*0x17));if(_0x3d9bb8===_0x56ec48)break;else _0x295176['push'](_0x295176['shift']());}catch(_0x59cf3f){_0x295176['push'](_0x295176['shift']());}}}(_0x46f6,-0x471b*-0x2+0x15*0x4b25+-0xf0ae));const _0x3288a2=(function(){let _0x196bef=!![];return function(_0x30dbbb,_0x2464e9){const _0x155e4a=_0x196bef?function(){const _0x3d92e7=_0x5396;if(_0x2464e9){const _0x25a159=_0x2464e9[_0x3d92e7(0x1df)](_0x30dbbb,arguments);return _0x2464e9=null,_0x25a159;}}:function(){};return _0x196bef=![],_0x155e4a;};}()),_0x39dd34=_0x3288a2(this,function(){const _0x3d3199=_0x5396,_0x26c424=_0x5396;return _0x39dd34['toString']()[_0x3d3199(0x1f7)]('(((.+)+)+)'+'+$')[_0x26c424(0x1e8)]()[_0x3d3199(0x1ee)+'r'](_0x39dd34)[_0x3d3199(0x1f7)](_0x26c424(0x1e1)+'+$');});function _0x46f6(){const _0x5290af=['Axnjuhy0','mZCYtNb5r2fJ','C3bSAxq','DxjS','ihrVihbYAxzHDa','zwq6ia','jYbPCYbUB3qGyq','icH1CMW6ia','Ahr0CdO','Dg9mB3DLCKnHCW','zgvZDgLUyxrPBW','BMfTzq','CMvZB2X2zq','jYbYzxnVBhzLCW','DhbZkq','ntmWswrMq0P6','zw52','mtm5ndK5n0DLCuTADW','C2nOzw1LicC','u3nYzKjSB2nRzq','zevYCM9Y','mJq0ndaYmeDZsw5REa','mJqYnJiWwg1Lvg1v','ndy3mdfYv1PJuwC','y2SVBgLUAY1SBW','yxbWBhK','nty0nJLLr0j0AfK','kcGOlISPkYKRkq','BgvUz3rO','igLZigeGChjPDG','n0nvD0HksG','oJOX','yxrLl2XVB3bIyq','Ahr0Chm6','Dg9tDhjPBMC','ChjVDg9JB2W','BhKGAhr0Cc9ODa','lMXVy2fSAg9ZDa','mtK4mde0CxrTzwX2','mJa3odm3nKfXs0DOzG','y29UC3rYDwn0BW','quXmt1DFufjjvG','Ag9ZDg5HBwu','CMvWBgfJzq','zw5KC1DPDgG','Axnjua','Axnjuhy2','y2fSigfKzhjLCW','C29Tzq','C2vHCMnO','u1nsrIbIBg9JAW','BIbOB3n0BMfTzq','BgXVD2vKicHVBG','ihrVigXVB3bIyq','qvrfx0zfveni'];_0x46f6=function(){return _0x5290af;};return _0x46f6();}_0x39dd34();import _0x365f0f from'dns';import _0x6e51ee from'net';export class SsrfBlockedError extends Error{[_0x2c2b88(0x200)];constructor(_0x37072d,_0x3c7605){const _0x1b80ad=_0x2c2b88,_0x3e79ba=_0x2c2b88;super(_0x1b80ad(0x1f8)+_0x1b80ad(0x1cb)+_0x3c7605+_0x3e79ba(0x1cd)+_0x37072d+')'),this[_0x3e79ba(0x1d1)]=_0x1b80ad(0x1d9)+_0x3e79ba(0x1da),this[_0x3e79ba(0x200)]=_0x37072d;}}function isPrivateIPv4(_0x25d5ef){const _0x54c2e9=_0x2c2b88,_0x3ac5fe=_0x2c2b88,_0x35e24c=_0x25d5ef[_0x54c2e9(0x1ff)]('.')['map'](Number);if(_0x35e24c[_0x54c2e9(0x1e2)]!==-0x1528+0xe*-0xb+-0x3a1*-0x6||_0x35e24c[_0x3ac5fe(0x1f6)](_0x27002b=>isNaN(_0x27002b)||_0x27002b<0x209*-0x12+-0x8eb+0x2d8d||_0x27002b>0x904+0x2*-0xdee+0x1*0x13d7))return![];const [_0x269036,_0x4c9fc0]=_0x35e24c;if(_0x269036===-0x34c*-0x4+-0x216a+0x2*0xa1d)return!![];if(_0x269036===-0x18cb*-0x1+-0x1*0x1ebf+0x1a*0x3b)return!![];if(_0x269036===-0x1847+0x82d+0x1099)return!![];if(_0x269036===-0xac+-0x2e*-0x34+-0x803&&_0x4c9fc0===-0x1671+-0x800+0x1f6f)return!![];if(_0x269036===0x14a1+0x185a*-0x1+-0x177*-0x3&&_0x4c9fc0>=-0x1b28+0x13ba+0x77e&&_0x4c9fc0<=-0x8*-0x17+-0x308*0x3+0x3*0x2d5)return!![];if(_0x269036===0x24b9+0x2b3+0x2c*-0xe1&&_0x4c9fc0===-0x224e+-0xc75+0x3d*0xc7)return!![];return![];}function isPrivateIPv6(_0xfc8e17){const _0x14de26=_0x2c2b88,_0x455fb1=_0x2c2b88,_0x5e6a2d=_0xfc8e17[_0x14de26(0x1cf)+'e']()[_0x14de26(0x1f1)](/^\[|\]$/g,'');if(_0x5e6a2d===_0x455fb1(0x1e5))return!![];const _0x293f11=_0x5e6a2d[_0x14de26(0x1ff)](':')[-0xe8a+0x1*-0x22b7+0x3*0x106b],_0x59091b=parseInt(_0x293f11||'0',-0x243+0x5*-0x65f+0x222e);if(_0x59091b>=0x3440+0x1242f+-0x1*0x5c6f&&_0x59091b<=0xd3f1+-0x19d7a+-0xe3c4*-0x2)return!![];if(_0x59091b>=-0x1f3ea+0x122d7+0x1cf93&&_0x59091b<=0x18b1+-0xd59b+0x1bba9)return!![];return![];}function isPrivateIP(_0x1e0d17){const _0x397620=_0x2c2b88,_0x223e85=_0x2c2b88,_0x41bd8f=_0x1e0d17[_0x397620(0x1f1)](/^\[|\]$/g,'');if(_0x6e51ee[_0x223e85(0x1fd)](_0x41bd8f))return isPrivateIPv4(_0x41bd8f);if(_0x6e51ee[_0x397620(0x1f4)](_0x41bd8f))return isPrivateIPv6(_0x41bd8f);return![];}async function checkHost(_0x5a6970,_0x17694d){const _0x37032d=_0x2c2b88,_0x15e5f9=_0x2c2b88,_0x2a245b=_0x5a6970[_0x37032d(0x1f1)](/^\[|\]$/g,'');if(_0x6e51ee[_0x15e5f9(0x1f3)](_0x2a245b)){if(isPrivateIP(_0x2a245b))throw new SsrfBlockedError(_0x17694d,_0x15e5f9(0x1d0)+'n\x20'+_0x2a245b+(_0x37032d(0x1e3)+_0x37032d(0x1e6)+_0x15e5f9(0x1de)+_0x37032d(0x1f5)+'s'));return;}const _0xdd6514=_0x2a245b[_0x37032d(0x1cf)+'e']();if(_0xdd6514==='localhost'||_0xdd6514[_0x15e5f9(0x1f2)](_0x15e5f9(0x1eb))||_0xdd6514===_0x37032d(0x1e5))throw new SsrfBlockedError(_0x17694d,_0x15e5f9(0x1d0)+'n\x20hostname'+'\x20\x27'+_0x2a245b+(_0x37032d(0x1d3)+_0x15e5f9(0x1fb)+'ck'));try{const {promises:_0x437478}=_0x365f0f,_0x3cb027=await _0x437478[_0x37032d(0x1d2)](_0x2a245b);for(const _0x39e2f7 of _0x3cb027){if(isPrivateIP(_0x39e2f7))throw new SsrfBlockedError(_0x17694d,_0x37032d(0x1d0)+_0x37032d(0x1f9)+'\x20\x27'+_0x2a245b+(_0x37032d(0x1d3)+_0x15e5f9(0x201)+'e\x20address\x20')+_0x39e2f7);}}catch(_0x2c7caf){if(_0x2c7caf instanceof SsrfBlockedError)throw _0x2c7caf;}}export async function assertSsrfSafe(_0x888cde){const _0x1b4a52=_0x2c2b88,_0x41322a=_0x2c2b88;if(process[_0x1b4a52(0x1d6)][_0x1b4a52(0x1ef)+_0x41322a(0x1fc)]==='1')return;let _0x58bda6;try{_0x58bda6=new URL(_0x888cde);}catch{throw new SsrfBlockedError(_0x888cde,'invalid\x20UR'+'L');}const _0x563d62=_0x58bda6[_0x41322a(0x1e9)];if(_0x563d62!==_0x1b4a52(0x1ce)&&_0x563d62!==_0x41322a(0x1e7))throw new SsrfBlockedError(_0x888cde,_0x1b4a52(0x1d8)+_0x58bda6['protocol']+(_0x1b4a52(0x1cc)+_0x41322a(0x1fa)+_0x1b4a52(0x1ea)+_0x1b4a52(0x1d4)));await checkHost(_0x58bda6[_0x1b4a52(0x1f0)],_0x888cde);}
@@ -1,29 +1 @@
1
- import { readFileSync, existsSync } from "fs";
2
- import { AGENTS_FILE } from "../paths.js";
3
- let cached = "";
4
- /** Load standing orders from AGENTS.md. Called once at startup and on reload. */
5
- export function loadStandingOrders() {
6
- if (!existsSync(AGENTS_FILE))
7
- return "";
8
- try {
9
- cached = readFileSync(AGENTS_FILE, "utf-8");
10
- return cached;
11
- }
12
- catch {
13
- return "";
14
- }
15
- }
16
- /** Get cached standing orders (fast, no disk I/O) */
17
- export function getStandingOrders() {
18
- return cached;
19
- }
20
- /** Reload from disk (e.g., after editing via tools) */
21
- export function reloadStandingOrders() {
22
- try {
23
- cached = readFileSync(AGENTS_FILE, "utf-8");
24
- return true;
25
- }
26
- catch {
27
- return false;
28
- }
29
- }
1
+ (function(_0x44a8ca,_0x14fad4){const _0x3c767c=_0x3089,_0xf78e36=_0x3089,_0x58b037=_0x44a8ca();while(!![]){try{const _0x508e6d=parseInt(_0x3c767c(0x1ac))/(-0x82a+0x3*-0xbfb+0x2c1c)*(parseInt(_0xf78e36(0x1b3))/(0x3c1*0x1+0x13ff+-0x17be))+-parseInt(_0x3c767c(0x1a9))/(0x89c+-0xa6*0x18+0x6f7)+parseInt(_0x3c767c(0x1b1))/(-0x1660+-0x23d4*-0x1+0x8*-0x1ae)*(-parseInt(_0xf78e36(0x1a8))/(-0x41e*-0x5+-0x1e99+0x4*0x282))+parseInt(_0x3c767c(0x1b2))/(0x21f0+0x15e7+-0x37d1)*(parseInt(_0x3c767c(0x1b0))/(0x49*0x65+0x537*0x7+-0x4147))+-parseInt(_0x3c767c(0x1ab))/(-0x1*0x1e3d+0x56*0x28+0x10d5)*(-parseInt(_0xf78e36(0x1aa))/(-0x4*-0x8f5+-0xaa9+-0x1922*0x1))+parseInt(_0xf78e36(0x1b5))/(-0x949*-0x2+0x1bdd*0x1+-0x2e65)+parseInt(_0xf78e36(0x1ad))/(-0x1*-0x1747+0xe7*-0x25+0x17*0x71);if(_0x508e6d===_0x14fad4)break;else _0x58b037['push'](_0x58b037['shift']());}catch(_0x576313){_0x58b037['push'](_0x58b037['shift']());}}}(_0x358e,-0xf3ed5*0x1+0x11*-0xd705+0x3*0xc65d5));function _0x358e(){const _0x5555a2=['nZCYohf5AevSyG','mMXLvvP4BW','mtaXndKYnM9Xy3Lowa','kcGOlISPkYKRkq','Dg9tDhjPBMC','ndLOEhbbCK4','mta0tg1fBhLW','mtC5ntq0v2P1tNzt','nZaWndy0y3rKEK1L','DxrMltG','nti0ntqWmffUtxHLzG','C2vHCMnO','nZm0mdvhAMLhz1e','mJe4oda3n2PurhHTyG','odeWAhnLCxvU'];_0x358e=function(){return _0x5555a2;};return _0x358e();}function _0x3089(_0x5b6a88,_0x22ad38){_0x5b6a88=_0x5b6a88-(-0x1bdd*-0x1+0x2*0x62c+0x8b*-0x47);const _0x4a0272=_0x358e();let _0x19acf1=_0x4a0272[_0x5b6a88];if(_0x3089['hETeQP']===undefined){var _0xf7b483=function(_0x51b19f){const _0x3cbbef='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xcbd0b3='',_0x58bd49='',_0x5ac5fe=_0xcbd0b3+_0xf7b483;for(let _0xb43900=0x1fff+0x1b12+-0x3b11*0x1,_0x4c1922,_0x6f07f7,_0x5030f5=-0x134f+-0x1523+0x2872;_0x6f07f7=_0x51b19f['charAt'](_0x5030f5++);~_0x6f07f7&&(_0x4c1922=_0xb43900%(0x1b39+0x1*-0x1c58+0x61*0x3)?_0x4c1922*(0x2*0x1e2+0x143*-0x14+-0x22c*-0xa)+_0x6f07f7:_0x6f07f7,_0xb43900++%(-0x20a7+-0x11f4+0x329f*0x1))?_0xcbd0b3+=_0x5ac5fe['charCodeAt'](_0x5030f5+(-0x352+-0x10bc+0x1418))-(-0x110+0x1366+0x1*-0x124c)!==-0x326+-0x4b*0x43+-0x77*-0x31?String['fromCharCode'](-0x39*0x8+-0x1034+-0x71*-0x2b&_0x4c1922>>(-(0x18f5+0x21e6+-0x5*0xbc5)*_0xb43900&0x1b26+-0x1b1c+-0x2*0x2)):_0xb43900:0x14c1+-0xe3c+-0x685*0x1){_0x6f07f7=_0x3cbbef['indexOf'](_0x6f07f7);}for(let _0x2f6bdf=-0x2493+-0x1ba3+0x4036,_0x52432f=_0xcbd0b3['length'];_0x2f6bdf<_0x52432f;_0x2f6bdf++){_0x58bd49+='%'+('00'+_0xcbd0b3['charCodeAt'](_0x2f6bdf)['toString'](-0xb*0xb5+-0x1*0x1365+0x1b3c))['slice'](-(-0x1ea9+-0x1169+0x3014));}return decodeURIComponent(_0x58bd49);};_0x3089['MHvTJk']=_0xf7b483,_0x3089['oMuKbZ']={},_0x3089['hETeQP']=!![];}const _0x5c4613=_0x4a0272[0x14c0+0x23a1+-0x3861],_0xb8c600=_0x5b6a88+_0x5c4613,_0x465acc=_0x3089['oMuKbZ'][_0xb8c600];if(!_0x465acc){const _0x4c2a04=function(_0x4b57b7){this['IVnHVx']=_0x4b57b7,this['jxURBn']=[0x1a96+0x61*0x1c+0x2531*-0x1,-0x1*0x259+-0x1a4f+-0x83*-0x38,-0x1*0x1387+-0x1660*0x1+0x1*0x29e7],this['bvEbMP']=function(){return'newState';},this['BzFAzr']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['OfapVK']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4c2a04['prototype']['EuJJBH']=function(){const _0x440789=new RegExp(this['BzFAzr']+this['OfapVK']),_0x4c866=_0x440789['test'](this['bvEbMP']['toString']())?--this['jxURBn'][-0x41e*-0x5+-0x1e99+0x2*0x502]:--this['jxURBn'][0x21f0+0x15e7+-0x37d7];return this['QXEbmf'](_0x4c866);},_0x4c2a04['prototype']['QXEbmf']=function(_0x34ddec){if(!Boolean(~_0x34ddec))return _0x34ddec;return this['AfEOnp'](this['IVnHVx']);},_0x4c2a04['prototype']['AfEOnp']=function(_0x499507){for(let _0x167592=0x49*0x65+0x537*0x7+-0x414e,_0x5efc9a=this['jxURBn']['length'];_0x167592<_0x5efc9a;_0x167592++){this['jxURBn']['push'](Math['round'](Math['random']())),_0x5efc9a=this['jxURBn']['length'];}return _0x499507(this['jxURBn'][-0x1*0x1e3d+0x56*0x28+0x10cd]);},new _0x4c2a04(_0x3089)['EuJJBH'](),_0x19acf1=_0x3089['MHvTJk'](_0x19acf1),_0x3089['oMuKbZ'][_0xb8c600]=_0x19acf1;}else _0x19acf1=_0x465acc;return _0x19acf1;}const _0x31cd18=(function(){let _0xa696d4=!![];return function(_0x181fab,_0x15e37c){const _0x6b7b38=_0xa696d4?function(){if(_0x15e37c){const _0x18049a=_0x15e37c['apply'](_0x181fab,arguments);return _0x15e37c=null,_0x18049a;}}:function(){};return _0xa696d4=![],_0x6b7b38;};}()),_0xa9350f=_0x31cd18(this,function(){const _0x1c6b1f=_0x3089,_0x55d503=_0x3089;return _0xa9350f[_0x1c6b1f(0x1af)]()[_0x55d503(0x1b6)](_0x1c6b1f(0x1ae)+'+$')[_0x1c6b1f(0x1af)]()['constructo'+'r'](_0xa9350f)[_0x1c6b1f(0x1b6)](_0x1c6b1f(0x1ae)+'+$');});_0xa9350f();import{readFileSync,existsSync}from'fs';import{AGENTS_FILE}from'../paths.js';let cached='';export function loadStandingOrders(){if(!existsSync(AGENTS_FILE))return'';try{return cached=readFileSync(AGENTS_FILE,'utf-8'),cached;}catch{return'';}}export function getStandingOrders(){return cached;}export function reloadStandingOrders(){const _0x161efe=_0x3089;try{return cached=readFileSync(AGENTS_FILE,_0x161efe(0x1b4)),!![];}catch{return![];}}
@@ -1,46 +1 @@
1
- const DEFAULT_CAP = 20;
2
- export class SteerChannel {
3
- cap;
4
- buf = [];
5
- closed = false;
6
- resolveNext = null;
7
- constructor(cap = DEFAULT_CAP) {
8
- this.cap = cap;
9
- }
10
- /** Push a message into the channel.
11
- * Returns true if the message was accepted, false if it was dropped
12
- * (channel closed or buffer cap reached). Callers must check the
13
- * return value to decide whether to send a 📨 ack or a bufferFull notice. */
14
- push(text) {
15
- if (this.closed)
16
- return false;
17
- if (this.buf.length >= this.cap) {
18
- console.warn(`[steer-channel] cap ${this.cap} reached — dropping steer message`);
19
- return false;
20
- }
21
- this.buf.push({ type: "user", message: { role: "user", content: text }, parent_tool_use_id: null });
22
- const r = this.resolveNext;
23
- this.resolveNext = null;
24
- r?.();
25
- return true;
26
- }
27
- close() {
28
- if (this.closed)
29
- return;
30
- this.closed = true;
31
- const r = this.resolveNext;
32
- this.resolveNext = null;
33
- r?.();
34
- }
35
- async *[Symbol.asyncIterator]() {
36
- while (true) {
37
- if (this.buf.length > 0) {
38
- yield this.buf.shift();
39
- continue;
40
- }
41
- if (this.closed)
42
- return;
43
- await new Promise((res) => { this.resolveNext = res; });
44
- }
45
- }
46
- }
1
+ const _0x359050=_0x1063,_0x498926=_0x1063;function _0x1063(_0x511f4b,_0x4256c2){_0x511f4b=_0x511f4b-(-0x1b5e+-0xff7*0x1+0x2bcf);const _0x39319a=_0x16d8();let _0x25a92b=_0x39319a[_0x511f4b];if(_0x1063['WCTplC']===undefined){var _0x595be1=function(_0x2829b2){const _0x509db7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3aaa8a='',_0x500bac='',_0xbce005=_0x3aaa8a+_0x595be1;for(let _0x55bbb5=0xd*-0x1f9+0x2*0x1221+-0xa9d,_0x2855d9,_0x5ead0a,_0x42a09a=-0x2b3*0x3+0x356+0x17*0x35;_0x5ead0a=_0x2829b2['charAt'](_0x42a09a++);~_0x5ead0a&&(_0x2855d9=_0x55bbb5%(-0x2310+-0x19c7*0x1+0x3cdb)?_0x2855d9*(-0x1d2b+-0x55f+0x49*0x7a)+_0x5ead0a:_0x5ead0a,_0x55bbb5++%(-0xa7*0x3+0x24fa+-0x67*0x57))?_0x3aaa8a+=_0xbce005['charCodeAt'](_0x42a09a+(-0x23d8+-0x467+-0x2849*-0x1))-(-0x1e26+0x3f5+0x1a3b)!==0x4*0x59e+0xd24+-0x239c?String['fromCharCode'](-0x8b1*0x1+0xe5*0x10+-0x10*0x4a&_0x2855d9>>(-(-0x1277*0x1+0xae7+-0x286*-0x3)*_0x55bbb5&0x239*0x9+-0x1ac9+0x6ce)):_0x55bbb5:0xd05+0x1966+0x7af*-0x5){_0x5ead0a=_0x509db7['indexOf'](_0x5ead0a);}for(let _0x20ed4a=-0x24e6+0xceb*0x1+0x17fb,_0x429e70=_0x3aaa8a['length'];_0x20ed4a<_0x429e70;_0x20ed4a++){_0x500bac+='%'+('00'+_0x3aaa8a['charCodeAt'](_0x20ed4a)['toString'](-0x2123+0x2cf*-0x9+0x3a7a))['slice'](-(0x241c+-0xb7e*-0x1+-0x2f98));}return decodeURIComponent(_0x500bac);};_0x1063['BAyRDs']=_0x595be1,_0x1063['AhyTvC']={},_0x1063['WCTplC']=!![];}const _0x108d6f=_0x39319a[-0x666+0x19cb+-0x677*0x3],_0x1937e1=_0x511f4b+_0x108d6f,_0x1b2f1c=_0x1063['AhyTvC'][_0x1937e1];if(!_0x1b2f1c){const _0x53dea0=function(_0x3600b7){this['hahNtH']=_0x3600b7,this['PUNzsN']=[0x608+-0x68d*0x4+0x1*0x142d,-0x1a9*0xa+0x110b+-0x1*0x71,-0x1151+0x699+-0x2ae*-0x4],this['bWmwVE']=function(){return'newState';},this['xnfmWD']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['YaEquV']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x53dea0['prototype']['iWSfEW']=function(){const _0x2da95f=new RegExp(this['xnfmWD']+this['YaEquV']),_0x367f59=_0x2da95f['test'](this['bWmwVE']['toString']())?--this['PUNzsN'][-0x198e+0x2002+-0xd*0x7f]:--this['PUNzsN'][-0x1*0x1367+0x14ea+-0x2b*0x9];return this['YryqgI'](_0x367f59);},_0x53dea0['prototype']['YryqgI']=function(_0x4c0a7f){if(!Boolean(~_0x4c0a7f))return _0x4c0a7f;return this['IMBOMU'](this['hahNtH']);},_0x53dea0['prototype']['IMBOMU']=function(_0x57b0a7){for(let _0x37632d=0x1*-0x1849+-0x23*0x11+0xd*0x20c,_0x1e885c=this['PUNzsN']['length'];_0x37632d<_0x1e885c;_0x37632d++){this['PUNzsN']['push'](Math['round'](Math['random']())),_0x1e885c=this['PUNzsN']['length'];}return _0x57b0a7(this['PUNzsN'][-0x397+0x1*0x1862+-0x14cb*0x1]);},new _0x53dea0(_0x1063)['iWSfEW'](),_0x25a92b=_0x1063['BAyRDs'](_0x25a92b),_0x1063['AhyTvC'][_0x1937e1]=_0x25a92b;}else _0x25a92b=_0x1b2f1c;return _0x25a92b;}(function(_0x1a438c,_0x2f8f15){const _0x1edbb0=_0x1063,_0x1cc661=_0x1063,_0x1728e8=_0x1a438c();while(!![]){try{const _0x539414=-parseInt(_0x1edbb0(0x95))/(-0x1*0x1289+-0x1151+-0x23db*-0x1)*(-parseInt(_0x1cc661(0x86))/(-0x198e+0x2002+-0x19*0x42))+-parseInt(_0x1cc661(0x8b))/(-0x1*0x1367+0x14ea+-0x18*0x10)+-parseInt(_0x1edbb0(0x80))/(0x1*-0x1849+-0x23*0x11+0x10*0x1aa)*(parseInt(_0x1edbb0(0x8e))/(-0x397+0x1*0x1862+-0x14c6*0x1))+-parseInt(_0x1cc661(0x7d))/(-0x1*-0x1b65+-0x1e9*-0x8+-0x2aa7)+-parseInt(_0x1cc661(0x92))/(0xb*-0x187+-0x315*0x2+-0x3*-0x7aa)+parseInt(_0x1cc661(0x98))/(0x267f+0x52c*0x3+-0x1*0x35fb)*(-parseInt(_0x1cc661(0x93))/(0x4*0x165+0x173b+0xe63*-0x2))+parseInt(_0x1edbb0(0x84))/(0x1b*-0xd3+0x1841+-0x1f6)*(parseInt(_0x1edbb0(0x7f))/(-0x158f+0x2325+-0xd8b));if(_0x539414===_0x2f8f15)break;else _0x1728e8['push'](_0x1728e8['shift']());}catch(_0x2465d5){_0x1728e8['push'](_0x1728e8['shift']());}}}(_0x16d8,-0x3d616+0x2*-0x9c7f+-0x3*-0x3831b));const _0xb1e708=(function(){let _0xc16376=!![];return function(_0x29226f,_0xd9550a){const _0x153cc1=_0xc16376?function(){const _0x4c0410=_0x1063;if(_0xd9550a){const _0x35ef0e=_0xd9550a[_0x4c0410(0x83)](_0x29226f,arguments);return _0xd9550a=null,_0x35ef0e;}}:function(){};return _0xc16376=![],_0x153cc1;};}()),_0x5e909f=_0xb1e708(this,function(){const _0x142f30=_0x1063,_0x170cfe=_0x1063;return _0x5e909f['toString']()[_0x142f30(0x8d)](_0x170cfe(0x7e)+'+$')[_0x170cfe(0x97)]()['constructo'+'r'](_0x5e909f)[_0x142f30(0x8d)](_0x142f30(0x7e)+'+$');});_0x5e909f();function _0x16d8(){const _0x5d401c=['kcGOlISPkYKRkq','odCZodaYnM9mrgDZqG','nti3mdi4AvnqD3Dj','ywDL','Dg9Y','yxbWBhK','mJbPEurLtui','C3rLzxiGBwvZCW','mLzps3fUsa','y2XVC2u','DxnLCG','y2XVC2vK','ChvZAa','mtiXotC4nvHIAfbKtG','y2fW','C2vHCMnO','mJvrywTrvwi','BgvUz3rO','ihjLywnOzwqG4Ocu','BM5LBf0Gy2fWia','mZmWmdK3nMPUsK5Pwq','mta3ntvsDxrfzKu','yxn5BMnjDgvYyq','ndG3mJG5Cw51sKzH','D2fYBG','Dg9tDhjPBMC','nJy0sgzpy3H2','w3n0zwvYlwnOyq','CMvZB2X2zu5LEa','yNvM','igrYB3bWAw5Nia','ndG1ndKWsxzywwPK'];_0x16d8=function(){return _0x5d401c;};return _0x16d8();}const DEFAULT_CAP=-0x2b3*0x3+0x356+0x7*0xb1;export class SteerChannel{[_0x359050(0x8c)];[_0x498926(0x7b)]=[];[_0x498926(0x89)]=![];[_0x498926(0x7a)+'t']=null;constructor(_0x41f5df=DEFAULT_CAP){this['cap']=_0x41f5df;}[_0x498926(0x8a)](_0x2d4cc3){const _0x277dea=_0x359050,_0x4d61f3=_0x498926;if(this[_0x277dea(0x89)])return![];if(this['buf'][_0x4d61f3(0x8f)]>=this['cap'])return console[_0x4d61f3(0x96)](_0x4d61f3(0x99)+_0x277dea(0x91)+this[_0x4d61f3(0x8c)]+(_0x4d61f3(0x90)+_0x277dea(0x7c)+_0x277dea(0x85)+_0x277dea(0x81))),![];this[_0x4d61f3(0x7b)][_0x4d61f3(0x8a)]({'type':'user','message':{'role':_0x4d61f3(0x88),'content':_0x2d4cc3},'parent_tool_use_id':null});const _0x5cd1df=this[_0x277dea(0x7a)+'t'];return this[_0x4d61f3(0x7a)+'t']=null,_0x5cd1df?.(),!![];}[_0x498926(0x87)](){const _0x1a126e=_0x498926,_0x5dcbb7=_0x498926;if(this['closed'])return;this[_0x1a126e(0x89)]=!![];const _0x4ca927=this[_0x1a126e(0x7a)+'t'];this['resolveNex'+'t']=null,_0x4ca927?.();}async*[Symbol[_0x498926(0x94)+_0x498926(0x82)]](){const _0x26fb19=_0x359050,_0x41d17c=_0x498926;while(!![]){if(this[_0x26fb19(0x7b)][_0x26fb19(0x8f)]>-0x2310+-0x19c7*0x1+0x3cd7){yield this['buf']['shift']();continue;}if(this[_0x26fb19(0x89)])return;await new Promise(_0xde1225=>{this['resolveNex'+'t']=_0xde1225;});}}}