alpic 0.0.0-dev.gf754aa0 → 0.0.0-dev.gf7dfd6e

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.
Files changed (180) hide show
  1. package/README.md +18 -0
  2. package/bin/run.js +15 -1
  3. package/dist/__tests__/audit.e2e.test.js +17 -30
  4. package/dist/__tests__/audit.e2e.test.js.map +1 -1
  5. package/dist/__tests__/auth.e2e.test.js +6 -22
  6. package/dist/__tests__/auth.e2e.test.js.map +1 -1
  7. package/dist/__tests__/deploy-flags.e2e.test.js +6 -21
  8. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -1
  9. package/dist/__tests__/deploy.e2e.test.js +5 -21
  10. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  11. package/dist/__tests__/deployment-inspect.e2e.test.js +18 -31
  12. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -1
  13. package/dist/__tests__/deployment-list.e2e.test.js +18 -31
  14. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -1
  15. package/dist/__tests__/deployment-logs.e2e.test.js +15 -29
  16. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -1
  17. package/dist/__tests__/environment-delete.e2e.test.d.ts +1 -0
  18. package/dist/__tests__/environment-delete.e2e.test.js +95 -0
  19. package/dist/__tests__/environment-delete.e2e.test.js.map +1 -0
  20. package/dist/__tests__/environment-list.e2e.test.js +5 -21
  21. package/dist/__tests__/environment-list.e2e.test.js.map +1 -1
  22. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +19 -31
  23. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -1
  24. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +19 -31
  25. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -1
  26. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +18 -31
  27. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -1
  28. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +18 -31
  29. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -1
  30. package/dist/__tests__/git-flags.e2e.test.js +6 -22
  31. package/dist/__tests__/git-flags.e2e.test.js.map +1 -1
  32. package/dist/__tests__/git.e2e.test.js +7 -22
  33. package/dist/__tests__/git.e2e.test.js.map +1 -1
  34. package/dist/__tests__/insights-category.e2e.test.d.ts +1 -0
  35. package/dist/__tests__/insights-category.e2e.test.js +247 -0
  36. package/dist/__tests__/insights-category.e2e.test.js.map +1 -0
  37. package/dist/__tests__/insights.e2e.test.d.ts +1 -0
  38. package/dist/__tests__/insights.e2e.test.js +193 -0
  39. package/dist/__tests__/insights.e2e.test.js.map +1 -0
  40. package/dist/__tests__/logs.e2e.test.js +15 -29
  41. package/dist/__tests__/logs.e2e.test.js.map +1 -1
  42. package/dist/__tests__/mock-api.d.ts +20 -1
  43. package/dist/__tests__/mock-api.js +301 -40
  44. package/dist/__tests__/mock-api.js.map +1 -1
  45. package/dist/__tests__/playground/playground-configure.e2e.test.js +18 -26
  46. package/dist/__tests__/playground/playground-configure.e2e.test.js.map +1 -1
  47. package/dist/__tests__/playground/playground-enable-disable.e2e.test.js +18 -26
  48. package/dist/__tests__/playground/playground-enable-disable.e2e.test.js.map +1 -1
  49. package/dist/__tests__/playground/playground-example-prompt.e2e.test.js +18 -26
  50. package/dist/__tests__/playground/playground-example-prompt.e2e.test.js.map +1 -1
  51. package/dist/__tests__/playground/playground-headers.e2e.test.js +18 -26
  52. package/dist/__tests__/playground/playground-headers.e2e.test.js.map +1 -1
  53. package/dist/__tests__/playground/playground-status.e2e.test.js +18 -26
  54. package/dist/__tests__/playground/playground-status.e2e.test.js.map +1 -1
  55. package/dist/__tests__/project-list.e2e.test.js +5 -21
  56. package/dist/__tests__/project-list.e2e.test.js.map +1 -1
  57. package/dist/__tests__/publish.e2e.test.js +6 -24
  58. package/dist/__tests__/publish.e2e.test.js.map +1 -1
  59. package/dist/__tests__/submission.e2e.test.d.ts +1 -0
  60. package/dist/__tests__/submission.e2e.test.js +173 -0
  61. package/dist/__tests__/submission.e2e.test.js.map +1 -0
  62. package/dist/__tests__/team-inspect.e2e.test.js +26 -1
  63. package/dist/__tests__/team-inspect.e2e.test.js.map +1 -1
  64. package/dist/__tests__/team-list.e2e.test.js +5 -21
  65. package/dist/__tests__/team-list.e2e.test.js.map +1 -1
  66. package/dist/__tests__/tunnel.e2e.test.js +74 -43
  67. package/dist/__tests__/tunnel.e2e.test.js.map +1 -1
  68. package/dist/__tests__/utils.d.ts +17 -6
  69. package/dist/__tests__/utils.js +47 -18
  70. package/dist/__tests__/utils.js.map +1 -1
  71. package/dist/commands/audit.js +3 -1
  72. package/dist/commands/audit.js.map +1 -1
  73. package/dist/commands/deploy.js +12 -11
  74. package/dist/commands/deploy.js.map +1 -1
  75. package/dist/commands/deployment/list.js +3 -3
  76. package/dist/commands/deployment/list.js.map +1 -1
  77. package/dist/commands/environment/delete.d.ts +13 -0
  78. package/dist/commands/environment/delete.js +45 -0
  79. package/dist/commands/environment/delete.js.map +1 -0
  80. package/dist/commands/environment/inspect.js +3 -3
  81. package/dist/commands/environment/inspect.js.map +1 -1
  82. package/dist/commands/environment/list.js +3 -3
  83. package/dist/commands/environment/list.js.map +1 -1
  84. package/dist/commands/insights/category/create.d.ts +17 -0
  85. package/dist/commands/insights/category/create.js +63 -0
  86. package/dist/commands/insights/category/create.js.map +1 -0
  87. package/dist/commands/insights/category/delete.d.ts +13 -0
  88. package/dist/commands/insights/category/delete.js +40 -0
  89. package/dist/commands/insights/category/delete.js.map +1 -0
  90. package/dist/commands/insights/category/link.d.ts +14 -0
  91. package/dist/commands/insights/category/link.js +36 -0
  92. package/dist/commands/insights/category/link.js.map +1 -0
  93. package/dist/commands/insights/category/list.d.ts +13 -0
  94. package/dist/commands/insights/category/list.js +46 -0
  95. package/dist/commands/insights/category/list.js.map +1 -0
  96. package/dist/commands/insights/category/unlink.d.ts +14 -0
  97. package/dist/commands/insights/category/unlink.js +36 -0
  98. package/dist/commands/insights/category/unlink.js.map +1 -0
  99. package/dist/commands/insights/category/update.d.ts +16 -0
  100. package/dist/commands/insights/category/update.js +45 -0
  101. package/dist/commands/insights/category/update.js.map +1 -0
  102. package/dist/commands/insights/feedback/list.d.ts +19 -0
  103. package/dist/commands/insights/feedback/list.js +73 -0
  104. package/dist/commands/insights/feedback/list.js.map +1 -0
  105. package/dist/commands/insights/intent/list.d.ts +22 -0
  106. package/dist/commands/insights/intent/list.js +89 -0
  107. package/dist/commands/insights/intent/list.js.map +1 -0
  108. package/dist/commands/link.js +4 -3
  109. package/dist/commands/link.js.map +1 -1
  110. package/dist/commands/logs.js +1 -9
  111. package/dist/commands/logs.js.map +1 -1
  112. package/dist/commands/project/inspect.js +3 -3
  113. package/dist/commands/project/inspect.js.map +1 -1
  114. package/dist/commands/project/list.js +3 -3
  115. package/dist/commands/project/list.js.map +1 -1
  116. package/dist/commands/submission/create.d.ts +15 -0
  117. package/dist/commands/submission/create.js +59 -0
  118. package/dist/commands/submission/create.js.map +1 -0
  119. package/dist/commands/submission/inspect.d.ts +10 -0
  120. package/dist/commands/submission/inspect.js +56 -0
  121. package/dist/commands/submission/inspect.js.map +1 -0
  122. package/dist/commands/submission/list.d.ts +13 -0
  123. package/dist/commands/submission/list.js +63 -0
  124. package/dist/commands/submission/list.js.map +1 -0
  125. package/dist/commands/submission/update.d.ts +12 -0
  126. package/dist/commands/submission/update.js +37 -0
  127. package/dist/commands/submission/update.js.map +1 -0
  128. package/dist/commands/team/inspect.js +25 -10
  129. package/dist/commands/team/inspect.js.map +1 -1
  130. package/dist/commands/team/list.js +3 -3
  131. package/dist/commands/team/list.js.map +1 -1
  132. package/dist/commands/tunnel.js +7 -11
  133. package/dist/commands/tunnel.js.map +1 -1
  134. package/dist/lib/agent-mode.d.ts +8 -1
  135. package/dist/lib/agent-mode.js +25 -26
  136. package/dist/lib/agent-mode.js.map +1 -1
  137. package/dist/lib/alpic-command.d.ts +2 -1
  138. package/dist/lib/alpic-command.js +14 -3
  139. package/dist/lib/alpic-command.js.map +1 -1
  140. package/dist/lib/alpic-sdk.js +1 -2
  141. package/dist/lib/alpic-sdk.js.map +1 -1
  142. package/dist/lib/audit.d.ts +1 -0
  143. package/dist/lib/audit.js +22 -13
  144. package/dist/lib/audit.js.map +1 -1
  145. package/dist/lib/base-workflow.d.ts +2 -1
  146. package/dist/lib/base-workflow.js +3 -3
  147. package/dist/lib/base-workflow.js.map +1 -1
  148. package/dist/lib/deployment.js +12 -12
  149. package/dist/lib/deployment.js.map +1 -1
  150. package/dist/lib/environment-variable.js +14 -13
  151. package/dist/lib/environment-variable.js.map +1 -1
  152. package/dist/lib/insights.d.ts +19 -0
  153. package/dist/lib/insights.js +54 -0
  154. package/dist/lib/insights.js.map +1 -0
  155. package/dist/lib/link.js +11 -14
  156. package/dist/lib/link.js.map +1 -1
  157. package/dist/lib/logs.js +4 -5
  158. package/dist/lib/logs.js.map +1 -1
  159. package/dist/lib/playground.js +25 -25
  160. package/dist/lib/playground.js.map +1 -1
  161. package/dist/lib/project-settings.js +1 -9
  162. package/dist/lib/project-settings.js.map +1 -1
  163. package/dist/lib/publish.js +3 -3
  164. package/dist/lib/publish.js.map +1 -1
  165. package/dist/lib/resolve.d.ts +7 -6
  166. package/dist/lib/resolve.js +23 -19
  167. package/dist/lib/resolve.js.map +1 -1
  168. package/dist/lib/submission.d.ts +13 -0
  169. package/dist/lib/submission.js +52 -0
  170. package/dist/lib/submission.js.map +1 -0
  171. package/dist/lib/telemetry.js +24 -17
  172. package/dist/lib/telemetry.js.map +1 -1
  173. package/dist/lib/utils.d.ts +9 -1
  174. package/dist/lib/utils.js +28 -2
  175. package/dist/lib/utils.js.map +1 -1
  176. package/dist/lib/utils.test.js +43 -5
  177. package/dist/lib/utils.test.js.map +1 -1
  178. package/dist/sentry.js +3 -6
  179. package/dist/sentry.js.map +1 -1
  180. package/package.json +23 -23
@@ -0,0 +1,173 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { beforeEach, describe, expect, it } from "vitest";
4
+ import { cliSession, expectSuccessfulApiCall, registerCliE2ELifecycle } from "./utils.js";
5
+ const ENV_ID = "env-submission-test";
6
+ const PROJECT_ID = "prj-submission-test";
7
+ const TEAM_ID = "mock-team-id";
8
+ const SUBMISSION_ID = "sub-existing";
9
+ const PREFILLED_FORM_DATA = { appName: "Chess", developerName: "Alpic", tools: [] };
10
+ describe("alpic submission (E2E)", () => {
11
+ const context = registerCliE2ELifecycle({
12
+ projects: [
13
+ {
14
+ projectId: PROJECT_ID,
15
+ teamId: TEAM_ID,
16
+ projectName: "submission-project",
17
+ environmentId: ENV_ID,
18
+ environmentName: "production",
19
+ },
20
+ ],
21
+ });
22
+ let mockServer;
23
+ let serverUrl;
24
+ let cwd;
25
+ let binPath;
26
+ beforeEach(() => {
27
+ ({ mockServer, serverUrl, cwd, binPath } = context);
28
+ mockServer.setSubmissionPrefill("chatgpt", PREFILLED_FORM_DATA);
29
+ mockServer.addSubmission({
30
+ id: SUBMISSION_ID,
31
+ environmentId: ENV_ID,
32
+ platform: "chatgpt",
33
+ formData: PREFILLED_FORM_DATA,
34
+ prefillSnapshot: PREFILLED_FORM_DATA,
35
+ auditId: "audit-1",
36
+ urlVerification: null,
37
+ createdAt: new Date("2026-08-10T00:00:00.000Z"),
38
+ updatedAt: new Date("2026-08-10T00:00:00.000Z"),
39
+ });
40
+ });
41
+ const env = () => ({ ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" });
42
+ it("creates a submission package for an environment", async () => {
43
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "create", "--environment-id", ENV_ID, "--platform", "chatgpt"], { cwd, env: env() });
44
+ expect(exitCode).toBe(0);
45
+ expect(output).toContain("for ChatGPT");
46
+ const call = mockServer.getLastCall("POST", "/v1/submissions");
47
+ expectSuccessfulApiCall(call);
48
+ expect(call?.input).toMatchObject({ environmentId: ENV_ID, platform: "chatgpt" });
49
+ });
50
+ it("prints the created package as JSON", async () => {
51
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "create", "--environment-id", ENV_ID, "--platform", "chatgpt", "--json"], { cwd, env: env() });
52
+ expect(exitCode).toBe(0);
53
+ expect(output).toContain('"appName":"Chess"');
54
+ });
55
+ it("errors when no platform is given in non-interactive mode", async () => {
56
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "create", "--environment-id", ENV_ID, "--non-interactive"], { cwd, env: env() });
57
+ expect(exitCode).not.toBe(0);
58
+ expect(output).toContain("--platform is required in non-interactive mode.");
59
+ expect(mockServer.getCalls("POST", "/v1/submissions")).toHaveLength(0);
60
+ });
61
+ it("keeps status output off stdout in JSON mode, so the package can be piped", async () => {
62
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "inspect", "--submission-id", SUBMISSION_ID, "--json"], { cwd, env: env() });
63
+ expect(exitCode).toBe(0);
64
+ expect(JSON.parse(output.trim())).toMatchObject({ id: SUBMISSION_ID, platform: "chatgpt" });
65
+ });
66
+ it("keeps nested project resolution off stdout in JSON mode", async () => {
67
+ const { exitCode, output } = await cliSession(process.execPath, [
68
+ binPath,
69
+ "submission",
70
+ "create",
71
+ "--environment-name",
72
+ "production",
73
+ "--project-name",
74
+ "submission-project",
75
+ "--platform",
76
+ "chatgpt",
77
+ "--json",
78
+ ], { cwd, env: env() });
79
+ expect(exitCode).toBe(0);
80
+ expect(JSON.parse(output.trim())).toMatchObject({ platform: "chatgpt" });
81
+ });
82
+ it("keeps environment resolution off stdout in JSON mode", async () => {
83
+ const { exitCode, output } = await cliSession(process.execPath, [
84
+ binPath,
85
+ "submission",
86
+ "create",
87
+ "--environment-name",
88
+ "production",
89
+ "--project-id",
90
+ PROJECT_ID,
91
+ "--platform",
92
+ "chatgpt",
93
+ "--json",
94
+ ], { cwd, env: env() });
95
+ expect(exitCode).toBe(0);
96
+ expect(JSON.parse(output.trim())).toMatchObject({ platform: "chatgpt" });
97
+ });
98
+ it("rejects a form field the platform does not have, rather than dropping it", async () => {
99
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "update", "--submission-id", SUBMISSION_ID, "--form-data", '{"appNmae":"Chess"}'], { cwd, env: env() });
100
+ expect(exitCode).not.toBe(0);
101
+ expect(output).not.toContain("Updated");
102
+ expect(output).toContain("Input validation failed");
103
+ expect(mockServer.getLastCall("PUT", `/v1/submissions/${SUBMISSION_ID}`)?.responseStatus).toBeGreaterThanOrEqual(400);
104
+ });
105
+ it("lists the packages of a project resolved by name", async () => {
106
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "list", "--project-name", "submission-project"], { cwd, env: env() });
107
+ expect(exitCode).toBe(0);
108
+ expect(output).toContain(SUBMISSION_ID);
109
+ expect(output).toContain("ChatGPT");
110
+ expectSuccessfulApiCall(mockServer.getLastCall("GET", `/v1/projects/${PROJECT_ID}/submissions`));
111
+ });
112
+ it("filters the list by environment and platform", async () => {
113
+ const { exitCode, output } = await cliSession(process.execPath, [
114
+ binPath,
115
+ "submission",
116
+ "list",
117
+ "--project-id",
118
+ PROJECT_ID,
119
+ "--environment-id",
120
+ ENV_ID,
121
+ "--platform",
122
+ "claudeai",
123
+ "--json",
124
+ ], { cwd, env: env() });
125
+ expect(exitCode).toBe(0);
126
+ expect(JSON.parse(output.trim())).toEqual([]);
127
+ expect(mockServer.getLastCall("GET", `/v1/projects/${PROJECT_ID}/submissions`)?.input).toMatchObject({
128
+ environmentId: ENV_ID,
129
+ platform: "claudeai",
130
+ });
131
+ });
132
+ it("inspects a submission package field by field", async () => {
133
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "inspect", "--submission-id", SUBMISSION_ID], { cwd, env: env() });
134
+ expect(exitCode).toBe(0);
135
+ expect(output).toContain("ChatGPT");
136
+ expect(output).toContain("appName");
137
+ expect(output).toContain("Chess");
138
+ expectSuccessfulApiCall(mockServer.getLastCall("GET", `/v1/submissions/${SUBMISSION_ID}`));
139
+ });
140
+ it("exits with an error when the submission does not exist", async () => {
141
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "inspect", "--submission-id", "sub-unknown"], { cwd, env: env() });
142
+ expect(exitCode).not.toBe(0);
143
+ expect(output).toContain("Submission not found");
144
+ });
145
+ it("sends the fields from inline JSON, reading the platform off the package", async () => {
146
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "update", "--submission-id", SUBMISSION_ID, "--form-data", '{"appName":"Chess Master"}'], { cwd, env: env() });
147
+ expect(exitCode).toBe(0);
148
+ expect(output).toContain(`Updated ${SUBMISSION_ID}.`);
149
+ const call = mockServer.getLastCall("PUT", `/v1/submissions/${SUBMISSION_ID}`);
150
+ expectSuccessfulApiCall(call);
151
+ expect(call?.input).toMatchObject({ platform: "chatgpt", formData: { appName: "Chess Master" } });
152
+ });
153
+ it("sends the fields from a JSON file", async () => {
154
+ const formDataPath = join(cwd, "submission.json");
155
+ await writeFile(formDataPath, JSON.stringify({ appName: "Chess Club" }));
156
+ const { exitCode } = await cliSession(process.execPath, [binPath, "submission", "update", "--submission-id", SUBMISSION_ID, "--form-data-file", formDataPath], { cwd, env: env() });
157
+ expect(exitCode).toBe(0);
158
+ const call = mockServer.getLastCall("PUT", `/v1/submissions/${SUBMISSION_ID}`);
159
+ expect(call?.input).toMatchObject({ formData: { appName: "Chess Club" } });
160
+ });
161
+ it("rejects form data that is not a JSON object without calling the API", async () => {
162
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "update", "--submission-id", SUBMISSION_ID, "--form-data", "[]"], { cwd, env: env() });
163
+ expect(exitCode).not.toBe(0);
164
+ expect(output).toContain("Form data must be a JSON object of submission fields.");
165
+ expect(mockServer.getCalls("PUT", `/v1/submissions/${SUBMISSION_ID}`)).toHaveLength(0);
166
+ });
167
+ it("rejects an update with no form data", async () => {
168
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "submission", "update", "--submission-id", SUBMISSION_ID], { cwd, env: env() });
169
+ expect(exitCode).not.toBe(0);
170
+ expect(output).toContain("No form data provided. Use --form-data or --form-data-file.");
171
+ });
172
+ });
173
+ //# sourceMappingURL=submission.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/submission.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { rmSync } from "node:fs";
2
2
  import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
3
3
  import { MockApiServer } from "./mock-api.js";
4
- import { buildMockProject, cliSession, expectSuccessfulApiCall, setupTestDirectory } from "./utils.js";
4
+ import { buildMockProject, buildMockTeamUsage, cliSession, expectSuccessfulApiCall, setupTestDirectory, } from "./utils.js";
5
5
  describe("alpic team inspect (E2E)", () => {
6
6
  let mockServer;
7
7
  let serverUrl;
@@ -29,6 +29,7 @@ describe("alpic team inspect (E2E)", () => {
29
29
  }
30
30
  });
31
31
  it("displays team details and projects with --team-id", async () => {
32
+ mockServer.setTeamUsage(buildMockTeamUsage(teamId));
32
33
  mockServer.addProject(buildMockProject({
33
34
  projectId: "prj-1",
34
35
  teamId,
@@ -49,6 +50,30 @@ describe("alpic team inspect (E2E)", () => {
49
50
  const listCall = mockServer.getLastCall("GET", "/v1/teams");
50
51
  expectSuccessfulApiCall(listCall);
51
52
  });
53
+ it("reports the current window usage against the plan allowance", async () => {
54
+ mockServer.setTeamUsage(buildMockTeamUsage(teamId, { plan: "pro", requestCount: 4_231, includedRequests: 200_000 }));
55
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "team", "inspect", "--team-id", teamId], {
56
+ cwd,
57
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
58
+ }, async (cli) => {
59
+ await cli.expect("Team found");
60
+ });
61
+ expect(exitCode).toBe(0);
62
+ expect(output).toContain("4,231 / 200,000 requests (resets in 12 days)");
63
+ const usageCall = mockServer.getLastCall("GET", `/v1/teams/${teamId}/usage`);
64
+ expectSuccessfulApiCall(usageCall);
65
+ });
66
+ it("still shows the team when the server has no usage route", async () => {
67
+ const { exitCode, output } = await cliSession(process.execPath, [binPath, "team", "inspect", "--team-id", teamId], {
68
+ cwd,
69
+ env: { ALPIC_API_BASE_URL: serverUrl, ALPIC_API_KEY: "test-api-key" },
70
+ }, async (cli) => {
71
+ await cli.expect("Team found");
72
+ });
73
+ expect(exitCode).toBe(0);
74
+ expect(output).toContain(teamName);
75
+ expect(output).not.toContain("Usage");
76
+ });
52
77
  it("prompts to select a team when --team-id is not provided", async () => {
53
78
  mockServer.setTeams([
54
79
  { id: teamId, name: teamName },
@@ -1 +1 @@
1
- {"version":3,"file":"team-inspect.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/team-inspect.e2e.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-inspect.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/team-inspect.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,13 @@
1
- import { rmSync } from "node:fs";
2
- import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
3
- import { MockApiServer } from "./mock-api.js";
4
- import { cliSession, expectSuccessfulApiCall, setupTestDirectory } from "./utils.js";
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { cliSession, expectSuccessfulApiCall, registerCliE2ELifecycle } from "./utils.js";
5
3
  describe("alpic team list (E2E)", () => {
4
+ const context = registerCliE2ELifecycle();
6
5
  let mockServer;
7
6
  let serverUrl;
8
7
  let cwd;
9
8
  let binPath;
10
- beforeAll(async () => {
11
- mockServer = new MockApiServer();
12
- serverUrl = await mockServer.start();
13
- });
14
- afterAll(async () => {
15
- await mockServer.stop();
16
- });
17
- beforeEach(async () => {
18
- mockServer.reset();
19
- const setup = await setupTestDirectory();
20
- cwd = setup.cwd;
21
- binPath = setup.binPath;
22
- });
23
- afterEach(() => {
24
- if (cwd) {
25
- rmSync(cwd, { recursive: true, force: true });
26
- }
9
+ beforeEach(() => {
10
+ ({ mockServer, serverUrl, cwd, binPath } = context);
27
11
  });
28
12
  it("lists teams for the authenticated user", async () => {
29
13
  mockServer.setTeams([
@@ -1 +1 @@
1
- {"version":3,"file":"team-list.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/team-list.e2e.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-list.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/team-list.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1F,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAE1C,IAAI,UAAyB,CAAC;IAC9B,IAAI,SAAiB,CAAC;IACtB,IAAI,GAAW,CAAC;IAChB,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,UAAU,CAAC,QAAQ,CAAC;YAClB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;YACpC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EACzB;YACE,GAAG;YACH,GAAG,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE;SACtE,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACpC,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAEjD,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5D,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAExB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC3C,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EACzB;YACE,GAAG;YACH,GAAG,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE;SACtE,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,9 +1,7 @@
1
- import { rmSync } from "node:fs";
2
1
  import http from "node:http";
3
2
  import { createServer } from "pipenet/server";
4
- import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
5
- import { MockApiServer } from "./mock-api.js";
6
- import { cliSession, createOAuthEnv, setupTestDirectory } from "./utils.js";
3
+ import { beforeEach, describe, expect, it } from "vitest";
4
+ import { cliSession, createOAuthEnv, registerCliE2ELifecycle } from "./utils.js";
7
5
  function freePort() {
8
6
  return new Promise((resolve, reject) => {
9
7
  const probe = http.createServer();
@@ -14,28 +12,50 @@ function freePort() {
14
12
  });
15
13
  });
16
14
  }
15
+ async function startTunnelServer() {
16
+ const tunnelPort = await freePort();
17
+ const tunnelServer = createServer({
18
+ domains: ["localhost"],
19
+ tunnelPort,
20
+ maxTcpSockets: 10,
21
+ keepAliveDelayMs: 1_000,
22
+ });
23
+ // Bind on all interfaces so the CLI's `localhost` tunnel sockets connect whether it resolves to IPv4 or IPv6.
24
+ await tunnelServer.tunnelServer?.listen(tunnelPort);
25
+ const httpPort = await new Promise((resolve) => {
26
+ tunnelServer.listen(0, () => resolve(tunnelServer.address().port));
27
+ });
28
+ const close = async () => {
29
+ tunnelServer.tunnelServer?.close();
30
+ await new Promise((resolve) => tunnelServer.close(() => resolve()));
31
+ };
32
+ return { httpPort, close };
33
+ }
34
+ function proxiedStatus(port, subdomain) {
35
+ return new Promise((resolve, reject) => {
36
+ const req = http.request({
37
+ agent: false,
38
+ host: "127.0.0.1",
39
+ port,
40
+ method: "POST",
41
+ path: "/mcp",
42
+ headers: { host: `${subdomain}.localhost`, connection: "close", "content-type": "application/json" },
43
+ }, (res) => {
44
+ res.resume();
45
+ res.on("end", () => resolve(res.statusCode ?? 0));
46
+ });
47
+ req.on("error", reject);
48
+ req.end("{}");
49
+ });
50
+ }
17
51
  describe("alpic tunnel (E2E)", () => {
52
+ const context = registerCliE2ELifecycle();
18
53
  let mockServer;
19
54
  let serverUrl;
20
55
  let cwd;
21
56
  let binPath;
22
- beforeAll(async () => {
23
- mockServer = new MockApiServer();
24
- serverUrl = await mockServer.start();
25
- });
26
- afterAll(async () => {
27
- await mockServer.stop();
28
- });
29
- beforeEach(async () => {
30
- mockServer.reset();
31
- const setup = await setupTestDirectory();
32
- cwd = setup.cwd;
33
- binPath = setup.binPath;
34
- });
35
- afterEach(() => {
36
- if (cwd) {
37
- rmSync(cwd, { recursive: true, force: true });
38
- }
57
+ beforeEach(() => {
58
+ ({ mockServer, serverUrl, cwd, binPath } = context);
39
59
  });
40
60
  it("triggers login when not authenticated", async () => {
41
61
  const { output } = await cliSession(process.execPath, [binPath, "tunnel", "--port", "3000"], {
@@ -69,8 +89,7 @@ describe("alpic tunnel (E2E)", () => {
69
89
  timeoutMs: 12000,
70
90
  }, async (cli) => {
71
91
  await cli.expect("Opening tunnel");
72
- // "Opening tunnel" is printed before the API request is sent (tunnel.ts:51 vs :54).
73
- // Wait for the request to reach the mock server before killing the process.
92
+ // "Opening tunnel" prints before the API request is sent, so wait for the request to reach the mock server before killing the process.
74
93
  const deadline = Date.now() + 500;
75
94
  while (Date.now() < deadline) {
76
95
  if (mockServer.getCalls().some((call) => call.path.includes("tunnels"))) {
@@ -84,24 +103,10 @@ describe("alpic tunnel (E2E)", () => {
84
103
  expect(ticketCall).toBeDefined();
85
104
  });
86
105
  it("closes the previous tunnel when a new one is opened for the same account", async () => {
87
- // Our patched pipenet enforces at-most-one tunnel per subdomain: opening a second
88
- // tunnel for the same subdomain closes the first and severs its sockets, and because
89
- // each session has a distinct internal id the displaced client can't rejoin the new
90
- // pool — so its CLI detects the takeover and exits on its own.
106
+ // The patched pipenet enforces at-most-one tunnel per subdomain: opening a second closes the first and severs its sockets, so the displaced CLI detects the takeover and exits on its own.
91
107
  const subdomain = "cool-mongoose-123";
92
- const tunnelPort = await freePort();
93
- const tunnelServer = createServer({
94
- domains: ["localhost"],
95
- tunnelPort,
96
- maxTcpSockets: 10,
97
- keepAliveDelayMs: 1_000,
98
- });
99
- // Bind on all interfaces so the CLI's `localhost` tunnel sockets connect regardless of
100
- // whether it resolves to IPv4 or IPv6.
101
- await tunnelServer.tunnelServer?.listen(tunnelPort);
102
- const httpPort = await new Promise((resolve) => {
103
- tunnelServer.listen(0, () => resolve(tunnelServer.address().port));
104
- });
108
+ const tunnelServer = await startTunnelServer();
109
+ const { httpPort } = tunnelServer;
105
110
  mockServer.setTunnelTicket({ subdomain, ticket: "mock-ticket", tunnelHost: `localhost:${httpPort}` });
106
111
  const env = createOAuthEnv(cwd, serverUrl);
107
112
  let startSecondTunnel = () => { };
@@ -111,7 +116,6 @@ describe("alpic tunnel (E2E)", () => {
111
116
  const firstSession = cliSession(process.execPath, [binPath, "tunnel", "--port", "4011"], { cwd, env, timeoutMs: 30_000 }, async (cli) => {
112
117
  await cli.expect("Forwarding");
113
118
  startSecondTunnel();
114
- // The displaced CLI should report the takeover and exit on its own.
115
119
  await cli.expect("a new tunnel was opened for this account", { timeoutMs: 20_000 });
116
120
  });
117
121
  await secondTunnelStarted;
@@ -127,8 +131,35 @@ describe("alpic tunnel (E2E)", () => {
127
131
  expect(first.output).toContain("a new tunnel was opened for this account");
128
132
  }
129
133
  finally {
130
- tunnelServer.tunnelServer?.close();
131
- await new Promise((resolve) => tunnelServer.close(() => resolve()));
134
+ await tunnelServer.close();
135
+ }
136
+ }, 40_000);
137
+ it("keeps proxying when the local server answers Connection: keep-alive to a Connection: close request", async () => {
138
+ const subdomain = "cool-mongoose-456";
139
+ const { httpPort, close } = await startTunnelServer();
140
+ const local = http.createServer((_req, res) => {
141
+ res.writeHead(200, { "content-type": "text/event-stream", connection: "keep-alive" });
142
+ res.end("event: message\ndata: {}\n\n");
143
+ });
144
+ const localPort = await new Promise((resolve) => {
145
+ local.listen(0, "127.0.0.1", () => resolve(local.address().port));
146
+ });
147
+ mockServer.setTunnelTicket({ subdomain, ticket: "mock-ticket", tunnelHost: `localhost:${httpPort}` });
148
+ const env = createOAuthEnv(cwd, serverUrl);
149
+ const statuses = [];
150
+ try {
151
+ await cliSession(process.execPath, [binPath, "tunnel", "--port", String(localPort)], { cwd, env, timeoutMs: 30_000 }, async (cli) => {
152
+ await cli.expect("Forwarding");
153
+ for (let attempt = 0; attempt < 4; attempt++) {
154
+ statuses.push(await proxiedStatus(httpPort, subdomain));
155
+ }
156
+ cli.stop();
157
+ });
158
+ expect(statuses).toEqual([200, 200, 200, 200]);
159
+ }
160
+ finally {
161
+ await close();
162
+ await new Promise((resolve) => local.close(() => resolve()));
132
163
  }
133
164
  }, 40_000);
134
165
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/tunnel.e2e.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel.e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/tunnel.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import type { RouterOutput } from "@alpic-ai/api";
2
- import type { ApiCall, MockApiServer } from "./mock-api.js";
2
+ import { type ApiCall, MockApiServer } from "./mock-api.js";
3
3
  type Expectable = string | RegExp;
4
4
  type ProjectGetV1 = RouterOutput["projects"]["get"]["v1"];
5
5
  type DeploymentGetV1 = RouterOutput["deployments"]["get"]["v1"];
6
+ type TeamUsageGetV1 = RouterOutput["teams"]["getUsage"]["v1"];
6
7
  type ProductionEnvironment = NonNullable<ProjectGetV1["productionEnvironment"]>;
7
8
  type ProductionEnvironmentDomains = ProductionEnvironment["domains"];
8
9
  export type CliSessionOptions = {
@@ -45,6 +46,8 @@ export type BuildMockProjectParams = {
45
46
  };
46
47
  export declare function buildMockProject(params: BuildMockProjectParams): ProjectGetV1;
47
48
  export declare function buildMockDeployment(overrides?: Partial<DeploymentGetV1>): DeploymentGetV1;
49
+ /** Anchored on the run so the rendered "resets in 12 days" stays snapshot-stable. */
50
+ export declare function buildMockTeamUsage(teamId: string, overrides?: Partial<TeamUsageGetV1>): TeamUsageGetV1;
48
51
  export type SetupTestDirectoryOptions = {
49
52
  /** If true, run git init and add origin/upstream remotes */
50
53
  initGit?: boolean;
@@ -53,14 +56,22 @@ export declare function setupTestDirectory(options?: SetupTestDirectoryOptions):
53
56
  cwd: string;
54
57
  binPath: string;
55
58
  }>;
59
+ export type CliE2EContext = {
60
+ mockServer: MockApiServer;
61
+ serverUrl: string;
62
+ cwd: string;
63
+ binPath: string;
64
+ };
65
+ export type RegisterCliE2ELifecycleOptions = {
66
+ projects?: BuildMockProjectParams[];
67
+ testDirectory?: SetupTestDirectoryOptions;
68
+ };
69
+ /** Registers the standard e2e lifecycle (one mock API server per suite, fresh test directory and mock state per test); context fields are (re)assigned by the hooks, so read them inside tests or a `beforeEach`, never at `describe` scope. */
70
+ export declare function registerCliE2ELifecycle(options?: RegisterCliE2ELifecycleOptions): CliE2EContext;
56
71
  export declare function createConfigFile(cwd: string, projectId: string, teamId: string, projectName: string, environmentId: string, environmentName: string, teamName?: string): void;
57
72
  export declare function runGit(args: string[], cwd: string): void;
58
73
  export declare function expectSuccessfulApiCall(call: ApiCall | undefined, customAssertions?: (call: ApiCall) => void): asserts call is ApiCall;
59
- /**
60
- * Create OAuth credentials in a temp config dir and return env for CLI subprocess.
61
- * Use this to run commands with OAuth auth (no ALPIC_API_KEY).
62
- * Caller must pass serverUrl so userinfo can be pointed at the mock server.
63
- */
74
+ /** Creates OAuth credentials in a temp config dir and returns env for running the CLI with OAuth auth (no ALPIC_API_KEY); serverUrl points userinfo at the mock server. */
64
75
  export declare function createOAuthEnv(cwd: string, serverUrl: string): Record<string, string>;
65
76
  export declare function verifyConfigFile(cwd: string, expected: {
66
77
  projectName: string;