aweshare 0.3.7 → 0.3.9
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 +48 -34
- package/apps/agent/dist/cli.js +22 -24
- package/apps/agent/dist/cli.js.map +1 -1
- package/apps/agent/dist/config.d.ts +1 -1
- package/apps/agent/dist/config.js +2 -2
- package/apps/agent/dist/config.js.map +1 -1
- package/apps/agent/dist/hub.js +1 -1
- package/apps/agent/dist/hub.js.map +1 -1
- package/apps/consumer/dist/cli.d.ts +2 -0
- package/apps/consumer/dist/cli.js +125 -0
- package/apps/consumer/dist/cli.js.map +1 -0
- package/apps/consumer/dist/hub.d.ts +34 -0
- package/apps/consumer/dist/hub.js +141 -0
- package/apps/consumer/dist/hub.js.map +1 -0
- package/apps/consumer/package.json +16 -0
- package/apps/hub/dist/admin.js +1 -1
- package/apps/hub/dist/admin.js.map +1 -1
- package/apps/hub/dist/cli.js +123 -22
- package/apps/hub/dist/cli.js.map +1 -1
- package/apps/hub/dist/config.d.ts +5 -0
- package/apps/hub/dist/config.js +99 -0
- package/apps/hub/dist/config.js.map +1 -1
- package/apps/hub/dist/invites.js +1 -1
- package/apps/hub/dist/invites.js.map +1 -1
- package/apps/hub/dist/server.js +2 -2
- package/apps/hub/dist/server.js.map +1 -1
- package/apps/hub/dist/table.d.ts +24 -0
- package/apps/hub/dist/table.js +20 -0
- package/apps/hub/dist/table.js.map +1 -1
- package/apps/hub/package.json +1 -0
- package/bin/aweshare.mjs +11 -7
- package/bin/self-update.mjs +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Command set: join. Consumers have no daemon and no local config — the
|
|
3
|
+
// token is printed once and lives in the consumer's SDK environment.
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { INVITE_PATTERN } from '../../../packages/protocol/dist/index.js';
|
|
6
|
+
import { assertWireCompatible, errorMessage, hostIsLocal, plainHttpHost, probeHub, redeemInvite, } from './hub.js';
|
|
7
|
+
const VERSION = JSON.parse(readFileSync(new URL('../../../package.json', import.meta.url), 'utf8')).version;
|
|
8
|
+
// One-liners only; flags per command live in their own -h, everything else in README.
|
|
9
|
+
const USAGE = `Usage: aweshare consumer [OPTIONS] COMMAND [ARGS]...
|
|
10
|
+
|
|
11
|
+
Redeem a consumer invite and set up your SDK environment.
|
|
12
|
+
|
|
13
|
+
Options:
|
|
14
|
+
-v, --version Show the version and exit.
|
|
15
|
+
-h, --help Show this message and exit.
|
|
16
|
+
|
|
17
|
+
Commands:
|
|
18
|
+
join Redeem an invite code into a consumer token.`;
|
|
19
|
+
const COMMAND_HELP = {
|
|
20
|
+
join: `Usage: aweshare consumer join [OPTIONS]
|
|
21
|
+
|
|
22
|
+
Redeem a consumer invite code into a consumer token (asc_...) and print
|
|
23
|
+
your SDK environment. Probes the hub first (reachable, a real hub,
|
|
24
|
+
wire-compatible) — the code only burns after the probe passes.
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--hub URL The hub to join (required, http(s) URL).
|
|
28
|
+
--code CODE The invite code from the hub operator (asi_..., required).
|
|
29
|
+
--allow-http Proceed with a plain-HTTP hub outside your LAN (the consumer
|
|
30
|
+
token would cross the network unencrypted).
|
|
31
|
+
-h, --help Show this message and exit.`,
|
|
32
|
+
};
|
|
33
|
+
function parseFlags(argv) {
|
|
34
|
+
const positional = [];
|
|
35
|
+
const flags = new Map();
|
|
36
|
+
for (let i = 0; i < argv.length; i++) {
|
|
37
|
+
const a = argv[i];
|
|
38
|
+
if (a.startsWith('--')) {
|
|
39
|
+
const eq = a.indexOf('=');
|
|
40
|
+
if (eq >= 0) {
|
|
41
|
+
flags.set(a.slice(2, eq), a.slice(eq + 1));
|
|
42
|
+
}
|
|
43
|
+
else if (i + 1 < argv.length && !argv[i + 1].startsWith('--')) {
|
|
44
|
+
flags.set(a.slice(2), argv[++i]);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
flags.set(a.slice(2), 'true');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
positional.push(a);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { positional, flags };
|
|
55
|
+
}
|
|
56
|
+
function fail(message) {
|
|
57
|
+
console.error(`error: ${message}`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
function noPositionals(cmd, positional) {
|
|
61
|
+
const arg = positional[0];
|
|
62
|
+
if (arg)
|
|
63
|
+
fail(`unexpected argument '${arg}' — this command takes flags only (see: aweshare consumer ${cmd} -h)`);
|
|
64
|
+
}
|
|
65
|
+
/** Refuse silent plain-HTTP pairing with a non-local hub: the consumer token
|
|
66
|
+
* would cross the network unencrypted. */
|
|
67
|
+
function guardPlainHttp(hub, flags) {
|
|
68
|
+
const host = plainHttpHost(hub);
|
|
69
|
+
if (host === null || hostIsLocal(host))
|
|
70
|
+
return;
|
|
71
|
+
if (flags.get('allow-http') !== 'true') {
|
|
72
|
+
fail(`${hub} uses plain HTTP — the consumer token would cross the network unencrypted\n` +
|
|
73
|
+
'fix: use an https:// hub URL (e.g. via a Cloudflare tunnel) or an http:// address on your LAN, or pass --allow-http to proceed anyway');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function runJoin(flags) {
|
|
77
|
+
const hub = flags.get('hub');
|
|
78
|
+
const code = flags.get('code');
|
|
79
|
+
if (!hub || !/^https?:\/\//.test(hub))
|
|
80
|
+
fail('--hub must be an http(s) URL');
|
|
81
|
+
if (!code || !INVITE_PATTERN.test(code))
|
|
82
|
+
fail('--code must be an invite code (asi_...)');
|
|
83
|
+
guardPlainHttp(hub, flags);
|
|
84
|
+
// Probe before burning the one-time invite; hub errors below carry the fix.
|
|
85
|
+
const info = await probeHub(hub);
|
|
86
|
+
assertWireCompatible(hub, info);
|
|
87
|
+
const { name, token } = await redeemInvite(hub, { code, expectRole: 'consumer' });
|
|
88
|
+
const where = info.version ? `hub v${info.version}` : 'hub';
|
|
89
|
+
console.log(`joined ${where} as consumer '${name}'`);
|
|
90
|
+
console.log(`\nconsumer token: ${token}`);
|
|
91
|
+
console.log('\nsave this token now — it will not be shown again (the hub stores only a hash).');
|
|
92
|
+
console.log('\nyour SDK environment:');
|
|
93
|
+
console.log(` export OPENAI_BASE_URL="${hub}/v1"`);
|
|
94
|
+
console.log(` export OPENAI_API_KEY="${token}"`);
|
|
95
|
+
console.log(' # Anthropic SDK / Claude Code:');
|
|
96
|
+
console.log(` export ANTHROPIC_BASE_URL="${hub}"`);
|
|
97
|
+
console.log(` export ANTHROPIC_AUTH_TOKEN="${token}"`);
|
|
98
|
+
console.log('\nmodel names look like <producer>/<alias> — ask the hub operator what is shared.');
|
|
99
|
+
}
|
|
100
|
+
async function main() {
|
|
101
|
+
const [cmd, ...rest] = process.argv.slice(2);
|
|
102
|
+
const { positional, flags } = parseFlags(rest);
|
|
103
|
+
if (cmd === '-v' || cmd === '--version') {
|
|
104
|
+
console.log(`aweshare consumer ${VERSION}`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
|
|
108
|
+
console.log(USAGE);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const help = COMMAND_HELP[cmd];
|
|
112
|
+
if (help && (positional.includes('-h') || flags.get('help') === 'true')) {
|
|
113
|
+
console.log(help);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
switch (cmd) {
|
|
117
|
+
case 'join':
|
|
118
|
+
noPositionals(cmd, positional);
|
|
119
|
+
return await runJoin(flags);
|
|
120
|
+
default:
|
|
121
|
+
fail(`unknown command: ${cmd}\n\n${USAGE}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
main().catch((err) => fail(errorMessage(err)));
|
|
125
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Name ourselves on the wire: anonymous/default UAs sit on Cloudflare Bot
|
|
2
|
+
* Fight Mode's signature blocklist (error 1010), and a tunnel is the
|
|
3
|
+
* recommended hub exposure. */
|
|
4
|
+
export declare const USER_AGENT: string;
|
|
5
|
+
/** One failed hub round-trip; the message is user-ready (never the token). */
|
|
6
|
+
export declare class HubError extends Error {
|
|
7
|
+
}
|
|
8
|
+
export interface HubInfo {
|
|
9
|
+
version?: string;
|
|
10
|
+
wire?: number;
|
|
11
|
+
}
|
|
12
|
+
/** Node fetch reports "fetch failed" without the reason; surface the cause. */
|
|
13
|
+
export declare function errorMessage(err: unknown): string;
|
|
14
|
+
/** Probe GET /healthz: reachable, a real aweshare hub, and which version/wire
|
|
15
|
+
* it speaks. Throws HubError with the precise failure otherwise. */
|
|
16
|
+
export declare function probeHub(hubUrl: string): Promise<HubInfo>;
|
|
17
|
+
/** Old hubs omit `wire` from healthz; only an explicit mismatch fails. */
|
|
18
|
+
export declare function assertWireCompatible(hubUrl: string, info: HubInfo): void;
|
|
19
|
+
export interface JoinBody {
|
|
20
|
+
code: string;
|
|
21
|
+
/** Asserts a consumer invite before the hub consumes the code — a producer
|
|
22
|
+
* code rejects with INVITE_ROLE_MISMATCH instead of being burned. */
|
|
23
|
+
expectRole?: 'consumer';
|
|
24
|
+
}
|
|
25
|
+
/** Burn a one-time consumer invite into the consumer's asc_ token. */
|
|
26
|
+
export declare function redeemInvite(hubUrl: string, body: JoinBody): Promise<{
|
|
27
|
+
name: string;
|
|
28
|
+
token: string;
|
|
29
|
+
}>;
|
|
30
|
+
/** Hostname when hubUrl is plain http://, else null (https is exempt). */
|
|
31
|
+
export declare function plainHttpHost(hubUrl: string): string | null;
|
|
32
|
+
/** Loopback/private/link-local IPs, localhost, or mDNS .local names — plain
|
|
33
|
+
* http to anything else exposes the consumer token on the wire. */
|
|
34
|
+
export declare function hostIsLocal(host: string): boolean;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** Client for the consumer's one talk with a hub: health probe and invite
|
|
2
|
+
* redeem. One User-Agent, one timeout policy, one error shape — a HubError
|
|
3
|
+
* message is user-ready and never contains the consumer token. */
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { BlockList, isIP } from 'node:net';
|
|
6
|
+
import { WIRE_VERSION } from '../../../packages/protocol/dist/index.js';
|
|
7
|
+
const VERSION = JSON.parse(readFileSync(new URL('../../../package.json', import.meta.url), 'utf8')).version;
|
|
8
|
+
/** Name ourselves on the wire: anonymous/default UAs sit on Cloudflare Bot
|
|
9
|
+
* Fight Mode's signature blocklist (error 1010), and a tunnel is the
|
|
10
|
+
* recommended hub exposure. */
|
|
11
|
+
export const USER_AGENT = `aweshare-consumer/${VERSION}`;
|
|
12
|
+
const TIMEOUT_MS = 10_000;
|
|
13
|
+
/** One failed hub round-trip; the message is user-ready (never the token). */
|
|
14
|
+
export class HubError extends Error {
|
|
15
|
+
}
|
|
16
|
+
/** Node fetch reports "fetch failed" without the reason; surface the cause. */
|
|
17
|
+
export function errorMessage(err) {
|
|
18
|
+
if (err instanceof Error) {
|
|
19
|
+
if (err.name === 'TimeoutError' || err.name === 'AbortError') {
|
|
20
|
+
return `timed out after ${TIMEOUT_MS / 1000}s`;
|
|
21
|
+
}
|
|
22
|
+
const cause = err.cause;
|
|
23
|
+
return cause ? `${err.message} (${cause.code ?? cause.message})` : err.message;
|
|
24
|
+
}
|
|
25
|
+
return String(err);
|
|
26
|
+
}
|
|
27
|
+
/** Probe GET /healthz: reachable, a real aweshare hub, and which version/wire
|
|
28
|
+
* it speaks. Throws HubError with the precise failure otherwise. */
|
|
29
|
+
export async function probeHub(hubUrl) {
|
|
30
|
+
let res;
|
|
31
|
+
try {
|
|
32
|
+
res = await fetch(`${hubUrl}/healthz`, {
|
|
33
|
+
headers: { 'user-agent': USER_AGENT },
|
|
34
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
throw new HubError(`cannot reach the hub at ${hubUrl}: ${errorMessage(err)}`);
|
|
39
|
+
}
|
|
40
|
+
// Cloudflare Bot Fight Mode answers with a bare plain-text "error code:
|
|
41
|
+
// 1010" body on 403 — both failure branches below may carry it.
|
|
42
|
+
const proxyHint = res.status === 403
|
|
43
|
+
? ' — a proxy or WAF (e.g. Cloudflare bot protection) in front of the hub may be blocking this client'
|
|
44
|
+
: '';
|
|
45
|
+
let body;
|
|
46
|
+
try {
|
|
47
|
+
body = JSON.parse(await res.text());
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new HubError(`${hubUrl} answered, but not like an aweshare hub (HTTP ${res.status}, body is not JSON)${proxyHint}`);
|
|
51
|
+
}
|
|
52
|
+
const info = body;
|
|
53
|
+
if (!res.ok || info?.ok !== true) {
|
|
54
|
+
throw new HubError(`${hubUrl} answered HTTP ${res.status}, but is not a healthy aweshare hub${proxyHint}`);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
version: typeof info.version === 'string' ? info.version : undefined,
|
|
58
|
+
wire: typeof info.wire === 'number' ? info.wire : undefined,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Old hubs omit `wire` from healthz; only an explicit mismatch fails. */
|
|
62
|
+
export function assertWireCompatible(hubUrl, info) {
|
|
63
|
+
if (info.wire !== undefined && info.wire !== WIRE_VERSION) {
|
|
64
|
+
throw new HubError(`hub ${hubUrl} speaks wire version ${info.wire}, this CLI speaks ${WIRE_VERSION} — ` +
|
|
65
|
+
'update one side to match (CLI: aweshare self-update)');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Burn a one-time consumer invite into the consumer's asc_ token. */
|
|
69
|
+
export async function redeemInvite(hubUrl, body) {
|
|
70
|
+
const data = await jsonCall(`${hubUrl}/invites/v1/redeem`, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers: { 'content-type': 'application/json' },
|
|
73
|
+
body: JSON.stringify(body),
|
|
74
|
+
});
|
|
75
|
+
if (typeof data.name !== 'string' || typeof data.token !== 'string') {
|
|
76
|
+
throw new HubError(`${hubUrl} redeemed the invite but answered without a consumer token — not an aweshare hub?`);
|
|
77
|
+
}
|
|
78
|
+
// pre-expectRole hubs redeem anything: an asp_ back means the code was a
|
|
79
|
+
// producer one and is now spent — say so instead of printing a useless token
|
|
80
|
+
if (data.token.startsWith('asp_')) {
|
|
81
|
+
throw new HubError(`that was a producer invite — aweshare consumer join redeems consumer codes only.\n` +
|
|
82
|
+
' the code is spent; ask the hub operator for a consumer invite');
|
|
83
|
+
}
|
|
84
|
+
return { name: data.name, token: data.token };
|
|
85
|
+
}
|
|
86
|
+
async function jsonCall(url, init = {}) {
|
|
87
|
+
let res;
|
|
88
|
+
try {
|
|
89
|
+
res = await fetch(url, {
|
|
90
|
+
...init,
|
|
91
|
+
headers: { 'user-agent': USER_AGENT, ...init.headers },
|
|
92
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
throw new HubError(`cannot reach the hub at ${new URL(url).origin}: ${errorMessage(err)}`);
|
|
97
|
+
}
|
|
98
|
+
const data = (await res.json().catch(() => ({})));
|
|
99
|
+
if (!res.ok) {
|
|
100
|
+
const message = data.error?.message;
|
|
101
|
+
throw new HubError(`${res.status} ${message ?? res.statusText}`);
|
|
102
|
+
}
|
|
103
|
+
return data;
|
|
104
|
+
}
|
|
105
|
+
/** Hostname when hubUrl is plain http://, else null (https is exempt). */
|
|
106
|
+
export function plainHttpHost(hubUrl) {
|
|
107
|
+
try {
|
|
108
|
+
const { protocol, hostname } = new URL(hubUrl);
|
|
109
|
+
return protocol === 'http:' ? hostname : null;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Ranges where plain http:// stays on the LAN. Node 22's BlockList rejects
|
|
116
|
+
// IPv6 subnet bases ("Invalid socket address"), so v6 gets hextet math below.
|
|
117
|
+
const LOCAL_V4 = new BlockList();
|
|
118
|
+
for (const [subnet, bits] of [
|
|
119
|
+
['127.0.0.0', 8],
|
|
120
|
+
['10.0.0.0', 8],
|
|
121
|
+
['172.16.0.0', 12],
|
|
122
|
+
['192.168.0.0', 16],
|
|
123
|
+
['169.254.0.0', 16],
|
|
124
|
+
]) {
|
|
125
|
+
LOCAL_V4.addSubnet(subnet, bits);
|
|
126
|
+
}
|
|
127
|
+
/** Loopback/private/link-local IPs, localhost, or mDNS .local names — plain
|
|
128
|
+
* http to anything else exposes the consumer token on the wire. */
|
|
129
|
+
export function hostIsLocal(host) {
|
|
130
|
+
const bare = host.replace(/^\[/, '').replace(/\]$/, '');
|
|
131
|
+
if (isIP(bare) === 4)
|
|
132
|
+
return LOCAL_V4.check(bare);
|
|
133
|
+
if (isIP(bare) === 6) {
|
|
134
|
+
if (bare === '::1')
|
|
135
|
+
return true;
|
|
136
|
+
const first = Number.parseInt(bare.split(':')[0] ?? '0', 16) || 0;
|
|
137
|
+
return (first & 0xffc0) === 0xfe80 || (first & 0xfe00) === 0xfc00; // link-local, ULA
|
|
138
|
+
}
|
|
139
|
+
return bare === 'localhost' || bare.endsWith('.local');
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.js","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aweshare/consumer",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc -b"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"aweshare-protocol": "workspace:*"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"typescript": "^5.8.3"
|
|
15
|
+
}
|
|
16
|
+
}
|
package/apps/hub/dist/admin.js
CHANGED
|
@@ -32,7 +32,7 @@ function authorizeGrantChange(req, auth, alias) {
|
|
|
32
32
|
if (!token)
|
|
33
33
|
throw new HttpError(401, 'INVALID_KEY', 'producer token required');
|
|
34
34
|
if (roleForToken(token) === 'admin') {
|
|
35
|
-
throw new HttpError(403, 'NOT_GRANTED', 'grants are producer-owned — manage them with the producer token (aweshare
|
|
35
|
+
throw new HttpError(403, 'NOT_GRANTED', 'grants are producer-owned — manage them with the producer token (aweshare producer grant)');
|
|
36
36
|
}
|
|
37
37
|
if (roleForToken(token) === 'consumer') {
|
|
38
38
|
throw new HttpError(403, 'NOT_GRANTED', 'consumer keys cannot manage grants');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
|
package/apps/hub/dist/cli.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync } from 'node:fs';
|
|
3
|
-
import { ensureDataDir, readAdminToken, resolvePaths } from './config.js';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { ensureDataDir, HUB_CONFIG_TEMPLATE, readAdminToken, resolvePaths } from './config.js';
|
|
4
4
|
import { createHubServer } from './server.js';
|
|
5
|
-
import { renderConsumers, renderInvites, renderProducers, } from './table.js';
|
|
5
|
+
import { renderConsumers, renderInvites, renderProducers, renderUsage, } from './table.js';
|
|
6
6
|
import { loadOrCreateAdminToken, loadOrCreatePepper } from './tokens.js';
|
|
7
7
|
const VERSION = JSON.parse(readFileSync(new URL('../../../package.json', import.meta.url), 'utf8')).version;
|
|
8
8
|
// One-liners only; flags per command live in their own -h, everything else in README.
|
|
@@ -19,6 +19,8 @@ Commands:
|
|
|
19
19
|
serve Run the hub server.
|
|
20
20
|
invite Mint one-time invite codes (producers or consumers).
|
|
21
21
|
list List invites (--reveal, --token), producers, or consumers.
|
|
22
|
+
limits Show, set or clear one consumer's limit overrides.
|
|
23
|
+
usage Recent request usage, newest first (--consumer, --alias).
|
|
22
24
|
revoke Kill an invite: pending stops pairing, redeemed suspends its identity.
|
|
23
25
|
restore Undo a revoke: pending pairs again, redeemed revives its identity.`;
|
|
24
26
|
const COMMAND_HELP = {
|
|
@@ -62,6 +64,32 @@ Options:
|
|
|
62
64
|
--token Invites only: also show the token each invite minted, with last seen.
|
|
63
65
|
--json Print the raw API response instead of a table.
|
|
64
66
|
-h, --help Show this message and exit.`,
|
|
67
|
+
limits: `Usage: aweshare hub limits NAME [OPTIONS]
|
|
68
|
+
|
|
69
|
+
Show, set or clear one consumer's limit overrides. Unset keys keep the
|
|
70
|
+
hub-wide defaults (AWESHARE_CONSUMER_* env vars); setting merges into
|
|
71
|
+
what is already stored.
|
|
72
|
+
|
|
73
|
+
Options:
|
|
74
|
+
--rps N Requests per second (may be fractional).
|
|
75
|
+
--burst N Token-bucket burst size.
|
|
76
|
+
--max-concurrent N Max in-flight requests.
|
|
77
|
+
--tpm N Max tokens in any sliding 60s window.
|
|
78
|
+
--max-total-tokens N Lifetime token budget.
|
|
79
|
+
--clear Drop every override (back to hub-wide defaults).
|
|
80
|
+
--json Print the raw API response instead of text.
|
|
81
|
+
-h, --help Show this message and exit.`,
|
|
82
|
+
usage: `Usage: aweshare hub usage [OPTIONS]
|
|
83
|
+
|
|
84
|
+
Recent request usage, newest first — one row per request, zero content
|
|
85
|
+
stored. The admin token sees everything; narrow with --consumer/--alias.
|
|
86
|
+
|
|
87
|
+
Options:
|
|
88
|
+
--consumer NAME Only rows for this consumer.
|
|
89
|
+
--alias ALIAS Only rows for this alias (ns/model).
|
|
90
|
+
--limit N Rows to show, 1..1000 (default 100).
|
|
91
|
+
--json Print the raw API response instead of a table.
|
|
92
|
+
-h, --help Show this message and exit.`,
|
|
65
93
|
revoke: `Usage: aweshare hub revoke [OPTIONS]
|
|
66
94
|
|
|
67
95
|
Kill an invite: pending stops pairing, redeemed suspends its identity.
|
|
@@ -77,16 +105,6 @@ Options:
|
|
|
77
105
|
--id N The invite id (see: aweshare hub list).
|
|
78
106
|
-h, --help Show this message and exit.`,
|
|
79
107
|
};
|
|
80
|
-
/** Off the CLI since it narrowed to invites; the admin REST API still serves them. */
|
|
81
|
-
const REMOVED = new Set(['token', 'grant', 'consumer', 'usage']);
|
|
82
|
-
/** Grants are the exception: producer-owned, so the pointer goes to the agent CLI. */
|
|
83
|
-
function removedPointer(cmd) {
|
|
84
|
-
if (cmd === 'grant')
|
|
85
|
-
return "grants are producer-owned — use 'aweshare agent grant' on the producer machine";
|
|
86
|
-
if (cmd === 'token')
|
|
87
|
-
return "listing is back as 'aweshare hub list producers' / 'aweshare hub list consumers'; issuance runs through invites (aweshare hub invite) or the admin REST API";
|
|
88
|
-
return `'${cmd}' left the CLI when it narrowed to invites — the admin REST API still serves it (see README)`;
|
|
89
|
-
}
|
|
90
108
|
function parseArgs(argv) {
|
|
91
109
|
const positional = [];
|
|
92
110
|
const flags = new Map();
|
|
@@ -165,6 +183,21 @@ function requireId(flags) {
|
|
|
165
183
|
fail('--id is required (find ids with: aweshare hub list)');
|
|
166
184
|
return id;
|
|
167
185
|
}
|
|
186
|
+
/** CLI flag name -> API key of the sparse limit override object. */
|
|
187
|
+
const LIMIT_FLAGS = [
|
|
188
|
+
['rps', 'rps'],
|
|
189
|
+
['burst', 'burst'],
|
|
190
|
+
['max-concurrent', 'maxConcurrent'],
|
|
191
|
+
['tpm', 'tpm'],
|
|
192
|
+
['max-total-tokens', 'maxTotalTokens'],
|
|
193
|
+
];
|
|
194
|
+
/** 'rps=5, maxConcurrent=2' or the none-line when nothing is overridden. */
|
|
195
|
+
function fmtLimits(name, overrides) {
|
|
196
|
+
const set = Object.entries(overrides ?? {}).map(([k, v]) => `${k}=${v}`);
|
|
197
|
+
return set.length > 0
|
|
198
|
+
? `${name}: ${set.join(', ')}`
|
|
199
|
+
: `${name}: no overrides — hub-wide defaults apply (AWESHARE_CONSUMER_* env vars)`;
|
|
200
|
+
}
|
|
168
201
|
async function main() {
|
|
169
202
|
const [cmd, ...rest] = process.argv.slice(2);
|
|
170
203
|
const { positional, flags } = parseArgs(rest);
|
|
@@ -176,9 +209,6 @@ async function main() {
|
|
|
176
209
|
console.log(USAGE);
|
|
177
210
|
return;
|
|
178
211
|
}
|
|
179
|
-
if (REMOVED.has(cmd)) {
|
|
180
|
-
fail(removedPointer(cmd));
|
|
181
|
-
}
|
|
182
212
|
const help = COMMAND_HELP[cmd];
|
|
183
213
|
if (help && (positional.includes('-h') || flags.get('help') === 'true')) {
|
|
184
214
|
console.log(help);
|
|
@@ -190,6 +220,10 @@ async function main() {
|
|
|
190
220
|
ensureDataDir(paths);
|
|
191
221
|
loadOrCreatePepper(paths);
|
|
192
222
|
const adminToken = loadOrCreateAdminToken(paths);
|
|
223
|
+
if (!existsSync(paths.configFile)) {
|
|
224
|
+
writeFileSync(paths.configFile, HUB_CONFIG_TEMPLATE, { mode: 0o600 });
|
|
225
|
+
console.log(`config file: ${paths.configFile} (every key commented out — edit to override)`);
|
|
226
|
+
}
|
|
193
227
|
const hub = createHubServer({ paths }); // creates the db schema
|
|
194
228
|
await hub.close();
|
|
195
229
|
console.log(`data dir: ${paths.dataDir}`);
|
|
@@ -239,15 +273,15 @@ async function main() {
|
|
|
239
273
|
for (const invite of out.invites)
|
|
240
274
|
console.log(invite.code);
|
|
241
275
|
if (role === 'consumer') {
|
|
242
|
-
console.error('(save this now;
|
|
243
|
-
`hand it to '${name}' — they redeem it
|
|
244
|
-
|
|
245
|
-
'
|
|
276
|
+
console.error('(save this now; codes print only here — re-view later with: aweshare hub list --reveal.\n' +
|
|
277
|
+
`hand it to '${name}' — they redeem it and keep the returned asc_ token:\n` +
|
|
278
|
+
' aweshare consumer join --hub https://YOUR-HUB --code CODE\n' +
|
|
279
|
+
'no aweshare installed? curl -s -X POST https://YOUR-HUB/invites/v1/redeem -H \'content-type: application/json\' -d \'{"code":"asi_..."}\')');
|
|
246
280
|
}
|
|
247
281
|
else {
|
|
248
282
|
console.error(name
|
|
249
|
-
? '(save these now; codes print only here — re-view later with: aweshare hub list --reveal. redeem: aweshare
|
|
250
|
-
: '(save these now; codes print only here — re-view later with: aweshare hub list --reveal. redeem: aweshare
|
|
283
|
+
? '(save these now; codes print only here — re-view later with: aweshare hub list --reveal. redeem: aweshare producer join --hub URL --code CODE)'
|
|
284
|
+
: '(save these now; codes print only here — re-view later with: aweshare hub list --reveal. redeem: aweshare producer join --hub URL --code CODE --name NAME --email YOU@EXAMPLE.COM)');
|
|
251
285
|
}
|
|
252
286
|
return;
|
|
253
287
|
}
|
|
@@ -284,6 +318,73 @@ async function main() {
|
|
|
284
318
|
}
|
|
285
319
|
return;
|
|
286
320
|
}
|
|
321
|
+
case 'limits': {
|
|
322
|
+
const name = positional[0];
|
|
323
|
+
if (!name)
|
|
324
|
+
fail('consumer name is required (see: aweshare hub limits -h)');
|
|
325
|
+
if (positional[1])
|
|
326
|
+
fail(`unexpected argument '${positional[1]}' (see: aweshare hub limits -h)`);
|
|
327
|
+
const api = adminApi();
|
|
328
|
+
const path = `/admin/v1/consumers/${encodeURIComponent(name)}/limits`;
|
|
329
|
+
const json = flags.get('json') === 'true';
|
|
330
|
+
const set = {};
|
|
331
|
+
for (const [flag, key] of LIMIT_FLAGS) {
|
|
332
|
+
const raw = flags.get(flag);
|
|
333
|
+
if (raw === undefined)
|
|
334
|
+
continue;
|
|
335
|
+
const n = Number(raw);
|
|
336
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
337
|
+
fail(`--${flag} must be a positive number, got '${raw}'`);
|
|
338
|
+
set[key] = n;
|
|
339
|
+
}
|
|
340
|
+
if (flags.get('clear') === 'true') {
|
|
341
|
+
if (Object.keys(set).length > 0)
|
|
342
|
+
fail('--clear drops every override — drop the value flags too');
|
|
343
|
+
const out = (await api('DELETE', path));
|
|
344
|
+
console.log(json
|
|
345
|
+
? JSON.stringify(out, null, 2)
|
|
346
|
+
: `✓ ${name}: overrides cleared — hub-wide defaults apply`);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
if (Object.keys(set).length > 0) {
|
|
350
|
+
// integer/precision rules live server-side; its error lists all problems
|
|
351
|
+
const out = (await api('PUT', path, set));
|
|
352
|
+
console.log(json ? JSON.stringify(out, null, 2) : `✓ ${fmtLimits(out.name, out.overrides)}`);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const out = (await api('GET', path));
|
|
356
|
+
console.log(json ? JSON.stringify(out, null, 2) : fmtLimits(out.name, out.overrides));
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
case 'usage': {
|
|
360
|
+
noPositionals(cmd, positional);
|
|
361
|
+
const api = adminApi();
|
|
362
|
+
const params = new URLSearchParams();
|
|
363
|
+
const consumer = flags.get('consumer');
|
|
364
|
+
if (consumer)
|
|
365
|
+
params.set('consumer', consumer);
|
|
366
|
+
const alias = flags.get('alias');
|
|
367
|
+
if (alias)
|
|
368
|
+
params.set('alias', alias);
|
|
369
|
+
const limit = flags.get('limit');
|
|
370
|
+
if (limit !== undefined) {
|
|
371
|
+
const n = Number(limit);
|
|
372
|
+
if (!Number.isInteger(n) || n < 1 || n > 1000)
|
|
373
|
+
fail(`--limit must be an integer between 1 and 1000, got '${limit}'`);
|
|
374
|
+
params.set('limit', String(n));
|
|
375
|
+
}
|
|
376
|
+
const qs = params.toString();
|
|
377
|
+
const rows = (await api('GET', `/admin/v1/usage${qs ? `?${qs}` : ''}`));
|
|
378
|
+
if (flags.get('json') === 'true') {
|
|
379
|
+
console.log(JSON.stringify(rows, null, 2));
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
// usage rows carry ids; the roster maps them to names (one extra call, no API change)
|
|
383
|
+
const roster = (await api('GET', '/admin/v1/tokens'));
|
|
384
|
+
const names = new Map(roster.consumers.map((c) => [c.id, c.name]));
|
|
385
|
+
console.log(renderUsage(rows, (id) => names.get(id) ?? `#${id}`));
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
287
388
|
case 'revoke': {
|
|
288
389
|
noPositionals(cmd, positional);
|
|
289
390
|
const api = adminApi();
|