aura-code 0.3.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.
- package/LICENSE +21 -0
- package/README.md +137 -0
- package/dist/agent/context.d.ts +13 -0
- package/dist/agent/context.js +183 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/loop.d.ts +60 -0
- package/dist/agent/loop.js +228 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/session-store.d.ts +30 -0
- package/dist/agent/session-store.js +178 -0
- package/dist/agent/session-store.js.map +1 -0
- package/dist/agent/spawner.d.ts +57 -0
- package/dist/agent/spawner.js +112 -0
- package/dist/agent/spawner.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +3 -0
- package/dist/agent/system-prompt.js +100 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/architect/engine.d.ts +47 -0
- package/dist/architect/engine.js +217 -0
- package/dist/architect/engine.js.map +1 -0
- package/dist/architect/types.d.ts +61 -0
- package/dist/architect/types.js +6 -0
- package/dist/architect/types.js.map +1 -0
- package/dist/cli/diamond.d.ts +1 -0
- package/dist/cli/diamond.js +23 -0
- package/dist/cli/diamond.js.map +1 -0
- package/dist/cli/display.d.ts +44 -0
- package/dist/cli/display.js +234 -0
- package/dist/cli/display.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +1734 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/defaults.d.ts +46 -0
- package/dist/config/defaults.js +106 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/project-config.d.ts +90 -0
- package/dist/config/project-config.js +141 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/harness/proposer.d.ts +26 -0
- package/dist/harness/proposer.js +204 -0
- package/dist/harness/proposer.js.map +1 -0
- package/dist/harness/weakness-miner.d.ts +28 -0
- package/dist/harness/weakness-miner.js +359 -0
- package/dist/harness/weakness-miner.js.map +1 -0
- package/dist/integrations/harnesses.d.ts +23 -0
- package/dist/integrations/harnesses.js +161 -0
- package/dist/integrations/harnesses.js.map +1 -0
- package/dist/orchestration/competence.d.ts +53 -0
- package/dist/orchestration/competence.js +181 -0
- package/dist/orchestration/competence.js.map +1 -0
- package/dist/orchestration/executor.d.ts +42 -0
- package/dist/orchestration/executor.js +206 -0
- package/dist/orchestration/executor.js.map +1 -0
- package/dist/orchestration/index.d.ts +20 -0
- package/dist/orchestration/index.js +39 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/orchestrator-prompts.d.ts +11 -0
- package/dist/orchestration/orchestrator-prompts.js +153 -0
- package/dist/orchestration/orchestrator-prompts.js.map +1 -0
- package/dist/orchestration/orchestrator.d.ts +27 -0
- package/dist/orchestration/orchestrator.js +169 -0
- package/dist/orchestration/orchestrator.js.map +1 -0
- package/dist/orchestration/plan-store.d.ts +53 -0
- package/dist/orchestration/plan-store.js +176 -0
- package/dist/orchestration/plan-store.js.map +1 -0
- package/dist/orchestration/router-prompts.d.ts +6 -0
- package/dist/orchestration/router-prompts.js +55 -0
- package/dist/orchestration/router-prompts.js.map +1 -0
- package/dist/orchestration/router.d.ts +23 -0
- package/dist/orchestration/router.js +70 -0
- package/dist/orchestration/router.js.map +1 -0
- package/dist/orchestration/ruby-detect.d.ts +6 -0
- package/dist/orchestration/ruby-detect.js +130 -0
- package/dist/orchestration/ruby-detect.js.map +1 -0
- package/dist/orchestration/ruby-types.d.ts +44 -0
- package/dist/orchestration/ruby-types.js +6 -0
- package/dist/orchestration/ruby-types.js.map +1 -0
- package/dist/orchestration/specialist-prompts.d.ts +19 -0
- package/dist/orchestration/specialist-prompts.js +143 -0
- package/dist/orchestration/specialist-prompts.js.map +1 -0
- package/dist/orchestration/specialists.d.ts +66 -0
- package/dist/orchestration/specialists.js +175 -0
- package/dist/orchestration/specialists.js.map +1 -0
- package/dist/orchestration/types.d.ts +82 -0
- package/dist/orchestration/types.js +6 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/perception/extractor.d.ts +7 -0
- package/dist/perception/extractor.js +521 -0
- package/dist/perception/extractor.js.map +1 -0
- package/dist/perception/graph-store.d.ts +25 -0
- package/dist/perception/graph-store.js +117 -0
- package/dist/perception/graph-store.js.map +1 -0
- package/dist/perception/index.d.ts +4 -0
- package/dist/perception/index.js +18 -0
- package/dist/perception/index.js.map +1 -0
- package/dist/perception/queries.d.ts +29 -0
- package/dist/perception/queries.js +354 -0
- package/dist/perception/queries.js.map +1 -0
- package/dist/perception/types.d.ts +103 -0
- package/dist/perception/types.js +6 -0
- package/dist/perception/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +11 -0
- package/dist/providers/anthropic.js +172 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/factory.d.ts +58 -0
- package/dist/providers/factory.js +354 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/fallback.d.ts +24 -0
- package/dist/providers/fallback.js +72 -0
- package/dist/providers/fallback.js.map +1 -0
- package/dist/providers/google.d.ts +11 -0
- package/dist/providers/google.js +129 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +24 -0
- package/dist/providers/openai-compatible.js +216 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/resilient-factory.d.ts +24 -0
- package/dist/providers/resilient-factory.js +57 -0
- package/dist/providers/resilient-factory.js.map +1 -0
- package/dist/providers/resilient.d.ts +63 -0
- package/dist/providers/resilient.js +145 -0
- package/dist/providers/resilient.js.map +1 -0
- package/dist/providers/types.d.ts +84 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/ruby/alternator.d.ts +40 -0
- package/dist/ruby/alternator.js +233 -0
- package/dist/ruby/alternator.js.map +1 -0
- package/dist/ruby/competence.d.ts +34 -0
- package/dist/ruby/competence.js +264 -0
- package/dist/ruby/competence.js.map +1 -0
- package/dist/ruby/episode-capture.d.ts +56 -0
- package/dist/ruby/episode-capture.js +193 -0
- package/dist/ruby/episode-capture.js.map +1 -0
- package/dist/ruby/fine-tune.d.ts +16 -0
- package/dist/ruby/fine-tune.js +253 -0
- package/dist/ruby/fine-tune.js.map +1 -0
- package/dist/ruby/index.d.ts +10 -0
- package/dist/ruby/index.js +26 -0
- package/dist/ruby/index.js.map +1 -0
- package/dist/ruby/ruby-model.d.ts +36 -0
- package/dist/ruby/ruby-model.js +81 -0
- package/dist/ruby/ruby-model.js.map +1 -0
- package/dist/ruby/training-data.d.ts +11 -0
- package/dist/ruby/training-data.js +107 -0
- package/dist/ruby/training-data.js.map +1 -0
- package/dist/ruby/types.d.ts +136 -0
- package/dist/ruby/types.js +20 -0
- package/dist/ruby/types.js.map +1 -0
- package/dist/safety/permissions.d.ts +32 -0
- package/dist/safety/permissions.js +304 -0
- package/dist/safety/permissions.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.js +342 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/session.d.ts +22 -0
- package/dist/server/session.js +16 -0
- package/dist/server/session.js.map +1 -0
- package/dist/setup/first-run.d.ts +41 -0
- package/dist/setup/first-run.js +386 -0
- package/dist/setup/first-run.js.map +1 -0
- package/dist/setup/global-config.d.ts +19 -0
- package/dist/setup/global-config.js +97 -0
- package/dist/setup/global-config.js.map +1 -0
- package/dist/tools/audio-transcribe.d.ts +8 -0
- package/dist/tools/audio-transcribe.js +156 -0
- package/dist/tools/audio-transcribe.js.map +1 -0
- package/dist/tools/browser.d.ts +15 -0
- package/dist/tools/browser.js +241 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/calendar.d.ts +12 -0
- package/dist/tools/calendar.js +196 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/clipboard.d.ts +7 -0
- package/dist/tools/clipboard.js +90 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/cron.d.ts +10 -0
- package/dist/tools/cron.js +167 -0
- package/dist/tools/cron.js.map +1 -0
- package/dist/tools/edit-file.d.ts +6 -0
- package/dist/tools/edit-file.js +98 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/email.d.ts +11 -0
- package/dist/tools/email.js +153 -0
- package/dist/tools/email.js.map +1 -0
- package/dist/tools/git.d.ts +1 -0
- package/dist/tools/git.js +7 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/http-request.d.ts +12 -0
- package/dist/tools/http-request.js +91 -0
- package/dist/tools/http-request.js.map +1 -0
- package/dist/tools/image-read.d.ts +7 -0
- package/dist/tools/image-read.js +125 -0
- package/dist/tools/image-read.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +201 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-dir.d.ts +1 -0
- package/dist/tools/list-dir.js +6 -0
- package/dist/tools/list-dir.js.map +1 -0
- package/dist/tools/mcp.d.ts +11 -0
- package/dist/tools/mcp.js +356 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/memory.d.ts +9 -0
- package/dist/tools/memory.js +124 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/notify.d.ts +9 -0
- package/dist/tools/notify.js +40 -0
- package/dist/tools/notify.js.map +1 -0
- package/dist/tools/read-file.d.ts +6 -0
- package/dist/tools/read-file.js +76 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/run-shell.d.ts +1 -0
- package/dist/tools/run-shell.js +6 -0
- package/dist/tools/run-shell.js.map +1 -0
- package/dist/tools/run-tests.d.ts +1 -0
- package/dist/tools/run-tests.js +6 -0
- package/dist/tools/run-tests.js.map +1 -0
- package/dist/tools/search-code.d.ts +1 -0
- package/dist/tools/search-code.js +6 -0
- package/dist/tools/search-code.js.map +1 -0
- package/dist/tools/telegram-bot.d.ts +2 -0
- package/dist/tools/telegram-bot.js +693 -0
- package/dist/tools/telegram-bot.js.map +1 -0
- package/dist/tools/telegram-safety.d.ts +52 -0
- package/dist/tools/telegram-safety.js +189 -0
- package/dist/tools/telegram-safety.js.map +1 -0
- package/dist/tools/telegram.d.ts +16 -0
- package/dist/tools/telegram.js +227 -0
- package/dist/tools/telegram.js.map +1 -0
- package/dist/tools/tools.d.ts +48 -0
- package/dist/tools/tools.js +328 -0
- package/dist/tools/tools.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +11 -0
- package/dist/tools/web-fetch.js +119 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +8 -0
- package/dist/tools/web-search.js +81 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/whatsapp.d.ts +10 -0
- package/dist/tools/whatsapp.js +222 -0
- package/dist/tools/whatsapp.js.map +1 -0
- package/dist/tools/write-file.d.ts +1 -0
- package/dist/tools/write-file.js +6 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/tools/youtube-transcript.d.ts +9 -0
- package/dist/tools/youtube-transcript.js +200 -0
- package/dist/tools/youtube-transcript.js.map +1 -0
- package/dist/util/circuit-breaker.d.ts +44 -0
- package/dist/util/circuit-breaker.js +78 -0
- package/dist/util/circuit-breaker.js.map +1 -0
- package/dist/util/env.d.ts +18 -0
- package/dist/util/env.js +39 -0
- package/dist/util/env.js.map +1 -0
- package/dist/util/errors.d.ts +42 -0
- package/dist/util/errors.js +121 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/rate-limiter.d.ts +71 -0
- package/dist/util/rate-limiter.js +141 -0
- package/dist/util/rate-limiter.js.map +1 -0
- package/dist/util/retry.d.ts +30 -0
- package/dist/util/retry.js +57 -0
- package/dist/util/retry.js.map +1 -0
- package/dist/util/sanitize.d.ts +16 -0
- package/dist/util/sanitize.js +255 -0
- package/dist/util/sanitize.js.map +1 -0
- package/dist/verify/checks.d.ts +21 -0
- package/dist/verify/checks.js +311 -0
- package/dist/verify/checks.js.map +1 -0
- package/dist/verify/index.d.ts +33 -0
- package/dist/verify/index.js +127 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/types.d.ts +20 -0
- package/dist/verify/types.js +3 -0
- package/dist/verify/types.js.map +1 -0
- package/dist/versioncheck.d.ts +22 -0
- package/dist/versioncheck.js +203 -0
- package/dist/versioncheck.js.map +1 -0
- package/dist/viz/index.d.ts +2 -0
- package/dist/viz/index.js +733 -0
- package/dist/viz/index.js.map +1 -0
- package/dist/workflows/engine.d.ts +46 -0
- package/dist/workflows/engine.js +320 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/types.d.ts +92 -0
- package/dist/workflows/types.js +6 -0
- package/dist/workflows/types.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../providers/types.js';
|
|
2
|
+
export interface ClipboardInput {
|
|
3
|
+
action: 'copy' | 'paste';
|
|
4
|
+
text?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const CLIPBOARD_DEFINITION: ToolDefinition;
|
|
7
|
+
export declare function clipboardTool(input: ClipboardInput): Promise<string>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CLIPBOARD_DEFINITION = void 0;
|
|
4
|
+
exports.clipboardTool = clipboardTool;
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
exports.CLIPBOARD_DEFINITION = {
|
|
7
|
+
name: 'clipboard',
|
|
8
|
+
description: 'Read from or write to the system clipboard. Copy text for the user to paste, ' +
|
|
9
|
+
'or read what the user has copied.',
|
|
10
|
+
parameters: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
action: { type: 'string', description: 'Action: copy (write to clipboard) or paste (read from clipboard)' },
|
|
14
|
+
text: { type: 'string', description: 'Text to copy (required for copy action)' },
|
|
15
|
+
},
|
|
16
|
+
required: ['action'],
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
function detectClipboardCommand() {
|
|
20
|
+
// Try xclip (X11)
|
|
21
|
+
try {
|
|
22
|
+
(0, child_process_1.execSync)('which xclip', { stdio: 'pipe' });
|
|
23
|
+
return {
|
|
24
|
+
copy: ['xclip', '-selection', 'clipboard'],
|
|
25
|
+
paste: ['xclip', '-selection', 'clipboard', '-o'],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch { /* not found */ }
|
|
29
|
+
// Try xsel (X11)
|
|
30
|
+
try {
|
|
31
|
+
(0, child_process_1.execSync)('which xsel', { stdio: 'pipe' });
|
|
32
|
+
return {
|
|
33
|
+
copy: ['xsel', '--clipboard', '--input'],
|
|
34
|
+
paste: ['xsel', '--clipboard', '--output'],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch { /* not found */ }
|
|
38
|
+
// Try wl-copy/wl-paste (Wayland)
|
|
39
|
+
try {
|
|
40
|
+
(0, child_process_1.execSync)('which wl-copy', { stdio: 'pipe' });
|
|
41
|
+
return {
|
|
42
|
+
copy: ['wl-copy'],
|
|
43
|
+
paste: ['wl-paste'],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch { /* not found */ }
|
|
47
|
+
// Try pbcopy/pbpaste (macOS)
|
|
48
|
+
try {
|
|
49
|
+
(0, child_process_1.execSync)('which pbcopy', { stdio: 'pipe' });
|
|
50
|
+
return {
|
|
51
|
+
copy: ['pbcopy'],
|
|
52
|
+
paste: ['pbpaste'],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch { /* not found */ }
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
async function clipboardTool(input) {
|
|
59
|
+
const cmds = detectClipboardCommand();
|
|
60
|
+
if (!cmds) {
|
|
61
|
+
return 'Error: No clipboard utility found. Install xclip, xsel, or wl-clipboard.';
|
|
62
|
+
}
|
|
63
|
+
switch (input.action) {
|
|
64
|
+
case 'copy': {
|
|
65
|
+
if (input.text === undefined)
|
|
66
|
+
return 'Error: text is required for copy';
|
|
67
|
+
try {
|
|
68
|
+
const [bin, ...args] = cmds.copy;
|
|
69
|
+
(0, child_process_1.execSync)(`${bin} ${args.join(' ')}`, { input: input.text });
|
|
70
|
+
return `Copied ${input.text.length} characters to clipboard.`;
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
return `Error copying to clipboard: ${e?.message}`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
case 'paste': {
|
|
77
|
+
try {
|
|
78
|
+
const [bin, ...args] = cmds.paste;
|
|
79
|
+
const result = (0, child_process_1.execSync)(`${bin} ${args.join(' ')}`, { encoding: 'utf8' });
|
|
80
|
+
return `Clipboard contents:\n${result}`;
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
return `Error reading clipboard: ${e?.message}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
default:
|
|
87
|
+
return `Error: Unknown clipboard action: ${input.action}`;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/tools/clipboard.ts"],"names":[],"mappings":";;;AAmEA,sCA+BC;AAlGD,iDAAyC;AAY5B,QAAA,oBAAoB,GAAmB;IAClD,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,+EAA+E;QAC/E,mCAAmC;IACrC,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kEAAkE,EAAE;YAC3G,IAAI,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAE;SACnF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,SAAS,sBAAsB;IAC7B,kBAAkB;IAClB,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO;YACL,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC;YAC1C,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC;SAClD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,iBAAiB;IACjB,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC;YACxC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC;SAC3C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,iCAAiC;IACjC,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,CAAC,SAAS,CAAC;YACjB,KAAK,EAAE,CAAC,UAAU,CAAC;SACpB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,6BAA6B;IAC7B,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,CAAC,QAAQ,CAAC;YAChB,KAAK,EAAE,CAAC,SAAS,CAAC;SACnB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,KAAqB;IACvD,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,0EAA0E,CAAC;IACpF,CAAC;IAED,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,kCAAkC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;gBACjC,IAAA,wBAAQ,EAAC,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5D,OAAO,UAAU,KAAK,CAAC,IAAI,CAAC,MAAM,2BAA2B,CAAC;YAChE,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,OAAO,+BAA+B,CAAC,EAAE,OAAO,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;gBAClC,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1E,OAAO,wBAAwB,MAAM,EAAE,CAAC;YAC1C,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,OAAO,4BAA4B,CAAC,EAAE,OAAO,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;QAED;YACE,OAAO,oCAAoC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../providers/types.js';
|
|
2
|
+
export interface CronInput {
|
|
3
|
+
action: 'add' | 'list' | 'remove' | 'remove_all' | 'run';
|
|
4
|
+
schedule?: string;
|
|
5
|
+
command?: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
id?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const CRON_DEFINITION: ToolDefinition;
|
|
10
|
+
export declare function cronTool(input: CronInput): Promise<string>;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CRON_DEFINITION = void 0;
|
|
4
|
+
exports.cronTool = cronTool;
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
exports.CRON_DEFINITION = {
|
|
7
|
+
name: 'cron',
|
|
8
|
+
description: 'Manage scheduled tasks (cron jobs). Add, list, remove scheduled commands. ' +
|
|
9
|
+
'Schedule presets: every_minute, every_5_minutes, every_15_minutes, hourly, daily_8am, daily_9pm, weekly, midnight. ' +
|
|
10
|
+
'Or use standard cron expressions (e.g., "*/10 * * * *" = every 10 min). ' +
|
|
11
|
+
'Useful for: periodic checks, reminders, backups, monitoring, auto-sync.',
|
|
12
|
+
parameters: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {
|
|
15
|
+
action: { type: 'string', description: 'Action: add, list, remove, remove_all, run' },
|
|
16
|
+
schedule: { type: 'string', description: 'Cron schedule (expression or preset name)' },
|
|
17
|
+
command: { type: 'string', description: 'Shell command to execute (for add)' },
|
|
18
|
+
label: { type: 'string', description: 'Label to identify the job (for add)' },
|
|
19
|
+
id: { type: 'string', description: 'Job label to remove (for remove)' },
|
|
20
|
+
},
|
|
21
|
+
required: ['action'],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
+
// Schedule presets
|
|
26
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
const PRESETS = {
|
|
28
|
+
'every_minute': '* * * * *',
|
|
29
|
+
'every_5_minutes': '*/5 * * * *',
|
|
30
|
+
'every_15_minutes': '*/15 * * * *',
|
|
31
|
+
'every_30_minutes': '*/30 * * * *',
|
|
32
|
+
'hourly': '0 * * * *',
|
|
33
|
+
'every_hour': '0 * * * *',
|
|
34
|
+
'daily': '0 9 * * *',
|
|
35
|
+
'daily_8am': '0 8 * * *',
|
|
36
|
+
'daily_9am': '0 9 * * *',
|
|
37
|
+
'daily_9pm': '21 * * * *',
|
|
38
|
+
'midnight': '0 0 * * *',
|
|
39
|
+
'weekly': '0 9 * * 1',
|
|
40
|
+
'weekly_monday': '0 9 * * 1',
|
|
41
|
+
'monthly': '0 9 1 * *',
|
|
42
|
+
};
|
|
43
|
+
function resolveSchedule(input) {
|
|
44
|
+
const lower = input.toLowerCase().trim();
|
|
45
|
+
if (PRESETS[lower])
|
|
46
|
+
return PRESETS[lower];
|
|
47
|
+
// Validate cron expression (5 fields)
|
|
48
|
+
const parts = input.trim().split(/\s+/);
|
|
49
|
+
if (parts.length === 5)
|
|
50
|
+
return input;
|
|
51
|
+
throw new Error(`Invalid schedule: "${input}". Use a preset (${Object.keys(PRESETS).join(', ')}) or a 5-field cron expression.`);
|
|
52
|
+
}
|
|
53
|
+
const TAG = '# aura:';
|
|
54
|
+
function tagFor(label) {
|
|
55
|
+
return `${TAG} ${label}`;
|
|
56
|
+
}
|
|
57
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
58
|
+
// Crontab operations
|
|
59
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
60
|
+
function getCrontab() {
|
|
61
|
+
try {
|
|
62
|
+
return (0, child_process_1.execSync)('crontab -l 2>/dev/null', { encoding: 'utf8' });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return '';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function setCrontab(content) {
|
|
69
|
+
(0, child_process_1.execSync)(`echo ${JSON.stringify(content)} | crontab -`);
|
|
70
|
+
}
|
|
71
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
72
|
+
// Actions
|
|
73
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
74
|
+
function doAdd(input) {
|
|
75
|
+
if (!input.command)
|
|
76
|
+
return 'Error: command is required for add';
|
|
77
|
+
if (!input.schedule)
|
|
78
|
+
return 'Error: schedule is required for add';
|
|
79
|
+
const schedule = resolveSchedule(input.schedule);
|
|
80
|
+
const label = input.label ?? `job-${Date.now().toString(36)}`;
|
|
81
|
+
const existing = getCrontab();
|
|
82
|
+
const lines = existing.split('\n').filter(l => l.trim());
|
|
83
|
+
// Remove existing job with same label
|
|
84
|
+
const filtered = lines.filter(l => !l.includes(tagFor(label)));
|
|
85
|
+
// Add new job
|
|
86
|
+
filtered.push(`${schedule} ${input.command} ${tagFor(label)}`);
|
|
87
|
+
setCrontab(filtered.join('\n') + '\n');
|
|
88
|
+
return `Cron job added: "${label}"\nSchedule: ${schedule}\nCommand: ${input.command}`;
|
|
89
|
+
}
|
|
90
|
+
function doList() {
|
|
91
|
+
const content = getCrontab();
|
|
92
|
+
if (!content.trim())
|
|
93
|
+
return 'No cron jobs configured.';
|
|
94
|
+
const lines = content.split('\n').filter(l => l.trim());
|
|
95
|
+
const auraJobs = lines.filter(l => l.includes(TAG));
|
|
96
|
+
const otherJobs = lines.filter(l => !l.includes(TAG) && l.trim());
|
|
97
|
+
const parts = [];
|
|
98
|
+
if (auraJobs.length > 0) {
|
|
99
|
+
parts.push(`Aura jobs (${auraJobs.length}):`);
|
|
100
|
+
auraJobs.forEach((l, i) => {
|
|
101
|
+
const labelMatch = l.match(/# aura: (.+)/);
|
|
102
|
+
const label = labelMatch ? labelMatch[1] : 'unnamed';
|
|
103
|
+
const schedule = l.split(/\s+/).slice(0, 5).join(' ');
|
|
104
|
+
const cmd = l.replace(/\s*# aura:.*/, '').replace(/^(\S+\s+){5}/, '').trim();
|
|
105
|
+
parts.push(` ${i + 1}. [${label}] ${schedule} → ${cmd}`);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (otherJobs.length > 0) {
|
|
109
|
+
parts.push(`\nSystem jobs (${otherJobs.length}):`);
|
|
110
|
+
otherJobs.forEach(l => parts.push(` ${l}`));
|
|
111
|
+
}
|
|
112
|
+
return parts.join('\n');
|
|
113
|
+
}
|
|
114
|
+
function doRemove(id) {
|
|
115
|
+
const existing = getCrontab();
|
|
116
|
+
const lines = existing.split('\n');
|
|
117
|
+
const filtered = lines.filter(l => !l.includes(tagFor(id)));
|
|
118
|
+
if (filtered.length === lines.length) {
|
|
119
|
+
return `Error: No cron job found with label "${id}"`;
|
|
120
|
+
}
|
|
121
|
+
setCrontab(filtered.join('\n') + '\n');
|
|
122
|
+
return `Cron job removed: "${id}"`;
|
|
123
|
+
}
|
|
124
|
+
function doRemoveAll() {
|
|
125
|
+
const existing = getCrontab();
|
|
126
|
+
const lines = existing.split('\n');
|
|
127
|
+
const filtered = lines.filter(l => !l.includes(TAG));
|
|
128
|
+
const removed = lines.length - filtered.length;
|
|
129
|
+
if (removed === 0)
|
|
130
|
+
return 'No Aura cron jobs to remove.';
|
|
131
|
+
setCrontab(filtered.join('\n') + '\n');
|
|
132
|
+
return `Removed ${removed} Aura cron job(s).`;
|
|
133
|
+
}
|
|
134
|
+
function doRun(input) {
|
|
135
|
+
if (!input.command)
|
|
136
|
+
return 'Error: command is required for run';
|
|
137
|
+
try {
|
|
138
|
+
const output = (0, child_process_1.execSync)(input.command, { encoding: 'utf8', timeout: 30_000 });
|
|
139
|
+
return `Command output:\n${output}`;
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
return `Command error:\n${e?.stderr ?? e?.message ?? String(e)}`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
146
|
+
// Main executor
|
|
147
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
148
|
+
async function cronTool(input) {
|
|
149
|
+
try {
|
|
150
|
+
switch (input.action) {
|
|
151
|
+
case 'add': return doAdd(input);
|
|
152
|
+
case 'list': return doList();
|
|
153
|
+
case 'remove': {
|
|
154
|
+
if (!input.id)
|
|
155
|
+
return 'Error: id (label) is required for remove';
|
|
156
|
+
return doRemove(input.id);
|
|
157
|
+
}
|
|
158
|
+
case 'remove_all': return doRemoveAll();
|
|
159
|
+
case 'run': return doRun(input);
|
|
160
|
+
default: return `Error: Unknown cron action: ${input.action}`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
return `Cron error: ${e?.message ?? String(e)}`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/tools/cron.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.editFile = editFile;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
function editFile(input, cwd) {
|
|
40
|
+
const filePath = path.resolve(cwd, input.path);
|
|
41
|
+
if (!fs.existsSync(filePath)) {
|
|
42
|
+
return `Error: File not found: ${input.path}`;
|
|
43
|
+
}
|
|
44
|
+
let content;
|
|
45
|
+
try {
|
|
46
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
return `Error reading file: ${String(e)}`;
|
|
50
|
+
}
|
|
51
|
+
// Normalise line endings
|
|
52
|
+
const normalContent = content.replace(/\r\n/g, '\n');
|
|
53
|
+
const normalFind = input.find.replace(/\r\n/g, '\n');
|
|
54
|
+
const normalReplace = input.replace.replace(/\r\n/g, '\n');
|
|
55
|
+
// ── Attempt 1: exact match ─────────────────────────────────────────────────
|
|
56
|
+
if (normalContent.includes(normalFind)) {
|
|
57
|
+
const newContent = normalContent.replace(normalFind, normalReplace);
|
|
58
|
+
fs.writeFileSync(filePath, newContent, 'utf8');
|
|
59
|
+
const lineCount = (normalFind.match(/\n/g) ?? []).length + 1;
|
|
60
|
+
return `✓ Edit applied to ${input.path} (replaced ${lineCount} line${lineCount > 1 ? 's' : ''})`;
|
|
61
|
+
}
|
|
62
|
+
// ── Attempt 2: trimmed leading/trailing whitespace on each line ────────────
|
|
63
|
+
const trimLines = (s) => s.split('\n').map(l => l.trimEnd()).join('\n');
|
|
64
|
+
const trimmedContent = trimLines(normalContent);
|
|
65
|
+
const trimmedFind = trimLines(normalFind);
|
|
66
|
+
if (trimmedContent.includes(trimmedFind)) {
|
|
67
|
+
const newContent = trimmedContent.replace(trimmedFind, trimLines(normalReplace));
|
|
68
|
+
fs.writeFileSync(filePath, newContent, 'utf8');
|
|
69
|
+
return `✓ Edit applied to ${input.path} (whitespace-normalised match)`;
|
|
70
|
+
}
|
|
71
|
+
// ── Attempt 3: fuzzy — ignore all internal whitespace differences ──────────
|
|
72
|
+
const collapse = (s) => s.replace(/[ \t]+/g, ' ').replace(/\n\s*/g, '\n').trim();
|
|
73
|
+
const escaped = collapse(normalFind).replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/ /g, '\\s+').replace(/\n/g, '\\s*\n\\s*');
|
|
74
|
+
const fuzzyRegex = new RegExp(escaped, 'm');
|
|
75
|
+
if (fuzzyRegex.test(normalContent)) {
|
|
76
|
+
const newContent = normalContent.replace(fuzzyRegex, normalReplace.trim());
|
|
77
|
+
fs.writeFileSync(filePath, newContent, 'utf8');
|
|
78
|
+
return `✓ Edit applied to ${input.path} (fuzzy whitespace match)`;
|
|
79
|
+
}
|
|
80
|
+
// ── Check for multiple matches (ambiguous edit) ────────────────────────────
|
|
81
|
+
const occurrences = normalContent.split(normalFind.split('\n')[0]).length - 1;
|
|
82
|
+
// Nothing found — return helpful context
|
|
83
|
+
const lines = normalContent.split('\n');
|
|
84
|
+
const preview = lines.slice(0, 60).map((l, i) => `${i + 1}: ${l}`).join('\n');
|
|
85
|
+
return [
|
|
86
|
+
`Error: Could not find the specified block in ${input.path}.`,
|
|
87
|
+
occurrences > 1 ? `Note: The first line of your find block appears ${occurrences} times — provide more context to disambiguate.` : '',
|
|
88
|
+
``,
|
|
89
|
+
`The find block you provided:`,
|
|
90
|
+
`---`,
|
|
91
|
+
normalFind.split('\n').slice(0, 10).join('\n'),
|
|
92
|
+
`---`,
|
|
93
|
+
``,
|
|
94
|
+
`File starts with (first 60 lines):`,
|
|
95
|
+
preview,
|
|
96
|
+
].filter(Boolean).join('\n');
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=edit-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-file.js","sourceRoot":"","sources":["../../src/tools/edit-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../providers/types.js';
|
|
2
|
+
export interface EmailInput {
|
|
3
|
+
action: 'send' | 'read' | 'unread_count';
|
|
4
|
+
to?: string;
|
|
5
|
+
subject?: string;
|
|
6
|
+
body?: string;
|
|
7
|
+
cc?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const EMAIL_DEFINITION: ToolDefinition;
|
|
11
|
+
export declare function emailTool(input: EmailInput): Promise<string>;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.EMAIL_DEFINITION = void 0;
|
|
37
|
+
exports.emailTool = emailTool;
|
|
38
|
+
const child_process_1 = require("child_process");
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
exports.EMAIL_DEFINITION = {
|
|
43
|
+
name: 'email',
|
|
44
|
+
description: 'Send and read emails. Uses system mail (sendmail/msmtp) or configured SMTP. ' +
|
|
45
|
+
'For reading, uses local mailbox. Configure ~/.msmtprc or ~/.aura/email.json for SMTP.',
|
|
46
|
+
parameters: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
action: { type: 'string', description: 'Action: send, read, unread_count' },
|
|
50
|
+
to: { type: 'string', description: 'Recipient email (for send)' },
|
|
51
|
+
subject: { type: 'string', description: 'Email subject (for send)' },
|
|
52
|
+
body: { type: 'string', description: 'Email body (for send)' },
|
|
53
|
+
cc: { type: 'string', description: 'CC recipients (for send)' },
|
|
54
|
+
limit: { type: 'number', description: 'Max emails to read (default: 10)' },
|
|
55
|
+
},
|
|
56
|
+
required: ['action'],
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
function getConfig() {
|
|
60
|
+
const configPath = path.join(os.homedir(), '.aura', 'email.json');
|
|
61
|
+
if (!fs.existsSync(configPath))
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function sendViaCommand(to, subject, body) {
|
|
71
|
+
// Try msmtp
|
|
72
|
+
try {
|
|
73
|
+
(0, child_process_1.execSync)('which msmtp', { stdio: 'pipe' });
|
|
74
|
+
const emailContent = `To: ${to}\nSubject: ${subject}\nContent-Type: text/plain; charset=UTF-8\n\n${body}`;
|
|
75
|
+
(0, child_process_1.execSync)(`echo ${JSON.stringify(emailContent)} | msmtp ${to}`, { stdio: 'pipe' });
|
|
76
|
+
return `Email sent to ${to} via msmtp: "${subject}"`;
|
|
77
|
+
}
|
|
78
|
+
catch { /* not found */ }
|
|
79
|
+
// Try sendmail
|
|
80
|
+
try {
|
|
81
|
+
(0, child_process_1.execSync)('which sendmail', { stdio: 'pipe' });
|
|
82
|
+
const emailContent = `To: ${to}\nSubject: ${subject}\nContent-Type: text/plain; charset=UTF-8\n\n${body}`;
|
|
83
|
+
(0, child_process_1.execSync)(`echo ${JSON.stringify(emailContent)} | sendmail -t`, { stdio: 'pipe' });
|
|
84
|
+
return `Email sent to ${to} via sendmail: "${subject}"`;
|
|
85
|
+
}
|
|
86
|
+
catch { /* not found */ }
|
|
87
|
+
// Try mail (mailutils)
|
|
88
|
+
try {
|
|
89
|
+
(0, child_process_1.execSync)('which mail', { stdio: 'pipe' });
|
|
90
|
+
(0, child_process_1.execSync)(`echo ${JSON.stringify(body)} | mail -s ${JSON.stringify(subject)} ${to}`, { stdio: 'pipe' });
|
|
91
|
+
return `Email sent to ${to} via mail: "${subject}"`;
|
|
92
|
+
}
|
|
93
|
+
catch { /* not found */ }
|
|
94
|
+
return 'Error: No mail command found. Install msmtp, sendmail, or mailutils. Or configure ~/.aura/email.json';
|
|
95
|
+
}
|
|
96
|
+
function readMail(limit) {
|
|
97
|
+
// Try reading from local mailbox
|
|
98
|
+
const mailPaths = [
|
|
99
|
+
path.join(os.homedir(), 'Mail', 'inbox'),
|
|
100
|
+
'/var/mail/' + os.userInfo().username,
|
|
101
|
+
path.join(os.homedir(), '.mail'),
|
|
102
|
+
];
|
|
103
|
+
for (const p of mailPaths) {
|
|
104
|
+
if (fs.existsSync(p)) {
|
|
105
|
+
try {
|
|
106
|
+
const content = fs.readFileSync(p, 'utf8');
|
|
107
|
+
if (!content.trim())
|
|
108
|
+
return 'Inbox is empty.';
|
|
109
|
+
// Split by mail separators
|
|
110
|
+
const emails = content.split(/^(?=From )/m).filter(e => e.trim());
|
|
111
|
+
const recent = emails.slice(-limit);
|
|
112
|
+
return `Found ${emails.length} emails (showing last ${recent.length}):\n\n${recent.join('\n---\n')}`;
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
return `Error reading mailbox: ${e?.message}`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return 'No local mailbox found. Configure ~/.aura/email.json or use a mail client.';
|
|
120
|
+
}
|
|
121
|
+
function unreadCount() {
|
|
122
|
+
try {
|
|
123
|
+
// Try notmuch
|
|
124
|
+
(0, child_process_1.execSync)('which notmuch', { stdio: 'pipe' });
|
|
125
|
+
const count = (0, child_process_1.execSync)('notmuch count tag:unread', { encoding: 'utf8' }).trim();
|
|
126
|
+
return `Unread emails: ${count}`;
|
|
127
|
+
}
|
|
128
|
+
catch { /* not found */ }
|
|
129
|
+
// Fallback to reading
|
|
130
|
+
return 'Cannot count unread emails. Install notmuch or configure mail client.';
|
|
131
|
+
}
|
|
132
|
+
async function emailTool(input) {
|
|
133
|
+
switch (input.action) {
|
|
134
|
+
case 'send': {
|
|
135
|
+
if (!input.to)
|
|
136
|
+
return 'Error: to is required for send';
|
|
137
|
+
if (!input.subject)
|
|
138
|
+
return 'Error: subject is required for send';
|
|
139
|
+
if (!input.body)
|
|
140
|
+
return 'Error: body is required for send';
|
|
141
|
+
return sendViaCommand(input.to, input.subject, input.body);
|
|
142
|
+
}
|
|
143
|
+
case 'read': {
|
|
144
|
+
return readMail(input.limit ?? 10);
|
|
145
|
+
}
|
|
146
|
+
case 'unread_count': {
|
|
147
|
+
return unreadCount();
|
|
148
|
+
}
|
|
149
|
+
default:
|
|
150
|
+
return `Error: Unknown email action: ${input.action}`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/tools/email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { gitStatus, gitDiff } from './tools.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gitDiff = exports.gitStatus = void 0;
|
|
4
|
+
var tools_js_1 = require("./tools.js");
|
|
5
|
+
Object.defineProperty(exports, "gitStatus", { enumerable: true, get: function () { return tools_js_1.gitStatus; } });
|
|
6
|
+
Object.defineProperty(exports, "gitDiff", { enumerable: true, get: function () { return tools_js_1.gitDiff; } });
|
|
7
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":";;;AAAA,uCAAgD;AAAvC,qGAAA,SAAS,OAAA;AAAE,mGAAA,OAAO,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../providers/types.js';
|
|
2
|
+
export interface HttpRequestInput {
|
|
3
|
+
url: string;
|
|
4
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD';
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
body?: string;
|
|
7
|
+
json?: unknown;
|
|
8
|
+
max_chars?: number;
|
|
9
|
+
timeout_ms?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare const HTTP_REQUEST_DEFINITION: ToolDefinition;
|
|
12
|
+
export declare function httpRequest(input: HttpRequestInput): Promise<string>;
|