Default feedback export to telemetry.paperclip.ing

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
dottaandPaperclip committed 2026-04-03 08:45:58 -05:00
1 parent 6940e3834b
commit bbd759c0ff
3 files changed
+53 -5

No files matched your search

@@ -0,0 +1,48 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { createFeedbackTraceShareClientFromConfig } from "../services/feedback-share-client.js";
describe("feedback trace share client", () => {
beforeEach(() => {
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
ok: true,
json: vi.fn().mockResolvedValue({ objectKey: "feedback-traces/test.json" }),
}));
});
afterEach(() => {
vi.restoreAllMocks();
});
it("defaults to telemetry.paperclip.ing when no backend url is configured", async () => {
const client = createFeedbackTraceShareClientFromConfig({
feedbackExportBackendUrl: undefined,
feedbackExportBackendToken: undefined,
});
await client.uploadTraceBundle({
traceId: "trace-1",
exportId: "export-1",
companyId: "company-1",
issueId: "issue-1",
issueIdentifier: "PAP-1",
adapterType: "codex_local",
captureStatus: "full",
notes: [],
envelope: {},
surface: null,
paperclipRun: null,
rawAdapterTrace: null,
normalizedAdapterTrace: null,
privacy: null,
integrity: {},
files: [],
});
expect(fetch).toHaveBeenCalledWith(
"https://telemetry.paperclip.ing/feedback-traces",
expect.objectContaining({
method: "POST",
}),
);
});
});
+4 -4
View File
@@ -1,6 +1,8 @@
import type { FeedbackTraceBundle } from "@paperclipai/shared";
import type { Config } from "../config.js";
const DEFAULT_FEEDBACK_EXPORT_BACKEND_URL = "https://telemetry.paperclip.ing";
function buildFeedbackShareObjectKey(bundle: FeedbackTraceBundle, exportedAt: Date) {
const year = String(exportedAt.getUTCFullYear());
const month = String(exportedAt.getUTCMonth() + 1).padStart(2, "0");
@@ -14,10 +16,8 @@ export interface FeedbackTraceShareClient {
export function createFeedbackTraceShareClientFromConfig(
config: Pick<Config, "feedbackExportBackendUrl" | "feedbackExportBackendToken">,
): FeedbackTraceShareClient | null {
const baseUrl = config.feedbackExportBackendUrl?.trim();
if (!baseUrl) return null;
): FeedbackTraceShareClient {
const baseUrl = config.feedbackExportBackendUrl?.trim() || DEFAULT_FEEDBACK_EXPORT_BACKEND_URL;
const token = config.feedbackExportBackendToken?.trim();
const endpoint = new URL("/feedback-traces", baseUrl).toString();