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,156 @@
1
+ "use strict";
2
+ /**
3
+ * 🐟 AZERCLAW Multi-Provider LLM Router
4
+ * Routes requests to the best available provider with automatic fallback.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ProviderRouter = void 0;
8
+ exports.getRouter = getRouter;
9
+ exports.resetRouter = resetRouter;
10
+ const openai_1 = require("./openai");
11
+ const anthropic_1 = require("./anthropic");
12
+ const google_1 = require("./google");
13
+ const ollama_1 = require("./ollama");
14
+ const manager_1 = require("../config/manager");
15
+ class ProviderRouter {
16
+ providers = new Map();
17
+ fallbackChain;
18
+ constructor() {
19
+ const config = (0, manager_1.getConfigManager)();
20
+ const aiConfig = config.getAll().ai;
21
+ this.fallbackChain = aiConfig.fallbackChain;
22
+ this.initProviders(aiConfig);
23
+ }
24
+ initProviders(aiConfig) {
25
+ const p = aiConfig.providers;
26
+ if (p.openai.enabled && p.openai.apiKey) {
27
+ this.providers.set('openai', new openai_1.OpenAIProvider(p.openai));
28
+ }
29
+ if (p.anthropic.enabled && p.anthropic.apiKey) {
30
+ this.providers.set('anthropic', new anthropic_1.AnthropicProvider(p.anthropic));
31
+ }
32
+ if (p.google.enabled && p.google.apiKey) {
33
+ this.providers.set('google', new google_1.GoogleProvider(p.google));
34
+ }
35
+ if (p.ollama.enabled) {
36
+ this.providers.set('ollama', new ollama_1.OllamaProvider(p.ollama));
37
+ }
38
+ if (p.groq.enabled && p.groq.apiKey) {
39
+ // Groq uses OpenAI-compatible API
40
+ this.providers.set('groq', new openai_1.OpenAIProvider({ apiKey: p.groq.apiKey, baseUrl: p.groq.baseUrl, defaultModel: p.groq.defaultModel }));
41
+ }
42
+ if (p.deepseek.enabled && p.deepseek.apiKey) {
43
+ this.providers.set('deepseek', new openai_1.OpenAIProvider({ apiKey: p.deepseek.apiKey, baseUrl: p.deepseek.baseUrl, defaultModel: p.deepseek.defaultModel }));
44
+ }
45
+ if (p.openrouter.enabled && p.openrouter.apiKey) {
46
+ this.providers.set('openrouter', new openai_1.OpenAIProvider({ apiKey: p.openrouter.apiKey, baseUrl: p.openrouter.baseUrl, defaultModel: p.openrouter.defaultModel }));
47
+ }
48
+ if (p.custom.enabled && p.custom.apiKey && p.custom.baseUrl) {
49
+ this.providers.set('custom', new openai_1.OpenAIProvider({ apiKey: p.custom.apiKey, baseUrl: p.custom.baseUrl, defaultModel: p.custom.defaultModel }));
50
+ }
51
+ }
52
+ getProvider(name) {
53
+ if (name)
54
+ return this.providers.get(name);
55
+ const config = (0, manager_1.getConfigManager)();
56
+ const defaultProvider = config.getAll().ai.defaultProvider;
57
+ return this.providers.get(defaultProvider) || this.providers.values().next().value;
58
+ }
59
+ async complete(options, preferredProvider) {
60
+ // Build the resolution order: preferred → default → fallback chain → any available
61
+ const config = (0, manager_1.getConfigManager)();
62
+ const defaultProvider = config.getAll().ai.defaultProvider;
63
+ const tried = new Set();
64
+ const tryOrder = [];
65
+ let lastError = '';
66
+ if (preferredProvider)
67
+ tryOrder.push(preferredProvider);
68
+ if (defaultProvider)
69
+ tryOrder.push(defaultProvider);
70
+ tryOrder.push(...this.fallbackChain);
71
+ // Add all registered providers as final fallback
72
+ for (const name of this.providers.keys())
73
+ tryOrder.push(name);
74
+ for (const providerName of tryOrder) {
75
+ if (tried.has(providerName))
76
+ continue;
77
+ tried.add(providerName);
78
+ const provider = this.providers.get(providerName);
79
+ if (!provider)
80
+ continue;
81
+ // Retry with exponential backoff for transient errors
82
+ const maxRetries = 3;
83
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
84
+ try {
85
+ const result = await provider.complete(options);
86
+ if (result.finishReason !== 'error')
87
+ return result;
88
+ // Check if error is retryable (rate limit, server error)
89
+ const isRetryable = result.content.includes('429') ||
90
+ result.content.includes('500') ||
91
+ result.content.includes('502') ||
92
+ result.content.includes('503') ||
93
+ result.content.includes('rate') ||
94
+ result.content.includes('timeout');
95
+ if (isRetryable && attempt < maxRetries - 1) {
96
+ const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
97
+ await new Promise(r => setTimeout(r, delay));
98
+ continue;
99
+ }
100
+ lastError = result.content || `${providerName} returned error`;
101
+ break;
102
+ }
103
+ catch (e) {
104
+ const isRetryable = e.status === 429 || e.status >= 500 ||
105
+ e.code === 'ECONNREFUSED' || e.code === 'ETIMEDOUT' ||
106
+ e.code === 'ENOTFOUND';
107
+ if (isRetryable && attempt < maxRetries - 1) {
108
+ const delay = Math.pow(2, attempt) * 1000;
109
+ await new Promise(r => setTimeout(r, delay));
110
+ continue;
111
+ }
112
+ lastError = e.message || `${providerName} threw exception`;
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ const errorMsg = lastError
118
+ ? `Error: All providers failed. Last error: ${lastError}`
119
+ : 'Error: No providers available. Run `azerclaw onboard` to configure.';
120
+ return { content: errorMsg, model: 'none', provider: 'none', finishReason: 'error' };
121
+ }
122
+ async *stream(options, preferredProvider) {
123
+ const provider = preferredProvider ? this.providers.get(preferredProvider) : this.getProvider();
124
+ if (!provider) {
125
+ yield { type: 'error', error: 'No provider available' };
126
+ return;
127
+ }
128
+ yield* provider.stream(options);
129
+ }
130
+ async listAllModels() {
131
+ const allModels = [];
132
+ for (const [, provider] of this.providers) {
133
+ try {
134
+ const models = await provider.listModels();
135
+ allModels.push(...models);
136
+ }
137
+ catch { /* skip */ }
138
+ }
139
+ return allModels;
140
+ }
141
+ getAvailableProviders() {
142
+ return Array.from(this.providers.keys());
143
+ }
144
+ hasAnyProvider() {
145
+ return this.providers.size > 0;
146
+ }
147
+ }
148
+ exports.ProviderRouter = ProviderRouter;
149
+ let routerInstance = null;
150
+ function getRouter() {
151
+ if (!routerInstance)
152
+ routerInstance = new ProviderRouter();
153
+ return routerInstance;
154
+ }
155
+ function resetRouter() { routerInstance = null; }
156
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/providers/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 🐟 AZERCLAW Heartbeat Scheduler
3
+ * Proactive background task execution on a configurable schedule.
4
+ * Reads HEARTBEAT.md for task definitions and runs them on cron intervals.
5
+ */
6
+ export interface HeartbeatTask {
7
+ name: string;
8
+ schedule: string;
9
+ action: string;
10
+ condition?: string;
11
+ enabled: boolean;
12
+ lastRun?: Date;
13
+ lastResult?: string;
14
+ }
15
+ export interface HeartbeatConfig {
16
+ intervalMinutes: number;
17
+ tasks: HeartbeatTask[];
18
+ suppressIfNoAction: boolean;
19
+ }
20
+ export declare class HeartbeatEngine {
21
+ private heartbeatPath?;
22
+ private jobs;
23
+ private tasks;
24
+ private running;
25
+ private eventCallback;
26
+ constructor(heartbeatPath?: string | undefined);
27
+ /**
28
+ * Set callback for heartbeat events (for messenger integration).
29
+ */
30
+ onEvent(callback: (event: string, details: string) => void): void;
31
+ /**
32
+ * Load tasks from HEARTBEAT.md and start all cron jobs.
33
+ */
34
+ start(): void;
35
+ /**
36
+ * Stop all cron jobs.
37
+ */
38
+ stop(): void;
39
+ /**
40
+ * Execute a single heartbeat task.
41
+ */
42
+ private executeTask;
43
+ /**
44
+ * Check if a condition is met (simple heuristic checks).
45
+ */
46
+ private checkCondition;
47
+ /**
48
+ * Get status of all tasks.
49
+ */
50
+ getStatus(): {
51
+ name: string;
52
+ schedule: string;
53
+ nextRun: string;
54
+ lastRun: string;
55
+ enabled: boolean;
56
+ }[];
57
+ /**
58
+ * Manually trigger a task by name.
59
+ */
60
+ triggerTask(name: string): Promise<string>;
61
+ }
62
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../src/scheduler/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAoFD,qBAAa,eAAe;IAMd,OAAO,CAAC,aAAa,CAAC;IALlC,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAA2D;gBAE5D,aAAa,CAAC,EAAE,MAAM,YAAA;IAK1C;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIjE;;OAEG;IACH,KAAK,IAAI,IAAI;IAgCb;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;YACW,WAAW;IAuCzB;;OAEG;YACW,cAAc;IAgB5B;;OAEG;IACH,SAAS,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE;IAarG;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAMjD"}
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * 🐟 AZERCLAW Heartbeat Scheduler
4
+ * Proactive background task execution on a configurable schedule.
5
+ * Reads HEARTBEAT.md for task definitions and runs them on cron intervals.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.HeartbeatEngine = void 0;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const croner_1 = require("croner");
45
+ const runtime_1 = require("../core/runtime");
46
+ const manager_1 = require("../config/manager");
47
+ const security_1 = require("../core/security");
48
+ // ─── Schedule Parsing ───────────────────────────────────────────
49
+ function humanToCron(schedule) {
50
+ const s = schedule.toLowerCase().trim();
51
+ // Pre-defined schedules
52
+ if (s === 'every 30 minutes' || s === 'every 30m')
53
+ return '*/30 * * * *';
54
+ if (s === 'every hour' || s === 'every 1h')
55
+ return '0 * * * *';
56
+ if (s === 'every 6 hours' || s === 'every 6h')
57
+ return '0 */6 * * *';
58
+ if (s === 'every 12 hours' || s === 'every 12h')
59
+ return '0 */12 * * *';
60
+ if (s === 'daily' || s === 'every day')
61
+ return '0 9 * * *';
62
+ if (s === 'weekly' || s === 'every week')
63
+ return '0 9 * * 1';
64
+ if (s.startsWith('daily at ')) {
65
+ const time = s.replace('daily at ', '');
66
+ const [h, m] = time.split(':').map(Number);
67
+ return `${m || 0} ${h} * * *`;
68
+ }
69
+ if (s.startsWith('weekly on ')) {
70
+ const day = s.replace('weekly on ', '').toLowerCase();
71
+ const dayMap = {
72
+ sunday: 0, monday: 1, tuesday: 2, wednesday: 3,
73
+ thursday: 4, friday: 5, saturday: 6,
74
+ };
75
+ return `0 9 * * ${dayMap[day] ?? 1}`;
76
+ }
77
+ // Match "every N minutes/hours" pattern
78
+ const everyMatch = s.match(/every (\d+) (minutes?|hours?)/);
79
+ if (everyMatch) {
80
+ const n = parseInt(everyMatch[1]);
81
+ const unit = everyMatch[2];
82
+ if (unit.startsWith('minute'))
83
+ return `*/${n} * * * *`;
84
+ if (unit.startsWith('hour'))
85
+ return `0 */${n} * * *`;
86
+ }
87
+ // Assume it's already a cron expression
88
+ return schedule;
89
+ }
90
+ // ─── HEARTBEAT.md Parser ────────────────────────────────────────
91
+ function parseHeartbeatFile(filePath) {
92
+ if (!fs.existsSync(filePath))
93
+ return [];
94
+ const content = fs.readFileSync(filePath, 'utf-8');
95
+ const tasks = [];
96
+ // Parse markdown sections: ### Task Name
97
+ const sections = content.split(/^### /m).slice(1);
98
+ for (const section of sections) {
99
+ const lines = section.split('\n');
100
+ const name = lines[0].trim();
101
+ let schedule = 'every 30 minutes';
102
+ let action = '';
103
+ let condition = '';
104
+ let enabled = true;
105
+ for (const line of lines) {
106
+ const trimmed = line.trim();
107
+ if (trimmed.startsWith('- **Schedule**:')) {
108
+ schedule = trimmed.replace('- **Schedule**:', '').trim();
109
+ }
110
+ else if (trimmed.startsWith('- **Action**:')) {
111
+ action = trimmed.replace('- **Action**:', '').trim();
112
+ }
113
+ else if (trimmed.startsWith('- **Condition**:')) {
114
+ condition = trimmed.replace('- **Condition**:', '').trim();
115
+ }
116
+ else if (trimmed.startsWith('- **Enabled**:')) {
117
+ enabled = trimmed.replace('- **Enabled**:', '').trim().toLowerCase() !== 'false';
118
+ }
119
+ }
120
+ if (name && action) {
121
+ tasks.push({ name, schedule, action, condition, enabled });
122
+ }
123
+ }
124
+ return tasks;
125
+ }
126
+ // ─── Heartbeat Engine ───────────────────────────────────────────
127
+ class HeartbeatEngine {
128
+ heartbeatPath;
129
+ jobs = new Map();
130
+ tasks = [];
131
+ running = false;
132
+ eventCallback = null;
133
+ constructor(heartbeatPath) {
134
+ this.heartbeatPath = heartbeatPath;
135
+ const configDir = (0, manager_1.getConfigManager)().paths.configDir;
136
+ this.heartbeatPath = heartbeatPath || path.join(configDir, 'HEARTBEAT.md');
137
+ }
138
+ /**
139
+ * Set callback for heartbeat events (for messenger integration).
140
+ */
141
+ onEvent(callback) {
142
+ this.eventCallback = callback;
143
+ }
144
+ /**
145
+ * Load tasks from HEARTBEAT.md and start all cron jobs.
146
+ */
147
+ start() {
148
+ if (this.running)
149
+ return;
150
+ this.running = true;
151
+ // Copy default HEARTBEAT.md if none exists
152
+ if (!fs.existsSync(this.heartbeatPath)) {
153
+ const templatePath = path.join(__dirname, '..', '..', 'templates', 'HEARTBEAT.md');
154
+ if (fs.existsSync(templatePath)) {
155
+ fs.copyFileSync(templatePath, this.heartbeatPath);
156
+ }
157
+ }
158
+ this.tasks = parseHeartbeatFile(this.heartbeatPath);
159
+ for (const task of this.tasks) {
160
+ if (!task.enabled)
161
+ continue;
162
+ const cronExpr = humanToCron(task.schedule);
163
+ try {
164
+ const job = new croner_1.Cron(cronExpr, async () => {
165
+ await this.executeTask(task);
166
+ });
167
+ this.jobs.set(task.name, job);
168
+ (0, security_1.auditLog)('HEARTBEAT_SCHEDULED', `${task.name} → ${cronExpr}`);
169
+ }
170
+ catch (e) {
171
+ (0, security_1.auditLog)('HEARTBEAT_ERROR', `Failed to schedule ${task.name}: ${e.message}`);
172
+ }
173
+ }
174
+ (0, security_1.auditLog)('HEARTBEAT_STARTED', `${this.jobs.size} tasks scheduled`);
175
+ }
176
+ /**
177
+ * Stop all cron jobs.
178
+ */
179
+ stop() {
180
+ for (const [name, job] of this.jobs) {
181
+ job.stop();
182
+ }
183
+ this.jobs.clear();
184
+ this.running = false;
185
+ (0, security_1.auditLog)('HEARTBEAT_STOPPED', 'All tasks stopped');
186
+ }
187
+ /**
188
+ * Execute a single heartbeat task.
189
+ */
190
+ async executeTask(task) {
191
+ (0, security_1.auditLog)('HEARTBEAT_RUN', task.name);
192
+ // Check condition
193
+ if (task.condition) {
194
+ const conditionMet = await this.checkCondition(task.condition);
195
+ if (!conditionMet) {
196
+ (0, security_1.auditLog)('HEARTBEAT_SKIP', `${task.name} — condition not met`);
197
+ return;
198
+ }
199
+ }
200
+ // Run the task via a temporary agent
201
+ let result = '';
202
+ const agent = new runtime_1.AgentRuntime({
203
+ sessionId: `heartbeat_${task.name}_${Date.now()}`,
204
+ maxIterations: 5,
205
+ eventHandler: async (event) => {
206
+ if (event.type === 'response' && event.content) {
207
+ result = event.content;
208
+ }
209
+ },
210
+ });
211
+ try {
212
+ result = await agent.run(task.action);
213
+ task.lastRun = new Date();
214
+ task.lastResult = result.slice(0, 500);
215
+ if (result && this.eventCallback) {
216
+ this.eventCallback(`heartbeat:${task.name}`, result);
217
+ }
218
+ (0, security_1.auditLog)('HEARTBEAT_DONE', `${task.name} — ${result.slice(0, 100)}`);
219
+ }
220
+ catch (e) {
221
+ (0, security_1.auditLog)('HEARTBEAT_ERROR', `${task.name} — ${e.message}`);
222
+ }
223
+ }
224
+ /**
225
+ * Check if a condition is met (simple heuristic checks).
226
+ */
227
+ async checkCondition(condition) {
228
+ const c = condition.toLowerCase();
229
+ if (c.includes('git repo')) {
230
+ return fs.existsSync(path.join(process.cwd(), '.git'));
231
+ }
232
+ if (c.includes('package.json')) {
233
+ return fs.existsSync(path.join(process.cwd(), 'package.json'));
234
+ }
235
+ if (c === 'always') {
236
+ return true;
237
+ }
238
+ return true; // Default: run
239
+ }
240
+ /**
241
+ * Get status of all tasks.
242
+ */
243
+ getStatus() {
244
+ return this.tasks.map(task => {
245
+ const job = this.jobs.get(task.name);
246
+ return {
247
+ name: task.name,
248
+ schedule: task.schedule,
249
+ nextRun: job?.nextRun()?.toISOString() || 'not scheduled',
250
+ lastRun: task.lastRun?.toISOString() || 'never',
251
+ enabled: task.enabled,
252
+ };
253
+ });
254
+ }
255
+ /**
256
+ * Manually trigger a task by name.
257
+ */
258
+ async triggerTask(name) {
259
+ const task = this.tasks.find(t => t.name === name);
260
+ if (!task)
261
+ return `Task not found: ${name}`;
262
+ await this.executeTask(task);
263
+ return task.lastResult || 'Task completed';
264
+ }
265
+ }
266
+ exports.HeartbeatEngine = HeartbeatEngine;
267
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/scheduler/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 🐟 AZERCLAW Skills System
3
+ * Load and execute SKILL.md files compatible with the OpenClaw ecosystem.
4
+ */
5
+ export interface SkillMetadata {
6
+ name: string;
7
+ description: string;
8
+ version?: string;
9
+ author?: string;
10
+ tags?: string[];
11
+ os?: string[];
12
+ requires?: string[];
13
+ }
14
+ export interface Skill {
15
+ metadata: SkillMetadata;
16
+ instructions: string;
17
+ filePath: string;
18
+ source: 'workspace' | 'project' | 'personal' | 'managed' | 'bundled';
19
+ }
20
+ export declare function loadAllSkills(workspaceDir?: string): Skill[];
21
+ /**
22
+ * Format skills as context for the agent system prompt.
23
+ */
24
+ export declare function formatSkillsForPrompt(skills: Skill[]): string;
25
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CACtE;AAyED,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAoC5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAW7D"}