alpic 0.0.0-dev.ge64513c → 0.0.0-dev.ge65ebc4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/dev.js +0 -0
- package/dist/__tests__/mock-api.d.ts +2 -0
- package/dist/__tests__/mock-api.js +95 -0
- package/dist/__tests__/mock-api.js.map +1 -1
- package/dist/__tests__/submission.e2e.test.js +27 -0
- package/dist/__tests__/submission.e2e.test.js.map +1 -1
- package/dist/__tests__/telemetry-destinations.e2e.test.d.ts +1 -0
- package/dist/__tests__/telemetry-destinations.e2e.test.js +105 -0
- package/dist/__tests__/telemetry-destinations.e2e.test.js.map +1 -0
- package/dist/__tests__/tunnel.e2e.test.js +67 -14
- package/dist/__tests__/tunnel.e2e.test.js.map +1 -1
- package/dist/commands/submission/list.d.ts +13 -0
- package/dist/commands/submission/list.js +63 -0
- package/dist/commands/submission/list.js.map +1 -0
- package/dist/commands/telemetry/destinations/create.d.ts +19 -0
- package/dist/commands/telemetry/destinations/create.js +57 -0
- package/dist/commands/telemetry/destinations/create.js.map +1 -0
- package/dist/commands/telemetry/destinations/delete.d.ts +13 -0
- package/dist/commands/telemetry/destinations/delete.js +27 -0
- package/dist/commands/telemetry/destinations/delete.js.map +1 -0
- package/dist/commands/telemetry/destinations/list.d.ts +13 -0
- package/dist/commands/telemetry/destinations/list.js +48 -0
- package/dist/commands/telemetry/destinations/list.js.map +1 -0
- package/dist/commands/telemetry/destinations/update.d.ts +20 -0
- package/dist/commands/telemetry/destinations/update.js +62 -0
- package/dist/commands/telemetry/destinations/update.js.map +1 -0
- package/dist/lib/telemetry-destinations.d.ts +9 -0
- package/dist/lib/telemetry-destinations.js +21 -0
- package/dist/lib/telemetry-destinations.js.map +1 -0
- package/dist/lib/telemetry-destinations.test.d.ts +1 -0
- package/dist/lib/telemetry-destinations.test.js +14 -0
- package/dist/lib/telemetry-destinations.test.js.map +1 -0
- package/dist/lib/telemetry.js +3 -0
- package/dist/lib/telemetry.js.map +1 -1
- package/package.json +22 -21
|
@@ -12,6 +12,42 @@ function freePort() {
|
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
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
|
+
}
|
|
15
51
|
describe("alpic tunnel (E2E)", () => {
|
|
16
52
|
const context = registerCliE2ELifecycle();
|
|
17
53
|
let mockServer;
|
|
@@ -69,18 +105,8 @@ describe("alpic tunnel (E2E)", () => {
|
|
|
69
105
|
it("closes the previous tunnel when a new one is opened for the same account", async () => {
|
|
70
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.
|
|
71
107
|
const subdomain = "cool-mongoose-123";
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
domains: ["localhost"],
|
|
75
|
-
tunnelPort,
|
|
76
|
-
maxTcpSockets: 10,
|
|
77
|
-
keepAliveDelayMs: 1_000,
|
|
78
|
-
});
|
|
79
|
-
// Bind on all interfaces so the CLI's `localhost` tunnel sockets connect whether it resolves to IPv4 or IPv6.
|
|
80
|
-
await tunnelServer.tunnelServer?.listen(tunnelPort);
|
|
81
|
-
const httpPort = await new Promise((resolve) => {
|
|
82
|
-
tunnelServer.listen(0, () => resolve(tunnelServer.address().port));
|
|
83
|
-
});
|
|
108
|
+
const tunnelServer = await startTunnelServer();
|
|
109
|
+
const { httpPort } = tunnelServer;
|
|
84
110
|
mockServer.setTunnelTicket({ subdomain, ticket: "mock-ticket", tunnelHost: `localhost:${httpPort}` });
|
|
85
111
|
const env = createOAuthEnv(cwd, serverUrl);
|
|
86
112
|
let startSecondTunnel = () => { };
|
|
@@ -105,8 +131,35 @@ describe("alpic tunnel (E2E)", () => {
|
|
|
105
131
|
expect(first.output).toContain("a new tunnel was opened for this account");
|
|
106
132
|
}
|
|
107
133
|
finally {
|
|
108
|
-
tunnelServer.
|
|
109
|
-
|
|
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()));
|
|
110
163
|
}
|
|
111
164
|
}, 40_000);
|
|
112
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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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
2
|
+
export declare class SubmissionList extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
platform: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
"project-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { AI_PLATFORMS, PLATFORM_LABELS } from "@alpic-ai/api";
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import { Flags } from "@oclif/core";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { api } from "../../api.js";
|
|
6
|
+
import { ERRORS_ONLY } from "../../lib/agent-mode.js";
|
|
7
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
8
|
+
import { projectFlags, resolveProjectId } from "../../lib/resolve.js";
|
|
9
|
+
import { parsePlatform } from "../../lib/submission.js";
|
|
10
|
+
import { formatTable } from "../../lib/table.js";
|
|
11
|
+
import { formatAgo, plural } from "../../lib/utils.js";
|
|
12
|
+
export class SubmissionList extends AlpicCommand {
|
|
13
|
+
static description = "List the submission packages of a project";
|
|
14
|
+
static examples = [
|
|
15
|
+
"<%= config.bin %> submission list",
|
|
16
|
+
"<%= config.bin %> submission list --project-id <projectId>",
|
|
17
|
+
"<%= config.bin %> submission list --project-name <projectName>",
|
|
18
|
+
"<%= config.bin %> submission list --environment-id <environmentId> --platform chatgpt",
|
|
19
|
+
"<%= config.bin %> submission list --json",
|
|
20
|
+
];
|
|
21
|
+
static flags = {
|
|
22
|
+
...projectFlags,
|
|
23
|
+
"environment-id": Flags.string({ description: "Filter by environment ID" }),
|
|
24
|
+
platform: Flags.string({ description: "Filter by the directory the package targets", options: [...AI_PLATFORMS] }),
|
|
25
|
+
json: Flags.boolean({ description: "Print the unmodified API response as JSON", default: false }),
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { flags } = await this.parse(SubmissionList);
|
|
29
|
+
await this.ensureAuthenticated(flags);
|
|
30
|
+
const projectId = await resolveProjectId(flags, { silent: flags.json });
|
|
31
|
+
const logger = this.logger(flags.json ? ERRORS_ONLY : "all");
|
|
32
|
+
logger.start("Fetching submissions...");
|
|
33
|
+
const submissions = await api.submissions.list.v1({
|
|
34
|
+
projectId,
|
|
35
|
+
environmentId: flags["environment-id"],
|
|
36
|
+
platform: flags.platform ? parsePlatform(flags.platform) : undefined,
|
|
37
|
+
});
|
|
38
|
+
logger.stop(`Found ${plural(submissions.length, "submission")}`);
|
|
39
|
+
if (flags.json) {
|
|
40
|
+
this.log(JSON.stringify(submissions));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (submissions.length === 0) {
|
|
44
|
+
p.log.info(`No submissions found. Create one with ${chalk.bold("alpic submission create")}`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const rows = submissions.map((submission) => ({
|
|
48
|
+
id: submission.id,
|
|
49
|
+
platform: PLATFORM_LABELS[submission.platform],
|
|
50
|
+
environment: submission.environmentId,
|
|
51
|
+
audit: submission.auditId ?? "-",
|
|
52
|
+
updated: formatAgo(submission.updatedAt, { short: true }),
|
|
53
|
+
}));
|
|
54
|
+
console.log(formatTable(rows, [
|
|
55
|
+
{ key: "id", header: "id", format: (value) => chalk.cyan(value) },
|
|
56
|
+
{ key: "platform", header: "platform", format: (value) => chalk.bold(value) },
|
|
57
|
+
{ key: "environment", header: "environment", format: (value) => chalk.gray(value) },
|
|
58
|
+
{ key: "audit", header: "beacon audit", format: (value) => chalk.gray(value) },
|
|
59
|
+
{ key: "updated", header: "updated", format: (value) => chalk.gray(value) },
|
|
60
|
+
]));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/submission/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,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,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,MAAM,CAAU,WAAW,GAAG,2CAA2C,CAAC;IAE1E,MAAM,CAAU,QAAQ,GAAG;QACzB,mCAAmC;QACnC,4DAA4D;QAC5D,gEAAgE;QAChE,uFAAuF;QACvF,0CAA0C;KAC3C,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,YAAY;QACf,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC;QAC3E,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;QAClH,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,cAAc,CAAC,CAAC;QAEnD,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAExC,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,SAAS;YACT,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;QAEjE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,yCAAyC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5C,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC9C,WAAW,EAAE,UAAU,CAAC,aAAa;YACrC,KAAK,EAAE,UAAU,CAAC,OAAO,IAAI,GAAG;YAChC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SAC1D,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,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC7E,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACnF,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC9E,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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
2
|
+
export declare class TelemetryDestinationsCreate extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
signal: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
endpoint: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
protocol: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
header: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"secret-header": import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
"intentional-only": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
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,57 @@
|
|
|
1
|
+
import { OTLP_PROTOCOLS, otlpProtocolSchema, TELEMETRY_SIGNALS, telemetrySignalSchema } from "@alpic-ai/api";
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import { Flags } from "@oclif/core";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { api } from "../../../api.js";
|
|
6
|
+
import { ERRORS_ONLY } from "../../../lib/agent-mode.js";
|
|
7
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
8
|
+
import { environmentFlags, projectFlags, resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
9
|
+
import { parseTelemetryHeaders } from "../../../lib/telemetry-destinations.js";
|
|
10
|
+
export class TelemetryDestinationsCreate extends AlpicCommand {
|
|
11
|
+
static description = "Create and verify an OTLP destination";
|
|
12
|
+
static examples = [
|
|
13
|
+
"<%= config.bin %> telemetry destinations create --signal traces --endpoint https://otlp.example.com/v1/traces",
|
|
14
|
+
"<%= config.bin %> telemetry destinations create --environment-id <environmentId> --signal logs --endpoint https://otlp.example.com/v1/logs --secret-header Authorization=Bearer-token",
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
...environmentFlags,
|
|
18
|
+
...projectFlags,
|
|
19
|
+
signal: Flags.string({ description: "The signal to export", options: [...TELEMETRY_SIGNALS], required: true }),
|
|
20
|
+
endpoint: Flags.string({ description: "The complete OTLP signal endpoint", required: true }),
|
|
21
|
+
protocol: Flags.string({
|
|
22
|
+
description: "The OTLP HTTP protocol",
|
|
23
|
+
options: [...OTLP_PROTOCOLS],
|
|
24
|
+
default: "http/protobuf",
|
|
25
|
+
}),
|
|
26
|
+
header: Flags.string({ description: "A visible header in NAME=VALUE form", multiple: true }),
|
|
27
|
+
"secret-header": Flags.string({ description: "A secret header in NAME=VALUE form", multiple: true }),
|
|
28
|
+
"intentional-only": Flags.boolean({ description: "Export only intentional request traces", default: false }),
|
|
29
|
+
json: Flags.boolean({ description: "Print the unmodified API response as JSON", default: false }),
|
|
30
|
+
};
|
|
31
|
+
async run() {
|
|
32
|
+
const { flags } = await this.parse(TelemetryDestinationsCreate);
|
|
33
|
+
await this.ensureAuthenticated(flags);
|
|
34
|
+
const environmentId = await resolveEnvironmentId(flags, { silent: flags.json });
|
|
35
|
+
if (flags["intentional-only"] && flags.signal !== "traces") {
|
|
36
|
+
throw new Error("--intentional-only can only be used with --signal traces.");
|
|
37
|
+
}
|
|
38
|
+
const logger = this.logger(flags.json ? ERRORS_ONLY : "all");
|
|
39
|
+
logger.start("Verifying and creating telemetry destination...");
|
|
40
|
+
const destination = await api.telemetryDestinations.create.v1({
|
|
41
|
+
environmentId,
|
|
42
|
+
signal: telemetrySignalSchema.parse(flags.signal),
|
|
43
|
+
endpoint: flags.endpoint,
|
|
44
|
+
protocol: otlpProtocolSchema.parse(flags.protocol),
|
|
45
|
+
isScopedToIntentionalRequestsOnly: flags["intentional-only"],
|
|
46
|
+
headers: parseTelemetryHeaders(flags.header, flags["secret-header"]),
|
|
47
|
+
});
|
|
48
|
+
logger.stop(`Created ${chalk.cyan(destination.signal)} destination. ✅`);
|
|
49
|
+
if (flags.json) {
|
|
50
|
+
this.log(JSON.stringify(destination));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
p.log.info(`Destination ID: ${destination.id}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/telemetry/destinations/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
2
|
+
export declare class TelemetryDestinationsDelete extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"destination-id": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
"project-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"environment-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { api } from "../../../api.js";
|
|
4
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
5
|
+
import { environmentFlags, projectFlags, resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
6
|
+
export class TelemetryDestinationsDelete extends AlpicCommand {
|
|
7
|
+
static description = "Delete an OTLP destination";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> telemetry destinations delete --destination-id <destinationId>",
|
|
10
|
+
"<%= config.bin %> telemetry destinations delete --environment-id <environmentId> --destination-id <destinationId>",
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
...environmentFlags,
|
|
14
|
+
...projectFlags,
|
|
15
|
+
"destination-id": Flags.string({ description: "The ID of the telemetry destination", required: true }),
|
|
16
|
+
};
|
|
17
|
+
async run() {
|
|
18
|
+
const { flags } = await this.parse(TelemetryDestinationsDelete);
|
|
19
|
+
await this.ensureAuthenticated(flags);
|
|
20
|
+
const environmentId = await resolveEnvironmentId(flags);
|
|
21
|
+
const logger = this.logger();
|
|
22
|
+
logger.start("Deleting telemetry destination...");
|
|
23
|
+
await api.telemetryDestinations.delete.v1({ environmentId, destinationId: flags["destination-id"] });
|
|
24
|
+
logger.stop(`Deleted telemetry destination ${chalk.cyan(flags["destination-id"])}. ✅`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/commands/telemetry/destinations/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/F,MAAM,OAAO,2BAA4B,SAAQ,YAAY;IAC3D,MAAM,CAAU,WAAW,GAAG,4BAA4B,CAAC;IAE3D,MAAM,CAAU,QAAQ,GAAG;QACzB,kFAAkF;QAClF,mHAAmH;KACpH,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,gBAAgB;QACnB,GAAG,YAAY;QACf,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACvG,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAClD,MAAM,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrG,MAAM,CAAC,IAAI,CAAC,iCAAiC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
2
|
+
export declare class TelemetryDestinationsList extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
"project-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"environment-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
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 { environmentFlags, projectFlags, resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
7
|
+
import { formatTable } from "../../../lib/table.js";
|
|
8
|
+
import { formatTelemetryHeaders } from "../../../lib/telemetry-destinations.js";
|
|
9
|
+
export class TelemetryDestinationsList extends AlpicCommand {
|
|
10
|
+
static description = "List OTLP destinations for an environment";
|
|
11
|
+
static examples = [
|
|
12
|
+
"<%= config.bin %> telemetry destinations list",
|
|
13
|
+
"<%= config.bin %> telemetry destinations list --environment-id <environmentId> --json",
|
|
14
|
+
];
|
|
15
|
+
static flags = {
|
|
16
|
+
...environmentFlags,
|
|
17
|
+
...projectFlags,
|
|
18
|
+
json: Flags.boolean({ description: "Print the unmodified API response as JSON", default: false }),
|
|
19
|
+
};
|
|
20
|
+
async run() {
|
|
21
|
+
const { flags } = await this.parse(TelemetryDestinationsList);
|
|
22
|
+
await this.ensureAuthenticated(flags);
|
|
23
|
+
const environmentId = await resolveEnvironmentId(flags, { silent: flags.json });
|
|
24
|
+
const destinations = await api.telemetryDestinations.list.v1({ environmentId });
|
|
25
|
+
if (flags.json) {
|
|
26
|
+
this.log(JSON.stringify(destinations));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (destinations.length === 0) {
|
|
30
|
+
p.log.info("No telemetry destinations configured.");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(formatTable(destinations.map((destination) => ({
|
|
34
|
+
...destination,
|
|
35
|
+
intentionalOnly: destination.signal === "traces" && destination.isScopedToIntentionalRequestsOnly ? "yes" : "no",
|
|
36
|
+
headers: formatTelemetryHeaders(destination.headers),
|
|
37
|
+
})), [
|
|
38
|
+
{ key: "id", header: "id", format: (value) => chalk.cyan(value) },
|
|
39
|
+
{ key: "signal", header: "signal", format: (value) => chalk.bold(value) },
|
|
40
|
+
{ key: "endpoint", header: "endpoint" },
|
|
41
|
+
{ key: "protocol", header: "protocol" },
|
|
42
|
+
{ key: "status", header: "status" },
|
|
43
|
+
{ key: "intentionalOnly", header: "intentional only" },
|
|
44
|
+
{ key: "headers", header: "headers" },
|
|
45
|
+
]));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/telemetry/destinations/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
2
|
+
export declare class TelemetryDestinationsUpdate extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"destination-id": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
endpoint: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
protocol: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
header: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"secret-header": import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
"clear-headers": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
"intentional-only": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
"project-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
"environment-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
};
|
|
19
|
+
run(): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { OTLP_PROTOCOLS, otlpProtocolSchema } from "@alpic-ai/api";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../../api.js";
|
|
5
|
+
import { ERRORS_ONLY } from "../../../lib/agent-mode.js";
|
|
6
|
+
import { AlpicCommand } from "../../../lib/alpic-command.js";
|
|
7
|
+
import { environmentFlags, projectFlags, resolveEnvironmentId } from "../../../lib/resolve.js";
|
|
8
|
+
import { parseTelemetryHeaders } from "../../../lib/telemetry-destinations.js";
|
|
9
|
+
export class TelemetryDestinationsUpdate extends AlpicCommand {
|
|
10
|
+
static description = "Verify and update an OTLP destination";
|
|
11
|
+
static examples = [
|
|
12
|
+
"<%= config.bin %> telemetry destinations update --destination-id <destinationId> --endpoint https://otlp.example.com/v1/traces",
|
|
13
|
+
"<%= config.bin %> telemetry destinations update --destination-id <destinationId> --intentional-only",
|
|
14
|
+
"<%= config.bin %> telemetry destinations update --destination-id <destinationId> --no-intentional-only",
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
...environmentFlags,
|
|
18
|
+
...projectFlags,
|
|
19
|
+
"destination-id": Flags.string({ description: "The ID of the telemetry destination", required: true }),
|
|
20
|
+
endpoint: Flags.string({ description: "The complete OTLP signal endpoint" }),
|
|
21
|
+
protocol: Flags.string({ description: "The OTLP HTTP protocol", options: [...OTLP_PROTOCOLS] }),
|
|
22
|
+
header: Flags.string({ description: "Replace headers with a visible NAME=VALUE header", multiple: true }),
|
|
23
|
+
"secret-header": Flags.string({ description: "Replace headers with a secret NAME=VALUE header", multiple: true }),
|
|
24
|
+
"clear-headers": Flags.boolean({
|
|
25
|
+
description: "Remove all headers",
|
|
26
|
+
exclusive: ["header", "secret-header"],
|
|
27
|
+
default: false,
|
|
28
|
+
}),
|
|
29
|
+
"intentional-only": Flags.boolean({
|
|
30
|
+
description: "Export only intentional request traces",
|
|
31
|
+
allowNo: true,
|
|
32
|
+
}),
|
|
33
|
+
json: Flags.boolean({ description: "Print the unmodified API response as JSON", default: false }),
|
|
34
|
+
};
|
|
35
|
+
async run() {
|
|
36
|
+
const { flags } = await this.parse(TelemetryDestinationsUpdate);
|
|
37
|
+
await this.ensureAuthenticated(flags);
|
|
38
|
+
const environmentId = await resolveEnvironmentId(flags, { silent: flags.json });
|
|
39
|
+
const hasHeaderUpdate = flags["clear-headers"] || flags.header !== undefined || flags["secret-header"] !== undefined;
|
|
40
|
+
if (flags.endpoint === undefined &&
|
|
41
|
+
flags.protocol === undefined &&
|
|
42
|
+
flags["intentional-only"] === undefined &&
|
|
43
|
+
!hasHeaderUpdate) {
|
|
44
|
+
throw new Error("Provide at least one field to update.");
|
|
45
|
+
}
|
|
46
|
+
const logger = this.logger(flags.json ? ERRORS_ONLY : "all");
|
|
47
|
+
logger.start("Verifying and updating telemetry destination...");
|
|
48
|
+
const destination = await api.telemetryDestinations.update.v1({
|
|
49
|
+
environmentId,
|
|
50
|
+
destinationId: flags["destination-id"],
|
|
51
|
+
endpoint: flags.endpoint,
|
|
52
|
+
protocol: flags.protocol === undefined ? undefined : otlpProtocolSchema.parse(flags.protocol),
|
|
53
|
+
isScopedToIntentionalRequestsOnly: flags["intentional-only"],
|
|
54
|
+
headers: hasHeaderUpdate ? parseTelemetryHeaders(flags.header, flags["secret-header"]) : undefined,
|
|
55
|
+
});
|
|
56
|
+
logger.stop(`Updated ${chalk.cyan(destination.signal)} destination. ✅`);
|
|
57
|
+
if (flags.json) {
|
|
58
|
+
this.log(JSON.stringify(destination));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/telemetry/destinations/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RouterOutput } from "@alpic-ai/api";
|
|
2
|
+
type TelemetryDestination = RouterOutput["telemetryDestinations"]["list"]["v1"][number];
|
|
3
|
+
export declare function parseTelemetryHeaders(headers?: string[], secretHeaders?: string[]): {
|
|
4
|
+
name: string;
|
|
5
|
+
value: string;
|
|
6
|
+
isSecret: boolean;
|
|
7
|
+
}[];
|
|
8
|
+
export declare function formatTelemetryHeaders(headers: TelemetryDestination["headers"]): string;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function parseTelemetryHeaders(headers = [], secretHeaders = []) {
|
|
2
|
+
return [
|
|
3
|
+
...headers.map((header) => parseTelemetryHeader(header, false)),
|
|
4
|
+
...secretHeaders.map((header) => parseTelemetryHeader(header, true)),
|
|
5
|
+
];
|
|
6
|
+
}
|
|
7
|
+
export function formatTelemetryHeaders(headers) {
|
|
8
|
+
return headers.map((header) => `${header.name}=${header.isSecret ? "<secret>" : header.value}`).join(", ");
|
|
9
|
+
}
|
|
10
|
+
function parseTelemetryHeader(header, isSecret) {
|
|
11
|
+
const separatorIndex = header.indexOf("=");
|
|
12
|
+
if (separatorIndex <= 0 || separatorIndex === header.length - 1) {
|
|
13
|
+
throw new Error(`Invalid header "${header}". Use NAME=VALUE.`);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
name: header.slice(0, separatorIndex),
|
|
17
|
+
value: header.slice(separatorIndex + 1),
|
|
18
|
+
isSecret,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=telemetry-destinations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-destinations.js","sourceRoot":"","sources":["../../src/lib/telemetry-destinations.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,qBAAqB,CAAC,UAAoB,EAAE,EAAE,gBAA0B,EAAE;IACxF,OAAO;QACL,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/D,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;KACrE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAwC;IAC7E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc,EAAE,QAAiB;IAC7D,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,oBAAoB,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;QACvC,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { parseTelemetryHeaders } from "./telemetry-destinations.js";
|
|
3
|
+
describe("parseTelemetryHeaders", () => {
|
|
4
|
+
it("preserves equals signs in header values", () => {
|
|
5
|
+
expect(parseTelemetryHeaders(["X-Token=part=two"], ["Authorization=Bearer secret"])).toEqual([
|
|
6
|
+
{ name: "X-Token", value: "part=two", isSecret: false },
|
|
7
|
+
{ name: "Authorization", value: "Bearer secret", isSecret: true },
|
|
8
|
+
]);
|
|
9
|
+
});
|
|
10
|
+
it.each(["missing-separator", "=missing-name", "missing-value="])("rejects malformed header %s", (header) => {
|
|
11
|
+
expect(() => parseTelemetryHeaders([header])).toThrow(`Invalid header "${header}". Use NAME=VALUE.`);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=telemetry-destinations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-destinations.test.js","sourceRoot":"","sources":["../../src/lib/telemetry-destinations.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,qBAAqB,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3F,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;YACvD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;SAClE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1G,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,MAAM,oBAAoB,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/lib/telemetry.js
CHANGED
|
@@ -2,6 +2,7 @@ import crypto from "node:crypto";
|
|
|
2
2
|
import { globalStore, UserInputError } from "@alpic-ai/sdk";
|
|
3
3
|
import { ORPCError } from "@orpc/client";
|
|
4
4
|
import ci from "ci-info";
|
|
5
|
+
import { agent } from "std-env";
|
|
5
6
|
import posthog from "../posthog.js";
|
|
6
7
|
import { initSentry, Sentry } from "../sentry.js";
|
|
7
8
|
import { getResponseErrorStatus } from "./utils.js";
|
|
@@ -64,6 +65,7 @@ async function captureToSentry(error, event) {
|
|
|
64
65
|
platform: event.platform,
|
|
65
66
|
nodeVersion: event.nodeVersion,
|
|
66
67
|
isCI: String(event.isCI),
|
|
68
|
+
agent: event.agent,
|
|
67
69
|
},
|
|
68
70
|
extra: { sessionId: event.sessionId },
|
|
69
71
|
});
|
|
@@ -127,6 +129,7 @@ const hook = async ({ id: command, config: { version }, error, }) => {
|
|
|
127
129
|
machineId: getMachineId(),
|
|
128
130
|
sessionId: crypto.randomUUID(),
|
|
129
131
|
isCI: ci.isCI,
|
|
132
|
+
agent,
|
|
130
133
|
nodeVersion: process.version,
|
|
131
134
|
platform: process.platform,
|
|
132
135
|
outcome: error ? "failure" : "success",
|