alpic 0.0.0-dev.gde9ffac → 0.0.0-dev.gdebde0d
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 +18 -0
- package/bin/run.js +15 -1
- package/dist/__tests__/alpic-command.test.js +8 -4
- package/dist/__tests__/alpic-command.test.js.map +1 -1
- package/dist/__tests__/audit.e2e.test.js +16 -29
- package/dist/__tests__/audit.e2e.test.js.map +1 -1
- package/dist/__tests__/auth.e2e.test.js +9 -23
- package/dist/__tests__/auth.e2e.test.js.map +1 -1
- package/dist/__tests__/deploy-flags.e2e.test.js +6 -21
- package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -1
- package/dist/__tests__/deploy.e2e.test.js +5 -21
- package/dist/__tests__/deploy.e2e.test.js.map +1 -1
- package/dist/__tests__/deployment-inspect.e2e.test.js +18 -31
- package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -1
- package/dist/__tests__/deployment-list.e2e.test.js +18 -31
- package/dist/__tests__/deployment-list.e2e.test.js.map +1 -1
- package/dist/__tests__/deployment-logs.e2e.test.js +15 -29
- package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -1
- package/dist/__tests__/environment-list.e2e.test.js +6 -22
- package/dist/__tests__/environment-list.e2e.test.js.map +1 -1
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +19 -31
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -1
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +19 -31
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -1
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +18 -31
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -1
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +18 -31
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -1
- package/dist/__tests__/git-flags.e2e.test.js +6 -22
- package/dist/__tests__/git-flags.e2e.test.js.map +1 -1
- package/dist/__tests__/git.e2e.test.js +7 -22
- package/dist/__tests__/git.e2e.test.js.map +1 -1
- package/dist/__tests__/insights-category.e2e.test.d.ts +1 -0
- package/dist/__tests__/insights-category.e2e.test.js +248 -0
- package/dist/__tests__/insights-category.e2e.test.js.map +1 -0
- package/dist/__tests__/insights.e2e.test.d.ts +1 -0
- package/dist/__tests__/insights.e2e.test.js +193 -0
- package/dist/__tests__/insights.e2e.test.js.map +1 -0
- package/dist/__tests__/logs.e2e.test.js +21 -35
- package/dist/__tests__/logs.e2e.test.js.map +1 -1
- package/dist/__tests__/mock-api.d.ts +23 -1
- package/dist/__tests__/mock-api.js +238 -46
- package/dist/__tests__/mock-api.js.map +1 -1
- package/dist/__tests__/playground/playground-configure.e2e.test.js +18 -26
- package/dist/__tests__/playground/playground-configure.e2e.test.js.map +1 -1
- package/dist/__tests__/playground/playground-enable-disable.e2e.test.js +18 -26
- package/dist/__tests__/playground/playground-enable-disable.e2e.test.js.map +1 -1
- package/dist/__tests__/playground/playground-example-prompt.e2e.test.js +24 -30
- package/dist/__tests__/playground/playground-example-prompt.e2e.test.js.map +1 -1
- package/dist/__tests__/playground/playground-headers.e2e.test.js +18 -26
- package/dist/__tests__/playground/playground-headers.e2e.test.js.map +1 -1
- package/dist/__tests__/playground/playground-status.e2e.test.js +18 -26
- package/dist/__tests__/playground/playground-status.e2e.test.js.map +1 -1
- package/dist/__tests__/project-list.e2e.test.js +5 -21
- package/dist/__tests__/project-list.e2e.test.js.map +1 -1
- package/dist/__tests__/publish.e2e.test.js +6 -24
- package/dist/__tests__/publish.e2e.test.js.map +1 -1
- package/dist/__tests__/team-inspect.e2e.test.js +26 -1
- package/dist/__tests__/team-inspect.e2e.test.js.map +1 -1
- package/dist/__tests__/team-list.e2e.test.js +5 -21
- package/dist/__tests__/team-list.e2e.test.js.map +1 -1
- package/dist/__tests__/tunnel.e2e.test.js +61 -23
- package/dist/__tests__/tunnel.e2e.test.js.map +1 -1
- package/dist/__tests__/utils.d.ts +17 -6
- package/dist/__tests__/utils.js +49 -20
- package/dist/__tests__/utils.js.map +1 -1
- package/dist/api.d.ts +1 -1
- package/dist/api.js +2 -21
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.js +69 -52
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/git/connect.js +2 -2
- package/dist/commands/git/connect.js.map +1 -1
- package/dist/commands/git/disconnect.js +2 -2
- package/dist/commands/git/disconnect.js.map +1 -1
- package/dist/commands/insights/category/create.d.ts +17 -0
- package/dist/commands/insights/category/create.js +63 -0
- package/dist/commands/insights/category/create.js.map +1 -0
- package/dist/commands/insights/category/delete.d.ts +13 -0
- package/dist/commands/insights/category/delete.js +40 -0
- package/dist/commands/insights/category/delete.js.map +1 -0
- package/dist/commands/insights/category/link.d.ts +14 -0
- package/dist/commands/insights/category/link.js +36 -0
- package/dist/commands/insights/category/link.js.map +1 -0
- package/dist/commands/insights/category/list.d.ts +13 -0
- package/dist/commands/insights/category/list.js +45 -0
- package/dist/commands/insights/category/list.js.map +1 -0
- package/dist/commands/insights/category/unlink.d.ts +14 -0
- package/dist/commands/insights/category/unlink.js +36 -0
- package/dist/commands/insights/category/unlink.js.map +1 -0
- package/dist/commands/insights/category/update.d.ts +16 -0
- package/dist/commands/insights/category/update.js +44 -0
- package/dist/commands/insights/category/update.js.map +1 -0
- package/dist/commands/insights/feedback/list.d.ts +19 -0
- package/dist/commands/insights/feedback/list.js +72 -0
- package/dist/commands/insights/feedback/list.js.map +1 -0
- package/dist/commands/insights/intent/list.d.ts +22 -0
- package/dist/commands/insights/intent/list.js +88 -0
- package/dist/commands/insights/intent/list.js.map +1 -0
- package/dist/commands/link.js +1 -0
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.js +7 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/logs.js +1 -9
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/playground/example-prompt/add.js +1 -1
- package/dist/commands/team/inspect.js +17 -2
- package/dist/commands/team/inspect.js.map +1 -1
- package/dist/commands/tunnel.js +35 -59
- package/dist/commands/tunnel.js.map +1 -1
- package/dist/commands/whoami.js +1 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/lib/alpic-command.d.ts +1 -1
- package/dist/lib/alpic-command.js +27 -11
- package/dist/lib/alpic-command.js.map +1 -1
- package/dist/lib/alpic-sdk.d.ts +2 -0
- package/dist/lib/alpic-sdk.js +8 -0
- package/dist/lib/alpic-sdk.js.map +1 -0
- package/dist/lib/audit.js +6 -3
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/deployment.d.ts +0 -21
- package/dist/lib/deployment.js +9 -58
- package/dist/lib/deployment.js.map +1 -1
- package/dist/lib/environment-variable.js +1 -0
- package/dist/lib/environment-variable.js.map +1 -1
- package/dist/lib/insights.d.ts +17 -0
- package/dist/lib/insights.js +54 -0
- package/dist/lib/insights.js.map +1 -0
- package/dist/lib/link.d.ts +1 -2
- package/dist/lib/link.js +16 -71
- package/dist/lib/link.js.map +1 -1
- package/dist/lib/logs.js +4 -5
- package/dist/lib/logs.js.map +1 -1
- package/dist/lib/playground.js +2 -2
- package/dist/lib/project-settings.d.ts +7 -0
- package/dist/lib/project-settings.js +140 -0
- package/dist/lib/project-settings.js.map +1 -0
- package/dist/lib/project-settings.test.d.ts +1 -0
- package/dist/lib/project-settings.test.js +56 -0
- package/dist/lib/project-settings.test.js.map +1 -0
- package/dist/lib/resolve.js +4 -5
- package/dist/lib/resolve.js.map +1 -1
- package/dist/lib/telemetry.js +83 -15
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/utils.d.ts +9 -1
- package/dist/lib/utils.js +28 -2
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/utils.test.js +43 -5
- package/dist/lib/utils.test.js.map +1 -1
- package/dist/lib/whoami.js +17 -0
- package/dist/lib/whoami.js.map +1 -0
- package/dist/sentry.d.ts +3 -0
- package/dist/sentry.js +37 -0
- package/dist/sentry.js.map +1 -0
- package/package.json +28 -31
- package/dist/lib/archive.d.ts +0 -7
- package/dist/lib/archive.js +0 -57
- package/dist/lib/archive.js.map +0 -1
- package/dist/lib/auth/auth.d.ts +0 -5
- package/dist/lib/auth/auth.js +0 -50
- package/dist/lib/auth/auth.js.map +0 -1
- package/dist/lib/auth/oauth/client.d.ts +0 -28
- package/dist/lib/auth/oauth/client.js +0 -116
- package/dist/lib/auth/oauth/client.js.map +0 -1
- package/dist/lib/auth/oauth/constants.d.ts +0 -2
- package/dist/lib/auth/oauth/constants.js +0 -3
- package/dist/lib/auth/oauth/constants.js.map +0 -1
- package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
- package/dist/lib/auth/oauth/server/assets/authorize.html +0 -234
- package/dist/lib/auth/oauth/server/assets/callback.html +0 -88
- package/dist/lib/auth/oauth/server/index.d.ts +0 -9
- package/dist/lib/auth/oauth/server/index.js +0 -128
- package/dist/lib/auth/oauth/server/index.js.map +0 -1
- package/dist/lib/auth/whoami.js +0 -47
- package/dist/lib/auth/whoami.js.map +0 -1
- package/dist/lib/config.d.ts +0 -12
- package/dist/lib/config.js +0 -32
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/global-store.d.ts +0 -28
- package/dist/lib/global-store.js +0 -76
- package/dist/lib/global-store.js.map +0 -1
- package/dist/lib/upload.d.ts +0 -1
- package/dist/lib/upload.js +0 -13
- package/dist/lib/upload.js.map +0 -1
- package/dist/lib/vendor/pipenet.d.ts +0 -1
- package/dist/lib/vendor/pipenet.js +0 -15626
- package/dist/lib/vendor/pipenet.js.LEGAL.txt +0 -17
- package/dist/lib/vendor/pipenet.js.map +0 -7
- package/dist/types.d.ts +0 -8
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- /package/dist/lib/{auth/whoami.d.ts → whoami.d.ts} +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { INTENT_CATEGORY_COLORS } from "@alpic-ai/api";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../../api.js";
|
|
5
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
6
|
+
import { categoryFlags, parseIntentCategoryColor, resolveIntentCategory } from "../../../lib/insights.js";
|
|
7
|
+
import { environmentFlags, projectFlags, resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
8
|
+
export class InsightsCategoryUpdate extends AlpicCommand {
|
|
9
|
+
static description = "Rename or recolor an intent category";
|
|
10
|
+
static examples = [
|
|
11
|
+
"<%= config.bin %> insights category update --name Scheduling",
|
|
12
|
+
"<%= config.bin %> insights category update --category-id <categoryId> --color green",
|
|
13
|
+
];
|
|
14
|
+
static flags = {
|
|
15
|
+
...environmentFlags,
|
|
16
|
+
...projectFlags,
|
|
17
|
+
...categoryFlags,
|
|
18
|
+
name: Flags.string({ description: "The new category name" }),
|
|
19
|
+
color: Flags.string({ description: "The new category color", options: [...INTENT_CATEGORY_COLORS] }),
|
|
20
|
+
json: Flags.boolean({ description: "Print the unmodified API response as JSON", default: false }),
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
const { flags } = await this.parse(InsightsCategoryUpdate);
|
|
24
|
+
if (flags.name === undefined && flags.color === undefined) {
|
|
25
|
+
throw new Error("At least one of --name or --color must be provided.");
|
|
26
|
+
}
|
|
27
|
+
await this.ensureAuthenticated(flags);
|
|
28
|
+
const environmentId = await resolveEnvironmentId(flags);
|
|
29
|
+
const category = await resolveIntentCategory(environmentId, flags, "update");
|
|
30
|
+
const spinner = this.spinner();
|
|
31
|
+
spinner.start("Updating category...");
|
|
32
|
+
const updated = await api.intentCategories.update.v1({
|
|
33
|
+
environmentId,
|
|
34
|
+
categoryId: category.id,
|
|
35
|
+
name: flags.name,
|
|
36
|
+
color: parseIntentCategoryColor(flags.color),
|
|
37
|
+
});
|
|
38
|
+
spinner.stop(`Updated ${chalk.cyan(updated.name)} (${updated.color}). ✅`);
|
|
39
|
+
if (flags.json) {
|
|
40
|
+
this.log(JSON.stringify(updated));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/insights/category/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/F,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IACtD,MAAM,CAAU,WAAW,GAAG,sCAAsC,CAAC;IAErE,MAAM,CAAU,QAAQ,GAAG;QACzB,8DAA8D;QAC9D,qFAAqF;KACtF,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,gBAAgB;QACnB,GAAG,YAAY;QACf,GAAG,aAAa;QAChB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;QAC5D,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,OAAO,EAAE,CAAC,GAAG,sBAAsB,CAAC,EAAE,CAAC;QACpG,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;KAClG,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE3D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE7E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAEtC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,aAAa;YACb,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC;SAC7C,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,KAAK,MAAM,CAAC,CAAC;QAE1E,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
2
|
+
export declare class InsightsFeedbackList extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
since: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
until: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
"client-id": import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
offset: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
"project-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
"environment-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
};
|
|
18
|
+
run(): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../../api.js";
|
|
5
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
6
|
+
import { truncateInsightContent } from "../../../lib/insights.js";
|
|
7
|
+
import { environmentFlags, projectFlags, resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
8
|
+
import { formatTable } from "../../../lib/table.js";
|
|
9
|
+
import { plural, validateTimeFlag } from "../../../lib/utils.js";
|
|
10
|
+
export class InsightsFeedbackList extends AlpicCommand {
|
|
11
|
+
static description = "List user feedback for an environment";
|
|
12
|
+
static examples = [
|
|
13
|
+
"<%= config.bin %> insights feedback list",
|
|
14
|
+
"<%= config.bin %> insights feedback list --environment-name production --project-name my-project",
|
|
15
|
+
"<%= config.bin %> insights feedback list --search timeout --client-id claude-desktop",
|
|
16
|
+
"<%= config.bin %> insights feedback list --json --non-interactive",
|
|
17
|
+
];
|
|
18
|
+
static flags = {
|
|
19
|
+
...environmentFlags,
|
|
20
|
+
...projectFlags,
|
|
21
|
+
since: Flags.string({
|
|
22
|
+
description: "Show feedback after this time (relative duration or ISO 8601 date)",
|
|
23
|
+
default: "7d",
|
|
24
|
+
}),
|
|
25
|
+
until: Flags.string({ description: "Show feedback before this time (relative duration or ISO 8601 date)" }),
|
|
26
|
+
search: Flags.string({ description: "Search feedback content and source" }),
|
|
27
|
+
"client-id": Flags.string({ description: "Filter by stable MCP client ID", multiple: true }),
|
|
28
|
+
limit: Flags.integer({ description: "Maximum number of feedbacks to return", min: 1, max: 200, default: 50 }),
|
|
29
|
+
offset: Flags.integer({ description: "Number of feedbacks to skip", min: 0, default: 0 }),
|
|
30
|
+
json: Flags.boolean({ description: "Print the unmodified API response as JSON", default: false }),
|
|
31
|
+
};
|
|
32
|
+
async run() {
|
|
33
|
+
const { flags } = await this.parse(InsightsFeedbackList);
|
|
34
|
+
await this.ensureAuthenticated(flags);
|
|
35
|
+
const environmentId = await resolveEnvironmentId(flags);
|
|
36
|
+
validateTimeFlag(flags.since, "since");
|
|
37
|
+
validateTimeFlag(flags.until, "until");
|
|
38
|
+
const spinner = this.spinner();
|
|
39
|
+
spinner.start("Fetching feedback...");
|
|
40
|
+
const response = await api.feedbacks.list.v1({
|
|
41
|
+
environmentId,
|
|
42
|
+
since: flags.since,
|
|
43
|
+
until: flags.until,
|
|
44
|
+
search: flags.search,
|
|
45
|
+
clientIds: flags["client-id"],
|
|
46
|
+
limit: flags.limit,
|
|
47
|
+
offset: flags.offset,
|
|
48
|
+
});
|
|
49
|
+
spinner.stop(`Found ${plural(response.totalCount, "feedback")}`);
|
|
50
|
+
if (flags.json) {
|
|
51
|
+
this.log(JSON.stringify(response));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (response.feedbacks.length === 0) {
|
|
55
|
+
p.log.info("No feedback found for this period.");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const rows = response.feedbacks.map((feedback) => ({
|
|
59
|
+
date: feedback.createdAt.toISOString(),
|
|
60
|
+
source: feedback.source,
|
|
61
|
+
feedback: truncateInsightContent(feedback.content),
|
|
62
|
+
client: feedback.clientName ?? feedback.clientId ?? "-",
|
|
63
|
+
}));
|
|
64
|
+
console.log(formatTable(rows, [
|
|
65
|
+
{ key: "date", header: "date", format: (value) => chalk.gray(value) },
|
|
66
|
+
{ key: "source", header: "source", format: (value) => chalk.cyan(value) },
|
|
67
|
+
{ key: "feedback", header: "feedback", format: (value) => chalk.bold(value) },
|
|
68
|
+
{ key: "client", header: "client", format: (value) => chalk.gray(value) },
|
|
69
|
+
]));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/insights/feedback/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
2
|
+
export declare class InsightsIntentList extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
since: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
until: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
tool: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"client-id": import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
"category-id": import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
sort: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
offset: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
"project-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
"environment-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
|
+
};
|
|
21
|
+
run(): Promise<void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../../api.js";
|
|
5
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
6
|
+
import { truncateInsightContent } from "../../../lib/insights.js";
|
|
7
|
+
import { environmentFlags, projectFlags, resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
8
|
+
import { formatTable } from "../../../lib/table.js";
|
|
9
|
+
import { plural, validateTimeFlag } from "../../../lib/utils.js";
|
|
10
|
+
const parseSortDir = (sort) => {
|
|
11
|
+
if (sort === "asc" || sort === "desc") {
|
|
12
|
+
return sort;
|
|
13
|
+
}
|
|
14
|
+
throw new Error(`Invalid sort direction: ${sort}`);
|
|
15
|
+
};
|
|
16
|
+
export class InsightsIntentList extends AlpicCommand {
|
|
17
|
+
static description = "List grouped user intents for an environment";
|
|
18
|
+
static examples = [
|
|
19
|
+
"<%= config.bin %> insights intent list",
|
|
20
|
+
"<%= config.bin %> insights intent list --environment-id <environmentId> --since 24h",
|
|
21
|
+
"<%= config.bin %> insights intent list --tool search --client-id claude-desktop",
|
|
22
|
+
"<%= config.bin %> insights intent list --json --non-interactive",
|
|
23
|
+
];
|
|
24
|
+
static flags = {
|
|
25
|
+
...environmentFlags,
|
|
26
|
+
...projectFlags,
|
|
27
|
+
since: Flags.string({
|
|
28
|
+
description: "Show intents after this time (relative duration or ISO 8601 date)",
|
|
29
|
+
default: "7d",
|
|
30
|
+
}),
|
|
31
|
+
until: Flags.string({ description: "Show intents before this time (relative duration or ISO 8601 date)" }),
|
|
32
|
+
search: Flags.string({ description: "Search intent messages, tools, and categories" }),
|
|
33
|
+
tool: Flags.string({ description: "Filter by tool name", multiple: true }),
|
|
34
|
+
"client-id": Flags.string({ description: "Filter by stable MCP client ID", multiple: true }),
|
|
35
|
+
"category-id": Flags.string({ description: "Filter by category ID", multiple: true }),
|
|
36
|
+
sort: Flags.string({ description: "Sort by date", options: ["asc", "desc"], default: "desc" }),
|
|
37
|
+
limit: Flags.integer({ description: "Maximum number of grouped intents to return", min: 1, max: 200, default: 50 }),
|
|
38
|
+
offset: Flags.integer({ description: "Number of grouped intents to skip", min: 0, default: 0 }),
|
|
39
|
+
json: Flags.boolean({ description: "Print the unmodified API response as JSON", default: false }),
|
|
40
|
+
};
|
|
41
|
+
async run() {
|
|
42
|
+
const { flags } = await this.parse(InsightsIntentList);
|
|
43
|
+
await this.ensureAuthenticated(flags);
|
|
44
|
+
const environmentId = await resolveEnvironmentId(flags);
|
|
45
|
+
validateTimeFlag(flags.since, "since");
|
|
46
|
+
validateTimeFlag(flags.until, "until");
|
|
47
|
+
const spinner = this.spinner();
|
|
48
|
+
spinner.start("Fetching intents...");
|
|
49
|
+
const response = await api.intents.list.v1({
|
|
50
|
+
environmentId,
|
|
51
|
+
since: flags.since,
|
|
52
|
+
until: flags.until,
|
|
53
|
+
search: flags.search,
|
|
54
|
+
tools: flags.tool,
|
|
55
|
+
clientIds: flags["client-id"],
|
|
56
|
+
categoryIds: flags["category-id"],
|
|
57
|
+
sortDir: parseSortDir(flags.sort),
|
|
58
|
+
limit: flags.limit,
|
|
59
|
+
offset: flags.offset,
|
|
60
|
+
});
|
|
61
|
+
spinner.stop(`Found ${plural(response.totalCount, "intent")}`);
|
|
62
|
+
if (flags.json) {
|
|
63
|
+
this.log(JSON.stringify(response));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (response.intents.length === 0) {
|
|
67
|
+
p.log.info("No intents found for this period.");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const rows = response.intents.map((intent) => ({
|
|
71
|
+
date: intent.createdAt.toISOString(),
|
|
72
|
+
intent: truncateInsightContent(intent.message),
|
|
73
|
+
occurrences: intent.occurrenceCount,
|
|
74
|
+
tool: intent.toolName,
|
|
75
|
+
client: intent.clientName ?? intent.clientId ?? "-",
|
|
76
|
+
categories: intent.categories.map(({ name }) => name).join(", ") || "-",
|
|
77
|
+
}));
|
|
78
|
+
console.log(formatTable(rows, [
|
|
79
|
+
{ key: "date", header: "date", format: (value) => chalk.gray(value) },
|
|
80
|
+
{ key: "intent", header: "intent", format: (value) => chalk.bold(value) },
|
|
81
|
+
{ key: "occurrences", header: "occurrences", format: (value) => chalk.gray(value) },
|
|
82
|
+
{ key: "tool", header: "tool", format: (value) => chalk.cyan(value) },
|
|
83
|
+
{ key: "client", header: "client", format: (value) => chalk.gray(value) },
|
|
84
|
+
{ key: "categories", header: "categories", format: (value) => chalk.gray(value) },
|
|
85
|
+
]));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/insights/intent/list.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/link.js
CHANGED
|
@@ -52,6 +52,7 @@ export class Link extends AlpicCommand {
|
|
|
52
52
|
projectId: flags["project-id"],
|
|
53
53
|
environmentId: flags["environment-id"],
|
|
54
54
|
projectName: flags["project-name"],
|
|
55
|
+
// biome-ignore lint/plugin/no-type-assertion: Oclif validates runtime flag values against the configured options.
|
|
55
56
|
runtime: flags.runtime,
|
|
56
57
|
rootDir: flags["root-dir"],
|
|
57
58
|
envFile: flags["env-file"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
2
3
|
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { getWhoamiInfoMessage } from "../lib/auth/whoami.js";
|
|
4
|
+
import { alpic } from "../lib/alpic-sdk.js";
|
|
5
|
+
import { getWhoamiInfoMessage } from "../lib/whoami.js";
|
|
6
6
|
export class Login extends AlpicCommand {
|
|
7
7
|
static description = "Log in to Alpic (opens browser, stores tokens)";
|
|
8
8
|
static examples = ["<%= config.bin %> login"];
|
|
9
9
|
async run() {
|
|
10
10
|
await this.parse(Login);
|
|
11
11
|
p.intro("Log in to Alpic");
|
|
12
|
-
const token = await
|
|
12
|
+
const token = await alpic.auth.getValidAccessToken();
|
|
13
13
|
if (token) {
|
|
14
14
|
p.outro("Already logged in.");
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
|
-
await
|
|
17
|
+
await alpic.auth.login({
|
|
18
|
+
onLoginUrl: (url) => p.log.message(`Opening browser to log in…\n\nIf the browser does not open, copy this URL: ${chalk.cyan(url)}`),
|
|
19
|
+
});
|
|
18
20
|
p.outro(await getWhoamiInfoMessage());
|
|
19
21
|
}
|
|
20
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,OAAO,KAAM,SAAQ,YAAY;IACrC,MAAM,CAAU,WAAW,GAAG,gDAAgD,CAAC;IAE/E,MAAM,CAAU,QAAQ,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAExB,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,IAAI,KAAK,EAAE,CAAC;YACV,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAClB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,8EAA8E,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;SACjH,CAAC,CAAC;QAEH,CAAC,CAAC,KAAK,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC;IACxC,CAAC"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { globalStore } from "@alpic-ai/sdk";
|
|
1
2
|
import * as p from "@clack/prompts";
|
|
2
3
|
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
3
|
-
import { globalStore } from "../lib/global-store.js";
|
|
4
4
|
export class Logout extends AlpicCommand {
|
|
5
5
|
static description = "Log out from Alpic (removes stored OAuth credentials)";
|
|
6
6
|
static examples = ["<%= config.bin %> logout"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,uDAAuD,CAAC;IAEtF,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzB,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAE9B,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC;QAE7D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,WAAW,CAAC,gBAAgB,EAAE,CAAC;QAE/B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAEhD,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACjC,CAAC"}
|
package/dist/commands/logs.js
CHANGED
|
@@ -3,15 +3,7 @@ import { api } from "../api.js";
|
|
|
3
3
|
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
4
4
|
import { followEnvironmentLogs, parseLevel, printLog } from "../lib/logs.js";
|
|
5
5
|
import { resolveEnvironmentId } from "../lib/resolve.js";
|
|
6
|
-
import {
|
|
7
|
-
function validateTimeFlag(value, flagName) {
|
|
8
|
-
if (value === undefined) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
if (!isValidLogTimeInput(value)) {
|
|
12
|
-
throw new Error(`Invalid --${flagName} value: "${value}". Use a relative duration (1h, 30m, 2d) or ISO 8601 date (2024-01-01T00:00:00Z).`);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
6
|
+
import { validateTimeFlag } from "../lib/utils.js";
|
|
15
7
|
export class Logs extends AlpicCommand {
|
|
16
8
|
static description = "Stream runtime logs for an environment";
|
|
17
9
|
static examples = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
|
3
3
|
import { PlaygroundWorkflow } from "../../../lib/playground.js";
|
|
4
4
|
import { resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
5
5
|
export default class PlaygroundExamplePromptAdd extends AlpicCommand {
|
|
6
|
-
static description = "Add an example prompt to the playground (max
|
|
6
|
+
static description = "Add an example prompt to the playground (max 5)";
|
|
7
7
|
static examples = [
|
|
8
8
|
"<%= config.bin %> playground example-prompt add",
|
|
9
9
|
'<%= config.bin %> playground example-prompt add --title "Hello" --prompt "Say hello to the user"',
|
|
@@ -4,7 +4,20 @@ import chalk from "chalk";
|
|
|
4
4
|
import { api } from "../../api.js";
|
|
5
5
|
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
6
6
|
import { formatTable } from "../../lib/table.js";
|
|
7
|
-
import { formatAgo, plural } from "../../lib/utils.js";
|
|
7
|
+
import { formatAgo, formatUsage, getResponseErrorStatus, plural } from "../../lib/utils.js";
|
|
8
|
+
const NOT_FOUND_STATUS = 404;
|
|
9
|
+
/** A published CLI outlives the server it talks to, so a server without the usage route drops the row rather than the command. */
|
|
10
|
+
const fetchTeamUsage = async (teamId) => {
|
|
11
|
+
try {
|
|
12
|
+
return await api.teams.getUsage.v1({ teamId });
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (getResponseErrorStatus(error) === NOT_FOUND_STATUS) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
8
21
|
export class TeamInspect extends AlpicCommand {
|
|
9
22
|
static description = "Show details of a team and its projects";
|
|
10
23
|
static examples = ["<%= config.bin %> team inspect --team-id <teamId>", "<%= config.bin %> team inspect"];
|
|
@@ -57,8 +70,9 @@ export class TeamInspect extends AlpicCommand {
|
|
|
57
70
|
this.exitWithErrorMessage(`Team not found: ${teamId}`);
|
|
58
71
|
}
|
|
59
72
|
let projects;
|
|
73
|
+
let usage;
|
|
60
74
|
try {
|
|
61
|
-
projects = await api.projects.list.v1({ teamId });
|
|
75
|
+
[projects, usage] = await Promise.all([api.projects.list.v1({ teamId }), fetchTeamUsage(teamId)]);
|
|
62
76
|
}
|
|
63
77
|
catch (error) {
|
|
64
78
|
spinner.stop();
|
|
@@ -69,6 +83,7 @@ export class TeamInspect extends AlpicCommand {
|
|
|
69
83
|
{ label: "ID", value: chalk.cyan(team.id) },
|
|
70
84
|
{ label: "Name", value: team.name },
|
|
71
85
|
{ label: "Stripe Account", value: team.hasStripeAccount ? "yes" : chalk.gray("no") },
|
|
86
|
+
...(usage === null ? [] : [{ label: "Usage", value: formatUsage(usage) }]),
|
|
72
87
|
{ label: "Created", value: formatAgo(team.createdAt) },
|
|
73
88
|
];
|
|
74
89
|
console.log(formatTable(detailRows, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/commands/team/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/commands/team/inspect.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/tunnel.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import { Flags } from "@oclif/core";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
-
import { api } from "../api.js";
|
|
5
4
|
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
6
|
-
import {
|
|
7
|
-
import { getOAuthClient } from "../lib/auth/oauth/client.js";
|
|
8
|
-
import { pipenet } from "../lib/vendor/pipenet.js";
|
|
5
|
+
import { alpic } from "../lib/alpic-sdk.js";
|
|
9
6
|
export class Tunnel extends AlpicCommand {
|
|
10
7
|
static description = "Expose a local server to the internet through an Alpic tunnel";
|
|
11
8
|
static examples = ["<%= config.bin %> tunnel --port 3000"];
|
|
@@ -23,20 +20,16 @@ export class Tunnel extends AlpicCommand {
|
|
|
23
20
|
async run() {
|
|
24
21
|
const { flags } = await this.parse(Tunnel);
|
|
25
22
|
const isPlain = flags.plain;
|
|
26
|
-
|
|
27
|
-
if (!
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
token = await getOAuthClient().getValidAccessToken();
|
|
37
|
-
}
|
|
38
|
-
if (!token) {
|
|
39
|
-
throw new Error("Cannot get valid access token");
|
|
23
|
+
// Checks the OAuth token specifically (not isAuthenticated) because tunnels require user OAuth — an ALPIC_API_KEY alone cannot open one — and authenticating up front lets us control the login messaging.
|
|
24
|
+
if (!(await alpic.auth.getValidAccessToken())) {
|
|
25
|
+
const loginMsg = "You need to be logged in to use the Alpic tunnel";
|
|
26
|
+
isPlain ? console.log(loginMsg) : p.log.step(loginMsg);
|
|
27
|
+
await alpic.auth.login({
|
|
28
|
+
onLoginUrl: (url) => {
|
|
29
|
+
const msg = `Opening browser to log in: ${url}`;
|
|
30
|
+
isPlain ? console.log(msg) : p.log.step(msg);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
40
33
|
}
|
|
41
34
|
let spinner;
|
|
42
35
|
const intro = "Opening tunnel...";
|
|
@@ -47,49 +40,18 @@ export class Tunnel extends AlpicCommand {
|
|
|
47
40
|
spinner = this.spinner();
|
|
48
41
|
spinner.start(intro);
|
|
49
42
|
}
|
|
50
|
-
let
|
|
51
|
-
let tunnelHost;
|
|
52
|
-
let subdomain;
|
|
53
|
-
let proto;
|
|
43
|
+
let handle;
|
|
54
44
|
try {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
request: {
|
|
58
|
-
headers: {
|
|
59
|
-
Authorization: `Bearer ${token?.access_token}`,
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
},
|
|
45
|
+
handle = await alpic.tunnel.open({
|
|
46
|
+
port: flags.port,
|
|
63
47
|
});
|
|
64
|
-
tunnelHost = ticketInfo.tunnelHost;
|
|
65
|
-
subdomain = ticketInfo.subdomain;
|
|
66
|
-
proto = tunnelHost.startsWith("localhost") ? "http" : "https";
|
|
67
|
-
tunnel = await Promise.race([
|
|
68
|
-
pipenet({
|
|
69
|
-
port: flags.port,
|
|
70
|
-
host: `${proto}://${tunnelHost}`,
|
|
71
|
-
subdomain: subdomain,
|
|
72
|
-
headers: { Authorization: `Bearer ${ticketInfo.ticket}` },
|
|
73
|
-
// Idle before TCP keepalive probes start. Paired with offlineTimeoutMs below.
|
|
74
|
-
keepAliveDelayMs: 30_000,
|
|
75
|
-
// Give-up window once all tunnel sockets are dead — pipenet emits 'close'
|
|
76
|
-
// and our `tunnel.on('close', ...)` exits the CLI.
|
|
77
|
-
offlineTimeoutMs: 30_000,
|
|
78
|
-
}),
|
|
79
|
-
new Promise((_, reject) => {
|
|
80
|
-
const id = setTimeout(() => reject(new Error("Failed to connect to tunnel server")), 10_000);
|
|
81
|
-
id.unref?.(); // don't keep the event loop alive just for this timer
|
|
82
|
-
}),
|
|
83
|
-
]);
|
|
84
48
|
}
|
|
85
49
|
catch (err) {
|
|
86
|
-
// Stop the spinner before the error propagates so the base class's p.cancel()
|
|
87
|
-
// can render cleanly instead of colliding with the spinner's render loop.
|
|
88
50
|
spinner?.stop(intro);
|
|
89
51
|
throw err;
|
|
90
52
|
}
|
|
91
|
-
const url =
|
|
92
|
-
const message = `Forwarding: ${
|
|
53
|
+
const url = handle.url;
|
|
54
|
+
const message = `Forwarding: ${url} -> http://localhost:${flags.port}`;
|
|
93
55
|
if (isPlain) {
|
|
94
56
|
console.log(message);
|
|
95
57
|
}
|
|
@@ -119,27 +81,41 @@ export class Tunnel extends AlpicCommand {
|
|
|
119
81
|
}
|
|
120
82
|
};
|
|
121
83
|
// Keep the process alive until Ctrl+C
|
|
122
|
-
await new Promise((resolve) => {
|
|
84
|
+
await new Promise((resolve, reject) => {
|
|
123
85
|
let closing = false;
|
|
86
|
+
let lastError;
|
|
124
87
|
const shutdown = () => {
|
|
125
88
|
if (closing) {
|
|
126
89
|
process.exit(0);
|
|
127
90
|
}
|
|
128
91
|
closing = true;
|
|
129
|
-
|
|
92
|
+
handle.close();
|
|
130
93
|
resolve();
|
|
131
94
|
};
|
|
132
95
|
process.on("SIGINT", shutdown);
|
|
133
96
|
process.on("SIGTERM", shutdown);
|
|
134
|
-
|
|
97
|
+
handle.on("request", (req) => {
|
|
135
98
|
const message = `${req.method} ${req.path}`;
|
|
136
99
|
isPlain ? console.log(message) : pushActivity(message);
|
|
137
100
|
});
|
|
138
|
-
|
|
101
|
+
handle.on("error", (err) => {
|
|
102
|
+
lastError = err;
|
|
139
103
|
const message = err.message;
|
|
140
104
|
isPlain ? console.error(message) : pushActivity(chalk.red(message));
|
|
141
105
|
});
|
|
142
|
-
tunnel
|
|
106
|
+
// If the tunnel dies without a user-initiated shutdown, surface the captured error so it reaches `catch` (and telemetry) instead of silently exiting 0.
|
|
107
|
+
handle.on("close", (info) => {
|
|
108
|
+
if (info?.displaced) {
|
|
109
|
+
const message = "Tunnel closed: a new tunnel was opened for this account";
|
|
110
|
+
isPlain ? console.log(message) : pushActivity(message);
|
|
111
|
+
}
|
|
112
|
+
if (!closing && lastError) {
|
|
113
|
+
reject(lastError);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
resolve();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
143
119
|
});
|
|
144
120
|
const outro = "Tunnel closed";
|
|
145
121
|
if (isPlain) {
|