omnara 0.1.3 → 0.1.5
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/omnara.js +8 -3
- package/dist/auth/auth-provider.d.ts +2 -2
- package/dist/auth/cli-auth-service.d.ts +1 -1
- package/dist/auth/credential-manager.d.ts +1 -1
- package/dist/auth/login-flow.d.ts +2 -2
- package/dist/auth/supabase-client.d.ts +1 -1
- package/dist/cli.js +5940 -44
- package/dist/cli.js.map +7 -1
- package/dist/commands/index.d.ts +2 -2
- package/dist/http/user-sessions.d.ts +13 -0
- package/dist/orchestrator/agent-orchestrator.d.ts +14 -6
- package/dist/orchestrator/ai-client.d.ts +5 -4
- package/dist/orchestrator/orchestrator-prompt.d.ts +3 -2
- package/dist/orchestrator/orchestrator-prompt.md +405 -0
- package/dist/orchestrator/{types.d.ts → orchestrator-types.d.ts} +33 -29
- package/dist/orchestrator/session.d.ts +7 -3
- package/dist/orchestrator/tools/worker-status-tool.d.ts +7 -0
- package/dist/orchestrator/tools/worker-tools.d.ts +2 -1
- package/dist/orchestrator/utils/async-queue.d.ts +26 -0
- package/dist/orchestrator/utils/session-logger.d.ts +1 -1
- package/dist/orchestrator/worker-manager.d.ts +31 -15
- package/dist/relay/relay-bridge.d.ts +24 -3
- package/dist/relay/relay-service.d.ts +4 -7
- package/dist/schemas/index.d.ts +2 -0
- package/dist/voice/voice-service.d.ts +1 -1
- package/package.json +13 -3
- package/scripts/preinstall.js +141 -0
- package/scripts/test-preinstall.js +125 -0
- package/dist/auth/auth-provider.js +0 -58
- package/dist/auth/auth-provider.js.map +0 -1
- package/dist/auth/cli-auth-service.js +0 -47
- package/dist/auth/cli-auth-service.js.map +0 -1
- package/dist/auth/credential-manager.js +0 -73
- package/dist/auth/credential-manager.js.map +0 -1
- package/dist/auth/credentials-store.js +0 -75
- package/dist/auth/credentials-store.js.map +0 -1
- package/dist/auth/login-flow.js +0 -202
- package/dist/auth/login-flow.js.map +0 -1
- package/dist/auth/loopback-listener.js +0 -159
- package/dist/auth/loopback-listener.js.map +0 -1
- package/dist/auth/pkce.js +0 -18
- package/dist/auth/pkce.js.map +0 -1
- package/dist/auth/supabase-client.js +0 -13
- package/dist/auth/supabase-client.js.map +0 -1
- package/dist/auth/supabase-config.js +0 -24
- package/dist/auth/supabase-config.js.map +0 -1
- package/dist/commands/agent.js +0 -174
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/auth.js +0 -87
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/hello.d.ts +0 -2
- package/dist/commands/hello.js +0 -12
- package/dist/commands/hello.js.map +0 -1
- package/dist/commands/index.js +0 -9
- package/dist/commands/index.js.map +0 -1
- package/dist/generated/relay.d.ts +0 -240
- package/dist/generated/relay.js +0 -2376
- package/dist/generated/relay.js.map +0 -1
- package/dist/http/api-client.js +0 -122
- package/dist/http/api-client.js.map +0 -1
- package/dist/messaging/proto-codec.d.ts +0 -5
- package/dist/messaging/proto-codec.js +0 -387
- package/dist/messaging/proto-codec.js.map +0 -1
- package/dist/orchestrator/agent-orchestrator.js +0 -423
- package/dist/orchestrator/agent-orchestrator.js.map +0 -1
- package/dist/orchestrator/ai-client.js +0 -74
- package/dist/orchestrator/ai-client.js.map +0 -1
- package/dist/orchestrator/orchestrator-prompt.js +0 -160
- package/dist/orchestrator/orchestrator-prompt.js.map +0 -1
- package/dist/orchestrator/session.js +0 -273
- package/dist/orchestrator/session.js.map +0 -1
- package/dist/orchestrator/tools/worker-tools.js +0 -165
- package/dist/orchestrator/tools/worker-tools.js.map +0 -1
- package/dist/orchestrator/types.js +0 -33
- package/dist/orchestrator/types.js.map +0 -1
- package/dist/orchestrator/utils/session-logger.js +0 -53
- package/dist/orchestrator/utils/session-logger.js.map +0 -1
- package/dist/orchestrator/worker-manager.js +0 -250
- package/dist/orchestrator/worker-manager.js.map +0 -1
- package/dist/relay/relay-bridge.js +0 -309
- package/dist/relay/relay-bridge.js.map +0 -1
- package/dist/relay/relay-service.js +0 -29
- package/dist/relay/relay-service.js.map +0 -1
- package/dist/repl/terminal-repl.js +0 -258
- package/dist/repl/terminal-repl.js.map +0 -1
- package/dist/server/agent-server.d.ts +0 -46
- package/dist/server/agent-server.js +0 -429
- package/dist/server/agent-server.js.map +0 -1
- package/dist/server/ai-client.d.ts +0 -16
- package/dist/server/ai-client.js +0 -74
- package/dist/server/ai-client.js.map +0 -1
- package/dist/server/session.d.ts +0 -35
- package/dist/server/session.js +0 -272
- package/dist/server/session.js.map +0 -1
- package/dist/server/subagents.d.ts +0 -19
- package/dist/server/subagents.js +0 -42
- package/dist/server/subagents.js.map +0 -1
- package/dist/server/tools/worker-tools.d.ts +0 -2
- package/dist/server/tools/worker-tools.js +0 -37
- package/dist/server/tools/worker-tools.js.map +0 -1
- package/dist/server/types.d.ts +0 -120
- package/dist/server/types.js +0 -29
- package/dist/server/types.js.map +0 -1
- package/dist/server/utils/session-logger.d.ts +0 -7
- package/dist/server/utils/session-logger.js +0 -53
- package/dist/server/utils/session-logger.js.map +0 -1
- package/dist/server/worker-manager.d.ts +0 -67
- package/dist/server/worker-manager.js +0 -207
- package/dist/server/worker-manager.js.map +0 -1
- package/dist/test-agent.d.ts +0 -1
- package/dist/test-agent.js +0 -63
- package/dist/test-agent.js.map +0 -1
- package/dist/utils/base64url.d.ts +0 -1
- package/dist/utils/base64url.js +0 -12
- package/dist/utils/base64url.js.map +0 -1
- package/dist/utils/prompt.js +0 -19
- package/dist/utils/prompt.js.map +0 -1
- package/dist/utils/random.d.ts +0 -1
- package/dist/utils/random.js +0 -9
- package/dist/utils/random.js.map +0 -1
- package/dist/voice/voice-service.js +0 -27
- package/dist/voice/voice-service.js.map +0 -1
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureAuthContext = ensureAuthContext;
|
|
4
|
-
const supabase_client_1 = require("./supabase-client");
|
|
5
|
-
const supabase_config_1 = require("./supabase-config");
|
|
6
|
-
const EXPIRY_BUFFER_MS = 60000; // refresh tokens one minute before expiry
|
|
7
|
-
async function ensureAuthContext(store, backendUrl) {
|
|
8
|
-
const credentials = await store.load();
|
|
9
|
-
if (!credentials) {
|
|
10
|
-
throw new Error('No credentials found. Run `omnara auth login` first.');
|
|
11
|
-
}
|
|
12
|
-
if (!credentials.refreshToken) {
|
|
13
|
-
throw new Error('Refresh token unavailable. Please run `omnara auth login`.');
|
|
14
|
-
}
|
|
15
|
-
if (!credentials.accessToken) {
|
|
16
|
-
return await refreshWithStoredToken(store, credentials, backendUrl, 'No access token stored.');
|
|
17
|
-
}
|
|
18
|
-
if (!isExpiring(credentials.accessTokenExpiresAt, EXPIRY_BUFFER_MS)) {
|
|
19
|
-
return { credentials, accessToken: credentials.accessToken };
|
|
20
|
-
}
|
|
21
|
-
return await refreshWithStoredToken(store, credentials, backendUrl, 'Access token expired.');
|
|
22
|
-
}
|
|
23
|
-
async function refreshWithStoredToken(store, credentials, backendUrl, reason) {
|
|
24
|
-
const refreshToken = credentials.refreshToken;
|
|
25
|
-
if (!refreshToken) {
|
|
26
|
-
throw new Error(`${reason} Refresh token unavailable. Please run \`omnara auth login\`.`);
|
|
27
|
-
}
|
|
28
|
-
if (credentials.refreshTokenExpiresAt && isExpiring(credentials.refreshTokenExpiresAt, 0)) {
|
|
29
|
-
throw new Error('Refresh token expired. Please run `omnara auth login`.');
|
|
30
|
-
}
|
|
31
|
-
const supabaseConfig = await (0, supabase_config_1.getSupabaseAuthConfig)(backendUrl);
|
|
32
|
-
const supabase = (0, supabase_client_1.buildSupabaseClient)(supabaseConfig);
|
|
33
|
-
const { data, error } = await supabase.auth.refreshSession({ refresh_token: refreshToken });
|
|
34
|
-
if (error || !data?.session) {
|
|
35
|
-
throw new Error(`${reason} Failed to refresh Supabase session: ${error?.message ?? 'unknown error'}.`);
|
|
36
|
-
}
|
|
37
|
-
const updated = applySession(credentials, data.session);
|
|
38
|
-
await store.save(updated);
|
|
39
|
-
if (!updated.accessToken) {
|
|
40
|
-
throw new Error('Supabase refresh completed without an access token.');
|
|
41
|
-
}
|
|
42
|
-
return { credentials: updated, accessToken: updated.accessToken };
|
|
43
|
-
}
|
|
44
|
-
function isExpiring(expiresAtIso, bufferMs) {
|
|
45
|
-
if (!expiresAtIso) {
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
const timestamp = Date.parse(expiresAtIso);
|
|
49
|
-
if (Number.isNaN(timestamp)) {
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
return timestamp - bufferMs <= Date.now();
|
|
53
|
-
}
|
|
54
|
-
function applySession(credentials, session) {
|
|
55
|
-
const expiresAt = deriveAccessExpiry(session);
|
|
56
|
-
return {
|
|
57
|
-
...credentials,
|
|
58
|
-
accessToken: session.access_token,
|
|
59
|
-
accessTokenExpiresAt: expiresAt,
|
|
60
|
-
refreshToken: session.refresh_token ?? credentials.refreshToken,
|
|
61
|
-
refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
function deriveAccessExpiry(session) {
|
|
65
|
-
if (session.expires_at) {
|
|
66
|
-
return new Date(session.expires_at * 1000).toISOString();
|
|
67
|
-
}
|
|
68
|
-
if (session.expires_in) {
|
|
69
|
-
return new Date(Date.now() + session.expires_in * 1000).toISOString();
|
|
70
|
-
}
|
|
71
|
-
return undefined;
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=credential-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/auth/credential-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.CredentialsStore = exports.DEFAULT_CREDENTIALS_PATH = void 0;
|
|
7
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
-
const os_1 = __importDefault(require("os"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const DEFAULT_DIR = path_1.default.join(os_1.default.homedir(), '.omnara');
|
|
11
|
-
exports.DEFAULT_CREDENTIALS_PATH = path_1.default.join(DEFAULT_DIR, 'credentials.json');
|
|
12
|
-
const DEFAULT_FILE_MODE = 0o600;
|
|
13
|
-
const DEFAULT_DIR_MODE = 0o700;
|
|
14
|
-
function isStoredCredentials(value) {
|
|
15
|
-
return Boolean(value) && typeof value === 'object';
|
|
16
|
-
}
|
|
17
|
-
class CredentialsStore {
|
|
18
|
-
constructor(filePath = exports.DEFAULT_CREDENTIALS_PATH) {
|
|
19
|
-
this.filePath = filePath;
|
|
20
|
-
}
|
|
21
|
-
async load() {
|
|
22
|
-
try {
|
|
23
|
-
const raw = await promises_1.default.readFile(this.filePath, 'utf8');
|
|
24
|
-
const parsed = JSON.parse(raw);
|
|
25
|
-
if (!isStoredCredentials(parsed)) {
|
|
26
|
-
throw new Error('File does not contain valid credentials data');
|
|
27
|
-
}
|
|
28
|
-
return parsed;
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
if (isFileNotFound(error)) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
throw new Error(`Failed to read credentials from ${this.filePath}: ${extractErrorMessage(error)}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async save(credentials) {
|
|
38
|
-
const payload = {
|
|
39
|
-
accessToken: credentials.accessToken,
|
|
40
|
-
accessTokenExpiresAt: credentials.accessTokenExpiresAt,
|
|
41
|
-
refreshToken: credentials.refreshToken,
|
|
42
|
-
refreshTokenExpiresAt: credentials.refreshTokenExpiresAt,
|
|
43
|
-
};
|
|
44
|
-
await promises_1.default.mkdir(path_1.default.dirname(this.filePath), { recursive: true, mode: DEFAULT_DIR_MODE });
|
|
45
|
-
const tempPath = `${this.filePath}.tmp`;
|
|
46
|
-
const serialized = JSON.stringify(payload, null, 2);
|
|
47
|
-
await promises_1.default.writeFile(tempPath, serialized, { mode: DEFAULT_FILE_MODE });
|
|
48
|
-
await promises_1.default.chmod(tempPath, DEFAULT_FILE_MODE);
|
|
49
|
-
await promises_1.default.rename(tempPath, this.filePath);
|
|
50
|
-
}
|
|
51
|
-
async clear() {
|
|
52
|
-
try {
|
|
53
|
-
await promises_1.default.unlink(this.filePath);
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
if (!isFileNotFound(error)) {
|
|
57
|
-
throw new Error(`Failed to remove credentials file ${this.filePath}: ${extractErrorMessage(error)}`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
exports.CredentialsStore = CredentialsStore;
|
|
63
|
-
function isFileNotFound(error) {
|
|
64
|
-
return Boolean(error &&
|
|
65
|
-
typeof error === 'object' &&
|
|
66
|
-
'code' in error &&
|
|
67
|
-
error.code === 'ENOENT');
|
|
68
|
-
}
|
|
69
|
-
function extractErrorMessage(error) {
|
|
70
|
-
if (error instanceof Error && error.message) {
|
|
71
|
-
return error.message;
|
|
72
|
-
}
|
|
73
|
-
return String(error);
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=credentials-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../../src/auth/credentials-store.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/login-flow.js
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.performVerificationLogin = performVerificationLogin;
|
|
4
|
-
exports.resolveBackendUrl = resolveBackendUrl;
|
|
5
|
-
exports.resolveFrontendUrl = resolveFrontendUrl;
|
|
6
|
-
exports.mergeCredentialsAfterExchange = mergeCredentialsAfterExchange;
|
|
7
|
-
exports.formatDuration = formatDuration;
|
|
8
|
-
const child_process_1 = require("child_process");
|
|
9
|
-
const api_client_1 = require("../http/api-client");
|
|
10
|
-
const prompt_1 = require("../utils/prompt");
|
|
11
|
-
const cli_auth_service_1 = require("./cli-auth-service");
|
|
12
|
-
const pkce_1 = require("./pkce");
|
|
13
|
-
const loopback_listener_1 = require("./loopback-listener");
|
|
14
|
-
async function performVerificationLogin({ backendUrlOption, frontendUrlOption, store, }) {
|
|
15
|
-
const backendUrl = resolveBackendUrl(backendUrlOption);
|
|
16
|
-
const frontendUrl = resolveFrontendUrl(frontendUrlOption);
|
|
17
|
-
const client = new api_client_1.ApiClient({ baseUrl: backendUrl });
|
|
18
|
-
console.log('\nAuthenticating CLI…');
|
|
19
|
-
const loopback = await loopback_listener_1.LoopbackListener.create();
|
|
20
|
-
const pkce = loopback ? (0, pkce_1.generatePkcePair)() : null;
|
|
21
|
-
const sessionOptions = {
|
|
22
|
-
frontendUrl,
|
|
23
|
-
};
|
|
24
|
-
if (loopback && pkce) {
|
|
25
|
-
sessionOptions.loopbackRedirectUri = loopback.redirectUri;
|
|
26
|
-
sessionOptions.loopbackState = loopback.state;
|
|
27
|
-
sessionOptions.pkceChallenge = pkce.challenge;
|
|
28
|
-
sessionOptions.pkceChallengeMethod = pkce.method;
|
|
29
|
-
}
|
|
30
|
-
const session = await (0, cli_auth_service_1.createCliAuthSession)(client, sessionOptions);
|
|
31
|
-
printSessionInstructions(session);
|
|
32
|
-
tryOpenBrowser(session.verificationUriComplete);
|
|
33
|
-
let completed = false;
|
|
34
|
-
let successLogged = false;
|
|
35
|
-
let latestCredentials = null;
|
|
36
|
-
const completeLogin = async (code, codeVerifier) => {
|
|
37
|
-
if (completed) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const exchange = await (0, cli_auth_service_1.exchangeCliCode)(client, session.sessionId, code, codeVerifier ? { codeVerifier } : {});
|
|
41
|
-
const updated = mergeCredentialsAfterExchange({
|
|
42
|
-
exchange,
|
|
43
|
-
});
|
|
44
|
-
await store.save(updated);
|
|
45
|
-
latestCredentials = updated;
|
|
46
|
-
if (!successLogged) {
|
|
47
|
-
console.log('\nLogin successful. Credentials saved.');
|
|
48
|
-
successLogged = true;
|
|
49
|
-
}
|
|
50
|
-
completed = true;
|
|
51
|
-
};
|
|
52
|
-
const loopbackTask = loopback && pkce
|
|
53
|
-
? waitForLoopback(loopback, session.sessionId, async (code) => {
|
|
54
|
-
await completeLogin(code, pkce.verifier);
|
|
55
|
-
if (typeof process.stdin.emit === 'function') {
|
|
56
|
-
process.stdin.emit('data', '\n');
|
|
57
|
-
}
|
|
58
|
-
})
|
|
59
|
-
: null;
|
|
60
|
-
if (!loopbackTask && !completed) {
|
|
61
|
-
console.log('\nWaiting for approval in the browser…');
|
|
62
|
-
}
|
|
63
|
-
while (!completed) {
|
|
64
|
-
const input = await (0, prompt_1.prompt)('\nFallback code if automatic login doesn\'t complete: ');
|
|
65
|
-
const cleaned = input.trim();
|
|
66
|
-
if (completed) {
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
if (!cleaned) {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
if (!/^[0-9]{6}$/.test(cleaned)) {
|
|
73
|
-
console.log('Codes must be exactly six digits.');
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
await completeLogin(cleaned);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
if (error instanceof api_client_1.ApiError) {
|
|
81
|
-
if (error.status === 401) {
|
|
82
|
-
console.log('Code not recognized. Double-check the digits shown in the browser.');
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
if (error.status === 409) {
|
|
86
|
-
console.log('Browser approval already completed. Finishing up…');
|
|
87
|
-
completed = true;
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
await loopback?.stop();
|
|
92
|
-
throw error;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
await loopback?.stop();
|
|
96
|
-
if (!latestCredentials) {
|
|
97
|
-
const stored = await store.load();
|
|
98
|
-
if (stored) {
|
|
99
|
-
latestCredentials = stored;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
throw new Error('Login completed but credentials were not stored.');
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return latestCredentials;
|
|
106
|
-
}
|
|
107
|
-
const DEFAULT_BACKEND_URL = 'https://omnara-voice.onrender.com/';
|
|
108
|
-
const DEFAULT_FRONTEND_URL = 'https://voice.omnara.com/';
|
|
109
|
-
function resolveBackendUrl(option) {
|
|
110
|
-
const candidate = option ?? process.env.OMNARA_BACKEND_URL ?? DEFAULT_BACKEND_URL;
|
|
111
|
-
return (0, api_client_1.normalizeBaseUrl)(candidate);
|
|
112
|
-
}
|
|
113
|
-
function resolveFrontendUrl(option) {
|
|
114
|
-
const candidate = option ?? process.env.OMNARA_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;
|
|
115
|
-
return (0, api_client_1.normalizeBaseUrl)(candidate);
|
|
116
|
-
}
|
|
117
|
-
function mergeCredentialsAfterExchange(args) {
|
|
118
|
-
const now = Date.now();
|
|
119
|
-
const accessExpiresAt = new Date(now + args.exchange.accessTokenExpiresIn * 1000).toISOString();
|
|
120
|
-
const refreshExpiresAt = new Date(now + args.exchange.refreshTokenExpiresIn * 1000).toISOString();
|
|
121
|
-
return {
|
|
122
|
-
accessToken: args.exchange.accessToken,
|
|
123
|
-
accessTokenExpiresAt: accessExpiresAt,
|
|
124
|
-
refreshToken: args.exchange.refreshToken,
|
|
125
|
-
refreshTokenExpiresAt: refreshExpiresAt,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
function formatDuration(ms) {
|
|
129
|
-
const totalSeconds = Math.round(ms / 1000);
|
|
130
|
-
if (totalSeconds < 60) {
|
|
131
|
-
return `${totalSeconds}s`;
|
|
132
|
-
}
|
|
133
|
-
const totalMinutes = Math.round(totalSeconds / 60);
|
|
134
|
-
if (totalMinutes < 60) {
|
|
135
|
-
const seconds = totalSeconds % 60;
|
|
136
|
-
return seconds > 0 ? `${totalMinutes}m ${seconds}s` : `${totalMinutes}m`;
|
|
137
|
-
}
|
|
138
|
-
const totalHours = Math.floor(totalMinutes / 60);
|
|
139
|
-
const minutes = totalMinutes % 60;
|
|
140
|
-
if (totalHours < 48) {
|
|
141
|
-
return minutes > 0 ? `${totalHours}h ${minutes}m` : `${totalHours}h`;
|
|
142
|
-
}
|
|
143
|
-
const totalDays = Math.floor(totalHours / 24);
|
|
144
|
-
const hours = totalDays % 24;
|
|
145
|
-
return hours > 0 ? `${totalDays}d ${hours}h` : `${totalDays}d`;
|
|
146
|
-
}
|
|
147
|
-
function reportLoopbackError(error) {
|
|
148
|
-
if (error instanceof api_client_1.ApiError) {
|
|
149
|
-
console.log(`Automatic login failed (HTTP ${error.status}). Paste the 6-digit code shown in the browser.`);
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
console.log(`Automatic login failed: ${extractErrorMessage(error)}`);
|
|
153
|
-
}
|
|
154
|
-
function printSessionInstructions(session) {
|
|
155
|
-
console.log('\nOpen this link in your browser if it did not open automatically:');
|
|
156
|
-
console.log(` ${session.verificationUriComplete}`);
|
|
157
|
-
console.log('Approve the request, then return to the CLI.');
|
|
158
|
-
}
|
|
159
|
-
function tryOpenBrowser(url) {
|
|
160
|
-
const command = process.platform === 'darwin'
|
|
161
|
-
? 'open'
|
|
162
|
-
: process.platform === 'win32'
|
|
163
|
-
? 'cmd'
|
|
164
|
-
: 'xdg-open';
|
|
165
|
-
const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
|
|
166
|
-
try {
|
|
167
|
-
const child = (0, child_process_1.spawn)(command, args, { stdio: 'ignore', detached: true });
|
|
168
|
-
child.unref();
|
|
169
|
-
}
|
|
170
|
-
catch {
|
|
171
|
-
// Ignore failures; user can open manually.
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
function extractErrorMessage(error) {
|
|
175
|
-
if (error instanceof Error && error.message) {
|
|
176
|
-
return error.message;
|
|
177
|
-
}
|
|
178
|
-
return String(error);
|
|
179
|
-
}
|
|
180
|
-
async function waitForLoopback(listener, sessionId, onCode) {
|
|
181
|
-
try {
|
|
182
|
-
const callback = await listener.waitForCallback();
|
|
183
|
-
if (callback.sessionId && callback.sessionId !== sessionId) {
|
|
184
|
-
console.log('Received browser callback for a different session.');
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
if (callback.state && callback.state !== listener.state) {
|
|
188
|
-
console.log('Received browser callback with unexpected state.');
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
try {
|
|
192
|
-
await onCode(callback.code);
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
reportLoopbackError(error);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
console.log(`Loopback listener error: ${extractErrorMessage(error)}`);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=login-flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-flow.js","sourceRoot":"","sources":["../../src/auth/login-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.LoopbackListener = void 0;
|
|
7
|
-
const http_1 = __importDefault(require("http"));
|
|
8
|
-
const crypto_1 = require("crypto");
|
|
9
|
-
const CALLBACK_PATH = '/callback';
|
|
10
|
-
const LISTEN_HOST = '127.0.0.1';
|
|
11
|
-
class LoopbackListener {
|
|
12
|
-
static async create() {
|
|
13
|
-
const listener = new LoopbackListener(generateState());
|
|
14
|
-
try {
|
|
15
|
-
await listener.start();
|
|
16
|
-
return listener;
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
await listener.stop().catch(() => undefined);
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
constructor(state) {
|
|
24
|
-
this.resolveCallback = null;
|
|
25
|
-
this.rejectCallback = null;
|
|
26
|
-
this.pending = null;
|
|
27
|
-
this.state = state;
|
|
28
|
-
this.redirectUri = '';
|
|
29
|
-
this.server = http_1.default.createServer((request, response) => {
|
|
30
|
-
void this.handleRequest(request, response);
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
async waitForCallback() {
|
|
34
|
-
if (this.pending) {
|
|
35
|
-
return this.pending;
|
|
36
|
-
}
|
|
37
|
-
this.pending = new Promise((resolve, reject) => {
|
|
38
|
-
this.resolveCallback = resolve;
|
|
39
|
-
this.rejectCallback = reject;
|
|
40
|
-
});
|
|
41
|
-
return this.pending;
|
|
42
|
-
}
|
|
43
|
-
async stop() {
|
|
44
|
-
if (!this.server.listening) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
await new Promise((resolve) => {
|
|
48
|
-
this.server.close(() => resolve());
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
async start() {
|
|
52
|
-
await new Promise((resolve, reject) => {
|
|
53
|
-
this.server.once('error', reject);
|
|
54
|
-
this.server.listen(0, LISTEN_HOST, () => {
|
|
55
|
-
this.server.removeListener('error', reject);
|
|
56
|
-
resolve();
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
const address = this.server.address();
|
|
60
|
-
if (!address || typeof address === 'string') {
|
|
61
|
-
throw new Error('Loopback listener failed to bind');
|
|
62
|
-
}
|
|
63
|
-
const { port } = address;
|
|
64
|
-
this.redirectUri = `http://${LISTEN_HOST}:${port}${CALLBACK_PATH}`;
|
|
65
|
-
}
|
|
66
|
-
async handleRequest(request, response) {
|
|
67
|
-
if (request.method !== 'GET' || !request.url) {
|
|
68
|
-
this.respond(response, 405, 'Method Not Allowed');
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const url = new URL(request.url, `http://${request.headers.host ?? LISTEN_HOST}`);
|
|
72
|
-
if (url.pathname !== CALLBACK_PATH) {
|
|
73
|
-
this.respond(response, 404, 'Not Found');
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const code = url.searchParams.get('code');
|
|
77
|
-
const sessionId = url.searchParams.get('session');
|
|
78
|
-
const state = url.searchParams.get('state');
|
|
79
|
-
if (!code) {
|
|
80
|
-
this.respond(response, 400, buildMessageHtml('Missing authorization code. Return to your CLI and try again.'));
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
this.respond(response, 200, buildSuccessHtml());
|
|
84
|
-
if (this.resolveCallback) {
|
|
85
|
-
this.resolveCallback({ code, sessionId, state });
|
|
86
|
-
this.resolveCallback = null;
|
|
87
|
-
this.rejectCallback = null;
|
|
88
|
-
}
|
|
89
|
-
void this.stop();
|
|
90
|
-
}
|
|
91
|
-
respond(response, status, body) {
|
|
92
|
-
response.writeHead(status, {
|
|
93
|
-
'content-type': 'text/html; charset=utf-8',
|
|
94
|
-
'cache-control': 'no-store',
|
|
95
|
-
});
|
|
96
|
-
response.end(body);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
exports.LoopbackListener = LoopbackListener;
|
|
100
|
-
function buildSuccessHtml() {
|
|
101
|
-
const redirectTarget = 'https://voice.omnara.com/dashboard';
|
|
102
|
-
return `<!doctype html>
|
|
103
|
-
<html lang="en">
|
|
104
|
-
<head>
|
|
105
|
-
<meta charset="utf-8" />
|
|
106
|
-
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
107
|
-
<meta http-equiv="refresh" content="3;url=${redirectTarget}" />
|
|
108
|
-
<title>Omnara CLI Login</title>
|
|
109
|
-
<style>
|
|
110
|
-
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }
|
|
111
|
-
.card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }
|
|
112
|
-
h1 { font-size: 1.5rem; margin-bottom: 0.75rem; }
|
|
113
|
-
p { margin: 0 0 0.75rem; line-height: 1.5; }
|
|
114
|
-
.note { font-size: 0.85rem; color: rgba(244,244,245,0.7); }
|
|
115
|
-
</style>
|
|
116
|
-
</head>
|
|
117
|
-
<body>
|
|
118
|
-
<div class="card">
|
|
119
|
-
<h1>Redirecting back to the CLI…</h1>
|
|
120
|
-
<p>Your authentication details were sent to the Omnara CLI. Return to your terminal to continue.</p>
|
|
121
|
-
<p class="note">If this page doesn't close automatically, you can manually open the Omnara dashboard.</p>
|
|
122
|
-
</div>
|
|
123
|
-
</body>
|
|
124
|
-
</html>`;
|
|
125
|
-
}
|
|
126
|
-
function generateState() {
|
|
127
|
-
return base64UrlEncode((0, crypto_1.randomBytes)(32));
|
|
128
|
-
}
|
|
129
|
-
function base64UrlEncode(input) {
|
|
130
|
-
const buffer = typeof input === 'string' ? Buffer.from(input, 'utf8') : Buffer.from(input);
|
|
131
|
-
return buffer
|
|
132
|
-
.toString('base64')
|
|
133
|
-
.replace(/\+/g, '-')
|
|
134
|
-
.replace(/\//g, '_')
|
|
135
|
-
.replace(/=+$/g, '');
|
|
136
|
-
}
|
|
137
|
-
function buildMessageHtml(message) {
|
|
138
|
-
return `<!doctype html>
|
|
139
|
-
<html lang="en">
|
|
140
|
-
<head>
|
|
141
|
-
<meta charset="utf-8" />
|
|
142
|
-
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
143
|
-
<title>Omnara CLI Login</title>
|
|
144
|
-
<style>
|
|
145
|
-
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }
|
|
146
|
-
.card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }
|
|
147
|
-
h1 { font-size: 1.4rem; margin-bottom: 0.75rem; }
|
|
148
|
-
p { margin: 0; line-height: 1.6; }
|
|
149
|
-
</style>
|
|
150
|
-
</head>
|
|
151
|
-
<body>
|
|
152
|
-
<div class="card">
|
|
153
|
-
<h1>Omnara CLI Login</h1>
|
|
154
|
-
<p>${message}</p>
|
|
155
|
-
</div>
|
|
156
|
-
</body>
|
|
157
|
-
</html>`;
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=loopback-listener.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loopback-listener.js","sourceRoot":"","sources":["../../src/auth/loopback-listener.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/pkce.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generatePkcePair = generatePkcePair;
|
|
4
|
-
const crypto_1 = require("crypto");
|
|
5
|
-
function generatePkcePair() {
|
|
6
|
-
const verifier = base64UrlEncode((0, crypto_1.randomBytes)(32));
|
|
7
|
-
const challenge = base64UrlEncode((0, crypto_1.createHash)('sha256').update(verifier).digest());
|
|
8
|
-
return { verifier, challenge, method: 'S256' };
|
|
9
|
-
}
|
|
10
|
-
function base64UrlEncode(input) {
|
|
11
|
-
const buffer = typeof input === 'string' ? Buffer.from(input, 'utf8') : Buffer.from(input);
|
|
12
|
-
return buffer
|
|
13
|
-
.toString('base64')
|
|
14
|
-
.replace(/\+/g, '-')
|
|
15
|
-
.replace(/\//g, '_')
|
|
16
|
-
.replace(/=+$/g, '');
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=pkce.js.map
|
package/dist/auth/pkce.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/auth/pkce.ts"],"names":[],"mappings":";;AAQA,4CAIC;AAZD,mCAAiD;AAQjD,SAAgB,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,eAAe,CAAC,KAAmC;IAC1D,MAAM,MAAM,GACV,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAA4B,CAAC,CAAC;IACrG,OAAO,MAAM;SACV,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildSupabaseClient = buildSupabaseClient;
|
|
4
|
-
const supabase_js_1 = require("@supabase/supabase-js");
|
|
5
|
-
function buildSupabaseClient(config) {
|
|
6
|
-
return (0, supabase_js_1.createClient)(config.url, config.anonKey, {
|
|
7
|
-
auth: {
|
|
8
|
-
persistSession: false,
|
|
9
|
-
detectSessionInUrl: false,
|
|
10
|
-
},
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=supabase-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-client.js","sourceRoot":"","sources":["../../src/auth/supabase-client.ts"],"names":[],"mappings":";;AAIA,kDAOC;AAXD,uDAA0E;AAI1E,SAAgB,mBAAmB,CAAC,MAA0B;IAC5D,OAAO,IAAA,0BAAY,EAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE;QAC9C,IAAI,EAAE;YACJ,cAAc,EAAE,KAAK;YACrB,kBAAkB,EAAE,KAAK;SAC1B;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSupabaseAuthConfig = getSupabaseAuthConfig;
|
|
4
|
-
const api_client_1 = require("../http/api-client");
|
|
5
|
-
const CACHE = new Map();
|
|
6
|
-
async function getSupabaseAuthConfig(baseUrl) {
|
|
7
|
-
const normalized = normalizeBaseUrl(baseUrl);
|
|
8
|
-
const cached = CACHE.get(normalized);
|
|
9
|
-
if (cached) {
|
|
10
|
-
return cached;
|
|
11
|
-
}
|
|
12
|
-
const client = new api_client_1.ApiClient({ baseUrl: normalized });
|
|
13
|
-
const response = await client.getJson('/api/v1/auth/config');
|
|
14
|
-
const config = {
|
|
15
|
-
url: response.supabase_url,
|
|
16
|
-
anonKey: response.supabase_anon_key,
|
|
17
|
-
};
|
|
18
|
-
CACHE.set(normalized, config);
|
|
19
|
-
return config;
|
|
20
|
-
}
|
|
21
|
-
function normalizeBaseUrl(raw) {
|
|
22
|
-
return raw.endsWith('/') ? raw : `${raw}/`;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=supabase-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-config.js","sourceRoot":"","sources":["../../src/auth/supabase-config.ts"],"names":[],"mappings":";;AAcA,sDAeC;AA7BD,mDAA+C;AAY/C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;AAE7C,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAyB,qBAAqB,CAAC,CAAC;IACrF,MAAM,MAAM,GAAuB;QACjC,GAAG,EAAE,QAAQ,CAAC,YAAY;QAC1B,OAAO,EAAE,QAAQ,CAAC,iBAAiB;KACpC,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AAC7C,CAAC"}
|