@honeybee-ai/hivemind-sdk 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/dist/auth.d.ts +32 -0
- package/dist/auth.js +111 -0
- package/dist/auth.js.map +1 -0
- package/dist/contracts/auth.d.ts +56 -0
- package/dist/contracts/auth.js +21 -0
- package/dist/contracts/auth.js.map +1 -0
- package/dist/contracts/carapace.d.ts +643 -0
- package/dist/contracts/carapace.js +95 -0
- package/dist/contracts/carapace.js.map +1 -0
- package/dist/contracts/colony.d.ts +390 -0
- package/dist/contracts/colony.js +78 -0
- package/dist/contracts/colony.js.map +1 -0
- package/dist/contracts/common.d.ts +59 -0
- package/dist/contracts/common.js +32 -0
- package/dist/contracts/common.js.map +1 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.js +6 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/marketplace.d.ts +946 -0
- package/dist/contracts/marketplace.js +139 -0
- package/dist/contracts/marketplace.js.map +1 -0
- package/dist/http.d.ts +6 -0
- package/dist/http.js +40 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/index.d.ts +73 -0
- package/dist/integrations/index.js +9 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/platform.d.ts +339 -0
- package/dist/platform.js +152 -0
- package/dist/platform.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AuthProfile, AuthStore } from './types.js';
|
|
2
|
+
export declare function getWglDir(): string;
|
|
3
|
+
export declare function loadAuthStore(): AuthStore;
|
|
4
|
+
export declare function saveAuthStore(store: AuthStore): void;
|
|
5
|
+
export declare function getActiveProfile(profileName: string): AuthProfile | null;
|
|
6
|
+
export declare function setProfile(name: string, profile: AuthProfile): void;
|
|
7
|
+
export declare function removeProfile(name: string): boolean;
|
|
8
|
+
export declare function listProfiles(): string[];
|
|
9
|
+
export declare function isTokenExpired(profile: AuthProfile): boolean;
|
|
10
|
+
interface DeviceCodeResponse {
|
|
11
|
+
device_code: string;
|
|
12
|
+
user_code: string;
|
|
13
|
+
verification_uri: string;
|
|
14
|
+
expires_in: number;
|
|
15
|
+
interval: number;
|
|
16
|
+
}
|
|
17
|
+
interface TokenResponse {
|
|
18
|
+
access_token: string;
|
|
19
|
+
refresh_token: string;
|
|
20
|
+
expires_in: number;
|
|
21
|
+
email: string;
|
|
22
|
+
org: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function startDeviceFlow(): Promise<DeviceCodeResponse>;
|
|
25
|
+
export declare function pollDeviceFlow(deviceCode: string, interval: number, expiresIn: number): Promise<string>;
|
|
26
|
+
export declare function exchangeGitHubToken(platform: string, githubToken: string): Promise<TokenResponse>;
|
|
27
|
+
export declare function verifyPat(platform: string, pat: string): Promise<{
|
|
28
|
+
email: string;
|
|
29
|
+
org: string;
|
|
30
|
+
}>;
|
|
31
|
+
export declare function refreshToken(platform: string, refreshTokenValue: string): Promise<TokenResponse>;
|
|
32
|
+
export {};
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, chmodSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { httpReq } from './http.js';
|
|
5
|
+
const WGL_DIR = join(homedir(), '.wgl');
|
|
6
|
+
const AUTH_PATH = join(WGL_DIR, 'auth.json');
|
|
7
|
+
export function getWglDir() {
|
|
8
|
+
return WGL_DIR;
|
|
9
|
+
}
|
|
10
|
+
export function loadAuthStore() {
|
|
11
|
+
if (!existsSync(AUTH_PATH))
|
|
12
|
+
return { profiles: {} };
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(readFileSync(AUTH_PATH, 'utf8'));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return { profiles: {} };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function saveAuthStore(store) {
|
|
21
|
+
if (!existsSync(WGL_DIR))
|
|
22
|
+
mkdirSync(WGL_DIR, { recursive: true });
|
|
23
|
+
writeFileSync(AUTH_PATH, JSON.stringify(store, null, 2) + '\n', { mode: 0o600 });
|
|
24
|
+
chmodSync(AUTH_PATH, 0o600);
|
|
25
|
+
}
|
|
26
|
+
export function getActiveProfile(profileName) {
|
|
27
|
+
const store = loadAuthStore();
|
|
28
|
+
return store.profiles[profileName] || null;
|
|
29
|
+
}
|
|
30
|
+
export function setProfile(name, profile) {
|
|
31
|
+
const store = loadAuthStore();
|
|
32
|
+
store.profiles[name] = profile;
|
|
33
|
+
saveAuthStore(store);
|
|
34
|
+
}
|
|
35
|
+
export function removeProfile(name) {
|
|
36
|
+
const store = loadAuthStore();
|
|
37
|
+
if (!(name in store.profiles))
|
|
38
|
+
return false;
|
|
39
|
+
delete store.profiles[name];
|
|
40
|
+
saveAuthStore(store);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
export function listProfiles() {
|
|
44
|
+
const store = loadAuthStore();
|
|
45
|
+
return Object.keys(store.profiles);
|
|
46
|
+
}
|
|
47
|
+
export function isTokenExpired(profile) {
|
|
48
|
+
return Date.now() / 1000 > profile.expiresAt - 60; // 60s buffer
|
|
49
|
+
}
|
|
50
|
+
const GITHUB_CLIENT_ID = 'Ov23liy8H1qGZdVAk1Vr';
|
|
51
|
+
export async function startDeviceFlow() {
|
|
52
|
+
const res = await httpReq('POST', 'https://github.com/login/device/code', { client_id: GITHUB_CLIENT_ID, scope: 'read:user user:email' }, { Accept: 'application/json' });
|
|
53
|
+
if (!res.ok)
|
|
54
|
+
throw new Error('Failed to start device flow');
|
|
55
|
+
return res.data;
|
|
56
|
+
}
|
|
57
|
+
export async function pollDeviceFlow(deviceCode, interval, expiresIn) {
|
|
58
|
+
const deadline = Date.now() + expiresIn * 1000;
|
|
59
|
+
while (Date.now() < deadline) {
|
|
60
|
+
await new Promise(r => setTimeout(r, interval * 1000));
|
|
61
|
+
const res = await httpReq('POST', 'https://github.com/login/oauth/access_token', {
|
|
62
|
+
client_id: GITHUB_CLIENT_ID,
|
|
63
|
+
device_code: deviceCode,
|
|
64
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
65
|
+
}, { Accept: 'application/json' });
|
|
66
|
+
if (res.ok && res.data.access_token) {
|
|
67
|
+
return res.data.access_token;
|
|
68
|
+
}
|
|
69
|
+
// authorization_pending is expected, keep polling
|
|
70
|
+
if (res.data.error === 'authorization_pending')
|
|
71
|
+
continue;
|
|
72
|
+
// slow_down means increase interval
|
|
73
|
+
if (res.data.error === 'slow_down') {
|
|
74
|
+
interval += 5;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Any other error is fatal
|
|
78
|
+
if (res.data.error && res.data.error !== 'authorization_pending') {
|
|
79
|
+
throw new Error(res.data.error_description || res.data.error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
throw new Error('Device flow expired');
|
|
83
|
+
}
|
|
84
|
+
export async function exchangeGitHubToken(platform, githubToken) {
|
|
85
|
+
const res = await httpReq('POST', `${platform}/api/auth/device/exchange`, {
|
|
86
|
+
github_access_token: githubToken,
|
|
87
|
+
});
|
|
88
|
+
if (!res.ok)
|
|
89
|
+
throw new Error('Token exchange failed');
|
|
90
|
+
return res.data;
|
|
91
|
+
}
|
|
92
|
+
export async function verifyPat(platform, pat) {
|
|
93
|
+
const res = await httpReq('GET', `${platform}/api/auth/me`, undefined, {
|
|
94
|
+
Authorization: `Bearer ${pat}`,
|
|
95
|
+
});
|
|
96
|
+
if (!res.ok)
|
|
97
|
+
throw new Error('Invalid PAT or network error');
|
|
98
|
+
const user = res.data.user;
|
|
99
|
+
return { email: user.email || user.username, org: 'personal' };
|
|
100
|
+
}
|
|
101
|
+
export async function refreshToken(platform, refreshTokenValue) {
|
|
102
|
+
const res = await httpReq('POST', `${platform}/api/auth/token`, {
|
|
103
|
+
client_id: 'wgl-cli',
|
|
104
|
+
refresh_token: refreshTokenValue,
|
|
105
|
+
grant_type: 'refresh_token',
|
|
106
|
+
});
|
|
107
|
+
if (!res.ok)
|
|
108
|
+
throw new Error('Token refresh failed');
|
|
109
|
+
return res.data;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const user: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
username: z.ZodString;
|
|
5
|
+
display_name: z.ZodNullable<z.ZodString>;
|
|
6
|
+
avatar_url: z.ZodNullable<z.ZodString>;
|
|
7
|
+
email: z.ZodNullable<z.ZodString>;
|
|
8
|
+
email_verified: z.ZodNumber;
|
|
9
|
+
tier: z.ZodString;
|
|
10
|
+
mfa_enabled: z.ZodNumber;
|
|
11
|
+
created_at: z.ZodString;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
id: string;
|
|
14
|
+
username: string;
|
|
15
|
+
display_name: string | null;
|
|
16
|
+
avatar_url: string | null;
|
|
17
|
+
email: string | null;
|
|
18
|
+
email_verified: number;
|
|
19
|
+
tier: string;
|
|
20
|
+
mfa_enabled: number;
|
|
21
|
+
created_at: string;
|
|
22
|
+
}, {
|
|
23
|
+
id: string;
|
|
24
|
+
username: string;
|
|
25
|
+
display_name: string | null;
|
|
26
|
+
avatar_url: string | null;
|
|
27
|
+
email: string | null;
|
|
28
|
+
email_verified: number;
|
|
29
|
+
tier: string;
|
|
30
|
+
mfa_enabled: number;
|
|
31
|
+
created_at: string;
|
|
32
|
+
}>;
|
|
33
|
+
export type User = z.infer<typeof user>;
|
|
34
|
+
export declare const platformClaims: z.ZodObject<{
|
|
35
|
+
sub: z.ZodString;
|
|
36
|
+
username: z.ZodString;
|
|
37
|
+
email: z.ZodString;
|
|
38
|
+
tier: z.ZodString;
|
|
39
|
+
exp: z.ZodNumber;
|
|
40
|
+
iat: z.ZodNumber;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
username: string;
|
|
43
|
+
email: string;
|
|
44
|
+
tier: string;
|
|
45
|
+
sub: string;
|
|
46
|
+
exp: number;
|
|
47
|
+
iat: number;
|
|
48
|
+
}, {
|
|
49
|
+
username: string;
|
|
50
|
+
email: string;
|
|
51
|
+
tier: string;
|
|
52
|
+
sub: string;
|
|
53
|
+
exp: number;
|
|
54
|
+
iat: number;
|
|
55
|
+
}>;
|
|
56
|
+
export type PlatformClaims = z.infer<typeof platformClaims>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const user = z.object({
|
|
3
|
+
id: z.string(),
|
|
4
|
+
username: z.string(),
|
|
5
|
+
display_name: z.string().nullable(),
|
|
6
|
+
avatar_url: z.string().nullable(),
|
|
7
|
+
email: z.string().nullable(),
|
|
8
|
+
email_verified: z.number(),
|
|
9
|
+
tier: z.string(),
|
|
10
|
+
mfa_enabled: z.number(),
|
|
11
|
+
created_at: z.string(),
|
|
12
|
+
});
|
|
13
|
+
export const platformClaims = z.object({
|
|
14
|
+
sub: z.string(),
|
|
15
|
+
username: z.string(),
|
|
16
|
+
email: z.string(),
|
|
17
|
+
tier: z.string(),
|
|
18
|
+
exp: z.number(),
|
|
19
|
+
iat: z.number(),
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/contracts/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAA"}
|