azerclaw 1.0.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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/bin/azerclaw.ts +290 -0
  4. package/dist/bin/azerclaw.d.ts +19 -0
  5. package/dist/bin/azerclaw.d.ts.map +1 -0
  6. package/dist/bin/azerclaw.js +247 -0
  7. package/dist/bin/azerclaw.js.map +1 -0
  8. package/dist/skills/code-review/SKILL.md +46 -0
  9. package/dist/skills/daily-briefing/SKILL.md +35 -0
  10. package/dist/skills/git-assistant/SKILL.md +31 -0
  11. package/dist/src/agents/builtin.d.ts +52 -0
  12. package/dist/src/agents/builtin.d.ts.map +1 -0
  13. package/dist/src/agents/builtin.js +497 -0
  14. package/dist/src/agents/builtin.js.map +1 -0
  15. package/dist/src/agents/loader.d.ts +23 -0
  16. package/dist/src/agents/loader.d.ts.map +1 -0
  17. package/dist/src/agents/loader.js +154 -0
  18. package/dist/src/agents/loader.js.map +1 -0
  19. package/dist/src/channels/adapter.d.ts +57 -0
  20. package/dist/src/channels/adapter.d.ts.map +1 -0
  21. package/dist/src/channels/adapter.js +45 -0
  22. package/dist/src/channels/adapter.js.map +1 -0
  23. package/dist/src/channels/discord.d.ts +23 -0
  24. package/dist/src/channels/discord.d.ts.map +1 -0
  25. package/dist/src/channels/discord.js +129 -0
  26. package/dist/src/channels/discord.js.map +1 -0
  27. package/dist/src/channels/slack.d.ts +19 -0
  28. package/dist/src/channels/slack.d.ts.map +1 -0
  29. package/dist/src/channels/slack.js +97 -0
  30. package/dist/src/channels/slack.js.map +1 -0
  31. package/dist/src/channels/telegram.d.ts +20 -0
  32. package/dist/src/channels/telegram.d.ts.map +1 -0
  33. package/dist/src/channels/telegram.js +87 -0
  34. package/dist/src/channels/telegram.js.map +1 -0
  35. package/dist/src/channels/webhook.d.ts +19 -0
  36. package/dist/src/channels/webhook.d.ts.map +1 -0
  37. package/dist/src/channels/webhook.js +124 -0
  38. package/dist/src/channels/webhook.js.map +1 -0
  39. package/dist/src/cli/animations/fish.d.ts +33 -0
  40. package/dist/src/cli/animations/fish.d.ts.map +1 -0
  41. package/dist/src/cli/animations/fish.js +297 -0
  42. package/dist/src/cli/animations/fish.js.map +1 -0
  43. package/dist/src/cli/commands/agents.d.ts +8 -0
  44. package/dist/src/cli/commands/agents.d.ts.map +1 -0
  45. package/dist/src/cli/commands/agents.js +104 -0
  46. package/dist/src/cli/commands/agents.js.map +1 -0
  47. package/dist/src/cli/commands/chat.d.ts +9 -0
  48. package/dist/src/cli/commands/chat.d.ts.map +1 -0
  49. package/dist/src/cli/commands/chat.js +236 -0
  50. package/dist/src/cli/commands/chat.js.map +1 -0
  51. package/dist/src/cli/commands/config.d.ts +9 -0
  52. package/dist/src/cli/commands/config.d.ts.map +1 -0
  53. package/dist/src/cli/commands/config.js +97 -0
  54. package/dist/src/cli/commands/config.js.map +1 -0
  55. package/dist/src/cli/commands/doctor.d.ts +8 -0
  56. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  57. package/dist/src/cli/commands/doctor.js +159 -0
  58. package/dist/src/cli/commands/doctor.js.map +1 -0
  59. package/dist/src/cli/commands/models.d.ts +7 -0
  60. package/dist/src/cli/commands/models.d.ts.map +1 -0
  61. package/dist/src/cli/commands/models.js +64 -0
  62. package/dist/src/cli/commands/models.js.map +1 -0
  63. package/dist/src/cli/commands/onboard.d.ts +6 -0
  64. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  65. package/dist/src/cli/commands/onboard.js +150 -0
  66. package/dist/src/cli/commands/onboard.js.map +1 -0
  67. package/dist/src/cli/commands/run.d.ts +9 -0
  68. package/dist/src/cli/commands/run.d.ts.map +1 -0
  69. package/dist/src/cli/commands/run.js +84 -0
  70. package/dist/src/cli/commands/run.js.map +1 -0
  71. package/dist/src/cli/commands/tui.d.ts +6 -0
  72. package/dist/src/cli/commands/tui.d.ts.map +1 -0
  73. package/dist/src/cli/commands/tui.js +252 -0
  74. package/dist/src/cli/commands/tui.js.map +1 -0
  75. package/dist/src/config/manager.d.ts +80 -0
  76. package/dist/src/config/manager.d.ts.map +1 -0
  77. package/dist/src/config/manager.js +232 -0
  78. package/dist/src/config/manager.js.map +1 -0
  79. package/dist/src/config/schema.d.ts +910 -0
  80. package/dist/src/config/schema.d.ts.map +1 -0
  81. package/dist/src/config/schema.js +138 -0
  82. package/dist/src/config/schema.js.map +1 -0
  83. package/dist/src/core/gateway.d.ts +35 -0
  84. package/dist/src/core/gateway.d.ts.map +1 -0
  85. package/dist/src/core/gateway.js +205 -0
  86. package/dist/src/core/gateway.js.map +1 -0
  87. package/dist/src/core/runtime.d.ts +69 -0
  88. package/dist/src/core/runtime.d.ts.map +1 -0
  89. package/dist/src/core/runtime.js +188 -0
  90. package/dist/src/core/runtime.js.map +1 -0
  91. package/dist/src/core/security.d.ts +55 -0
  92. package/dist/src/core/security.d.ts.map +1 -0
  93. package/dist/src/core/security.js +241 -0
  94. package/dist/src/core/security.js.map +1 -0
  95. package/dist/src/index.d.ts +24 -0
  96. package/dist/src/index.d.ts.map +1 -0
  97. package/dist/src/index.js +46 -0
  98. package/dist/src/index.js.map +1 -0
  99. package/dist/src/memory/store.d.ts +65 -0
  100. package/dist/src/memory/store.d.ts.map +1 -0
  101. package/dist/src/memory/store.js +250 -0
  102. package/dist/src/memory/store.js.map +1 -0
  103. package/dist/src/providers/anthropic.d.ts +25 -0
  104. package/dist/src/providers/anthropic.d.ts.map +1 -0
  105. package/dist/src/providers/anthropic.js +163 -0
  106. package/dist/src/providers/anthropic.js.map +1 -0
  107. package/dist/src/providers/base.d.ts +90 -0
  108. package/dist/src/providers/base.d.ts.map +1 -0
  109. package/dist/src/providers/base.js +12 -0
  110. package/dist/src/providers/base.js.map +1 -0
  111. package/dist/src/providers/google.d.ts +23 -0
  112. package/dist/src/providers/google.d.ts.map +1 -0
  113. package/dist/src/providers/google.js +118 -0
  114. package/dist/src/providers/google.js.map +1 -0
  115. package/dist/src/providers/ollama.d.ts +24 -0
  116. package/dist/src/providers/ollama.d.ts.map +1 -0
  117. package/dist/src/providers/ollama.js +81 -0
  118. package/dist/src/providers/ollama.js.map +1 -0
  119. package/dist/src/providers/openai.d.ts +30 -0
  120. package/dist/src/providers/openai.d.ts.map +1 -0
  121. package/dist/src/providers/openai.js +187 -0
  122. package/dist/src/providers/openai.js.map +1 -0
  123. package/dist/src/providers/router.d.ts +20 -0
  124. package/dist/src/providers/router.d.ts.map +1 -0
  125. package/dist/src/providers/router.js +156 -0
  126. package/dist/src/providers/router.js.map +1 -0
  127. package/dist/src/scheduler/heartbeat.d.ts +62 -0
  128. package/dist/src/scheduler/heartbeat.d.ts.map +1 -0
  129. package/dist/src/scheduler/heartbeat.js +267 -0
  130. package/dist/src/scheduler/heartbeat.js.map +1 -0
  131. package/dist/src/skills/loader.d.ts +25 -0
  132. package/dist/src/skills/loader.d.ts.map +1 -0
  133. package/dist/src/skills/loader.js +165 -0
  134. package/dist/src/skills/loader.js.map +1 -0
  135. package/dist/src/tools/advanced.d.ts +15 -0
  136. package/dist/src/tools/advanced.d.ts.map +1 -0
  137. package/dist/src/tools/advanced.js +102 -0
  138. package/dist/src/tools/advanced.js.map +1 -0
  139. package/dist/src/tools/filesystem.d.ts +10 -0
  140. package/dist/src/tools/filesystem.d.ts.map +1 -0
  141. package/dist/src/tools/filesystem.js +160 -0
  142. package/dist/src/tools/filesystem.js.map +1 -0
  143. package/dist/src/tools/registry.d.ts +26 -0
  144. package/dist/src/tools/registry.d.ts.map +1 -0
  145. package/dist/src/tools/registry.js +49 -0
  146. package/dist/src/tools/registry.js.map +1 -0
  147. package/dist/src/tools/shell.d.ts +7 -0
  148. package/dist/src/tools/shell.d.ts.map +1 -0
  149. package/dist/src/tools/shell.js +46 -0
  150. package/dist/src/tools/shell.js.map +1 -0
  151. package/dist/src/workflow/engine.d.ts +65 -0
  152. package/dist/src/workflow/engine.d.ts.map +1 -0
  153. package/dist/src/workflow/engine.js +297 -0
  154. package/dist/src/workflow/engine.js.map +1 -0
  155. package/package.json +113 -0
  156. package/skills/code-review/SKILL.md +46 -0
  157. package/skills/daily-briefing/SKILL.md +35 -0
  158. package/skills/git-assistant/SKILL.md +31 -0
  159. package/templates/HEARTBEAT.md +27 -0
  160. package/templates/IDENTITY.md +23 -0
  161. package/templates/deploy-pipeline.fishbone +39 -0
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /**
3
+ * 🐟 AZERCLAW Agent Loader
4
+ * Loads agent definitions from .md files in the agents/ directory,
5
+ * merging file-based definitions with the built-in TypeScript definitions.
6
+ * Supports /AGENT command routing.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.loadAgentsFromDirectory = loadAgentsFromDirectory;
43
+ exports.parseAgentCommand = parseAgentCommand;
44
+ exports.resolveGroupCommand = resolveGroupCommand;
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const builtin_1 = require("./builtin");
48
+ // ─── Load agents from .md files ─────────────────────────────────
49
+ function loadAgentsFromDirectory(dir) {
50
+ const agents = [];
51
+ if (!fs.existsSync(dir))
52
+ return agents;
53
+ const files = fs.readdirSync(dir).filter(f => f.endsWith('.md') && f !== 'README.md');
54
+ for (const file of files) {
55
+ try {
56
+ const content = fs.readFileSync(path.join(dir, file), 'utf-8');
57
+ const parsed = parseAgentMd(content, file);
58
+ if (parsed)
59
+ agents.push(parsed);
60
+ }
61
+ catch { /* skip malformed */ }
62
+ }
63
+ return agents;
64
+ }
65
+ function parseAgentMd(content, filename) {
66
+ // Parse YAML frontmatter
67
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
68
+ if (!fmMatch)
69
+ return null;
70
+ const metadata = {};
71
+ for (const line of fmMatch[1].split('\n')) {
72
+ const colonIdx = line.indexOf(':');
73
+ if (colonIdx > 0) {
74
+ metadata[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();
75
+ }
76
+ }
77
+ const name = metadata['name'] || path.basename(filename, '.md');
78
+ const codename = name.toUpperCase();
79
+ // Try to find matching built-in agent for the full system prompt
80
+ const builtin = (0, builtin_1.getAgent)(name);
81
+ return {
82
+ id: name.toLowerCase(),
83
+ codename,
84
+ emoji: extractEmoji(fmMatch[2]) || builtin?.emoji || '🐟',
85
+ role: extractRole(fmMatch[2]) || builtin?.role || 'Agent',
86
+ description: metadata['description'] || '',
87
+ systemPrompt: builtin?.systemPrompt || fmMatch[2],
88
+ maxIterations: builtin?.maxIterations || 20,
89
+ tags: builtin?.tags || extractTags(metadata['description'] || ''),
90
+ };
91
+ }
92
+ function extractEmoji(body) {
93
+ const match = body.match(/^#\s+([\p{Emoji}\u200d]+)/mu);
94
+ return match ? match[1].trim() : null;
95
+ }
96
+ function extractRole(body) {
97
+ const match = body.match(/\*\*Specialty\*\*:\s*(.+)/);
98
+ return match ? match[1].trim() : null;
99
+ }
100
+ function extractTags(description) {
101
+ return description.toLowerCase()
102
+ .split(/[\s,]+/)
103
+ .filter(w => w.length > 4)
104
+ .slice(0, 8);
105
+ }
106
+ /**
107
+ * Parse /AGENT //flag task format.
108
+ * Returns null if not a command.
109
+ */
110
+ function parseAgentCommand(input) {
111
+ const trimmed = input.trim();
112
+ if (!trimmed.startsWith('/'))
113
+ return null;
114
+ const parts = trimmed.split(/\s+/);
115
+ const agentName = parts[0].slice(1).toUpperCase(); // Remove /
116
+ // Check for special group commands
117
+ if (['PANTHEON', 'TRINITY', 'ALL', 'WARRIORS'].includes(agentName)) {
118
+ return {
119
+ agent: agentName,
120
+ flags: parts.filter(p => p.startsWith('//')).map(p => p.slice(2)),
121
+ task: parts.filter(p => !p.startsWith('/') || p === parts[0]).slice(1).join(' '),
122
+ };
123
+ }
124
+ // Check if agent exists
125
+ const agent = (0, builtin_1.getAgent)(agentName);
126
+ if (!agent)
127
+ return null;
128
+ const flags = parts.filter(p => p.startsWith('//') && p.length > 2).map(p => p.slice(2));
129
+ const taskParts = parts.filter(p => !p.startsWith('/'));
130
+ return {
131
+ agent: agentName,
132
+ flags,
133
+ task: taskParts.join(' '),
134
+ };
135
+ }
136
+ /**
137
+ * Get agents for group commands.
138
+ */
139
+ function resolveGroupCommand(group) {
140
+ switch (group.toUpperCase()) {
141
+ case 'TRINITY':
142
+ return ['orion', 'atlas', 'titan']
143
+ .map(id => (0, builtin_1.getAgent)(id))
144
+ .filter(Boolean);
145
+ case 'PANTHEON':
146
+ case 'WARRIORS':
147
+ return builtin_1.BUILT_IN_AGENTS.filter(a => a.id !== 'zeus');
148
+ case 'ALL':
149
+ return [...builtin_1.BUILT_IN_AGENTS];
150
+ default:
151
+ return [];
152
+ }
153
+ }
154
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/agents/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 🐟 AZERCLAW Channel Adapter Base
3
+ * Normalized interface for messenger platform integrations.
4
+ * All messages from different platforms are normalized into a unified format.
5
+ */
6
+ import { AgentRuntime } from '../core/runtime';
7
+ export interface NormalizedMessage {
8
+ id: string;
9
+ platform: string;
10
+ channelId: string;
11
+ senderId: string;
12
+ senderName: string;
13
+ content: string;
14
+ attachments: Attachment[];
15
+ timestamp: Date;
16
+ replyTo?: string;
17
+ metadata: Record<string, unknown>;
18
+ }
19
+ export interface Attachment {
20
+ type: 'image' | 'file' | 'audio' | 'video' | 'link';
21
+ url: string;
22
+ name?: string;
23
+ mimeType?: string;
24
+ size?: number;
25
+ }
26
+ export interface SendOptions {
27
+ channelId: string;
28
+ content: string;
29
+ replyTo?: string;
30
+ attachments?: Attachment[];
31
+ }
32
+ export declare abstract class ChannelAdapter {
33
+ abstract readonly platform: string;
34
+ abstract readonly displayName: string;
35
+ protected agent: AgentRuntime | null;
36
+ /**
37
+ * Initialize the adapter with credentials.
38
+ */
39
+ abstract connect(config: Record<string, string>): Promise<void>;
40
+ /**
41
+ * Disconnect from the platform.
42
+ */
43
+ abstract disconnect(): Promise<void>;
44
+ /**
45
+ * Send a message to a channel.
46
+ */
47
+ abstract send(options: SendOptions): Promise<void>;
48
+ /**
49
+ * Check if the adapter is connected.
50
+ */
51
+ abstract isConnected(): boolean;
52
+ /**
53
+ * Handle an incoming message — routes to agent.
54
+ */
55
+ protected handleIncoming(message: NormalizedMessage): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/channels/adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAc,MAAM,iBAAiB,CAAC;AAK3D,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAID,8BAAsB,cAAc;IAClC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAQ;IAE5C;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/D;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEpC;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAElD;;OAEG;IACH,QAAQ,CAAC,WAAW,IAAI,OAAO;IAE/B;;OAEG;cACa,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CA2B1E"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * 🐟 AZERCLAW Channel Adapter Base
4
+ * Normalized interface for messenger platform integrations.
5
+ * All messages from different platforms are normalized into a unified format.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ChannelAdapter = void 0;
9
+ const runtime_1 = require("../core/runtime");
10
+ const security_1 = require("../core/security");
11
+ // ─── Base Adapter ───────────────────────────────────────────────
12
+ class ChannelAdapter {
13
+ agent = null;
14
+ /**
15
+ * Handle an incoming message — routes to agent.
16
+ */
17
+ async handleIncoming(message) {
18
+ (0, security_1.auditLog)('CHANNEL_MSG_IN', `${this.platform}:${message.channelId} from ${message.senderName}`);
19
+ if (!this.agent) {
20
+ this.agent = new runtime_1.AgentRuntime({
21
+ sessionId: `${this.platform}_${message.channelId}`,
22
+ eventHandler: async (event) => {
23
+ if (event.type === 'response' && event.content) {
24
+ await this.send({
25
+ channelId: message.channelId,
26
+ content: event.content,
27
+ replyTo: message.id,
28
+ });
29
+ }
30
+ },
31
+ });
32
+ }
33
+ try {
34
+ await this.agent.chat(message.content);
35
+ }
36
+ catch (e) {
37
+ await this.send({
38
+ channelId: message.channelId,
39
+ content: `🐟 Error: ${e.message}`,
40
+ });
41
+ }
42
+ }
43
+ }
44
+ exports.ChannelAdapter = ChannelAdapter;
45
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/channels/adapter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6CAA2D;AAC3D,+CAA4C;AAgC5C,mEAAmE;AAEnE,MAAsB,cAAc;IAGxB,KAAK,GAAwB,IAAI,CAAC;IAsB5C;;OAEG;IACO,KAAK,CAAC,cAAc,CAAC,OAA0B;QACvD,IAAA,mBAAQ,EAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAE/F,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAY,CAAC;gBAC5B,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE;gBAClD,YAAY,EAAE,KAAK,EAAE,KAAiB,EAAE,EAAE;oBACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBAC/C,MAAM,IAAI,CAAC,IAAI,CAAC;4BACd,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,OAAO,EAAE,OAAO,CAAC,EAAE;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,IAAI,CAAC;gBACd,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,aAAa,CAAC,CAAC,OAAO,EAAE;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAvDD,wCAuDC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 🐟 AZERCLAW Discord Channel Adapter
3
+ * Connects to Discord via WebSocket (discord.js-like but lightweight).
4
+ * Uses the WebSocket gateway directly to avoid heavy dependencies.
5
+ */
6
+ import { ChannelAdapter, SendOptions } from './adapter';
7
+ export declare class DiscordAdapter extends ChannelAdapter {
8
+ readonly platform = "discord";
9
+ readonly displayName = "Discord";
10
+ private ws;
11
+ private token;
12
+ private heartbeatInterval;
13
+ private connected;
14
+ private sequence;
15
+ connect(config: Record<string, string>): Promise<void>;
16
+ disconnect(): Promise<void>;
17
+ send(options: SendOptions): Promise<void>;
18
+ isConnected(): boolean;
19
+ private handleGatewayEvent;
20
+ private startHeartbeat;
21
+ private identify;
22
+ }
23
+ //# sourceMappingURL=discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../src/channels/discord.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAqB,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3E,qBAAa,cAAe,SAAQ,cAAc;IAChD,QAAQ,CAAC,QAAQ,aAAa;IAC9B,QAAQ,CAAC,WAAW,aAAa;IACjC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAuB;IAEjC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;CAcjB"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * 🐟 AZERCLAW Discord Channel Adapter
4
+ * Connects to Discord via WebSocket (discord.js-like but lightweight).
5
+ * Uses the WebSocket gateway directly to avoid heavy dependencies.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DiscordAdapter = void 0;
9
+ const adapter_1 = require("./adapter");
10
+ const security_1 = require("../core/security");
11
+ class DiscordAdapter extends adapter_1.ChannelAdapter {
12
+ platform = 'discord';
13
+ displayName = 'Discord';
14
+ ws = null;
15
+ token = '';
16
+ heartbeatInterval = null;
17
+ connected = false;
18
+ sequence = null;
19
+ async connect(config) {
20
+ this.token = config.token;
21
+ if (!this.token)
22
+ throw new Error('Discord bot token required');
23
+ const WebSocket = require('ws');
24
+ this.ws = new WebSocket('wss://gateway.discord.gg/?v=10&encoding=json');
25
+ this.ws.on('open', () => {
26
+ (0, security_1.auditLog)('DISCORD_CONNECTED', 'WebSocket opened');
27
+ });
28
+ this.ws.on('message', (data) => {
29
+ const payload = JSON.parse(data);
30
+ this.handleGatewayEvent(payload);
31
+ });
32
+ this.ws.on('close', () => {
33
+ this.connected = false;
34
+ if (this.heartbeatInterval)
35
+ clearInterval(this.heartbeatInterval);
36
+ (0, security_1.auditLog)('DISCORD_DISCONNECTED', 'WebSocket closed');
37
+ });
38
+ this.ws.on('error', (err) => {
39
+ (0, security_1.auditLog)('DISCORD_ERROR', err.message);
40
+ });
41
+ }
42
+ async disconnect() {
43
+ if (this.heartbeatInterval)
44
+ clearInterval(this.heartbeatInterval);
45
+ if (this.ws)
46
+ this.ws.close();
47
+ this.connected = false;
48
+ }
49
+ async send(options) {
50
+ const url = `https://discord.com/api/v10/channels/${options.channelId}/messages`;
51
+ const body = { content: options.content };
52
+ if (options.replyTo) {
53
+ body.message_reference = { message_id: options.replyTo };
54
+ }
55
+ await fetch(url, {
56
+ method: 'POST',
57
+ headers: {
58
+ 'Authorization': `Bot ${this.token}`,
59
+ 'Content-Type': 'application/json',
60
+ },
61
+ body: JSON.stringify(body),
62
+ });
63
+ }
64
+ isConnected() {
65
+ return this.connected;
66
+ }
67
+ handleGatewayEvent(payload) {
68
+ const { op, d, s, t } = payload;
69
+ if (s)
70
+ this.sequence = s;
71
+ switch (op) {
72
+ case 10: // Hello — start heartbeat
73
+ this.startHeartbeat(d.heartbeat_interval);
74
+ this.identify();
75
+ break;
76
+ case 11: // Heartbeat ACK
77
+ break;
78
+ case 0: // Dispatch
79
+ if (t === 'READY') {
80
+ this.connected = true;
81
+ (0, security_1.auditLog)('DISCORD_READY', `Logged in as ${d.user?.username}`);
82
+ }
83
+ if (t === 'MESSAGE_CREATE') {
84
+ // Don't respond to own messages
85
+ if (d.author?.bot)
86
+ return;
87
+ const message = {
88
+ id: d.id,
89
+ platform: 'discord',
90
+ channelId: d.channel_id,
91
+ senderId: d.author?.id || '',
92
+ senderName: d.author?.username || 'Unknown',
93
+ content: d.content || '',
94
+ attachments: (d.attachments || []).map((a) => ({
95
+ type: 'file',
96
+ url: a.url,
97
+ name: a.filename,
98
+ size: a.size,
99
+ })),
100
+ timestamp: new Date(d.timestamp),
101
+ metadata: { guildId: d.guild_id },
102
+ };
103
+ this.handleIncoming(message);
104
+ }
105
+ break;
106
+ }
107
+ }
108
+ startHeartbeat(interval) {
109
+ this.heartbeatInterval = setInterval(() => {
110
+ this.ws?.send(JSON.stringify({ op: 1, d: this.sequence }));
111
+ }, interval);
112
+ }
113
+ identify() {
114
+ this.ws?.send(JSON.stringify({
115
+ op: 2,
116
+ d: {
117
+ token: this.token,
118
+ intents: 513, // GUILDS + GUILD_MESSAGES
119
+ properties: {
120
+ os: process.platform,
121
+ browser: 'azerclaw',
122
+ device: 'azerclaw',
123
+ },
124
+ },
125
+ }));
126
+ }
127
+ }
128
+ exports.DiscordAdapter = DiscordAdapter;
129
+ //# sourceMappingURL=discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/channels/discord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 🐟 AZERCLAW Slack Channel Adapter
3
+ * Connects to Slack via the Web API + Socket Mode.
4
+ */
5
+ import { ChannelAdapter, SendOptions } from './adapter';
6
+ export declare class SlackAdapter extends ChannelAdapter {
7
+ readonly platform = "slack";
8
+ readonly displayName = "Slack";
9
+ private botToken;
10
+ private appToken;
11
+ private ws;
12
+ private connected;
13
+ connect(config: Record<string, string>): Promise<void>;
14
+ disconnect(): Promise<void>;
15
+ send(options: SendOptions): Promise<void>;
16
+ isConnected(): boolean;
17
+ private handleSlackEvent;
18
+ }
19
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/channels/slack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAqB,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3E,qBAAa,YAAa,SAAQ,cAAc;IAC9C,QAAQ,CAAC,QAAQ,WAAW;IAC5B,QAAQ,CAAC,WAAW,WAAW;IAC/B,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,SAAS,CAAS;IAEpB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCtD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,gBAAgB;CA6BzB"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * 🐟 AZERCLAW Slack Channel Adapter
4
+ * Connects to Slack via the Web API + Socket Mode.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SlackAdapter = void 0;
8
+ const adapter_1 = require("./adapter");
9
+ const security_1 = require("../core/security");
10
+ class SlackAdapter extends adapter_1.ChannelAdapter {
11
+ platform = 'slack';
12
+ displayName = 'Slack';
13
+ botToken = '';
14
+ appToken = '';
15
+ ws = null;
16
+ connected = false;
17
+ async connect(config) {
18
+ this.botToken = config.botToken;
19
+ this.appToken = config.appToken;
20
+ if (!this.botToken || !this.appToken) {
21
+ throw new Error('Slack requires both botToken and appToken');
22
+ }
23
+ // Get WebSocket URL via Socket Mode
24
+ const res = await fetch('https://slack.com/api/apps.connections.open', {
25
+ method: 'POST',
26
+ headers: { 'Authorization': `Bearer ${this.appToken}` },
27
+ });
28
+ const data = await res.json();
29
+ if (!data.ok)
30
+ throw new Error(`Slack auth failed: ${data.error}`);
31
+ const WebSocket = require('ws');
32
+ this.ws = new WebSocket(data.url);
33
+ this.ws.on('open', () => {
34
+ this.connected = true;
35
+ (0, security_1.auditLog)('SLACK_CONNECTED', 'Socket Mode active');
36
+ });
37
+ this.ws.on('message', (raw) => {
38
+ const payload = JSON.parse(raw);
39
+ this.handleSlackEvent(payload);
40
+ });
41
+ this.ws.on('close', () => {
42
+ this.connected = false;
43
+ (0, security_1.auditLog)('SLACK_DISCONNECTED', '');
44
+ });
45
+ }
46
+ async disconnect() {
47
+ if (this.ws)
48
+ this.ws.close();
49
+ this.connected = false;
50
+ }
51
+ async send(options) {
52
+ await fetch('https://slack.com/api/chat.postMessage', {
53
+ method: 'POST',
54
+ headers: {
55
+ 'Authorization': `Bearer ${this.botToken}`,
56
+ 'Content-Type': 'application/json',
57
+ },
58
+ body: JSON.stringify({
59
+ channel: options.channelId,
60
+ text: options.content,
61
+ thread_ts: options.replyTo,
62
+ }),
63
+ });
64
+ }
65
+ isConnected() {
66
+ return this.connected;
67
+ }
68
+ handleSlackEvent(payload) {
69
+ // Acknowledge envelope
70
+ if (payload.envelope_id) {
71
+ this.ws?.send(JSON.stringify({ envelope_id: payload.envelope_id }));
72
+ }
73
+ const event = payload.payload?.event;
74
+ if (!event || event.type !== 'message' || event.bot_id)
75
+ return;
76
+ const normalized = {
77
+ id: event.ts,
78
+ platform: 'slack',
79
+ channelId: event.channel,
80
+ senderId: event.user || '',
81
+ senderName: event.user || 'Unknown',
82
+ content: event.text || '',
83
+ attachments: (event.files || []).map((f) => ({
84
+ type: 'file',
85
+ url: f.url_private,
86
+ name: f.name,
87
+ mimeType: f.mimetype,
88
+ size: f.size,
89
+ })),
90
+ timestamp: new Date(parseFloat(event.ts) * 1000),
91
+ metadata: { threadTs: event.thread_ts },
92
+ };
93
+ this.handleIncoming(normalized);
94
+ }
95
+ }
96
+ exports.SlackAdapter = SlackAdapter;
97
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/channels/slack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 🐟 AZERCLAW Telegram Channel Adapter
3
+ * Connects to Telegram via the Bot API (long polling).
4
+ */
5
+ import { ChannelAdapter, SendOptions } from './adapter';
6
+ export declare class TelegramAdapter extends ChannelAdapter {
7
+ readonly platform = "telegram";
8
+ readonly displayName = "Telegram";
9
+ private token;
10
+ private polling;
11
+ private offset;
12
+ private pollTimer;
13
+ private get baseUrl();
14
+ connect(config: Record<string, string>): Promise<void>;
15
+ disconnect(): Promise<void>;
16
+ send(options: SendOptions): Promise<void>;
17
+ isConnected(): boolean;
18
+ private pollUpdates;
19
+ }
20
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAqB,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3E,qBAAa,eAAgB,SAAQ,cAAc;IACjD,QAAQ,CAAC,QAAQ,cAAc;IAC/B,QAAQ,CAAC,WAAW,cAAc;IAClC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAA+B;IAEhD,OAAO,KAAK,OAAO,GAElB;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IActD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,WAAW,IAAI,OAAO;YAIR,WAAW;CAiC1B"}