aiden-runtime 4.0.0 → 4.0.2
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/README.md +16 -14
- package/dist/cli/v4/aidenCLI.js +92 -9
- package/dist/cli/v4/chatSession.js +16 -0
- package/dist/cli/v4/commands/index.js +4 -1
- package/dist/cli/v4/commands/setup.js +34 -0
- package/dist/cli/v4/display.js +3 -1
- package/dist/cli/v4/setupWizard.js +466 -232
- package/dist/core/permissionSystem.js +2 -2
- package/dist/core/toolRegistry.js +2 -2
- package/dist/core/v4/firstRun/providerDetection.js +287 -0
- package/dist/core/version.js +1 -1
- package/dist/providers/v4/nullAdapter.js +58 -0
- package/package.json +14 -6
|
@@ -53,7 +53,7 @@ exports.permissionSystem = void 0;
|
|
|
53
53
|
const fs = __importStar(require("fs"));
|
|
54
54
|
const path = __importStar(require("path"));
|
|
55
55
|
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
56
|
-
const minimatch_1 =
|
|
56
|
+
const minimatch_1 = require("minimatch");
|
|
57
57
|
// ── PermissionSystem ──────────────────────────────────────────
|
|
58
58
|
class PermissionSystem {
|
|
59
59
|
constructor() {
|
|
@@ -136,7 +136,7 @@ class PermissionSystem {
|
|
|
136
136
|
if (!p.includes('*') && !p.includes('?') && !p.includes('[')) {
|
|
137
137
|
return normalized.toLowerCase().startsWith(p.toLowerCase().replace(/\s*$/, ''));
|
|
138
138
|
}
|
|
139
|
-
return (0, minimatch_1.
|
|
139
|
+
return (0, minimatch_1.minimatch)(normalized, p, { dot: true, matchBase: true, nocase: true });
|
|
140
140
|
});
|
|
141
141
|
}
|
|
142
142
|
// ── Audit ────────────────────────────────────────────────────
|
|
@@ -68,7 +68,7 @@ const paths_1 = require("./paths");
|
|
|
68
68
|
const computerControl_1 = require("./computerControl");
|
|
69
69
|
const webSearch_1 = require("./webSearch");
|
|
70
70
|
const conversationMemory_1 = require("./conversationMemory");
|
|
71
|
-
const minimatch_1 =
|
|
71
|
+
const minimatch_1 = require("minimatch");
|
|
72
72
|
const morningBriefing_1 = require("./morningBriefing");
|
|
73
73
|
const marketDataTool_1 = require("./tools/marketDataTool");
|
|
74
74
|
const companyFilingsTool_1 = require("./tools/companyFilingsTool");
|
|
@@ -124,7 +124,7 @@ const DENIED_PATHS = [
|
|
|
124
124
|
];
|
|
125
125
|
function isPathDenied(filePath) {
|
|
126
126
|
const normalized = normalizeFilePath(filePath);
|
|
127
|
-
return DENIED_PATHS.some(pattern => (0, minimatch_1.
|
|
127
|
+
return DENIED_PATHS.some(pattern => (0, minimatch_1.minimatch)(normalized, pattern, { dot: true }));
|
|
128
128
|
}
|
|
129
129
|
// ── Command deny rules ────────────────────────────────────────
|
|
130
130
|
const DENIED_COMMANDS = [
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2026 Shiva Deore (Taracod).
|
|
4
|
+
* Licensed under AGPL-3.0. See LICENSE for details.
|
|
5
|
+
*
|
|
6
|
+
* Aiden — local-first agent.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* core/v4/firstRun/providerDetection.ts — Aiden v4.0.2 (Phase 30.2)
|
|
10
|
+
*
|
|
11
|
+
* Fast (< 100 ms) check at boot: does the user have ANY working
|
|
12
|
+
* provider configured? Drives the "auto-launch setup wizard if not"
|
|
13
|
+
* behaviour in cli/v4/aidenCLI.ts and the "model not configured"
|
|
14
|
+
* fallback in the boot card.
|
|
15
|
+
*
|
|
16
|
+
* Three signals are inspected, all local — no real API calls:
|
|
17
|
+
*
|
|
18
|
+
* 1. Env vars — process.env keys matching any of the wizard's
|
|
19
|
+
* `PROVIDERS[].envVar` entries. (Wizard-managed
|
|
20
|
+
* `.env` is loaded into process.env upstream by
|
|
21
|
+
* `loadAidenEnvFile`, so this catches both shell
|
|
22
|
+
* env and Aiden's persisted .env.)
|
|
23
|
+
*
|
|
24
|
+
* 2. OAuth tokens — `<paths.root>/auth/<provider>.json`. We treat
|
|
25
|
+
* the file's presence as "credentials available"
|
|
26
|
+
* — actual decrypt + expiry happens later in
|
|
27
|
+
* `runtimeResolver` and is reported via plugin
|
|
28
|
+
* boot-card status. Avoids paying scrypt + AES
|
|
29
|
+
* cost on every boot just to gate the wizard.
|
|
30
|
+
*
|
|
31
|
+
* 3. Ollama — TCP probe of `http://localhost:11434/api/tags`
|
|
32
|
+
* with a HARD 80 ms abort. Non-fatal on timeout
|
|
33
|
+
* so a slow loopback doesn't slow boot.
|
|
34
|
+
*
|
|
35
|
+
* Returns a `ProviderDetection` snapshot the caller can consult to
|
|
36
|
+
* decide whether to launch the wizard. The shape is intentionally
|
|
37
|
+
* descriptive (lists, not just a boolean) so smoke tests and
|
|
38
|
+
* `aiden doctor` can render the why.
|
|
39
|
+
*/
|
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.detectAvailableProviders = detectAvailableProviders;
|
|
45
|
+
exports.summarizeDetection = summarizeDetection;
|
|
46
|
+
const node_fs_1 = require("node:fs");
|
|
47
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
48
|
+
const setupWizard_1 = require("../../../cli/v4/setupWizard");
|
|
49
|
+
/**
|
|
50
|
+
* Walk `PROVIDERS` and return env-var names whose value is set + non-empty.
|
|
51
|
+
* Includes the multi-slot Groq fallback vars so a user with `GROQ_API_KEY_2`
|
|
52
|
+
* but no primary still counts as configured.
|
|
53
|
+
*/
|
|
54
|
+
function detectEnvVars(env) {
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
const out = [];
|
|
57
|
+
const consider = (name) => {
|
|
58
|
+
if (!name)
|
|
59
|
+
return;
|
|
60
|
+
if (seen.has(name))
|
|
61
|
+
return;
|
|
62
|
+
const val = env[name];
|
|
63
|
+
if (typeof val === 'string' && val.trim().length > 0) {
|
|
64
|
+
seen.add(name);
|
|
65
|
+
out.push(name);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
for (const p of setupWizard_1.PROVIDERS)
|
|
69
|
+
consider(p.envVar);
|
|
70
|
+
// Multi-slot Groq fallbacks live in core/v4/providerFallback.ts. Keep
|
|
71
|
+
// this list local so detection has zero deep imports off the boot
|
|
72
|
+
// path; the fallback module is heavy.
|
|
73
|
+
for (const extra of [
|
|
74
|
+
'GROQ_API_KEY_2',
|
|
75
|
+
'GROQ_API_KEY_3',
|
|
76
|
+
'GROQ_API_KEY_4',
|
|
77
|
+
'TOGETHER_API_KEY',
|
|
78
|
+
]) {
|
|
79
|
+
consider(extra);
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read `<paths.root>/auth/` and return provider ids whose `.json`
|
|
85
|
+
* file exists. ENOENT on the directory is treated as "no tokens".
|
|
86
|
+
*/
|
|
87
|
+
async function detectOAuthTokens(paths) {
|
|
88
|
+
const dir = node_path_1.default.join(paths.root, 'auth');
|
|
89
|
+
let entries;
|
|
90
|
+
try {
|
|
91
|
+
entries = await node_fs_1.promises.readdir(dir);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const e of entries) {
|
|
98
|
+
if (!e.endsWith('.json'))
|
|
99
|
+
continue;
|
|
100
|
+
const id = e.replace(/\.json$/, '');
|
|
101
|
+
// tokenStore writes one JSON per provider id; the file itself is
|
|
102
|
+
// always non-empty when it exists. Skip the size check — the
|
|
103
|
+
// resolver will surface a corrupt file with a clear error.
|
|
104
|
+
out.push(id);
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Quick local probe of an Ollama daemon. Hard-aborts at `timeoutMs`
|
|
110
|
+
* so a slow loopback (e.g. WSL2 mirror mode warming up) never delays
|
|
111
|
+
* boot past the budget.
|
|
112
|
+
*/
|
|
113
|
+
async function probeOllamaQuick(opts) {
|
|
114
|
+
const ctrl = new AbortController();
|
|
115
|
+
const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs);
|
|
116
|
+
try {
|
|
117
|
+
const res = await opts.fetchImpl('http://localhost:11434/api/tags', { signal: ctrl.signal });
|
|
118
|
+
return res.ok;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Cheap regex parse of `model.provider:` / `model.modelId:` AND the
|
|
129
|
+
* `providers:` section from config.yaml. Avoids pulling in js-yaml on
|
|
130
|
+
* the boot hot-path. Tolerates quoted values and inline comments.
|
|
131
|
+
* Returns nulls / empty list when the file is missing.
|
|
132
|
+
*
|
|
133
|
+
* The `providers:` walker mirrors `cli/v4/setupWizard.isFreshInstall`
|
|
134
|
+
* so a config.yaml that only carries inline `providers.foo.apiKey`
|
|
135
|
+
* (no env var) still counts as "the user has configured something" —
|
|
136
|
+
* the moat-boot test suite relies on this fixture shape.
|
|
137
|
+
*/
|
|
138
|
+
async function readConfigProviders(configYaml) {
|
|
139
|
+
let text;
|
|
140
|
+
try {
|
|
141
|
+
text = await node_fs_1.promises.readFile(configYaml, 'utf8');
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return { provider: null, model: null, configuredProviders: [] };
|
|
145
|
+
}
|
|
146
|
+
const lines = text.split(/\r?\n/);
|
|
147
|
+
let inModel = false;
|
|
148
|
+
let inProviders = false;
|
|
149
|
+
let provider = null;
|
|
150
|
+
let model = null;
|
|
151
|
+
// Two-line lookahead would let us match `apiKey: ...` under each
|
|
152
|
+
// provider id; instead we keep the most recently seen provider id
|
|
153
|
+
// and stamp it on `configuredProviders` when its child field is
|
|
154
|
+
// populated. Idempotent within a single file.
|
|
155
|
+
let currentProviderId = null;
|
|
156
|
+
const seenProviders = [];
|
|
157
|
+
for (const raw of lines) {
|
|
158
|
+
const line = raw.replace(/#.*$/, '').replace(/\s+$/, '');
|
|
159
|
+
if (/^model\s*:\s*$/.test(line)) {
|
|
160
|
+
inModel = true;
|
|
161
|
+
inProviders = false;
|
|
162
|
+
currentProviderId = null;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (/^providers\s*:\s*$/.test(line)) {
|
|
166
|
+
inProviders = true;
|
|
167
|
+
inModel = false;
|
|
168
|
+
currentProviderId = null;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
// Top-level non-indented key ends both blocks.
|
|
172
|
+
if (/^\S/.test(line) && line.length > 0) {
|
|
173
|
+
inModel = false;
|
|
174
|
+
inProviders = false;
|
|
175
|
+
currentProviderId = null;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (inModel) {
|
|
179
|
+
const provM = line.match(/^\s+provider\s*:\s*['"]?([^'"\s]+)['"]?\s*$/);
|
|
180
|
+
if (provM)
|
|
181
|
+
provider = provM[1];
|
|
182
|
+
const modM = line.match(/^\s+modelId\s*:\s*['"]?([^'"\s]+)['"]?\s*$/);
|
|
183
|
+
if (modM)
|
|
184
|
+
model = modM[1];
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (inProviders) {
|
|
188
|
+
// 2-space indented `<id>:` opens a provider entry.
|
|
189
|
+
const idM = line.match(/^ ([A-Za-z0-9_.-]+)\s*:\s*$/);
|
|
190
|
+
if (idM) {
|
|
191
|
+
currentProviderId = idM[1];
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// 4-space indented `apiKey:` / `baseUrl:` flags it as configured.
|
|
195
|
+
if (currentProviderId &&
|
|
196
|
+
/^ (apiKey|baseUrl|auth)\s*:\s*\S/.test(line)) {
|
|
197
|
+
if (!seenProviders.includes(currentProviderId)) {
|
|
198
|
+
seenProviders.push(currentProviderId);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return { provider, model, configuredProviders: seenProviders };
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Map a config provider id to the env-var name(s) and/or OAuth provider
|
|
207
|
+
* id that would represent valid credentials for it. Drives the
|
|
208
|
+
* `configuredProviderHasCredentials` flag.
|
|
209
|
+
*/
|
|
210
|
+
function configProviderCredentialKeys(providerId) {
|
|
211
|
+
const entry = setupWizard_1.PROVIDERS.find((p) => p.id === providerId);
|
|
212
|
+
const envVars = [];
|
|
213
|
+
const oauthIds = [];
|
|
214
|
+
if (entry?.envVar)
|
|
215
|
+
envVars.push(entry.envVar);
|
|
216
|
+
// Pro/oauth providers store tokens under their provider id.
|
|
217
|
+
if (entry?.kind === 'pro' || entry?.kind === 'oauth') {
|
|
218
|
+
oauthIds.push(providerId);
|
|
219
|
+
}
|
|
220
|
+
// Ollama needs no credentials; mirror the env-var-less local-key path.
|
|
221
|
+
if (entry?.kind === 'local') {
|
|
222
|
+
envVars.push('__OLLAMA_REACHABLE__'); // sentinel handled by caller
|
|
223
|
+
}
|
|
224
|
+
return { envVars, oauthIds };
|
|
225
|
+
}
|
|
226
|
+
async function detectAvailableProviders(opts) {
|
|
227
|
+
const env = opts.env ?? process.env;
|
|
228
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
229
|
+
const timeoutMs = opts.ollamaTimeoutMs ?? 80;
|
|
230
|
+
// Run the four independent probes in parallel — Ollama is the only
|
|
231
|
+
// one that can take real wall time, but capping it at 80 ms keeps
|
|
232
|
+
// total detection cost under the 100 ms budget on every realistic host.
|
|
233
|
+
const [envVars, oauthTokens, ollamaReachable, cfg] = await Promise.all([
|
|
234
|
+
Promise.resolve(detectEnvVars(env)),
|
|
235
|
+
detectOAuthTokens(opts.paths),
|
|
236
|
+
opts.skipOllamaProbe
|
|
237
|
+
? Promise.resolve(false)
|
|
238
|
+
: probeOllamaQuick({ fetchImpl, timeoutMs }),
|
|
239
|
+
readConfigProviders(opts.paths.configYaml),
|
|
240
|
+
]);
|
|
241
|
+
const hasAnyProvider = envVars.length > 0 ||
|
|
242
|
+
oauthTokens.length > 0 ||
|
|
243
|
+
ollamaReachable ||
|
|
244
|
+
cfg.configuredProviders.length > 0;
|
|
245
|
+
let configuredProviderHasCredentials = false;
|
|
246
|
+
if (cfg.provider) {
|
|
247
|
+
const want = configProviderCredentialKeys(cfg.provider);
|
|
248
|
+
const envHit = want.envVars.some((v) => v === '__OLLAMA_REACHABLE__' ? ollamaReachable : envVars.includes(v));
|
|
249
|
+
const oauthHit = want.oauthIds.some((id) => oauthTokens.includes(id));
|
|
250
|
+
// Inline `providers.<id>.apiKey` in config.yaml is also a valid
|
|
251
|
+
// credential source — it's what the moat-boot fixtures rely on
|
|
252
|
+
// and what users get when they hand-edit config.yaml.
|
|
253
|
+
const inlineHit = cfg.configuredProviders.includes(cfg.provider);
|
|
254
|
+
configuredProviderHasCredentials = envHit || oauthHit || inlineHit;
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
hasAnyProvider,
|
|
258
|
+
envVars,
|
|
259
|
+
oauthTokens,
|
|
260
|
+
ollamaReachable,
|
|
261
|
+
configProvider: cfg.provider,
|
|
262
|
+
configModel: cfg.model,
|
|
263
|
+
configuredProviders: cfg.configuredProviders,
|
|
264
|
+
configuredProviderHasCredentials,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Format a single-line summary suitable for the boot UX preamble.
|
|
269
|
+
* Public so the wizard auto-trigger path can mirror it and so smoke
|
|
270
|
+
* tests can assert on stable text.
|
|
271
|
+
*/
|
|
272
|
+
function summarizeDetection(d) {
|
|
273
|
+
if (d.hasAnyProvider) {
|
|
274
|
+
const parts = [];
|
|
275
|
+
if (d.envVars.length > 0)
|
|
276
|
+
parts.push(`env: ${d.envVars.length}`);
|
|
277
|
+
if (d.oauthTokens.length > 0)
|
|
278
|
+
parts.push(`oauth: ${d.oauthTokens.length}`);
|
|
279
|
+
if (d.ollamaReachable)
|
|
280
|
+
parts.push('ollama');
|
|
281
|
+
if (d.configuredProviders.length > 0) {
|
|
282
|
+
parts.push(`config: ${d.configuredProviders.length}`);
|
|
283
|
+
}
|
|
284
|
+
return `Providers detected — ${parts.join(', ')}.`;
|
|
285
|
+
}
|
|
286
|
+
return 'No AI provider configured yet.';
|
|
287
|
+
}
|
package/dist/core/version.js
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2026 Shiva Deore (Taracod).
|
|
4
|
+
* Licensed under AGPL-3.0. See LICENSE for details.
|
|
5
|
+
*
|
|
6
|
+
* Aiden — local-first agent.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* providers/v4/nullAdapter.ts — Aiden v4.0.2 (Phase 30.2.1)
|
|
10
|
+
*
|
|
11
|
+
* A `ProviderAdapter` that throws a typed `NotConfiguredError` on every
|
|
12
|
+
* call. Used when the setup wizard returns `status: 'skipped'` so the
|
|
13
|
+
* REPL can boot in "explore mode" — slash commands, skill listing,
|
|
14
|
+
* /providers etc. all work, but any chat attempt is intercepted by
|
|
15
|
+
* `ChatSession.runAgentTurn` BEFORE reaching the agent loop and
|
|
16
|
+
* surfaces a friendly "no provider configured" message.
|
|
17
|
+
*
|
|
18
|
+
* Why a stub instead of nullable types: every wiring downstream of
|
|
19
|
+
* the resolver assumes a non-null `provider` field on AidenAgent /
|
|
20
|
+
* ChatSession. Threading optionality through 6 layers of code would
|
|
21
|
+
* be a much larger blast radius for v4.0.2's UX-only patch. The stub
|
|
22
|
+
* is one file, one error type, fully typed.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.NullAdapter = exports.NotConfiguredError = void 0;
|
|
26
|
+
/**
|
|
27
|
+
* Sentinel error class. ChatSession checks `instanceof NotConfiguredError`
|
|
28
|
+
* to decide whether to print the friendly message or fall through to
|
|
29
|
+
* the generic adapter-error path.
|
|
30
|
+
*/
|
|
31
|
+
class NotConfiguredError extends Error {
|
|
32
|
+
constructor(msg = 'No AI provider configured yet.') {
|
|
33
|
+
super(msg);
|
|
34
|
+
this.notConfigured = true;
|
|
35
|
+
this.name = 'NotConfiguredError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.NotConfiguredError = NotConfiguredError;
|
|
39
|
+
/**
|
|
40
|
+
* Drop-in stub adapter. Reports `chat_completions` so the rest of the
|
|
41
|
+
* agent loop's provider-mode dispatch finds the same shape it expects;
|
|
42
|
+
* the actual `call()` / `callStream()` paths never run because
|
|
43
|
+
* `ChatSession` short-circuits on the explore-mode flag.
|
|
44
|
+
*/
|
|
45
|
+
class NullAdapter {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.apiMode = 'chat_completions';
|
|
48
|
+
}
|
|
49
|
+
async call(_input) {
|
|
50
|
+
throw new NotConfiguredError('No AI provider configured yet. Run /setup to configure a provider, ' +
|
|
51
|
+
'or set an API key environment variable (e.g. GROQ_API_KEY).');
|
|
52
|
+
}
|
|
53
|
+
async *callStream(_input) {
|
|
54
|
+
throw new NotConfiguredError('No AI provider configured yet. Run /setup to configure a provider, ' +
|
|
55
|
+
'or set an API key environment variable (e.g. GROQ_API_KEY).');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.NullAdapter = NullAdapter;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiden-runtime",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
"dev": "electron electron/main.js",
|
|
62
62
|
"build": "tsc --outDir dist && npm run build:cli && npm run build:api",
|
|
63
63
|
"prebuild:cli": "node scripts/inject-version.js",
|
|
64
|
-
"build:cli": "esbuild cli/aiden.ts --bundle --platform=node --target=node18 --outfile=dist-bundle/cli.js --external:electron --external:cpu-features --external:ssh2 --external:bcrypt --external:playwright --external:playwright-core",
|
|
64
|
+
"build:cli": "esbuild cli/aiden.ts --bundle --platform=node --target=node18 --outfile=dist-bundle/cli.js --external:electron --external:cpu-features --external:ssh2 --external:bcrypt --external:playwright --external:playwright-core --external:@aws-sdk/client-s3",
|
|
65
65
|
"prebuild:api": "node scripts/inject-version.js",
|
|
66
|
-
"build:api": "esbuild api/entry.ts --bundle --platform=node --target=node18 --outfile=dist-bundle/index.js --external:electron --external:cpu-features --external:ssh2 --external:bcrypt --external:playwright --external:playwright-core",
|
|
66
|
+
"build:api": "esbuild api/entry.ts --bundle --platform=node --target=node18 --outfile=dist-bundle/index.js --external:electron --external:cpu-features --external:ssh2 --external:bcrypt --external:playwright --external:playwright-core --external:@aws-sdk/client-s3",
|
|
67
67
|
"prepublishOnly": "npm run typecheck && npm run build",
|
|
68
68
|
"typecheck": "tsc --noEmit",
|
|
69
69
|
"publish:beta": "npm publish --tag beta",
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
"@types/twilio": "^3.19.2",
|
|
234
234
|
"@types/ws": "^8.18.1",
|
|
235
235
|
"archiver": "^7.0.1",
|
|
236
|
-
"axios": "^1.
|
|
236
|
+
"axios": "^1.15.2",
|
|
237
237
|
"bcrypt": "^6.0.0",
|
|
238
238
|
"better-sqlite3": "^12.9.0",
|
|
239
239
|
"blessed": "^0.1.81",
|
|
@@ -255,7 +255,7 @@
|
|
|
255
255
|
"kleur": "^4.1.5",
|
|
256
256
|
"marked": "^15.0.12",
|
|
257
257
|
"marked-terminal": "^7.3.0",
|
|
258
|
-
"multer": "^1.
|
|
258
|
+
"multer": "^2.1.1",
|
|
259
259
|
"nodemailer": "^8.0.3",
|
|
260
260
|
"open": "^11.0.0",
|
|
261
261
|
"ora": "^9.3.0",
|
|
@@ -272,12 +272,20 @@
|
|
|
272
272
|
"whatsapp-web.js": "^1.26.0",
|
|
273
273
|
"ws": "^8.20.0"
|
|
274
274
|
},
|
|
275
|
+
"overrides": {
|
|
276
|
+
"basic-ftp": "^5.3.1",
|
|
277
|
+
"ip-address": "^10.1.1",
|
|
278
|
+
"semver": "^7.5.2",
|
|
279
|
+
"postcss": "^8.5.10",
|
|
280
|
+
"hono": "^4.12.16",
|
|
281
|
+
"minimatch": "^9.0.9"
|
|
282
|
+
},
|
|
275
283
|
"devDependencies": {
|
|
276
284
|
"@types/better-sqlite3": "^7.6.13",
|
|
277
285
|
"@types/blessed": "^0.1.27",
|
|
278
286
|
"@types/dockerode": "^4.0.1",
|
|
279
287
|
"@types/js-yaml": "^4.0.9",
|
|
280
|
-
"@types/multer": "^
|
|
288
|
+
"@types/multer": "^2.0.0",
|
|
281
289
|
"@types/node": "^25.3.0",
|
|
282
290
|
"@types/nodemailer": "^7.0.11",
|
|
283
291
|
"@types/pdf-parse": "^1.1.4",
|