copilotkit 0.0.3 → 0.0.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/README.md +40 -2
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +8 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +5 -0
- package/dist/commands/base-command.d.ts +11 -0
- package/dist/commands/base-command.js +70 -0
- package/dist/commands/base-command.js.map +1 -0
- package/dist/commands/dev.d.ts +25 -0
- package/dist/commands/dev.js +591 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/login.d.ts +13 -0
- package/dist/commands/login.js +306 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +13 -0
- package/dist/commands/logout.js +309 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/services/analytics.service.d.ts +25 -0
- package/dist/services/analytics.service.js +75 -0
- package/dist/services/analytics.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +23 -0
- package/dist/services/auth.service.js +226 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/events.d.ts +31 -0
- package/dist/services/events.js +1 -0
- package/dist/services/events.js.map +1 -0
- package/dist/services/tunnel.service.d.ts +15 -0
- package/dist/services/tunnel.service.js +17 -0
- package/dist/services/tunnel.service.js.map +1 -0
- package/dist/utils/detect-endpoint-type.utils.d.ts +13 -0
- package/dist/utils/detect-endpoint-type.utils.js +117 -0
- package/dist/utils/detect-endpoint-type.utils.js.map +1 -0
- package/dist/utils/trpc.d.ts +4 -0
- package/dist/utils/trpc.js +25 -0
- package/dist/utils/trpc.js.map +1 -0
- package/dist/utils/version.d.ts +3 -0
- package/dist/utils/version.js +6 -0
- package/dist/utils/version.js.map +1 -0
- package/oclif.manifest.json +106 -0
- package/package.json +90 -84
- package/LICENSE +0 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/commands/logout.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import {Config} from '@oclif/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\n\nimport {AuthService} from '../services/auth.service.js'\nimport { BaseCommand } from './base-command.js'\n\nexport default class CloudLogout extends BaseCommand {\n static override description = 'Authenticate with Copilot Cloud'\n\n static override examples = ['<%= config.bin %> logout']\n\n constructor(argv: string[], config: Config, private authService = new AuthService()) {\n super(argv, config)\n }\n\n public async run(): Promise<void> {\n await this.parse(CloudLogout)\n const spinner = ora('Logging out...\\n').start()\n await this.authService.logout();\n spinner.succeed(chalk.green('Successfully logged out!'))\n spinner.stop();\n }\n}\n","// @ts-ignore\nimport Conf from 'conf'\nimport cors from 'cors'\nimport express from 'express'\nimport crypto from 'node:crypto'\nimport open from 'open'\nimport getPort from 'get-port'\nimport ora from 'ora'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport {Command} from '@oclif/core'\nimport {createTRPCClient} from '../utils/trpc.js'\nimport { AnalyticsService } from '../services/analytics.service.js'\n\ninterface LoginResponse {\n cliToken: string\n user: {\n email: string\n id: string\n }\n organization: {\n id: string\n }\n}\n\nexport class AuthService {\n private readonly config = new Conf({projectName: 'CopilotKitCLI'})\n private readonly COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\n getToken(): string | undefined {\n return this.config.get('cliToken') as string | undefined\n }\n\n getCLIToken(): string | undefined {\n const cliToken = this.config.get('cliToken') as string | undefined\n return cliToken\n }\n\n async logout(): Promise<void> {\n const cliToken = this.getCLIToken();\n \n if (!cliToken) {\n throw new Error('You are not logged in');\n }\n\n const trpcClient = createTRPCClient(cliToken)\n const me = await trpcClient.me.query()\n\n const analytics = new AnalyticsService({ userId: me.user!.id, organizationId: me.organization!.id, email: me.user!.email });\n \n this.config.delete('cliToken')\n \n analytics.track({\n event: \"cli.logout\",\n properties: {\n organizationId: me.organization!.id,\n userId: me.user!.id,\n email: me.user!.email,\n }\n });\n }\n\n async requireLogin(cmd: Command): Promise<LoginResponse> {\n let cliToken = this.getCLIToken()\n\n // Check authentication\n if (!cliToken) {\n try {\n const {shouldLogin} = await inquirer.prompt([\n {\n name: 'shouldLogin',\n type: 'confirm',\n message: 'You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)',\n default: true,\n },\n ])\n\n if (shouldLogin) {\n const loginResult = await this.login()\n cliToken = loginResult.cliToken\n cmd.log(`🪁 Logged in as ${chalk.hex('#7553fc')(loginResult.user.email)}\\n`)\n return loginResult\n } else {\n cmd.error('Authentication required to proceed.')\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n cmd.error(chalk.yellow('\\nAuthentication cancelled'))\n }\n\n throw error\n }\n }\n\n let me;\n\n const trpcClient = createTRPCClient(cliToken)\n try {\n me = await trpcClient.me.query()\n } catch (error) {\n cmd.log(chalk.red(\"Could not authenticate with Copilot Cloud. Please try again.\"))\n process.exit(1)\n }\n\n if (!me.organization || !me.user) {\n cmd.error('Authentication required to proceed.')\n }\n\n return {cliToken, user: me.user, organization: me.organization}\n }\n\n async login(): Promise<LoginResponse> {\n let analytics: AnalyticsService;\n analytics = new AnalyticsService();\n\n const app = express()\n app.use(cors())\n app.use(express.urlencoded({extended: true}))\n app.use(express.json())\n\n const port = await getPort()\n const state = crypto.randomBytes(16).toString('hex')\n\n return new Promise((resolve) => {\n const server = app.listen(port, () => {})\n\n analytics.track({\n event: \"cli.login.initiated\",\n properties: {}\n });\n\n const spinner = ora('Waiting for browser authentication to complete...\\n').start()\n\n app.post('/callback', async (req, res) => {\n const {cliToken, user, organization} = req.body\n\n analytics = new AnalyticsService({ userId: user.id, organizationId: organization.id, email: user.email });\n analytics.track({\n event: \"cli.login.success\",\n properties: {\n organizationId: organization.id,\n userId: user.id,\n email: user.email,\n }\n });\n\n if (state !== req.query.state) {\n res.status(401).json({message: 'Invalid state'})\n spinner.fail('Invalid state')\n return\n }\n\n this.config.set('cliToken', cliToken)\n res.status(200).json({message: 'Callback called'})\n spinner.succeed(`🪁 Successfully logged in as ${chalk.hex('#7553fc')(user.email)}\\n`)\n server.close()\n resolve({\n cliToken,\n organization,\n user,\n })\n })\n\n open(`${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`)\n })\n }\n}\n","import {createTRPCClient as createTRPClient_, unstable_httpBatchStreamLink} from '@trpc/client'\nimport type {CLIRouter} from '@repo/trpc-cli'\nimport superjson from 'superjson'\n\nexport const COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\nexport function createTRPCClient(cliToken: string) {\n return createTRPClient_<CLIRouter>({\n links: [\n unstable_httpBatchStreamLink({\n transformer: superjson,\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n headers: () => {\n const headers = new Headers()\n headers.set('x-trpc-source', 'cli')\n headers.set('x-cli-token', cliToken)\n return headers\n },\n }),\n ],\n })\n}\n","import {Analytics} from '@segment/analytics-node'\nimport {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | undefined\n private globalProperties: Record<string, any> = {}\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({projectName: 'CopilotKitCLI'})\n\n constructor(private readonly authData?: {\n userId: string,\n email: string,\n organizationId: string,\n }) {\n if (process.env.SEGMENT_DISABLED === 'true') {\n return;\n }\n\n const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\"\n\n this.globalProperties = {\n service: 'cli',\n }\n\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email\n this.globalProperties.email = this.authData.email\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === 'true',\n })\n\n const config = new Conf({projectName: 'CopilotKitCLI'})\n if (!config.get('anonymousId')) {\n config.set('anonymousId', crypto.randomUUID())\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get('anonymousId')\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID()\n this.config.set('anonymousId', anonymousId)\n return anonymousId\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics['track']>[0], 'userId'> & {\n event: K\n properties: AnalyticsEvents[K]\n },\n ): void {\n if (!this.segment) {\n return;\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId ? {\n segment_group: this.organizationId,\n } : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n }\n\n this.segment.track(payload)\n }\n}\n","import { Command } from \"@oclif/core\";\nimport Sentry, { consoleIntegration } from \"@sentry/node\";\nimport { LIB_VERSION } from \"../utils/version.js\";\nimport { COPILOT_CLOUD_BASE_URL } from \"../utils/trpc.js\";\nimport chalk from \"chalk\";\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion();\n\n if (process.env.SENTRY_DISABLED === 'true') {\n return;\n }\n\n Sentry.init({\n dsn: process.env.SENTRY_DSN || \"https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120\",\n integrations: [\n consoleIntegration(),\n ],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n });\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED === 'true') {\n super.catch(err)\n return;\n }\n\n Sentry.captureException(err)\n super.catch(err)\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === 'true') {\n return;\n }\n\n Sentry.close()\n }\n \n async run() {}\n\n async checkCLIVersion() {\n const response = await fetch(`${COPILOT_CLOUD_BASE_URL}/api/healthz`)\n const data = await response.json()\n const cloudVersion = data.cliVersion\n\n if (cloudVersion === LIB_VERSION) {\n return;\n }\n\n this.log(chalk.yellow('================ New version available! =================\\n'))\n this.log(`A new CopilotKit CLI version is available (${LIB_VERSION}).\\n`)\n this.log('Please update your CLI to the latest version:\\n\\n')\n this.log(`${chalk.cyan(chalk.underline(chalk.bold('npm:')))}\\t npm install -g copilotkit@${LIB_VERSION}\\n`)\n this.log(`${chalk.cyan(chalk.underline(chalk.bold('pnpm:')))}\\t pnpm install -g copilotkit@${LIB_VERSION}\\n`)\n this.log(`${chalk.cyan(chalk.underline(chalk.bold('yarn:')))}\\t yarn global add copilotkit@${LIB_VERSION}\\n`)\n\n process.exit(0)\n }\n}\n","// This is auto generated!\nexport const LIB_VERSION = \"0.0.5\";\n"],"mappings":"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","names":["chalk","ora","Conf","crypto","anonymousId","Conf","crypto","chalk","ora","chalk"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { run } from '@oclif/core';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {run} from '@oclif/core'\n"],"mappings":";AAAA,SAAQ,WAAU;","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Analytics } from '@segment/analytics-node';
|
|
2
|
+
import { AnalyticsEvents } from './events.js';
|
|
3
|
+
import '../utils/detect-endpoint-type.utils.js';
|
|
4
|
+
|
|
5
|
+
declare class AnalyticsService {
|
|
6
|
+
private readonly authData?;
|
|
7
|
+
private segment;
|
|
8
|
+
private globalProperties;
|
|
9
|
+
private userId;
|
|
10
|
+
private email;
|
|
11
|
+
private organizationId;
|
|
12
|
+
private config;
|
|
13
|
+
constructor(authData?: {
|
|
14
|
+
userId: string;
|
|
15
|
+
email: string;
|
|
16
|
+
organizationId: string;
|
|
17
|
+
} | undefined);
|
|
18
|
+
private getAnonymousId;
|
|
19
|
+
track<K extends keyof AnalyticsEvents>(event: Omit<Parameters<Analytics['track']>[0], 'userId'> & {
|
|
20
|
+
event: K;
|
|
21
|
+
properties: AnalyticsEvents[K];
|
|
22
|
+
}): void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { AnalyticsService };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// src/services/analytics.service.ts
|
|
2
|
+
import { Analytics } from "@segment/analytics-node";
|
|
3
|
+
import Conf from "conf";
|
|
4
|
+
var AnalyticsService = class {
|
|
5
|
+
constructor(authData) {
|
|
6
|
+
this.authData = authData;
|
|
7
|
+
if (process.env.SEGMENT_DISABLED === "true") {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || "9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf";
|
|
11
|
+
this.globalProperties = {
|
|
12
|
+
service: "cli"
|
|
13
|
+
};
|
|
14
|
+
if (this.authData?.userId) {
|
|
15
|
+
this.userId = this.authData.userId;
|
|
16
|
+
}
|
|
17
|
+
if (this.authData?.email) {
|
|
18
|
+
this.email = this.authData.email;
|
|
19
|
+
this.globalProperties.email = this.authData.email;
|
|
20
|
+
}
|
|
21
|
+
if (this.authData?.organizationId) {
|
|
22
|
+
this.organizationId = this.authData.organizationId;
|
|
23
|
+
}
|
|
24
|
+
this.segment = new Analytics({
|
|
25
|
+
writeKey: segmentWriteKey,
|
|
26
|
+
disable: process.env.SEGMENT_DISABLE === "true"
|
|
27
|
+
});
|
|
28
|
+
const config = new Conf({ projectName: "CopilotKitCLI" });
|
|
29
|
+
if (!config.get("anonymousId")) {
|
|
30
|
+
config.set("anonymousId", crypto.randomUUID());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
segment;
|
|
34
|
+
globalProperties = {};
|
|
35
|
+
userId;
|
|
36
|
+
email;
|
|
37
|
+
organizationId;
|
|
38
|
+
config = new Conf({ projectName: "CopilotKitCLI" });
|
|
39
|
+
getAnonymousId() {
|
|
40
|
+
const anonymousId = this.config.get("anonymousId");
|
|
41
|
+
if (!anonymousId) {
|
|
42
|
+
const anonymousId2 = crypto.randomUUID();
|
|
43
|
+
this.config.set("anonymousId", anonymousId2);
|
|
44
|
+
return anonymousId2;
|
|
45
|
+
}
|
|
46
|
+
return anonymousId;
|
|
47
|
+
}
|
|
48
|
+
track(event) {
|
|
49
|
+
if (!this.segment) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const payload = {
|
|
53
|
+
userId: this.userId ? this.userId : void 0,
|
|
54
|
+
email: this.email ? this.email : void 0,
|
|
55
|
+
anonymousId: this.getAnonymousId(),
|
|
56
|
+
event: event.event,
|
|
57
|
+
properties: {
|
|
58
|
+
...this.globalProperties,
|
|
59
|
+
...event.properties,
|
|
60
|
+
$groups: this.organizationId ? {
|
|
61
|
+
segment_group: this.organizationId
|
|
62
|
+
} : void 0,
|
|
63
|
+
eventProperties: {
|
|
64
|
+
...event.properties,
|
|
65
|
+
...this.globalProperties
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
this.segment.track(payload);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
export {
|
|
73
|
+
AnalyticsService
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=analytics.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/analytics.service.ts"],"sourcesContent":["import {Analytics} from '@segment/analytics-node'\nimport {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | undefined\n private globalProperties: Record<string, any> = {}\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({projectName: 'CopilotKitCLI'})\n\n constructor(private readonly authData?: {\n userId: string,\n email: string,\n organizationId: string,\n }) {\n if (process.env.SEGMENT_DISABLED === 'true') {\n return;\n }\n\n const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\"\n\n this.globalProperties = {\n service: 'cli',\n }\n\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email\n this.globalProperties.email = this.authData.email\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === 'true',\n })\n\n const config = new Conf({projectName: 'CopilotKitCLI'})\n if (!config.get('anonymousId')) {\n config.set('anonymousId', crypto.randomUUID())\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get('anonymousId')\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID()\n this.config.set('anonymousId', anonymousId)\n return anonymousId\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics['track']>[0], 'userId'> & {\n event: K\n properties: AnalyticsEvents[K]\n },\n ): void {\n if (!this.segment) {\n return;\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId ? {\n segment_group: this.organizationId,\n } : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n }\n\n this.segment.track(payload)\n }\n}\n"],"mappings":";AAAA,SAAQ,iBAAgB;AAExB,OAAO,UAAU;AAEV,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,YAA6B,UAI1B;AAJ0B;AAK3B,QAAI,QAAQ,IAAI,qBAAqB,QAAQ;AAC3C;AAAA,IACF;AAEA,UAAM,kBAAkB,QAAQ,IAAI,qBAAqB;AAEzD,SAAK,mBAAmB;AAAA,MACtB,SAAS;AAAA,IACX;AAGA,QAAI,KAAK,UAAU,QAAQ;AACzB,WAAK,SAAS,KAAK,SAAS;AAAA,IAC9B;AAEA,QAAI,KAAK,UAAU,OAAO;AACxB,WAAK,QAAQ,KAAK,SAAS;AAC3B,WAAK,iBAAiB,QAAQ,KAAK,SAAS;AAAA,IAC9C;AAEA,QAAI,KAAK,UAAU,gBAAgB;AACjC,WAAK,iBAAiB,KAAK,SAAS;AAAA,IACtC;AAEA,SAAK,UAAU,IAAI,UAAU;AAAA,MAC3B,UAAU;AAAA,MACV,SAAS,QAAQ,IAAI,oBAAoB;AAAA,IAC3C,CAAC;AAED,UAAM,SAAS,IAAI,KAAK,EAAC,aAAa,gBAAe,CAAC;AACtD,QAAI,CAAC,OAAO,IAAI,aAAa,GAAG;AAC9B,aAAO,IAAI,eAAe,OAAO,WAAW,CAAC;AAAA,IAC/C;AAAA,EACF;AAAA,EA7CQ;AAAA,EACA,mBAAwC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,IAAI,KAAK,EAAC,aAAa,gBAAe,CAAC;AAAA,EA0ChD,iBAAyB;AAC/B,UAAM,cAAc,KAAK,OAAO,IAAI,aAAa;AACjD,QAAI,CAAC,aAAa;AAChB,YAAMA,eAAc,OAAO,WAAW;AACtC,WAAK,OAAO,IAAI,eAAeA,YAAW;AAC1C,aAAOA;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,MACL,OAIM;AACN,QAAI,CAAC,KAAK,SAAS;AACjB;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd,QAAQ,KAAK,SAAS,KAAK,SAAS;AAAA,MACpC,OAAO,KAAK,QAAQ,KAAK,QAAQ;AAAA,MACjC,aAAa,KAAK,eAAe;AAAA,MACjC,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,QACV,GAAG,KAAK;AAAA,QACR,GAAG,MAAM;AAAA,QACT,SAAS,KAAK,iBAAiB;AAAA,UAC7B,eAAe,KAAK;AAAA,QACtB,IAAI;AAAA,QACJ,iBAAiB;AAAA,UACf,GAAG,MAAM;AAAA,UACT,GAAG,KAAK;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,SAAK,QAAQ,MAAM,OAAO;AAAA,EAC5B;AACF;","names":["anonymousId"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
|
|
3
|
+
interface LoginResponse {
|
|
4
|
+
cliToken: string;
|
|
5
|
+
user: {
|
|
6
|
+
email: string;
|
|
7
|
+
id: string;
|
|
8
|
+
};
|
|
9
|
+
organization: {
|
|
10
|
+
id: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
declare class AuthService {
|
|
14
|
+
private readonly config;
|
|
15
|
+
private readonly COPILOT_CLOUD_BASE_URL;
|
|
16
|
+
getToken(): string | undefined;
|
|
17
|
+
getCLIToken(): string | undefined;
|
|
18
|
+
logout(): Promise<void>;
|
|
19
|
+
requireLogin(cmd: Command): Promise<LoginResponse>;
|
|
20
|
+
login(): Promise<LoginResponse>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { AuthService };
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// src/services/auth.service.ts
|
|
2
|
+
import Conf2 from "conf";
|
|
3
|
+
import cors from "cors";
|
|
4
|
+
import express from "express";
|
|
5
|
+
import crypto2 from "node:crypto";
|
|
6
|
+
import open from "open";
|
|
7
|
+
import getPort from "get-port";
|
|
8
|
+
import ora from "ora";
|
|
9
|
+
import chalk from "chalk";
|
|
10
|
+
import inquirer from "inquirer";
|
|
11
|
+
|
|
12
|
+
// src/utils/trpc.ts
|
|
13
|
+
import { createTRPCClient as createTRPClient_, unstable_httpBatchStreamLink } from "@trpc/client";
|
|
14
|
+
import superjson from "superjson";
|
|
15
|
+
var COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || "https://cloud.copilotkit.ai";
|
|
16
|
+
function createTRPCClient(cliToken) {
|
|
17
|
+
return createTRPClient_({
|
|
18
|
+
links: [
|
|
19
|
+
unstable_httpBatchStreamLink({
|
|
20
|
+
transformer: superjson,
|
|
21
|
+
url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,
|
|
22
|
+
headers: () => {
|
|
23
|
+
const headers = new Headers();
|
|
24
|
+
headers.set("x-trpc-source", "cli");
|
|
25
|
+
headers.set("x-cli-token", cliToken);
|
|
26
|
+
return headers;
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// src/services/analytics.service.ts
|
|
34
|
+
import { Analytics } from "@segment/analytics-node";
|
|
35
|
+
import Conf from "conf";
|
|
36
|
+
var AnalyticsService = class {
|
|
37
|
+
constructor(authData) {
|
|
38
|
+
this.authData = authData;
|
|
39
|
+
if (process.env.SEGMENT_DISABLED === "true") {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || "9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf";
|
|
43
|
+
this.globalProperties = {
|
|
44
|
+
service: "cli"
|
|
45
|
+
};
|
|
46
|
+
if (this.authData?.userId) {
|
|
47
|
+
this.userId = this.authData.userId;
|
|
48
|
+
}
|
|
49
|
+
if (this.authData?.email) {
|
|
50
|
+
this.email = this.authData.email;
|
|
51
|
+
this.globalProperties.email = this.authData.email;
|
|
52
|
+
}
|
|
53
|
+
if (this.authData?.organizationId) {
|
|
54
|
+
this.organizationId = this.authData.organizationId;
|
|
55
|
+
}
|
|
56
|
+
this.segment = new Analytics({
|
|
57
|
+
writeKey: segmentWriteKey,
|
|
58
|
+
disable: process.env.SEGMENT_DISABLE === "true"
|
|
59
|
+
});
|
|
60
|
+
const config = new Conf({ projectName: "CopilotKitCLI" });
|
|
61
|
+
if (!config.get("anonymousId")) {
|
|
62
|
+
config.set("anonymousId", crypto.randomUUID());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
segment;
|
|
66
|
+
globalProperties = {};
|
|
67
|
+
userId;
|
|
68
|
+
email;
|
|
69
|
+
organizationId;
|
|
70
|
+
config = new Conf({ projectName: "CopilotKitCLI" });
|
|
71
|
+
getAnonymousId() {
|
|
72
|
+
const anonymousId = this.config.get("anonymousId");
|
|
73
|
+
if (!anonymousId) {
|
|
74
|
+
const anonymousId2 = crypto.randomUUID();
|
|
75
|
+
this.config.set("anonymousId", anonymousId2);
|
|
76
|
+
return anonymousId2;
|
|
77
|
+
}
|
|
78
|
+
return anonymousId;
|
|
79
|
+
}
|
|
80
|
+
track(event) {
|
|
81
|
+
if (!this.segment) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const payload = {
|
|
85
|
+
userId: this.userId ? this.userId : void 0,
|
|
86
|
+
email: this.email ? this.email : void 0,
|
|
87
|
+
anonymousId: this.getAnonymousId(),
|
|
88
|
+
event: event.event,
|
|
89
|
+
properties: {
|
|
90
|
+
...this.globalProperties,
|
|
91
|
+
...event.properties,
|
|
92
|
+
$groups: this.organizationId ? {
|
|
93
|
+
segment_group: this.organizationId
|
|
94
|
+
} : void 0,
|
|
95
|
+
eventProperties: {
|
|
96
|
+
...event.properties,
|
|
97
|
+
...this.globalProperties
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
this.segment.track(payload);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// src/services/auth.service.ts
|
|
106
|
+
var AuthService = class {
|
|
107
|
+
config = new Conf2({ projectName: "CopilotKitCLI" });
|
|
108
|
+
COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || "https://cloud.copilotkit.ai";
|
|
109
|
+
getToken() {
|
|
110
|
+
return this.config.get("cliToken");
|
|
111
|
+
}
|
|
112
|
+
getCLIToken() {
|
|
113
|
+
const cliToken = this.config.get("cliToken");
|
|
114
|
+
return cliToken;
|
|
115
|
+
}
|
|
116
|
+
async logout() {
|
|
117
|
+
const cliToken = this.getCLIToken();
|
|
118
|
+
if (!cliToken) {
|
|
119
|
+
throw new Error("You are not logged in");
|
|
120
|
+
}
|
|
121
|
+
const trpcClient = createTRPCClient(cliToken);
|
|
122
|
+
const me = await trpcClient.me.query();
|
|
123
|
+
const analytics = new AnalyticsService({ userId: me.user.id, organizationId: me.organization.id, email: me.user.email });
|
|
124
|
+
this.config.delete("cliToken");
|
|
125
|
+
analytics.track({
|
|
126
|
+
event: "cli.logout",
|
|
127
|
+
properties: {
|
|
128
|
+
organizationId: me.organization.id,
|
|
129
|
+
userId: me.user.id,
|
|
130
|
+
email: me.user.email
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
async requireLogin(cmd) {
|
|
135
|
+
let cliToken = this.getCLIToken();
|
|
136
|
+
if (!cliToken) {
|
|
137
|
+
try {
|
|
138
|
+
const { shouldLogin } = await inquirer.prompt([
|
|
139
|
+
{
|
|
140
|
+
name: "shouldLogin",
|
|
141
|
+
type: "confirm",
|
|
142
|
+
message: "You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)",
|
|
143
|
+
default: true
|
|
144
|
+
}
|
|
145
|
+
]);
|
|
146
|
+
if (shouldLogin) {
|
|
147
|
+
const loginResult = await this.login();
|
|
148
|
+
cliToken = loginResult.cliToken;
|
|
149
|
+
cmd.log(`\u{1FA81} Logged in as ${chalk.hex("#7553fc")(loginResult.user.email)}
|
|
150
|
+
`);
|
|
151
|
+
return loginResult;
|
|
152
|
+
} else {
|
|
153
|
+
cmd.error("Authentication required to proceed.");
|
|
154
|
+
}
|
|
155
|
+
} catch (error) {
|
|
156
|
+
if (error instanceof Error && error.name === "ExitPromptError") {
|
|
157
|
+
cmd.error(chalk.yellow("\nAuthentication cancelled"));
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let me;
|
|
163
|
+
const trpcClient = createTRPCClient(cliToken);
|
|
164
|
+
try {
|
|
165
|
+
me = await trpcClient.me.query();
|
|
166
|
+
} catch (error) {
|
|
167
|
+
cmd.log(chalk.red("Could not authenticate with Copilot Cloud. Please try again."));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
if (!me.organization || !me.user) {
|
|
171
|
+
cmd.error("Authentication required to proceed.");
|
|
172
|
+
}
|
|
173
|
+
return { cliToken, user: me.user, organization: me.organization };
|
|
174
|
+
}
|
|
175
|
+
async login() {
|
|
176
|
+
let analytics;
|
|
177
|
+
analytics = new AnalyticsService();
|
|
178
|
+
const app = express();
|
|
179
|
+
app.use(cors());
|
|
180
|
+
app.use(express.urlencoded({ extended: true }));
|
|
181
|
+
app.use(express.json());
|
|
182
|
+
const port = await getPort();
|
|
183
|
+
const state = crypto2.randomBytes(16).toString("hex");
|
|
184
|
+
return new Promise((resolve) => {
|
|
185
|
+
const server = app.listen(port, () => {
|
|
186
|
+
});
|
|
187
|
+
analytics.track({
|
|
188
|
+
event: "cli.login.initiated",
|
|
189
|
+
properties: {}
|
|
190
|
+
});
|
|
191
|
+
const spinner = ora("Waiting for browser authentication to complete...\n").start();
|
|
192
|
+
app.post("/callback", async (req, res) => {
|
|
193
|
+
const { cliToken, user, organization } = req.body;
|
|
194
|
+
analytics = new AnalyticsService({ userId: user.id, organizationId: organization.id, email: user.email });
|
|
195
|
+
analytics.track({
|
|
196
|
+
event: "cli.login.success",
|
|
197
|
+
properties: {
|
|
198
|
+
organizationId: organization.id,
|
|
199
|
+
userId: user.id,
|
|
200
|
+
email: user.email
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
if (state !== req.query.state) {
|
|
204
|
+
res.status(401).json({ message: "Invalid state" });
|
|
205
|
+
spinner.fail("Invalid state");
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this.config.set("cliToken", cliToken);
|
|
209
|
+
res.status(200).json({ message: "Callback called" });
|
|
210
|
+
spinner.succeed(`\u{1FA81} Successfully logged in as ${chalk.hex("#7553fc")(user.email)}
|
|
211
|
+
`);
|
|
212
|
+
server.close();
|
|
213
|
+
resolve({
|
|
214
|
+
cliToken,
|
|
215
|
+
organization,
|
|
216
|
+
user
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
open(`${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
export {
|
|
224
|
+
AuthService
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts"],"sourcesContent":["// @ts-ignore\nimport Conf from 'conf'\nimport cors from 'cors'\nimport express from 'express'\nimport crypto from 'node:crypto'\nimport open from 'open'\nimport getPort from 'get-port'\nimport ora from 'ora'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport {Command} from '@oclif/core'\nimport {createTRPCClient} from '../utils/trpc.js'\nimport { AnalyticsService } from '../services/analytics.service.js'\n\ninterface LoginResponse {\n cliToken: string\n user: {\n email: string\n id: string\n }\n organization: {\n id: string\n }\n}\n\nexport class AuthService {\n private readonly config = new Conf({projectName: 'CopilotKitCLI'})\n private readonly COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\n getToken(): string | undefined {\n return this.config.get('cliToken') as string | undefined\n }\n\n getCLIToken(): string | undefined {\n const cliToken = this.config.get('cliToken') as string | undefined\n return cliToken\n }\n\n async logout(): Promise<void> {\n const cliToken = this.getCLIToken();\n \n if (!cliToken) {\n throw new Error('You are not logged in');\n }\n\n const trpcClient = createTRPCClient(cliToken)\n const me = await trpcClient.me.query()\n\n const analytics = new AnalyticsService({ userId: me.user!.id, organizationId: me.organization!.id, email: me.user!.email });\n \n this.config.delete('cliToken')\n \n analytics.track({\n event: \"cli.logout\",\n properties: {\n organizationId: me.organization!.id,\n userId: me.user!.id,\n email: me.user!.email,\n }\n });\n }\n\n async requireLogin(cmd: Command): Promise<LoginResponse> {\n let cliToken = this.getCLIToken()\n\n // Check authentication\n if (!cliToken) {\n try {\n const {shouldLogin} = await inquirer.prompt([\n {\n name: 'shouldLogin',\n type: 'confirm',\n message: 'You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)',\n default: true,\n },\n ])\n\n if (shouldLogin) {\n const loginResult = await this.login()\n cliToken = loginResult.cliToken\n cmd.log(`🪁 Logged in as ${chalk.hex('#7553fc')(loginResult.user.email)}\\n`)\n return loginResult\n } else {\n cmd.error('Authentication required to proceed.')\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n cmd.error(chalk.yellow('\\nAuthentication cancelled'))\n }\n\n throw error\n }\n }\n\n let me;\n\n const trpcClient = createTRPCClient(cliToken)\n try {\n me = await trpcClient.me.query()\n } catch (error) {\n cmd.log(chalk.red(\"Could not authenticate with Copilot Cloud. Please try again.\"))\n process.exit(1)\n }\n\n if (!me.organization || !me.user) {\n cmd.error('Authentication required to proceed.')\n }\n\n return {cliToken, user: me.user, organization: me.organization}\n }\n\n async login(): Promise<LoginResponse> {\n let analytics: AnalyticsService;\n analytics = new AnalyticsService();\n\n const app = express()\n app.use(cors())\n app.use(express.urlencoded({extended: true}))\n app.use(express.json())\n\n const port = await getPort()\n const state = crypto.randomBytes(16).toString('hex')\n\n return new Promise((resolve) => {\n const server = app.listen(port, () => {})\n\n analytics.track({\n event: \"cli.login.initiated\",\n properties: {}\n });\n\n const spinner = ora('Waiting for browser authentication to complete...\\n').start()\n\n app.post('/callback', async (req, res) => {\n const {cliToken, user, organization} = req.body\n\n analytics = new AnalyticsService({ userId: user.id, organizationId: organization.id, email: user.email });\n analytics.track({\n event: \"cli.login.success\",\n properties: {\n organizationId: organization.id,\n userId: user.id,\n email: user.email,\n }\n });\n\n if (state !== req.query.state) {\n res.status(401).json({message: 'Invalid state'})\n spinner.fail('Invalid state')\n return\n }\n\n this.config.set('cliToken', cliToken)\n res.status(200).json({message: 'Callback called'})\n spinner.succeed(`🪁 Successfully logged in as ${chalk.hex('#7553fc')(user.email)}\\n`)\n server.close()\n resolve({\n cliToken,\n organization,\n user,\n })\n })\n\n open(`${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`)\n })\n }\n}\n","import {createTRPCClient as createTRPClient_, unstable_httpBatchStreamLink} from '@trpc/client'\nimport type {CLIRouter} from '@repo/trpc-cli'\nimport superjson from 'superjson'\n\nexport const COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\nexport function createTRPCClient(cliToken: string) {\n return createTRPClient_<CLIRouter>({\n links: [\n unstable_httpBatchStreamLink({\n transformer: superjson,\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n headers: () => {\n const headers = new Headers()\n headers.set('x-trpc-source', 'cli')\n headers.set('x-cli-token', cliToken)\n return headers\n },\n }),\n ],\n })\n}\n","import {Analytics} from '@segment/analytics-node'\nimport {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | undefined\n private globalProperties: Record<string, any> = {}\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({projectName: 'CopilotKitCLI'})\n\n constructor(private readonly authData?: {\n userId: string,\n email: string,\n organizationId: string,\n }) {\n if (process.env.SEGMENT_DISABLED === 'true') {\n return;\n }\n\n const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\"\n\n this.globalProperties = {\n service: 'cli',\n }\n\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email\n this.globalProperties.email = this.authData.email\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === 'true',\n })\n\n const config = new Conf({projectName: 'CopilotKitCLI'})\n if (!config.get('anonymousId')) {\n config.set('anonymousId', crypto.randomUUID())\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get('anonymousId')\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID()\n this.config.set('anonymousId', anonymousId)\n return anonymousId\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics['track']>[0], 'userId'> & {\n event: K\n properties: AnalyticsEvents[K]\n },\n ): void {\n if (!this.segment) {\n return;\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId ? {\n segment_group: this.organizationId,\n } : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n }\n\n this.segment.track(payload)\n }\n}\n"],"mappings":"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","names":["Conf","crypto","anonymousId","Conf","crypto"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { RemoteEndpointType } from '../utils/detect-endpoint-type.utils.js';
|
|
2
|
+
|
|
3
|
+
type AnalyticsEvents = {
|
|
4
|
+
"cli.login.initiated": {};
|
|
5
|
+
"cli.login.success": {
|
|
6
|
+
organizationId: string;
|
|
7
|
+
userId: string;
|
|
8
|
+
email: string;
|
|
9
|
+
};
|
|
10
|
+
"cli.logout": {
|
|
11
|
+
organizationId: string;
|
|
12
|
+
userId: string;
|
|
13
|
+
email: string;
|
|
14
|
+
};
|
|
15
|
+
"cli.dev.initiatied": {
|
|
16
|
+
port: string;
|
|
17
|
+
projectId: string;
|
|
18
|
+
endpointType: RemoteEndpointType.LangGraphPlatform | RemoteEndpointType.CopilotKit;
|
|
19
|
+
};
|
|
20
|
+
"cli.dev.tunnel.created": {
|
|
21
|
+
tunnelId: string;
|
|
22
|
+
port: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
endpointType: RemoteEndpointType.LangGraphPlatform | RemoteEndpointType.CopilotKit;
|
|
25
|
+
};
|
|
26
|
+
"cli.dev.tunnel.closed": {
|
|
27
|
+
tunnelId: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type { AnalyticsEvents };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Tunnel } from 'localtunnel';
|
|
2
|
+
|
|
3
|
+
interface TunnelOptions {
|
|
4
|
+
port: number;
|
|
5
|
+
subdomain?: string;
|
|
6
|
+
}
|
|
7
|
+
declare class TunnelService {
|
|
8
|
+
private readonly META_DATA_URL;
|
|
9
|
+
create(options: TunnelOptions): Promise<Tunnel>;
|
|
10
|
+
getMetaData(): Promise<{
|
|
11
|
+
tunnelHost: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { type TunnelOptions, TunnelService };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/services/tunnel.service.ts
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import localtunnel from "localtunnel";
|
|
4
|
+
var TunnelService = class {
|
|
5
|
+
META_DATA_URL = "https://metadata-cdn.copilotkit.ai/cloud.config.json";
|
|
6
|
+
async create(options) {
|
|
7
|
+
return localtunnel(options);
|
|
8
|
+
}
|
|
9
|
+
async getMetaData() {
|
|
10
|
+
const response = await axios.get(this.META_DATA_URL);
|
|
11
|
+
return response.data;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
TunnelService
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=tunnel.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/tunnel.service.ts"],"sourcesContent":["import type {Tunnel} from 'localtunnel'\n\nimport axios from 'axios'\nimport localtunnel from 'localtunnel'\n\nexport interface TunnelOptions {\n port: number\n subdomain?: string\n}\n\nexport class TunnelService {\n private readonly META_DATA_URL = 'https://metadata-cdn.copilotkit.ai/cloud.config.json'\n\n async create(options: TunnelOptions): Promise<Tunnel> {\n return localtunnel(options)\n }\n\n async getMetaData() {\n const response = await axios.get<{\n tunnelHost: string\n }>(this.META_DATA_URL)\n return response.data\n }\n}\n"],"mappings":";AAEA,OAAO,WAAW;AAClB,OAAO,iBAAiB;AAOjB,IAAM,gBAAN,MAAoB;AAAA,EACR,gBAAgB;AAAA,EAEjC,MAAM,OAAO,SAAyC;AACpD,WAAO,YAAY,OAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,cAAc;AAClB,UAAM,WAAW,MAAM,MAAM,IAE1B,KAAK,aAAa;AACrB,WAAO,SAAS;AAAA,EAClB;AACF;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare enum RemoteEndpointType {
|
|
2
|
+
LangGraphPlatform = "LangGraphPlatform",
|
|
3
|
+
CopilotKit = "CopilotKit",
|
|
4
|
+
Invalid = "Invalid"
|
|
5
|
+
}
|
|
6
|
+
declare const getHumanReadableEndpointType: (type: RemoteEndpointType) => "LangGraph Platform" | "CopilotKit" | "Invalid";
|
|
7
|
+
declare function detectRemoteEndpointType(url: string): Promise<{
|
|
8
|
+
url: string;
|
|
9
|
+
type: RemoteEndpointType;
|
|
10
|
+
humanReadableType: string;
|
|
11
|
+
}>;
|
|
12
|
+
|
|
13
|
+
export { RemoteEndpointType, detectRemoteEndpointType, getHumanReadableEndpointType };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// src/utils/detect-endpoint-type.utils.ts
|
|
2
|
+
var RemoteEndpointType = /* @__PURE__ */ ((RemoteEndpointType2) => {
|
|
3
|
+
RemoteEndpointType2["LangGraphPlatform"] = "LangGraphPlatform";
|
|
4
|
+
RemoteEndpointType2["CopilotKit"] = "CopilotKit";
|
|
5
|
+
RemoteEndpointType2["Invalid"] = "Invalid";
|
|
6
|
+
return RemoteEndpointType2;
|
|
7
|
+
})(RemoteEndpointType || {});
|
|
8
|
+
var removeTrailingSlash = (url) => url.replace(/\/$/, "");
|
|
9
|
+
var getHumanReadableEndpointType = (type) => {
|
|
10
|
+
switch (type) {
|
|
11
|
+
case "LangGraphPlatform" /* LangGraphPlatform */:
|
|
12
|
+
return "LangGraph Platform";
|
|
13
|
+
case "CopilotKit" /* CopilotKit */:
|
|
14
|
+
return "CopilotKit";
|
|
15
|
+
default:
|
|
16
|
+
return "Invalid";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
async function detectRemoteEndpointType(url) {
|
|
20
|
+
const promises = [
|
|
21
|
+
isLangGraphPlatformEndpoint(url),
|
|
22
|
+
isCopilotKitEndpoint(url)
|
|
23
|
+
];
|
|
24
|
+
if (!url.endsWith("/copilotkit")) {
|
|
25
|
+
promises.push(isCopilotKitEndpoint(`${removeTrailingSlash(url)}/copilotkit`));
|
|
26
|
+
}
|
|
27
|
+
const results = await Promise.all(promises);
|
|
28
|
+
if (results[0]) {
|
|
29
|
+
return {
|
|
30
|
+
url,
|
|
31
|
+
type: "LangGraphPlatform" /* LangGraphPlatform */,
|
|
32
|
+
humanReadableType: "LangGraph Platform"
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (results[1]) {
|
|
36
|
+
return {
|
|
37
|
+
url,
|
|
38
|
+
type: "CopilotKit" /* CopilotKit */,
|
|
39
|
+
humanReadableType: "CopilotKit"
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (results[2]) {
|
|
43
|
+
return {
|
|
44
|
+
url: `${removeTrailingSlash(url)}/copilotkit`,
|
|
45
|
+
type: "CopilotKit" /* CopilotKit */,
|
|
46
|
+
humanReadableType: "CopilotKit"
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
url,
|
|
51
|
+
type: "Invalid" /* Invalid */,
|
|
52
|
+
humanReadableType: "Invalid"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function isLangGraphPlatformEndpoint(url, retries = 0) {
|
|
56
|
+
let response;
|
|
57
|
+
try {
|
|
58
|
+
response = await fetch(`${url}/assistants/search`, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
body: JSON.stringify({
|
|
61
|
+
metadata: {},
|
|
62
|
+
limit: 99,
|
|
63
|
+
offset: 0
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
} catch (error) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
if (response.status === 502) {
|
|
71
|
+
if (retries < 3) {
|
|
72
|
+
console.log("RETRYING LGC", retries + 1);
|
|
73
|
+
return isLangGraphPlatformEndpoint(url, retries + 1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (response.status === 403) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
const data = await response.json();
|
|
82
|
+
if (data[0].assistant_id) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
async function isCopilotKitEndpoint(url, retries = 0) {
|
|
88
|
+
let response;
|
|
89
|
+
try {
|
|
90
|
+
response = await fetch(`${url}/info`, {
|
|
91
|
+
method: "POST",
|
|
92
|
+
body: JSON.stringify({})
|
|
93
|
+
});
|
|
94
|
+
} catch (error) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
if (response.status === 502) {
|
|
99
|
+
if (retries < 3) {
|
|
100
|
+
console.log("RETRYING CK", retries + 1);
|
|
101
|
+
return isCopilotKitEndpoint(url, retries + 1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const data = await response.json();
|
|
107
|
+
if (data.agents && data.actions) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
export {
|
|
113
|
+
RemoteEndpointType,
|
|
114
|
+
detectRemoteEndpointType,
|
|
115
|
+
getHumanReadableEndpointType
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=detect-endpoint-type.utils.js.map
|