alpic 0.0.0-dev.gde9ffac → 0.0.0-dev.gdebadc6
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 +17 -30
- 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-delete.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-delete.e2e.test.js +95 -0
- package/dist/__tests__/environment-delete.e2e.test.js.map +1 -0
- 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 +247 -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 +26 -1
- package/dist/__tests__/mock-api.js +296 -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__/submission.e2e.test.d.ts +1 -0
- package/dist/__tests__/submission.e2e.test.js +146 -0
- package/dist/__tests__/submission.e2e.test.js.map +1 -0
- 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/audit.js +3 -1
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/deploy.js +71 -54
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/deployment/list.js +3 -3
- package/dist/commands/deployment/list.js.map +1 -1
- package/dist/commands/environment/delete.d.ts +13 -0
- package/dist/commands/environment/delete.js +45 -0
- package/dist/commands/environment/delete.js.map +1 -0
- package/dist/commands/environment/inspect.js +3 -3
- package/dist/commands/environment/inspect.js.map +1 -1
- package/dist/commands/environment/list.js +3 -3
- package/dist/commands/environment/list.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 +46 -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 +45 -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 +73 -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 +89 -0
- package/dist/commands/insights/intent/list.js.map +1 -0
- package/dist/commands/link.js +4 -3
- 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/project/inspect.js +3 -3
- package/dist/commands/project/inspect.js.map +1 -1
- package/dist/commands/project/list.js +3 -3
- package/dist/commands/project/list.js.map +1 -1
- package/dist/commands/submission/create.d.ts +15 -0
- package/dist/commands/submission/create.js +59 -0
- package/dist/commands/submission/create.js.map +1 -0
- package/dist/commands/submission/inspect.d.ts +10 -0
- package/dist/commands/submission/inspect.js +56 -0
- package/dist/commands/submission/inspect.js.map +1 -0
- package/dist/commands/submission/update.d.ts +12 -0
- package/dist/commands/submission/update.js +37 -0
- package/dist/commands/submission/update.js.map +1 -0
- package/dist/commands/team/inspect.js +25 -10
- package/dist/commands/team/inspect.js.map +1 -1
- package/dist/commands/team/list.js +3 -3
- package/dist/commands/team/list.js.map +1 -1
- package/dist/commands/tunnel.js +40 -64
- 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/agent-mode.d.ts +8 -1
- package/dist/lib/agent-mode.js +25 -26
- package/dist/lib/agent-mode.js.map +1 -1
- package/dist/lib/alpic-command.d.ts +3 -2
- package/dist/lib/alpic-command.js +30 -14
- 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.d.ts +1 -0
- package/dist/lib/audit.js +24 -15
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/base-workflow.d.ts +2 -1
- package/dist/lib/base-workflow.js +3 -3
- package/dist/lib/base-workflow.js.map +1 -1
- package/dist/lib/deployment.d.ts +0 -21
- package/dist/lib/deployment.js +20 -69
- package/dist/lib/deployment.js.map +1 -1
- package/dist/lib/environment-variable.js +14 -13
- package/dist/lib/environment-variable.js.map +1 -1
- package/dist/lib/insights.d.ts +19 -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 +20 -75
- 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 +27 -27
- package/dist/lib/playground.js.map +1 -1
- 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/publish.js +3 -3
- package/dist/lib/publish.js.map +1 -1
- package/dist/lib/resolve.d.ts +7 -6
- package/dist/lib/resolve.js +27 -23
- package/dist/lib/resolve.js.map +1 -1
- package/dist/lib/submission.d.ts +13 -0
- package/dist/lib/submission.js +52 -0
- package/dist/lib/submission.js.map +1 -0
- 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
|
@@ -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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"}
|
|
@@ -17,10 +17,10 @@ export class TeamList extends AlpicCommand {
|
|
|
17
17
|
async run() {
|
|
18
18
|
const { flags } = await this.parse(TeamList);
|
|
19
19
|
await this.ensureAuthenticated(flags);
|
|
20
|
-
const
|
|
21
|
-
|
|
20
|
+
const logger = this.logger();
|
|
21
|
+
logger.start("Fetching teams...");
|
|
22
22
|
const teams = await api.teams.list.v1();
|
|
23
|
-
|
|
23
|
+
logger.stop(`Found ${plural(teams.length, "team")}`);
|
|
24
24
|
if (teams.length === 0) {
|
|
25
25
|
p.log.info("No teams found.");
|
|
26
26
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/team/list.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;AAEvD,MAAM,OAAO,QAAS,SAAQ,YAAY;IACxC,MAAM,CAAU,WAAW,GAAG,iCAAiC,CAAC;IAEhE,MAAM,CAAU,QAAQ,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3D,MAAM,CAAU,KAAK,GAAG;QACtB,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE7C,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/team/list.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;AAEvD,MAAM,OAAO,QAAS,SAAQ,YAAY;IACxC,MAAM,CAAU,WAAW,GAAG,iCAAiC,CAAC;IAEhE,MAAM,CAAU,QAAQ,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3D,MAAM,CAAU,KAAK,GAAG;QACtB,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE7C,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAExC,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAErD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG;SAC3E,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,IAAI,EAAE;YAChB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACjE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACrE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;SAC5E,CAAC,CACH,CAAC;IACJ,CAAC"}
|
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,78 +20,43 @@ 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
|
-
let
|
|
34
|
+
let logger;
|
|
42
35
|
const intro = "Opening tunnel...";
|
|
43
36
|
if (isPlain) {
|
|
44
37
|
console.log(intro);
|
|
45
38
|
}
|
|
46
39
|
else {
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
logger = this.logger();
|
|
41
|
+
logger.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
|
-
|
|
87
|
-
// can render cleanly instead of colliding with the spinner's render loop.
|
|
88
|
-
spinner?.stop(intro);
|
|
50
|
+
logger?.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
|
}
|
|
96
58
|
else {
|
|
97
|
-
|
|
59
|
+
logger?.stop(message);
|
|
98
60
|
p.log.step(`Test it live at ${url}/try`);
|
|
99
61
|
p.log.info("Press Ctrl+C to close the tunnel");
|
|
100
62
|
}
|
|
@@ -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) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
3
|
-
import { getWhoamiInfoMessage } from "../lib/
|
|
3
|
+
import { getWhoamiInfoMessage } from "../lib/whoami.js";
|
|
4
4
|
export class Whoami extends AlpicCommand {
|
|
5
5
|
static description = "Show the current Alpic identity (API key or logged-in user)";
|
|
6
6
|
static examples = ["<%= config.bin %> whoami"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,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,gCAAgC,CAAC,CAAC;QAE1C,CAAC,CAAC,KAAK,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC;IACxC,CAAC"}
|
package/dist/lib/agent-mode.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
export declare function isAgentMode(): boolean;
|
|
3
|
-
|
|
3
|
+
declare const LOG_LEVELS: readonly ["start", "stop", "cancel", "error"];
|
|
4
|
+
export type LogLevel = (typeof LOG_LEVELS)[number];
|
|
5
|
+
export type LogLevels = "all" | readonly LogLevel[];
|
|
6
|
+
/** All a `--json` command can afford: progress on stdout would corrupt the payload, while failures still reach stderr. */
|
|
7
|
+
export declare const ERRORS_ONLY: readonly LogLevel[];
|
|
8
|
+
/** A clack spinner on a TTY, plain logging everywhere else; any restricted level set rules the spinner out, since it cannot be silenced per level. */
|
|
9
|
+
export declare function createLogger(levels?: LogLevels): p.SpinnerResult;
|
|
10
|
+
export {};
|
package/dist/lib/agent-mode.js
CHANGED
|
@@ -4,33 +4,32 @@ const agentResult = await determineAgent();
|
|
|
4
4
|
export function isAgentMode() {
|
|
5
5
|
return agentResult.isAgent;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
const LOG_LEVELS = ["start", "stop", "cancel", "error"];
|
|
8
|
+
/** All a `--json` command can afford: progress on stdout would corrupt the payload, while failures still reach stderr. */
|
|
9
|
+
export const ERRORS_ONLY = ["cancel", "error"];
|
|
10
|
+
function createLevelledLogger(levels) {
|
|
11
|
+
const write = (level, stream) => (message) => {
|
|
12
|
+
if (message && levels.includes(level)) {
|
|
13
|
+
stream(message);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
start: write("start", console.log),
|
|
18
|
+
stop: write("stop", console.log),
|
|
19
|
+
message: () => { },
|
|
20
|
+
cancel: write("cancel", console.error),
|
|
21
|
+
error: write("error", console.error),
|
|
22
|
+
clear: () => { },
|
|
23
|
+
isCancelled: false,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** A clack spinner on a TTY, plain logging everywhere else; any restricted level set rules the spinner out, since it cannot be silenced per level. */
|
|
27
|
+
export function createLogger(levels = "all") {
|
|
28
|
+
if (levels !== "all") {
|
|
29
|
+
return createLevelledLogger(levels);
|
|
30
|
+
}
|
|
8
31
|
if (process.env.VITEST || isAgentMode()) {
|
|
9
|
-
return
|
|
10
|
-
start: (message) => {
|
|
11
|
-
if (message) {
|
|
12
|
-
console.log(message);
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
stop: (message) => {
|
|
16
|
-
if (message) {
|
|
17
|
-
console.log(message);
|
|
18
|
-
}
|
|
19
|
-
},
|
|
20
|
-
message: () => { },
|
|
21
|
-
cancel: (message) => {
|
|
22
|
-
if (message) {
|
|
23
|
-
console.error(message);
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
error: (message) => {
|
|
27
|
-
if (message) {
|
|
28
|
-
console.error(message);
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
clear: () => { },
|
|
32
|
-
isCancelled: false,
|
|
33
|
-
};
|
|
32
|
+
return createLevelledLogger(LOG_LEVELS);
|
|
34
33
|
}
|
|
35
34
|
return p.spinner();
|
|
36
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-mode.js","sourceRoot":"","sources":["../../src/lib/agent-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;AAE3C,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"agent-mode.js","sourceRoot":"","sources":["../../src/lib/agent-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;AAE3C,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAKjE,0HAA0H;AAC1H,MAAM,CAAC,MAAM,WAAW,GAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAEpE,SAAS,oBAAoB,CAAC,MAA2B;IACvD,MAAM,KAAK,GAAG,CAAC,KAAe,EAAE,MAAiC,EAAE,EAAE,CAAC,CAAC,OAAgB,EAAE,EAAE;QACzF,IAAI,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;QAClC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC;QACtC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;QACpC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;QACf,WAAW,EAAE,KAAc;KAC5B,CAAC;AACJ,CAAC;AAED,sJAAsJ;AACtJ,MAAM,UAAU,YAAY,CAAC,SAAoB,KAAK;IACpD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,WAAW,EAAE,EAAE,CAAC;QACxC,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import { Command } from "@oclif/core";
|
|
3
|
+
import { type LogLevels } from "./agent-mode.js";
|
|
3
4
|
export declare abstract class AlpicCommand extends Command {
|
|
4
5
|
static baseFlags: {
|
|
5
6
|
"non-interactive": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
@@ -8,6 +9,6 @@ export declare abstract class AlpicCommand extends Command {
|
|
|
8
9
|
ensureAuthenticated(flags: {
|
|
9
10
|
"non-interactive"?: boolean;
|
|
10
11
|
}): Promise<void>;
|
|
11
|
-
protected
|
|
12
|
-
protected exitWithErrorMessage(message: string): never;
|
|
12
|
+
protected logger(levels?: LogLevels): p.SpinnerResult;
|
|
13
|
+
protected exitWithErrorMessage(message: string, cause?: unknown): never;
|
|
13
14
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import { Command, Flags } from "@oclif/core";
|
|
2
|
+
import { Command, Errors, Flags } from "@oclif/core";
|
|
3
3
|
import { ORPCError } from "@orpc/client";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { createLogger } from "./agent-mode.js";
|
|
5
|
+
import { alpic } from "./alpic-sdk.js";
|
|
6
|
+
import { getResponseErrorStatus } from "./utils.js";
|
|
7
7
|
export class AlpicCommand extends Command {
|
|
8
8
|
static baseFlags = {
|
|
9
9
|
"non-interactive": Flags.boolean({
|
|
@@ -13,32 +13,48 @@ export class AlpicCommand extends Command {
|
|
|
13
13
|
};
|
|
14
14
|
async catch(error) {
|
|
15
15
|
if (error instanceof ORPCError) {
|
|
16
|
+
if (error.status === 401 || error.status === 403) {
|
|
17
|
+
const authMessage = process.env.ALPIC_API_KEY !== undefined
|
|
18
|
+
? "Your ALPIC_API_KEY is invalid or not authorized. Check the key and try again."
|
|
19
|
+
: "Your session has expired. Run `alpic login` to sign in again.";
|
|
20
|
+
this.exitWithErrorMessage(authMessage, error);
|
|
21
|
+
}
|
|
16
22
|
let message = `An error occurred while connecting to Alpic: ${error.message}`;
|
|
17
|
-
if (error.code === "NOT_FOUND" &&
|
|
23
|
+
if (error.code === "NOT_FOUND" && alpic.projects.loadConfig()) {
|
|
18
24
|
message += "\nYour .alpic config may reference a deleted resource. Run `alpic link` to re-link.";
|
|
19
25
|
}
|
|
20
|
-
this.exitWithErrorMessage(message);
|
|
26
|
+
this.exitWithErrorMessage(message, error);
|
|
27
|
+
}
|
|
28
|
+
const status = getResponseErrorStatus(error);
|
|
29
|
+
if (status === 401 || status === 403) {
|
|
30
|
+
this.exitWithErrorMessage("Your session has expired. Run `alpic login` to sign in again.", error);
|
|
21
31
|
}
|
|
22
32
|
if (error instanceof Error) {
|
|
23
|
-
this.exitWithErrorMessage(error.message);
|
|
33
|
+
this.exitWithErrorMessage(error.message, error);
|
|
24
34
|
}
|
|
25
|
-
this.exitWithErrorMessage(String(error));
|
|
35
|
+
this.exitWithErrorMessage(String(error), error);
|
|
26
36
|
}
|
|
27
37
|
async ensureAuthenticated(flags) {
|
|
28
|
-
if (!(await isAuthenticated())) {
|
|
38
|
+
if (!(await alpic.auth.isAuthenticated())) {
|
|
29
39
|
if (flags["non-interactive"]) {
|
|
30
40
|
this.exitWithErrorMessage("Not authenticated. Set ALPIC_API_KEY or run `alpic login` interactively.");
|
|
31
41
|
}
|
|
32
42
|
p.log.warn("Not authenticated. Starting login…");
|
|
33
|
-
await
|
|
43
|
+
await alpic.auth.login({
|
|
44
|
+
onLoginUrl: (url) => p.log.message(`Opening browser to log in…\n\nIf the browser does not open, copy this URL: ${url}`),
|
|
45
|
+
});
|
|
34
46
|
}
|
|
35
47
|
}
|
|
36
|
-
|
|
37
|
-
return
|
|
48
|
+
logger(levels) {
|
|
49
|
+
return createLogger(levels);
|
|
38
50
|
}
|
|
39
|
-
exitWithErrorMessage(message) {
|
|
51
|
+
exitWithErrorMessage(message, cause) {
|
|
40
52
|
p.cancel(message);
|
|
41
|
-
|
|
53
|
+
const exitError = new Errors.ExitError(1);
|
|
54
|
+
if (cause !== undefined) {
|
|
55
|
+
exitError.cause = cause;
|
|
56
|
+
}
|
|
57
|
+
throw exitError;
|
|
42
58
|
}
|
|
43
59
|
}
|
|
44
60
|
//# sourceMappingURL=alpic-command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpic-command.js","sourceRoot":"","sources":["../../src/lib/alpic-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"alpic-command.js","sourceRoot":"","sources":["../../src/lib/alpic-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAkB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,OAAgB,YAAa,SAAQ,OAAO;IAChD,MAAM,CAAU,SAAS,GAAG;QAC1B,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,WAAW,EAAE,8BAA8B;YAC3C,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;SAC/B,CAAC;KACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,KAAc;QACjC,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACjD,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS;oBACrC,CAAC,CAAC,+EAA+E;oBACjF,CAAC,CAAC,+DAA+D,CAAC;gBACtE,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,OAAO,GAAG,gDAAgD,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC9D,OAAO,IAAI,qFAAqF,CAAC;YACnG,CAAC;YACD,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,IAAI,CAAC,oBAAoB,CAAC,+DAA+D,EAAE,KAAK,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAsC;QAC9D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,oBAAoB,CAAC,0EAA0E,CAAC,CAAC;YACxG,CAAC;YACD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBACrB,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAClB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,8EAA8E,GAAG,EAAE,CAAC;aACrG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAES,MAAM,CAAC,MAAkB;QACjC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAES,oBAAoB,CAAC,OAAe,EAAE,KAAe;QAC7D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,MAAM,SAAS,CAAC;IAClB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Alpic } from "@alpic-ai/sdk";
|
|
2
|
+
import { aliasMachineToUser } from "./telemetry.js";
|
|
3
|
+
export const alpic = new Alpic();
|
|
4
|
+
// The SDK is telemetry-free (the CLI owns transport), so the machine is aliased to the user here on every authentication, explicit login and auto-login alike.
|
|
5
|
+
alpic.auth.on("authenticated", ({ sub }) => {
|
|
6
|
+
void aliasMachineToUser(sub);
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=alpic-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alpic-sdk.js","sourceRoot":"","sources":["../../src/lib/alpic-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;AAEjC,+JAA+J;AAC/J,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;IACzC,KAAK,kBAAkB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
|
package/dist/lib/audit.d.ts
CHANGED
package/dist/lib/audit.js
CHANGED
|
@@ -2,12 +2,19 @@ import { PLATFORM_LABELS } from "@alpic-ai/api";
|
|
|
2
2
|
import * as p from "@clack/prompts";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import { api } from "../api.js";
|
|
5
|
+
import { ERRORS_ONLY } from "./agent-mode.js";
|
|
6
|
+
import { alpic } from "./alpic-sdk.js";
|
|
5
7
|
import { BaseWorkflow } from "./base-workflow.js";
|
|
6
|
-
import { config } from "./config.js";
|
|
7
8
|
import { pollIntervalMs } from "./utils.js";
|
|
8
|
-
|
|
9
|
+
// Keeps a full-length audit under the 30 requests/minute WAF budget on /v1/beacon (infrastructure/lib/constructs/Firewall.ts).
|
|
10
|
+
const DEFAULT_POLL_INTERVAL_MS = pollIntervalMs(5_000);
|
|
9
11
|
const MAX_POLL_MS = 120_000;
|
|
10
12
|
export class AuditWorkflow extends BaseWorkflow {
|
|
13
|
+
info(message) {
|
|
14
|
+
if (!this.flags.json) {
|
|
15
|
+
p.log.info(message);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
11
18
|
async runAudit() {
|
|
12
19
|
this.validateFlags();
|
|
13
20
|
const target = this.flags.url
|
|
@@ -18,32 +25,32 @@ export class AuditWorkflow extends BaseWorkflow {
|
|
|
18
25
|
return 0;
|
|
19
26
|
}
|
|
20
27
|
const { targetUrl, teamId, projectId } = target;
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
const logger = this.logger(this.flags.json ? ERRORS_ONLY : "all");
|
|
29
|
+
this.info(`Target URL ${chalk.dim(targetUrl)}`);
|
|
30
|
+
logger.start("Starting audit...");
|
|
24
31
|
const { id } = await api.beacon.create.v1({
|
|
25
32
|
targetUrl,
|
|
26
33
|
teamId,
|
|
27
34
|
projectId,
|
|
28
35
|
excludeCategories: ["e2e"],
|
|
29
36
|
});
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
logger.stop(`Audit created ${chalk.dim(id)}`);
|
|
38
|
+
logger.start("Running checks...");
|
|
32
39
|
const startedAt = Date.now();
|
|
33
40
|
let audit = await api.beacon.get.v1({ auditId: id });
|
|
34
41
|
while (audit.status === "pending" || audit.status === "partial") {
|
|
35
42
|
if (Date.now() - startedAt > MAX_POLL_MS) {
|
|
36
|
-
|
|
43
|
+
logger.stop("Timed out");
|
|
37
44
|
throw new Error("Audit timed out after 2 minutes");
|
|
38
45
|
}
|
|
39
46
|
await new Promise((resolve) => setTimeout(resolve, DEFAULT_POLL_INTERVAL_MS));
|
|
40
47
|
audit = await api.beacon.get.v1({ auditId: id });
|
|
41
48
|
}
|
|
42
49
|
if (audit.status === "failed") {
|
|
43
|
-
|
|
50
|
+
logger.stop("Audit failed");
|
|
44
51
|
throw new Error("The audit failed. The MCP server may be unreachable.");
|
|
45
52
|
}
|
|
46
|
-
|
|
53
|
+
logger.stop(`Audit completed in ${chalk.bold(`${audit.durationMs ?? 0}ms`)}`);
|
|
47
54
|
const report = audit.report;
|
|
48
55
|
if (!report) {
|
|
49
56
|
throw new Error("Report not available");
|
|
@@ -84,9 +91,9 @@ export class AuditWorkflow extends BaseWorkflow {
|
|
|
84
91
|
if (this.flags["project-id"]) {
|
|
85
92
|
return this.resolveProjectEnvironmentUrl(this.flags["project-id"], environmentId, this.isNonInteractive());
|
|
86
93
|
}
|
|
87
|
-
const projectConfig =
|
|
94
|
+
const projectConfig = alpic.projects.loadConfig();
|
|
88
95
|
if (projectConfig) {
|
|
89
|
-
|
|
96
|
+
this.info(`Using project config from .alpic: project "${projectConfig.projectName}" (team: "${projectConfig.teamName}")`);
|
|
90
97
|
const confirmed = await this.confirm({
|
|
91
98
|
message: `Run audit for project "${projectConfig.projectName}"?`,
|
|
92
99
|
initialValue: true,
|
|
@@ -110,7 +117,7 @@ export class AuditWorkflow extends BaseWorkflow {
|
|
|
110
117
|
throw new Error("No teams found.");
|
|
111
118
|
}
|
|
112
119
|
selectedTeamId = singleTeam.id;
|
|
113
|
-
|
|
120
|
+
this.info(`Using team ${chalk.bold(singleTeam.name)}`);
|
|
114
121
|
}
|
|
115
122
|
else {
|
|
116
123
|
const choice = await p.select({
|
|
@@ -137,6 +144,7 @@ export class AuditWorkflow extends BaseWorkflow {
|
|
|
137
144
|
if (p.isCancel(selectedProjectId)) {
|
|
138
145
|
return null;
|
|
139
146
|
}
|
|
147
|
+
// biome-ignore lint/plugin/no-type-assertion: The cancellation branch above narrows the selected prompt value to a project ID.
|
|
140
148
|
return this.resolveProjectEnvironmentUrl(selectedProjectId, environmentId, this.isNonInteractive());
|
|
141
149
|
}
|
|
142
150
|
async resolveProjectEnvironmentUrl(projectId, environmentId, nonInteractive) {
|
|
@@ -160,7 +168,7 @@ export class AuditWorkflow extends BaseWorkflow {
|
|
|
160
168
|
if (!environment) {
|
|
161
169
|
throw new Error("No environments found for this project.");
|
|
162
170
|
}
|
|
163
|
-
|
|
171
|
+
this.info(`Using environment "${environment.name}"`);
|
|
164
172
|
return { targetUrl: environment.mcpServerUrl, teamId: project.teamId, projectId };
|
|
165
173
|
}
|
|
166
174
|
if (nonInteractive) {
|
|
@@ -169,7 +177,7 @@ export class AuditWorkflow extends BaseWorkflow {
|
|
|
169
177
|
if (!targetUrl) {
|
|
170
178
|
throw new Error("Multiple environments found. Use --environment-id to specify which one to audit.");
|
|
171
179
|
}
|
|
172
|
-
|
|
180
|
+
this.info("Using production environment");
|
|
173
181
|
return { targetUrl, teamId: project.teamId, projectId };
|
|
174
182
|
}
|
|
175
183
|
const selectedEnvironmentId = await p.select({
|
|
@@ -203,6 +211,7 @@ function renderReport(report) {
|
|
|
203
211
|
const warnings = report.results.filter((result) => result.status === "fail" && result.severity === "warning");
|
|
204
212
|
const skipped = report.results.filter((result) => result.status === "skip");
|
|
205
213
|
const platformEntries = Object.entries(report.isReadyForPlatform).map(([platform, ready]) => ({
|
|
214
|
+
// biome-ignore lint/plugin/no-type-assertion: isReadyForPlatform is keyed by the supported Platform union.
|
|
206
215
|
label: PLATFORM_LABELS[platform] ?? platform,
|
|
207
216
|
ready,
|
|
208
217
|
}));
|