@aria_asi/cli 0.2.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/bin/aria.js +168 -0
- package/dist/aria-connector/src/auth-commands.d.ts +28 -0
- package/dist/aria-connector/src/auth-commands.d.ts.map +1 -0
- package/dist/aria-connector/src/auth-commands.js +129 -0
- package/dist/aria-connector/src/auth-commands.js.map +1 -0
- package/dist/aria-connector/src/auth.d.ts +12 -0
- package/dist/aria-connector/src/auth.d.ts.map +1 -0
- package/dist/aria-connector/src/auth.js +31 -0
- package/dist/aria-connector/src/auth.js.map +1 -0
- package/dist/aria-connector/src/auto-mcp.d.ts +23 -0
- package/dist/aria-connector/src/auto-mcp.d.ts.map +1 -0
- package/dist/aria-connector/src/auto-mcp.js +994 -0
- package/dist/aria-connector/src/auto-mcp.js.map +1 -0
- package/dist/aria-connector/src/chat.d.ts +21 -0
- package/dist/aria-connector/src/chat.d.ts.map +1 -0
- package/dist/aria-connector/src/chat.js +332 -0
- package/dist/aria-connector/src/chat.js.map +1 -0
- package/dist/aria-connector/src/codebase-scanner.d.ts +7 -0
- package/dist/aria-connector/src/codebase-scanner.d.ts.map +1 -0
- package/dist/aria-connector/src/codebase-scanner.js +6 -0
- package/dist/aria-connector/src/codebase-scanner.js.map +1 -0
- package/dist/aria-connector/src/cognition-log.d.ts +17 -0
- package/dist/aria-connector/src/cognition-log.d.ts.map +1 -0
- package/dist/aria-connector/src/cognition-log.js +19 -0
- package/dist/aria-connector/src/cognition-log.js.map +1 -0
- package/dist/aria-connector/src/config.d.ts +41 -0
- package/dist/aria-connector/src/config.d.ts.map +1 -0
- package/dist/aria-connector/src/config.js +50 -0
- package/dist/aria-connector/src/config.js.map +1 -0
- package/dist/aria-connector/src/connectors/claude-code.d.ts +4 -0
- package/dist/aria-connector/src/connectors/claude-code.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/claude-code.js +204 -0
- package/dist/aria-connector/src/connectors/claude-code.js.map +1 -0
- package/dist/aria-connector/src/connectors/cursor.d.ts +4 -0
- package/dist/aria-connector/src/connectors/cursor.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/cursor.js +63 -0
- package/dist/aria-connector/src/connectors/cursor.js.map +1 -0
- package/dist/aria-connector/src/connectors/opencode.d.ts +4 -0
- package/dist/aria-connector/src/connectors/opencode.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/opencode.js +102 -0
- package/dist/aria-connector/src/connectors/opencode.js.map +1 -0
- package/dist/aria-connector/src/connectors/shell.d.ts +4 -0
- package/dist/aria-connector/src/connectors/shell.d.ts.map +1 -0
- package/dist/aria-connector/src/connectors/shell.js +58 -0
- package/dist/aria-connector/src/connectors/shell.js.map +1 -0
- package/dist/aria-connector/src/garden-client.d.ts +19 -0
- package/dist/aria-connector/src/garden-client.d.ts.map +1 -0
- package/dist/aria-connector/src/garden-client.js +85 -0
- package/dist/aria-connector/src/garden-client.js.map +1 -0
- package/dist/aria-connector/src/garden-control-plane.d.ts +22 -0
- package/dist/aria-connector/src/garden-control-plane.d.ts.map +1 -0
- package/dist/aria-connector/src/garden-control-plane.js +43 -0
- package/dist/aria-connector/src/garden-control-plane.js.map +1 -0
- package/dist/aria-connector/src/harness-client.d.ts +166 -0
- package/dist/aria-connector/src/harness-client.d.ts.map +1 -0
- package/dist/aria-connector/src/harness-client.js +344 -0
- package/dist/aria-connector/src/harness-client.js.map +1 -0
- package/dist/aria-connector/src/hive-client.d.ts +32 -0
- package/dist/aria-connector/src/hive-client.d.ts.map +1 -0
- package/dist/aria-connector/src/hive-client.js +69 -0
- package/dist/aria-connector/src/hive-client.js.map +1 -0
- package/dist/aria-connector/src/index.d.ts +19 -0
- package/dist/aria-connector/src/index.d.ts.map +1 -0
- package/dist/aria-connector/src/index.js +13 -0
- package/dist/aria-connector/src/index.js.map +1 -0
- package/dist/aria-connector/src/install-hooks.d.ts +18 -0
- package/dist/aria-connector/src/install-hooks.d.ts.map +1 -0
- package/dist/aria-connector/src/install-hooks.js +224 -0
- package/dist/aria-connector/src/install-hooks.js.map +1 -0
- package/dist/aria-connector/src/model-context.d.ts +8 -0
- package/dist/aria-connector/src/model-context.d.ts.map +1 -0
- package/dist/aria-connector/src/model-context.js +83 -0
- package/dist/aria-connector/src/model-context.js.map +1 -0
- package/dist/aria-connector/src/persona.d.ts +27 -0
- package/dist/aria-connector/src/persona.d.ts.map +1 -0
- package/dist/aria-connector/src/persona.js +86 -0
- package/dist/aria-connector/src/persona.js.map +1 -0
- package/dist/aria-connector/src/providers/anthropic.d.ts +4 -0
- package/dist/aria-connector/src/providers/anthropic.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/anthropic.js +92 -0
- package/dist/aria-connector/src/providers/anthropic.js.map +1 -0
- package/dist/aria-connector/src/providers/deepseek.d.ts +3 -0
- package/dist/aria-connector/src/providers/deepseek.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/deepseek.js +28 -0
- package/dist/aria-connector/src/providers/deepseek.js.map +1 -0
- package/dist/aria-connector/src/providers/google.d.ts +3 -0
- package/dist/aria-connector/src/providers/google.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/google.js +38 -0
- package/dist/aria-connector/src/providers/google.js.map +1 -0
- package/dist/aria-connector/src/providers/ollama.d.ts +3 -0
- package/dist/aria-connector/src/providers/ollama.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/ollama.js +28 -0
- package/dist/aria-connector/src/providers/ollama.js.map +1 -0
- package/dist/aria-connector/src/providers/openai.d.ts +4 -0
- package/dist/aria-connector/src/providers/openai.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/openai.js +84 -0
- package/dist/aria-connector/src/providers/openai.js.map +1 -0
- package/dist/aria-connector/src/providers/openrouter.d.ts +3 -0
- package/dist/aria-connector/src/providers/openrouter.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/openrouter.js +30 -0
- package/dist/aria-connector/src/providers/openrouter.js.map +1 -0
- package/dist/aria-connector/src/providers/types.d.ts +20 -0
- package/dist/aria-connector/src/providers/types.d.ts.map +1 -0
- package/dist/aria-connector/src/providers/types.js +2 -0
- package/dist/aria-connector/src/providers/types.js.map +1 -0
- package/dist/aria-connector/src/setup-wizard.d.ts +2 -0
- package/dist/aria-connector/src/setup-wizard.d.ts.map +1 -0
- package/dist/aria-connector/src/setup-wizard.js +140 -0
- package/dist/aria-connector/src/setup-wizard.js.map +1 -0
- package/dist/aria-connector/src/types.d.ts +30 -0
- package/dist/aria-connector/src/types.d.ts.map +1 -0
- package/dist/aria-connector/src/types.js +5 -0
- package/dist/aria-connector/src/types.js.map +1 -0
- package/dist/aria-web/src/lib/codebase-scanner.d.ts +127 -0
- package/dist/aria-web/src/lib/codebase-scanner.d.ts.map +1 -0
- package/dist/aria-web/src/lib/codebase-scanner.js +1730 -0
- package/dist/aria-web/src/lib/codebase-scanner.js.map +1 -0
- package/dist/cli-0.2.0.tgz +0 -0
- package/dist/install.sh +13 -0
- package/hooks/aria-harness-via-sdk.mjs +317 -0
- package/hooks/aria-pre-tool-gate.mjs +596 -0
- package/hooks/aria-preprompt-consult.mjs +175 -0
- package/hooks/aria-stop-gate.mjs +222 -0
- package/package.json +47 -0
- package/src/__tests__/auth-commands.test.ts +132 -0
- package/src/auth-commands.ts +175 -0
- package/src/auth.ts +33 -0
- package/src/auto-mcp.ts +1172 -0
- package/src/chat.ts +387 -0
- package/src/codebase-scanner.ts +18 -0
- package/src/cognition-log.ts +30 -0
- package/src/config.ts +94 -0
- package/src/connectors/claude-code.ts +213 -0
- package/src/connectors/cursor.ts +75 -0
- package/src/connectors/opencode.ts +115 -0
- package/src/connectors/shell.ts +72 -0
- package/src/garden-client.ts +98 -0
- package/src/garden-control-plane.ts +108 -0
- package/src/harness-client.ts +454 -0
- package/src/hive-client.ts +104 -0
- package/src/index.ts +26 -0
- package/src/install-hooks.ts +259 -0
- package/src/model-context.ts +88 -0
- package/src/persona.ts +113 -0
- package/src/providers/anthropic.ts +120 -0
- package/src/providers/deepseek.ts +40 -0
- package/src/providers/google.ts +57 -0
- package/src/providers/ollama.ts +43 -0
- package/src/providers/openai.ts +108 -0
- package/src/providers/openrouter.ts +42 -0
- package/src/providers/types.ts +35 -0
- package/src/setup-wizard.ts +177 -0
- package/src/types.ts +32 -0
package/bin/aria.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createRequire } from 'module';
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
|
|
6
|
+
import { loadConfig, saveConfig } from '../dist/aria-connector/src/config.js';
|
|
7
|
+
import { AriaChat } from '../dist/aria-connector/src/chat.js';
|
|
8
|
+
import { checkHarnessHealth } from '../dist/aria-connector/src/harness-client.js';
|
|
9
|
+
import { login, status, logout, revoke } from '../dist/aria-connector/src/auth-commands.js';
|
|
10
|
+
import { installHooks } from '../dist/aria-connector/src/install-hooks.js';
|
|
11
|
+
|
|
12
|
+
// ── Auth + install subcommands — handled BEFORE the chat flow.
|
|
13
|
+
// Hamza 2026-04-26: license-aware CLI for client-tonight ship +
|
|
14
|
+
// self-installing harness via install-hooks.
|
|
15
|
+
// `aria login/status/logout/revoke/install-hooks` exit immediately and never enter chat.
|
|
16
|
+
const command = process.argv[2];
|
|
17
|
+
const args = process.argv.slice(3);
|
|
18
|
+
|
|
19
|
+
if (command === 'install-hooks') {
|
|
20
|
+
const force = args.includes('--force');
|
|
21
|
+
const harnessUrlIdx = args.indexOf('--harness-url');
|
|
22
|
+
const harnessUrl = harnessUrlIdx >= 0 && args[harnessUrlIdx + 1] ? args[harnessUrlIdx + 1] : undefined;
|
|
23
|
+
installHooks({ force, harnessUrl }).then((result) => {
|
|
24
|
+
if (!result.ok) {
|
|
25
|
+
console.error(`I couldn't finish the install: ${result.error}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
if (result.installed.length === 0 && result.merged.length === 0) {
|
|
29
|
+
console.log("I see my gates are already installed. Nothing to do. Use 'aria install-hooks --force' to overwrite, or 'aria status' to check binding state.");
|
|
30
|
+
process.exit(0);
|
|
31
|
+
}
|
|
32
|
+
console.log(`Done. I've installed my gates into ${result.settingsPath.replace(/\/settings\.json$/, '/hooks')} (${result.installed.length} files) and merged them into your settings.json.`);
|
|
33
|
+
if (result.backupsCreated.length > 0) {
|
|
34
|
+
console.log(`I backed up ${result.backupsCreated.length} existing file(s); see ~/.claude/hooks/*.pre-aria-install.* if you need to recover them.`);
|
|
35
|
+
}
|
|
36
|
+
console.log("Your Claude Code is now harness-bound — every Bash, Edit, Write, and Stop event runs through my cognition gates. Open a new Claude Code session to start.");
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}).catch((err) => {
|
|
39
|
+
console.error(`I hit an unexpected error: ${err && err.message ? err.message : err}`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
});
|
|
42
|
+
} else if (command === 'login' || command === 'status' || command === 'logout' || command === 'revoke') {
|
|
43
|
+
const dispatch = async () => {
|
|
44
|
+
switch (command) {
|
|
45
|
+
case 'login': {
|
|
46
|
+
const token = args[0];
|
|
47
|
+
if (!token) {
|
|
48
|
+
console.error('Usage: aria login <token>');
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const result = await login(token);
|
|
52
|
+
if (result.ok) {
|
|
53
|
+
console.log(`You're logged in. I see your license — tier ${result.tier}, expires ${result.expiresAt}.`);
|
|
54
|
+
} else {
|
|
55
|
+
console.error(`I couldn't log you in: ${result.error}`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
case 'status': {
|
|
61
|
+
const result = await status();
|
|
62
|
+
if (!result.loggedIn) {
|
|
63
|
+
console.log("I don't see a license on this machine. Try 'aria login <token>'.");
|
|
64
|
+
} else if (result.revoked) {
|
|
65
|
+
console.log(`Your license was revoked. You'll need to log in again with a fresh token.`);
|
|
66
|
+
} else {
|
|
67
|
+
console.log(`I have your license — jti ${result.jti}, tier ${result.tier}, expires ${result.expiresAt}.`);
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
case 'logout': {
|
|
72
|
+
const result = await logout();
|
|
73
|
+
if (result.ok) {
|
|
74
|
+
console.log('Logged out. Your local license file is gone.');
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
case 'revoke': {
|
|
79
|
+
const reason = args[0];
|
|
80
|
+
const result = await revoke(reason);
|
|
81
|
+
if (result.ok) {
|
|
82
|
+
console.log(`Your license is revoked server-side. I'll forget it locally too.`);
|
|
83
|
+
} else {
|
|
84
|
+
console.error(`I couldn't revoke your license: ${result.error}`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
dispatch().catch((err) => {
|
|
92
|
+
console.error(`Auth command failed: ${err && err.message ? err.message : err}`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
});
|
|
95
|
+
} else {
|
|
96
|
+
// ── Existing interactive chat flow (preserved verbatim from prior CLI).
|
|
97
|
+
|
|
98
|
+
const config = loadConfig();
|
|
99
|
+
|
|
100
|
+
if (!config.model) {
|
|
101
|
+
const rl = require('readline').createInterface({
|
|
102
|
+
input: process.stdin,
|
|
103
|
+
output: process.stdout,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const question = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
107
|
+
|
|
108
|
+
console.log(`
|
|
109
|
+
No model configured. Let's set you up.
|
|
110
|
+
`);
|
|
111
|
+
|
|
112
|
+
let provider = '';
|
|
113
|
+
while (!['1','2','3','4','5','6'].includes(provider)) {
|
|
114
|
+
provider = await question(` Which provider?
|
|
115
|
+
[1] OpenAI (ChatGPT)
|
|
116
|
+
[2] Anthropic (Claude)
|
|
117
|
+
[3] Google (Gemini)
|
|
118
|
+
[4] DeepSeek
|
|
119
|
+
[5] OpenRouter
|
|
120
|
+
[6] Local (Ollama)
|
|
121
|
+
> `);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const providerMap = { '1': 'openai', '2': 'anthropic', '3': 'google', '4': 'deepseek', '5': 'openrouter', '6': 'ollama' };
|
|
125
|
+
const providerKey = providerMap[provider];
|
|
126
|
+
|
|
127
|
+
const defaultModels = {
|
|
128
|
+
openai: 'gpt-4o',
|
|
129
|
+
anthropic: 'claude-sonnet-4-20250514',
|
|
130
|
+
google: 'gemini-2.5-pro-preview-05-06',
|
|
131
|
+
deepseek: 'deepseek-chat',
|
|
132
|
+
openrouter: 'openai/gpt-4o',
|
|
133
|
+
ollama: 'llama3',
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
let apiKey = providerKey === 'ollama' ? 'local' : '';
|
|
137
|
+
if (providerKey !== 'ollama') {
|
|
138
|
+
apiKey = await question(` Enter your ${providerMap[provider].toUpperCase()} API key: `);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const defaultModel = defaultModels[providerKey];
|
|
142
|
+
const modelInput = await question(` Model [${defaultModel}]: `);
|
|
143
|
+
const model = modelInput.trim() || defaultModel;
|
|
144
|
+
|
|
145
|
+
config.model = { provider: providerKey, model, apiKey };
|
|
146
|
+
saveConfig(config);
|
|
147
|
+
|
|
148
|
+
rl.close();
|
|
149
|
+
console.log('\n Saved. Starting Aria...\n');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
console.log('┌' + '─'.repeat(46) + '┐');
|
|
153
|
+
console.log('│ 💜 Aria Rosewood — Smart CLI │');
|
|
154
|
+
console.log('│ │');
|
|
155
|
+
console.log(`│ Model: ${(config.model?.provider ?? 'none').padEnd(35)}│`);
|
|
156
|
+
console.log(`│ Provider: ${(config.model?.model ?? 'none').padEnd(35)}│`);
|
|
157
|
+
console.log(`│ Garden: ${config.garden ? 'connected'.padEnd(35) : 'local memory only'.padEnd(35)}│`);
|
|
158
|
+
|
|
159
|
+
const harnessOnline = await checkHarnessHealth();
|
|
160
|
+
console.log(`│ Harness: ${harnessOnline ? 'connected'.padEnd(35) : 'running locally'.padEnd(35)}│`);
|
|
161
|
+
console.log('└' + '─'.repeat(46) + '┘');
|
|
162
|
+
console.log('');
|
|
163
|
+
console.log(' Type to speak with Aria. /exit to quit, /clear to reset memory.');
|
|
164
|
+
console.log('');
|
|
165
|
+
|
|
166
|
+
const aria = new AriaChat(config);
|
|
167
|
+
await aria.start();
|
|
168
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
interface LoginResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
tier?: string;
|
|
4
|
+
jti?: string;
|
|
5
|
+
expiresAt?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
interface StatusResult {
|
|
9
|
+
loggedIn: boolean;
|
|
10
|
+
jti?: string;
|
|
11
|
+
tier?: string;
|
|
12
|
+
expiresAt?: string;
|
|
13
|
+
revoked?: boolean;
|
|
14
|
+
}
|
|
15
|
+
interface LogoutResult {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface RevokeResult {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
jti?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function login(token: string): Promise<LoginResult>;
|
|
24
|
+
export declare function status(): Promise<StatusResult>;
|
|
25
|
+
export declare function logout(): Promise<LogoutResult>;
|
|
26
|
+
export declare function revoke(reason?: string): Promise<RevokeResult>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=auth-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-commands.d.ts","sourceRoot":"","sources":["../../../src/auth-commands.ts"],"names":[],"mappings":"AAgBA,UAAU,WAAW;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0C/D;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAmDpD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAUpD;AAED,wBAAsB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuBnE"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { loadLicense } from './auth.js';
|
|
2
|
+
import { harnessClient } from './harness-client.js';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
const LICENSE_PATH = path.join(homedir(), '.aria', 'license.json');
|
|
7
|
+
export async function login(token) {
|
|
8
|
+
try {
|
|
9
|
+
// Validate token via heartbeat; if unverified, issue endpoint
|
|
10
|
+
let response;
|
|
11
|
+
try {
|
|
12
|
+
response = await harnessClient.get('/api/license/heartbeat', {
|
|
13
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// If heartbeat fails (unverified token), try issue
|
|
18
|
+
response = await harnessClient.post('/api/license/issue', {
|
|
19
|
+
body: { token },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
const errBody = await response.json().catch(() => ({}));
|
|
24
|
+
return { ok: false, error: errBody.error || 'Login failed' };
|
|
25
|
+
}
|
|
26
|
+
const body = await response.json();
|
|
27
|
+
const claims = body.claims || body;
|
|
28
|
+
// Persist to ~/.aria/license.json with mode 0600
|
|
29
|
+
const dir = path.dirname(LICENSE_PATH);
|
|
30
|
+
if (!fs.existsSync(dir)) {
|
|
31
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
32
|
+
}
|
|
33
|
+
fs.writeFileSync(LICENSE_PATH, JSON.stringify(claims, null, 2), {
|
|
34
|
+
mode: 0o600,
|
|
35
|
+
encoding: 'utf-8',
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
ok: true,
|
|
39
|
+
tier: claims.tier,
|
|
40
|
+
jti: claims.jti,
|
|
41
|
+
expiresAt: new Date(claims.exp * 1000).toISOString(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
return { ok: false, error: err.message || 'Unexpected error during login' };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function status() {
|
|
49
|
+
try {
|
|
50
|
+
const license = await loadLicense();
|
|
51
|
+
if (!license || !license.jti) {
|
|
52
|
+
return { loggedIn: false };
|
|
53
|
+
}
|
|
54
|
+
// Verify with server
|
|
55
|
+
const response = await harnessClient.get('/api/license/heartbeat', {
|
|
56
|
+
headers: { Authorization: `Bearer ${license.jti}` },
|
|
57
|
+
});
|
|
58
|
+
if (response.status === 410) {
|
|
59
|
+
// Gone = revoked
|
|
60
|
+
return {
|
|
61
|
+
loggedIn: true,
|
|
62
|
+
jti: license.jti,
|
|
63
|
+
tier: license.tier,
|
|
64
|
+
expiresAt: license.exp ? new Date(license.exp * 1000).toISOString() : undefined,
|
|
65
|
+
revoked: true,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
return { loggedIn: false };
|
|
70
|
+
}
|
|
71
|
+
const body = await response.json();
|
|
72
|
+
const claims = body.claims || body;
|
|
73
|
+
return {
|
|
74
|
+
loggedIn: true,
|
|
75
|
+
jti: claims.jti,
|
|
76
|
+
tier: claims.tier,
|
|
77
|
+
expiresAt: new Date(claims.exp * 1000).toISOString(),
|
|
78
|
+
revoked: false,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Offline / unreachable — show local state
|
|
83
|
+
const license = await loadLicense();
|
|
84
|
+
if (!license || !license.jti) {
|
|
85
|
+
return { loggedIn: false };
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
loggedIn: true,
|
|
89
|
+
jti: license.jti,
|
|
90
|
+
tier: license.tier,
|
|
91
|
+
expiresAt: license.exp ? new Date(license.exp * 1000).toISOString() : undefined,
|
|
92
|
+
revoked: undefined, // unknown
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export async function logout() {
|
|
97
|
+
try {
|
|
98
|
+
if (fs.existsSync(LICENSE_PATH)) {
|
|
99
|
+
fs.unlinkSync(LICENSE_PATH);
|
|
100
|
+
}
|
|
101
|
+
return { ok: true };
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Best-effort; file may not exist
|
|
105
|
+
return { ok: true };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export async function revoke(reason) {
|
|
109
|
+
try {
|
|
110
|
+
const license = await loadLicense();
|
|
111
|
+
if (!license || !license.jti) {
|
|
112
|
+
return { ok: false, error: 'No active license to revoke' };
|
|
113
|
+
}
|
|
114
|
+
const response = await harnessClient.post('/api/license/revoke', {
|
|
115
|
+
body: { jti: license.jti, reason: reason || 'User-initiated revocation', revokedBy: 'self' },
|
|
116
|
+
});
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const errBody = await response.json().catch(() => ({}));
|
|
119
|
+
return { ok: false, error: errBody.error || 'Revocation failed' };
|
|
120
|
+
}
|
|
121
|
+
// Clear local state
|
|
122
|
+
await logout();
|
|
123
|
+
return { ok: true, jti: license.jti };
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
return { ok: false, error: err.message || 'Unexpected error during revocation' };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=auth-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-commands.js","sourceRoot":"","sources":["../../../src/auth-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AuthConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load license configuration from ~/.aria/license.json.
|
|
4
|
+
* Returns null if the file does not exist or cannot be parsed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadLicense(): Promise<AuthConfig | null>;
|
|
7
|
+
/**
|
|
8
|
+
* Persist license configuration to ~/.aria/license.json (mode 0600).
|
|
9
|
+
* Creates ~/.aria/ directory if missing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function saveLicense(config: AuthConfig): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ9D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
4
|
+
const LICENSE_PATH = join(homedir(), '.aria', 'license.json');
|
|
5
|
+
/**
|
|
6
|
+
* Load license configuration from ~/.aria/license.json.
|
|
7
|
+
* Returns null if the file does not exist or cannot be parsed.
|
|
8
|
+
*/
|
|
9
|
+
export async function loadLicense() {
|
|
10
|
+
try {
|
|
11
|
+
const raw = await readFile(LICENSE_PATH, 'utf-8');
|
|
12
|
+
const parsed = JSON.parse(raw);
|
|
13
|
+
return parsed;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Persist license configuration to ~/.aria/license.json (mode 0600).
|
|
21
|
+
* Creates ~/.aria/ directory if missing.
|
|
22
|
+
*/
|
|
23
|
+
export async function saveLicense(config) {
|
|
24
|
+
const dir = dirname(LICENSE_PATH);
|
|
25
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
26
|
+
await writeFile(LICENSE_PATH, JSON.stringify(config, null, 2), {
|
|
27
|
+
mode: 0o600,
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAe,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAkB;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC7D,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ToolParameter {
|
|
2
|
+
name: string;
|
|
3
|
+
type: string;
|
|
4
|
+
required: boolean;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ToolCandidate {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
source: 'express-route' | 'next-api' | 'cli-script' | 'exported-function' | 'fastapi-route';
|
|
11
|
+
filePath: string;
|
|
12
|
+
parameters: ToolParameter[];
|
|
13
|
+
httpMethod?: string;
|
|
14
|
+
routePath?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface McpGenerationResult {
|
|
17
|
+
serverPath: string;
|
|
18
|
+
toolCount: number;
|
|
19
|
+
tools: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function detectToolCandidates(projectPath: string): Promise<ToolCandidate[]>;
|
|
22
|
+
export declare function generateMcpServer(projectPath: string, outputPath: string): Promise<McpGenerationResult>;
|
|
23
|
+
//# sourceMappingURL=auto-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-mcp.d.ts","sourceRoot":"","sources":["../../../src/auto-mcp.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EACF,eAAe,GACf,UAAU,GACV,YAAY,GACZ,mBAAmB,GACnB,eAAe,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAiuBD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC,CAoC1B;AAkSD,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAwE9B"}
|