agentskeptic 6.1.0 → 6.3.0

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 (89) hide show
  1. package/README.md +5 -1
  2. package/dist/actionableFailure.d.ts +4 -0
  3. package/dist/actionableFailure.d.ts.map +1 -1
  4. package/dist/actionableFailure.js +406 -3
  5. package/dist/actionableFailure.js.map +1 -1
  6. package/dist/actionableFailure.remediationExhaustive.test.js +2 -1
  7. package/dist/actionableFailure.remediationExhaustive.test.js.map +1 -1
  8. package/dist/cli/lockOrchestration.d.ts.map +1 -1
  9. package/dist/cli/lockOrchestration.js +14 -0
  10. package/dist/cli/lockOrchestration.js.map +1 -1
  11. package/dist/cli.js +11 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/correctnessDefinition.d.ts.map +1 -1
  14. package/dist/correctnessDefinition.js +2 -22
  15. package/dist/correctnessDefinition.js.map +1 -1
  16. package/dist/evidenceCompleteness.d.ts +3 -1
  17. package/dist/evidenceCompleteness.d.ts.map +1 -1
  18. package/dist/evidenceCompleteness.js +42 -1
  19. package/dist/evidenceCompleteness.js.map +1 -1
  20. package/dist/execution-identity.v1.json +1 -1
  21. package/dist/formatEvidenceCompletenessHuman.d.ts +1 -1
  22. package/dist/formatEvidenceCompletenessHuman.d.ts.map +1 -1
  23. package/dist/formatEvidenceCompletenessHuman.js +32 -2
  24. package/dist/formatEvidenceCompletenessHuman.js.map +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/outcomeCertificate.d.ts.map +1 -1
  29. package/dist/outcomeCertificate.js +9 -0
  30. package/dist/outcomeCertificate.js.map +1 -1
  31. package/dist/outcomeCertificate.test.js +130 -0
  32. package/dist/outcomeCertificate.test.js.map +1 -1
  33. package/dist/publicDistribution.generated.d.ts +1 -1
  34. package/dist/publicDistribution.generated.js +1 -1
  35. package/dist/quickVerify/canonicalJson.d.ts.map +1 -1
  36. package/dist/quickVerify/canonicalJson.js +6 -1
  37. package/dist/quickVerify/canonicalJson.js.map +1 -1
  38. package/dist/quickVerify/formatQuickVerifyHumanReport.test.js +67 -0
  39. package/dist/quickVerify/formatQuickVerifyHumanReport.test.js.map +1 -1
  40. package/dist/sdk/_generated/openapi-types.d.ts +1 -1
  41. package/dist/shareReport/postPublicVerificationReport.test.d.ts +2 -0
  42. package/dist/shareReport/postPublicVerificationReport.test.d.ts.map +1 -0
  43. package/dist/shareReport/postPublicVerificationReport.test.js +22 -0
  44. package/dist/shareReport/postPublicVerificationReport.test.js.map +1 -0
  45. package/dist/telemetry/cliInstallId.d.ts +4 -0
  46. package/dist/telemetry/cliInstallId.d.ts.map +1 -1
  47. package/dist/telemetry/cliInstallId.js +33 -24
  48. package/dist/telemetry/cliInstallId.js.map +1 -1
  49. package/dist/telemetry/maybeEmitOssClaimTicketUrl.d.ts.map +1 -1
  50. package/dist/telemetry/maybeEmitOssClaimTicketUrl.js +2 -1
  51. package/dist/telemetry/maybeEmitOssClaimTicketUrl.js.map +1 -1
  52. package/dist/telemetry/postOssClaimTicket.d.ts.map +1 -1
  53. package/dist/telemetry/postOssClaimTicket.js +2 -1
  54. package/dist/telemetry/postOssClaimTicket.js.map +1 -1
  55. package/dist/telemetry/postProductActivationEvent.d.ts +1 -1
  56. package/dist/telemetry/postProductActivationEvent.d.ts.map +1 -1
  57. package/dist/telemetry/postProductActivationEvent.js +3 -2
  58. package/dist/telemetry/postProductActivationEvent.js.map +1 -1
  59. package/dist/telemetry/postProductActivationEvent.test.js +19 -0
  60. package/dist/telemetry/postProductActivationEvent.test.js.map +1 -1
  61. package/dist/telemetry/telemetryConsent.d.ts +11 -0
  62. package/dist/telemetry/telemetryConsent.d.ts.map +1 -0
  63. package/dist/telemetry/telemetryConsent.js +40 -0
  64. package/dist/telemetry/telemetryConsent.js.map +1 -0
  65. package/dist/telemetry/telemetryConsent.test.d.ts +2 -0
  66. package/dist/telemetry/telemetryConsent.test.d.ts.map +1 -0
  67. package/dist/telemetry/telemetryConsent.test.js +165 -0
  68. package/dist/telemetry/telemetryConsent.test.js.map +1 -0
  69. package/dist/telemetry/telemetryOfflineConsentPrompt.d.ts +15 -0
  70. package/dist/telemetry/telemetryOfflineConsentPrompt.d.ts.map +1 -0
  71. package/dist/telemetry/telemetryOfflineConsentPrompt.js +69 -0
  72. package/dist/telemetry/telemetryOfflineConsentPrompt.js.map +1 -0
  73. package/dist/telemetry/telemetryOfflineConsentPrompt.test.d.ts +2 -0
  74. package/dist/telemetry/telemetryOfflineConsentPrompt.test.d.ts.map +1 -0
  75. package/dist/telemetry/telemetryOfflineConsentPrompt.test.js +201 -0
  76. package/dist/telemetry/telemetryOfflineConsentPrompt.test.js.map +1 -0
  77. package/dist/telemetry/telemetryStatusLine.d.ts +12 -0
  78. package/dist/telemetry/telemetryStatusLine.d.ts.map +1 -0
  79. package/dist/telemetry/telemetryStatusLine.js +29 -0
  80. package/dist/telemetry/telemetryStatusLine.js.map +1 -0
  81. package/dist/types.d.ts +39 -0
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/verify/batchVerifyTelemetrySubcommand.d.ts.map +1 -1
  84. package/dist/verify/batchVerifyTelemetrySubcommand.js +8 -0
  85. package/dist/verify/batchVerifyTelemetrySubcommand.js.map +1 -1
  86. package/package.json +1 -1
  87. package/schemas/evidence-completeness-v1.schema.json +169 -0
  88. package/schemas/openapi-commercial-v1.in.yaml +1 -1
  89. package/schemas/openapi-commercial-v1.yaml +2 -2
@@ -0,0 +1,165 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { resetCliInstallIdModuleStateForTests } from "./cliInstallId.js";
6
+ import { hasPersistedTelemetryPreference, isProductActivationTelemetryEnabled, readPersistedTelemetryBoolean, tryPersistTelemetryPreference, } from "./telemetryConsent.js";
7
+ function sandboxHome(home) {
8
+ process.env.HOME = home;
9
+ if (process.platform === "win32") {
10
+ process.env.USERPROFILE = home;
11
+ }
12
+ }
13
+ describe("telemetryConsent", () => {
14
+ let prevHome;
15
+ let prevUserProfile;
16
+ let prevTelemetry;
17
+ beforeEach(() => {
18
+ prevHome = process.env.HOME;
19
+ prevUserProfile = process.env.USERPROFILE;
20
+ prevTelemetry = process.env.AGENTSKEPTIC_TELEMETRY;
21
+ resetCliInstallIdModuleStateForTests();
22
+ });
23
+ afterEach(() => {
24
+ vi.unstubAllEnvs();
25
+ if (prevHome === undefined)
26
+ delete process.env.HOME;
27
+ else
28
+ process.env.HOME = prevHome;
29
+ if (process.platform === "win32") {
30
+ if (prevUserProfile === undefined)
31
+ delete process.env.USERPROFILE;
32
+ else
33
+ process.env.USERPROFILE = prevUserProfile;
34
+ }
35
+ if (prevTelemetry === undefined)
36
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
37
+ else
38
+ process.env.AGENTSKEPTIC_TELEMETRY = prevTelemetry;
39
+ resetCliInstallIdModuleStateForTests();
40
+ });
41
+ it("default unset env and no config → disabled", () => {
42
+ const home = join(tmpdir(), `as-tc-off-${Date.now()}`);
43
+ mkdirSync(home, { recursive: true });
44
+ try {
45
+ sandboxHome(home);
46
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
47
+ expect(isProductActivationTelemetryEnabled()).toBe(false);
48
+ }
49
+ finally {
50
+ rmSync(home, { recursive: true, force: true });
51
+ }
52
+ });
53
+ it("AGENTSKEPTIC_TELEMETRY=0 → disabled even when config true", () => {
54
+ const home = join(tmpdir(), `as-tc-env0-${Date.now()}`);
55
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
56
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ telemetry: true }), "utf8");
57
+ try {
58
+ sandboxHome(home);
59
+ process.env.AGENTSKEPTIC_TELEMETRY = "0";
60
+ expect(isProductActivationTelemetryEnabled()).toBe(false);
61
+ }
62
+ finally {
63
+ rmSync(home, { recursive: true, force: true });
64
+ }
65
+ });
66
+ it("AGENTSKEPTIC_TELEMETRY=1 → enabled even when config false", () => {
67
+ const home = join(tmpdir(), `as-tc-env1-${Date.now()}`);
68
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
69
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ telemetry: false }), "utf8");
70
+ try {
71
+ sandboxHome(home);
72
+ process.env.AGENTSKEPTIC_TELEMETRY = "1";
73
+ expect(isProductActivationTelemetryEnabled()).toBe(true);
74
+ }
75
+ finally {
76
+ rmSync(home, { recursive: true, force: true });
77
+ }
78
+ });
79
+ it("non-1 non-empty env → disabled; config true still applies when env cleared", () => {
80
+ const home = join(tmpdir(), `as-tc-badenv-${Date.now()}`);
81
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
82
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ telemetry: true }), "utf8");
83
+ try {
84
+ sandboxHome(home);
85
+ process.env.AGENTSKEPTIC_TELEMETRY = "yes";
86
+ expect(isProductActivationTelemetryEnabled()).toBe(false);
87
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
88
+ expect(isProductActivationTelemetryEnabled()).toBe(true);
89
+ }
90
+ finally {
91
+ rmSync(home, { recursive: true, force: true });
92
+ }
93
+ });
94
+ it("persisted telemetry true enables when env unset", () => {
95
+ const home = join(tmpdir(), `as-tc-cfg-${Date.now()}`);
96
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
97
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ telemetry: true }), "utf8");
98
+ try {
99
+ sandboxHome(home);
100
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
101
+ expect(isProductActivationTelemetryEnabled()).toBe(true);
102
+ }
103
+ finally {
104
+ rmSync(home, { recursive: true, force: true });
105
+ }
106
+ });
107
+ it("persisted telemetry false disables when env unset", () => {
108
+ const home = join(tmpdir(), `as-tc-cfgf-${Date.now()}`);
109
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
110
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ telemetry: false }), "utf8");
111
+ try {
112
+ sandboxHome(home);
113
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
114
+ expect(isProductActivationTelemetryEnabled()).toBe(false);
115
+ }
116
+ finally {
117
+ rmSync(home, { recursive: true, force: true });
118
+ }
119
+ });
120
+ it("malformed config → readPersistedTelemetryBoolean null; disabled", () => {
121
+ const home = join(tmpdir(), `as-tc-bad-${Date.now()}`);
122
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
123
+ writeFileSync(join(home, ".agentskeptic", "config.json"), "{ not json", "utf8");
124
+ try {
125
+ sandboxHome(home);
126
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
127
+ expect(readPersistedTelemetryBoolean()).toBe(null);
128
+ expect(hasPersistedTelemetryPreference()).toBe(false);
129
+ expect(isProductActivationTelemetryEnabled()).toBe(false);
130
+ }
131
+ finally {
132
+ rmSync(home, { recursive: true, force: true });
133
+ }
134
+ });
135
+ it("telemetry string in config → not a boolean preference", () => {
136
+ const home = join(tmpdir(), `as-tc-str-${Date.now()}`);
137
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
138
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ telemetry: "true" }), "utf8");
139
+ try {
140
+ sandboxHome(home);
141
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
142
+ expect(readPersistedTelemetryBoolean()).toBe(null);
143
+ expect(hasPersistedTelemetryPreference()).toBe(false);
144
+ }
145
+ finally {
146
+ rmSync(home, { recursive: true, force: true });
147
+ }
148
+ });
149
+ it("tryPersistTelemetryPreference merges unknown keys", () => {
150
+ const home = join(tmpdir(), `as-tc-merge-${Date.now()}`);
151
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
152
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ custom_key: 42, install_id: "00000000-0000-4000-8000-000000000001" }), "utf8");
153
+ try {
154
+ sandboxHome(home);
155
+ expect(tryPersistTelemetryPreference(false)).toBe(true);
156
+ const disk = JSON.parse(readFileSync(join(home, ".agentskeptic", "config.json"), "utf8"));
157
+ expect(disk.telemetry).toBe(false);
158
+ expect(disk.custom_key).toBe(42);
159
+ }
160
+ finally {
161
+ rmSync(home, { recursive: true, force: true });
162
+ }
163
+ });
164
+ });
165
+ //# sourceMappingURL=telemetryConsent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetryConsent.test.js","sourceRoot":"","sources":["../../src/telemetry/telemetryConsent.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type TelemetryConsentPromptDeps = {
2
+ /** Test hook: return simulated stdin line (no trailing newline required). */
3
+ readAnswerLine?: () => Promise<string>;
4
+ };
5
+ /**
6
+ * After first successful local-sqlite-only OSS verify, optionally prompt once to persist telemetry opt-in/out.
7
+ * Never throws; failures leave telemetry unchanged (disabled unless already opted in).
8
+ */
9
+ export declare function maybePromptTelemetryAfterFirstOfflineSuccess(input: {
10
+ verificationUsedOnlyLocalSqliteFile: boolean;
11
+ shareReportOriginUsed: boolean;
12
+ /** Certificate exit would be success (matches_expectations). */
13
+ verifySucceeded: boolean;
14
+ }, deps?: TelemetryConsentPromptDeps): Promise<void>;
15
+ //# sourceMappingURL=telemetryOfflineConsentPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetryOfflineConsentPrompt.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetryOfflineConsentPrompt.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,0BAA0B,GAAG;IACvC,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,4CAA4C,CAChE,KAAK,EAAE;IACL,mCAAmC,EAAE,OAAO,CAAC;IAC7C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,gEAAgE;IAChE,eAAe,EAAE,OAAO,CAAC;CAC1B,EACD,IAAI,GAAE,0BAA+B,GACpC,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,69 @@
1
+ import { createInterface } from "node:readline";
2
+ import { LICENSE_PREFLIGHT_ENABLED } from "../generated/commercialBuildFlags.js";
3
+ import { hasPersistedTelemetryPreference, isProductActivationTelemetryEnabled, tryPersistTelemetryPreference, } from "./telemetryConsent.js";
4
+ const PROMPT_TEXT = "Verification complete. AgentSkeptic ran offline.\n" +
5
+ "\n" +
6
+ "Help improve AgentSkeptic by sending anonymous usage telemetry?\n" +
7
+ "No workflow data, database contents, credentials, prompts, traces, or verification artifacts are sent.\n" +
8
+ "You can change this later with AGENTSKEPTIC_TELEMETRY=1 or AGENTSKEPTIC_TELEMETRY=0.\n" +
9
+ "\n" +
10
+ "Enable telemetry? (y/N): ";
11
+ /**
12
+ * After first successful local-sqlite-only OSS verify, optionally prompt once to persist telemetry opt-in/out.
13
+ * Never throws; failures leave telemetry unchanged (disabled unless already opted in).
14
+ */
15
+ export async function maybePromptTelemetryAfterFirstOfflineSuccess(input, deps = {}) {
16
+ if (LICENSE_PREFLIGHT_ENABLED)
17
+ return;
18
+ if (!input.verifySucceeded)
19
+ return;
20
+ if (!input.verificationUsedOnlyLocalSqliteFile)
21
+ return;
22
+ if (input.shareReportOriginUsed)
23
+ return;
24
+ if (process.env.AGENTSKEPTIC_TELEMETRY !== undefined)
25
+ return;
26
+ if (hasPersistedTelemetryPreference())
27
+ return;
28
+ if (isProductActivationTelemetryEnabled())
29
+ return;
30
+ if (String(process.env.CI).toLowerCase() === "true")
31
+ return;
32
+ if (!process.stdin.isTTY || !process.stderr.isTTY)
33
+ return;
34
+ process.stderr.write(PROMPT_TEXT);
35
+ let line;
36
+ try {
37
+ if (deps.readAnswerLine !== undefined) {
38
+ line = await deps.readAnswerLine();
39
+ }
40
+ else {
41
+ line = await readLineFromStdin();
42
+ }
43
+ }
44
+ catch {
45
+ return;
46
+ }
47
+ const normalized = line.trim().toLowerCase();
48
+ const yes = normalized === "y" || normalized === "yes";
49
+ tryPersistTelemetryPreference(yes);
50
+ }
51
+ async function readLineFromStdin() {
52
+ return await new Promise((resolve, reject) => {
53
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
54
+ rl.once("line", (ln) => {
55
+ rl.close();
56
+ resolve(ln ?? "");
57
+ });
58
+ rl.once("error", (err) => {
59
+ try {
60
+ rl.close();
61
+ }
62
+ catch {
63
+ /* ignore */
64
+ }
65
+ reject(err);
66
+ });
67
+ });
68
+ }
69
+ //# sourceMappingURL=telemetryOfflineConsentPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetryOfflineConsentPrompt.js","sourceRoot":"","sources":["../../src/telemetry/telemetryOfflineConsentPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,GACf,oDAAoD;IACpD,IAAI;IACJ,mEAAmE;IACnE,0GAA0G;IAC1G,wFAAwF;IACxF,IAAI;IACJ,2BAA2B,CAAC;AAO9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,4CAA4C,CAChE,KAKC,EACD,OAAmC,EAAE;IAErC,IAAI,yBAAyB;QAAE,OAAO;IACtC,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO;IACnC,IAAI,CAAC,KAAK,CAAC,mCAAmC;QAAE,OAAO;IACvD,IAAI,KAAK,CAAC,qBAAqB;QAAE,OAAO;IAExC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,SAAS;QAAE,OAAO;IAE7D,IAAI,+BAA+B,EAAE;QAAE,OAAO;IAC9C,IAAI,mCAAmC,EAAE;QAAE,OAAO;IAElD,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM;QAAE,OAAO;IAC5D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAE1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAElC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;IACvD,6BAA6B,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;YACrB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=telemetryOfflineConsentPrompt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetryOfflineConsentPrompt.test.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetryOfflineConsentPrompt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,201 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { resetCliInstallIdModuleStateForTests } from "./cliInstallId.js";
6
+ import { resetTelemetryStatusLineForTests } from "./telemetryStatusLine.js";
7
+ import { maybePromptTelemetryAfterFirstOfflineSuccess } from "./telemetryOfflineConsentPrompt.js";
8
+ function sandboxHome(home) {
9
+ process.env.HOME = home;
10
+ if (process.platform === "win32") {
11
+ process.env.USERPROFILE = home;
12
+ }
13
+ }
14
+ describe("telemetryOfflineConsentPrompt", () => {
15
+ let prevHome;
16
+ let prevUserProfile;
17
+ let prevTelemetry;
18
+ let prevCi;
19
+ let prevIsTTYin;
20
+ let prevIsTTYout;
21
+ let prevIsTTYerr;
22
+ beforeEach(() => {
23
+ prevHome = process.env.HOME;
24
+ prevUserProfile = process.env.USERPROFILE;
25
+ prevTelemetry = process.env.AGENTSKEPTIC_TELEMETRY;
26
+ prevCi = process.env.CI;
27
+ prevIsTTYin = process.stdin.isTTY;
28
+ prevIsTTYout = process.stdout.isTTY;
29
+ prevIsTTYerr = process.stderr.isTTY;
30
+ resetCliInstallIdModuleStateForTests();
31
+ resetTelemetryStatusLineForTests();
32
+ });
33
+ afterEach(() => {
34
+ vi.restoreAllMocks();
35
+ Object.defineProperty(process.stdin, "isTTY", { value: prevIsTTYin, configurable: true });
36
+ Object.defineProperty(process.stdout, "isTTY", { value: prevIsTTYout, configurable: true });
37
+ Object.defineProperty(process.stderr, "isTTY", { value: prevIsTTYerr, configurable: true });
38
+ if (prevHome === undefined)
39
+ delete process.env.HOME;
40
+ else
41
+ process.env.HOME = prevHome;
42
+ if (process.platform === "win32") {
43
+ if (prevUserProfile === undefined)
44
+ delete process.env.USERPROFILE;
45
+ else
46
+ process.env.USERPROFILE = prevUserProfile;
47
+ }
48
+ if (prevTelemetry === undefined)
49
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
50
+ else
51
+ process.env.AGENTSKEPTIC_TELEMETRY = prevTelemetry;
52
+ if (prevCi === undefined)
53
+ delete process.env.CI;
54
+ else
55
+ process.env.CI = prevCi;
56
+ resetCliInstallIdModuleStateForTests();
57
+ resetTelemetryStatusLineForTests();
58
+ });
59
+ it("CI=true skips prompt and does not write config", async () => {
60
+ const home = join(tmpdir(), `as-prompt-ci-${Date.now()}`);
61
+ mkdirSync(home, { recursive: true });
62
+ try {
63
+ sandboxHome(home);
64
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
65
+ process.env.CI = "true";
66
+ Object.defineProperty(process.stdin, "isTTY", { value: true, configurable: true });
67
+ Object.defineProperty(process.stderr, "isTTY", { value: true, configurable: true });
68
+ await maybePromptTelemetryAfterFirstOfflineSuccess({
69
+ verificationUsedOnlyLocalSqliteFile: true,
70
+ shareReportOriginUsed: false,
71
+ verifySucceeded: true,
72
+ }, { readAnswerLine: async () => "y" });
73
+ expect(existsSync(join(home, ".agentskeptic", "config.json"))).toBe(false);
74
+ }
75
+ finally {
76
+ rmSync(home, { recursive: true, force: true });
77
+ }
78
+ });
79
+ it("non-interactive stdin skips prompt", async () => {
80
+ const home = join(tmpdir(), `as-prompt-nitty-${Date.now()}`);
81
+ mkdirSync(home, { recursive: true });
82
+ try {
83
+ sandboxHome(home);
84
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
85
+ delete process.env.CI;
86
+ Object.defineProperty(process.stdin, "isTTY", { value: false, configurable: true });
87
+ Object.defineProperty(process.stderr, "isTTY", { value: true, configurable: true });
88
+ await maybePromptTelemetryAfterFirstOfflineSuccess({
89
+ verificationUsedOnlyLocalSqliteFile: true,
90
+ shareReportOriginUsed: false,
91
+ verifySucceeded: true,
92
+ }, { readAnswerLine: async () => "y" });
93
+ expect(existsSync(join(home, ".agentskeptic", "config.json"))).toBe(false);
94
+ }
95
+ finally {
96
+ rmSync(home, { recursive: true, force: true });
97
+ }
98
+ });
99
+ it("opt-in persists telemetry true", async () => {
100
+ const home = join(tmpdir(), `as-prompt-y-${Date.now()}`);
101
+ mkdirSync(home, { recursive: true });
102
+ try {
103
+ sandboxHome(home);
104
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
105
+ delete process.env.CI;
106
+ Object.defineProperty(process.stdin, "isTTY", { value: true, configurable: true });
107
+ Object.defineProperty(process.stderr, "isTTY", { value: true, configurable: true });
108
+ await maybePromptTelemetryAfterFirstOfflineSuccess({
109
+ verificationUsedOnlyLocalSqliteFile: true,
110
+ shareReportOriginUsed: false,
111
+ verifySucceeded: true,
112
+ }, { readAnswerLine: async () => "yes" });
113
+ const cfg = JSON.parse(readFileSync(join(home, ".agentskeptic", "config.json"), "utf8"));
114
+ expect(cfg.telemetry).toBe(true);
115
+ }
116
+ finally {
117
+ rmSync(home, { recursive: true, force: true });
118
+ }
119
+ });
120
+ it("opt-out persists telemetry false", async () => {
121
+ const home = join(tmpdir(), `as-prompt-n-${Date.now()}`);
122
+ mkdirSync(home, { recursive: true });
123
+ try {
124
+ sandboxHome(home);
125
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
126
+ delete process.env.CI;
127
+ Object.defineProperty(process.stdin, "isTTY", { value: true, configurable: true });
128
+ Object.defineProperty(process.stderr, "isTTY", { value: true, configurable: true });
129
+ await maybePromptTelemetryAfterFirstOfflineSuccess({
130
+ verificationUsedOnlyLocalSqliteFile: true,
131
+ shareReportOriginUsed: false,
132
+ verifySucceeded: true,
133
+ }, { readAnswerLine: async () => "n" });
134
+ const cfg = JSON.parse(readFileSync(join(home, ".agentskeptic", "config.json"), "utf8"));
135
+ expect(cfg.telemetry).toBe(false);
136
+ }
137
+ finally {
138
+ rmSync(home, { recursive: true, force: true });
139
+ }
140
+ });
141
+ it("skips when shareReportOriginUsed", async () => {
142
+ const home = join(tmpdir(), `as-prompt-share-${Date.now()}`);
143
+ mkdirSync(home, { recursive: true });
144
+ try {
145
+ sandboxHome(home);
146
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
147
+ Object.defineProperty(process.stdin, "isTTY", { value: true, configurable: true });
148
+ Object.defineProperty(process.stderr, "isTTY", { value: true, configurable: true });
149
+ await maybePromptTelemetryAfterFirstOfflineSuccess({
150
+ verificationUsedOnlyLocalSqliteFile: true,
151
+ shareReportOriginUsed: true,
152
+ verifySucceeded: true,
153
+ }, { readAnswerLine: async () => "y" });
154
+ expect(existsSync(join(home, ".agentskeptic", "config.json"))).toBe(false);
155
+ }
156
+ finally {
157
+ rmSync(home, { recursive: true, force: true });
158
+ }
159
+ });
160
+ it("skips when postgres verification path", async () => {
161
+ const home = join(tmpdir(), `as-prompt-pg-${Date.now()}`);
162
+ mkdirSync(home, { recursive: true });
163
+ try {
164
+ sandboxHome(home);
165
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
166
+ Object.defineProperty(process.stdin, "isTTY", { value: true, configurable: true });
167
+ Object.defineProperty(process.stderr, "isTTY", { value: true, configurable: true });
168
+ await maybePromptTelemetryAfterFirstOfflineSuccess({
169
+ verificationUsedOnlyLocalSqliteFile: false,
170
+ shareReportOriginUsed: false,
171
+ verifySucceeded: true,
172
+ }, { readAnswerLine: async () => "y" });
173
+ expect(existsSync(join(home, ".agentskeptic", "config.json"))).toBe(false);
174
+ }
175
+ finally {
176
+ rmSync(home, { recursive: true, force: true });
177
+ }
178
+ });
179
+ it("skips when persisted preference exists", async () => {
180
+ const home = join(tmpdir(), `as-prompt-exists-${Date.now()}`);
181
+ mkdirSync(join(home, ".agentskeptic"), { recursive: true });
182
+ writeFileSync(join(home, ".agentskeptic", "config.json"), JSON.stringify({ telemetry: false }), "utf8");
183
+ try {
184
+ sandboxHome(home);
185
+ delete process.env.AGENTSKEPTIC_TELEMETRY;
186
+ Object.defineProperty(process.stdin, "isTTY", { value: true, configurable: true });
187
+ Object.defineProperty(process.stderr, "isTTY", { value: true, configurable: true });
188
+ await maybePromptTelemetryAfterFirstOfflineSuccess({
189
+ verificationUsedOnlyLocalSqliteFile: true,
190
+ shareReportOriginUsed: false,
191
+ verifySucceeded: true,
192
+ }, { readAnswerLine: async () => "y" });
193
+ const cfg = JSON.parse(readFileSync(join(home, ".agentskeptic", "config.json"), "utf8"));
194
+ expect(cfg.telemetry).toBe(false);
195
+ }
196
+ finally {
197
+ rmSync(home, { recursive: true, force: true });
198
+ }
199
+ });
200
+ });
201
+ //# sourceMappingURL=telemetryOfflineConsentPrompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetryOfflineConsentPrompt.test.js","sourceRoot":"","sources":["../../src/telemetry/telemetryOfflineConsentPrompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,4CAA4C,EAAE,MAAM,oCAAoC,CAAC;AAElG,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACjC,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,QAA4B,CAAC;IACjC,IAAI,eAAmC,CAAC;IACxC,IAAI,aAAiC,CAAC;IACtC,IAAI,MAA0B,CAAC;IAC/B,IAAI,WAAoB,CAAC;IACzB,IAAI,YAAqB,CAAC;IAC1B,IAAI,YAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAC1C,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QACnD,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACpC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACpC,oCAAoC,EAAE,CAAC;QACvC,gCAAgC,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;YAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;QACjC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,eAAe,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;;gBAC7D,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,eAAe,CAAC;QACjD,CAAC;QACD,IAAI,aAAa,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;;YACtE,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,aAAa,CAAC;QACxD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;;YAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;QAC7B,oCAAoC,EAAE,CAAC;QACvC,gCAAgC,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1D,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;YACxB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,4CAA4C,CAChD;gBACE,mCAAmC,EAAE,IAAI;gBACzC,qBAAqB,EAAE,KAAK;gBAC5B,eAAe,EAAE,IAAI;aACtB,EACD,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CACpC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7D,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,4CAA4C,CAChD;gBACE,mCAAmC,EAAE,IAAI;gBACzC,qBAAqB,EAAE,KAAK;gBAC5B,eAAe,EAAE,IAAI;aACtB,EACD,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CACpC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,4CAA4C,CAChD;gBACE,mCAAmC,EAAE,IAAI;gBACzC,qBAAqB,EAAE,KAAK;gBAC5B,eAAe,EAAE,IAAI;aACtB,EACD,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACzF,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,4CAA4C,CAChD;gBACE,mCAAmC,EAAE,IAAI;gBACzC,qBAAqB,EAAE,KAAK;gBAC5B,eAAe,EAAE,IAAI;aACtB,EACD,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CACpC,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACzF,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7D,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC1C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,4CAA4C,CAChD;gBACE,mCAAmC,EAAE,IAAI;gBACzC,qBAAqB,EAAE,IAAI;gBAC3B,eAAe,EAAE,IAAI;aACtB,EACD,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CACpC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1D,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC1C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,4CAA4C,CAChD;gBACE,mCAAmC,EAAE,KAAK;gBAC1C,qBAAqB,EAAE,KAAK;gBAC5B,eAAe,EAAE,IAAI;aACtB,EACD,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CACpC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9D,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACxG,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC1C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,4CAA4C,CAChD;gBACE,mCAAmC,EAAE,IAAI;gBACzC,qBAAqB,EAAE,KAAK;gBAC5B,eAAe,EAAE,IAAI;aACtB,EACD,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CACpC,CAAC;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACzF,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Exact stderr line when OSS telemetry is off (for tests / contract checks). */
2
+ export declare const OSS_PRODUCT_ACTIVATION_TELEMETRY_STDERR_DISABLED = "Running offline: telemetry disabled.\n";
3
+ /** Exact stderr line when OSS telemetry is on (for tests / contract checks). */
4
+ export declare const OSS_PRODUCT_ACTIVATION_TELEMETRY_STDERR_ENABLED = "Telemetry enabled: sending anonymous usage events.\n";
5
+ /** Vitest / node:test: allow repeated CLI runs in one process. */
6
+ export declare function resetTelemetryStatusLineForTests(): void;
7
+ /**
8
+ * OSS build: print once whether product-activation telemetry is enabled (stderr).
9
+ * Does not claim all network is disabled (witnesses, share-report, licensing may still apply).
10
+ */
11
+ export declare function printProductActivationTelemetryStatusLineOnce(): void;
12
+ //# sourceMappingURL=telemetryStatusLine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetryStatusLine.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetryStatusLine.ts"],"names":[],"mappings":"AAGA,iFAAiF;AACjF,eAAO,MAAM,gDAAgD,2CAA2C,CAAC;AAEzG,gFAAgF;AAChF,eAAO,MAAM,+CAA+C,yDAAyD,CAAC;AAItH,kEAAkE;AAClE,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAED;;;GAGG;AACH,wBAAgB,6CAA6C,IAAI,IAAI,CASpE"}
@@ -0,0 +1,29 @@
1
+ import { LICENSE_PREFLIGHT_ENABLED } from "../generated/commercialBuildFlags.js";
2
+ import { isProductActivationTelemetryEnabled } from "./telemetryConsent.js";
3
+ /** Exact stderr line when OSS telemetry is off (for tests / contract checks). */
4
+ export const OSS_PRODUCT_ACTIVATION_TELEMETRY_STDERR_DISABLED = "Running offline: telemetry disabled.\n";
5
+ /** Exact stderr line when OSS telemetry is on (for tests / contract checks). */
6
+ export const OSS_PRODUCT_ACTIVATION_TELEMETRY_STDERR_ENABLED = "Telemetry enabled: sending anonymous usage events.\n";
7
+ let printed = false;
8
+ /** Vitest / node:test: allow repeated CLI runs in one process. */
9
+ export function resetTelemetryStatusLineForTests() {
10
+ printed = false;
11
+ }
12
+ /**
13
+ * OSS build: print once whether product-activation telemetry is enabled (stderr).
14
+ * Does not claim all network is disabled (witnesses, share-report, licensing may still apply).
15
+ */
16
+ export function printProductActivationTelemetryStatusLineOnce() {
17
+ if (printed)
18
+ return;
19
+ if (LICENSE_PREFLIGHT_ENABLED)
20
+ return;
21
+ printed = true;
22
+ if (isProductActivationTelemetryEnabled()) {
23
+ process.stderr.write(OSS_PRODUCT_ACTIVATION_TELEMETRY_STDERR_ENABLED);
24
+ }
25
+ else {
26
+ process.stderr.write(OSS_PRODUCT_ACTIVATION_TELEMETRY_STDERR_DISABLED);
27
+ }
28
+ }
29
+ //# sourceMappingURL=telemetryStatusLine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetryStatusLine.js","sourceRoot":"","sources":["../../src/telemetry/telemetryStatusLine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,mCAAmC,EAAE,MAAM,uBAAuB,CAAC;AAE5E,iFAAiF;AACjF,MAAM,CAAC,MAAM,gDAAgD,GAAG,wCAAwC,CAAC;AAEzG,gFAAgF;AAChF,MAAM,CAAC,MAAM,+CAA+C,GAAG,sDAAsD,CAAC;AAEtH,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,kEAAkE;AAClE,MAAM,UAAU,gCAAgC;IAC9C,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6CAA6C;IAC3D,IAAI,OAAO;QAAE,OAAO;IACpB,IAAI,yBAAyB;QAAE,OAAO;IACtC,OAAO,GAAG,IAAI,CAAC;IACf,IAAI,mCAAmC,EAAE,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
package/dist/types.d.ts CHANGED
@@ -555,6 +555,43 @@ export type ActionableFailure = {
555
555
  };
556
556
  export type EvidenceGapPrimary = "none" | "preview_lane" | "ingest_empty" | "ingest_unstructured" | "registry_unknown_tool" | "registry_resolution" | "database_access" | "timing_or_window" | "witness_unavailable" | "state_mismatch" | "verification_incomplete" | "event_sequence" | "control_flow_context" | "unclassified";
557
557
  export type RerunReadiness = "rerun_ready_same_inputs" | "fix_inputs_before_rerun" | "fix_registry_before_rerun" | "reconcile_state_before_rerun" | "manual_review_before_rerun";
558
+ export type AutomationClass = "read_only_retry" | "input_regeneration_candidate" | "human_write_required" | "never_auto_mutate";
559
+ export type RerunPathType = "same_input_verify" | "after_input_fix_verify" | "after_state_fix_verify" | "after_manual_review_verify" | "no_rerun_needed";
560
+ export type RerunPath = {
561
+ type: RerunPathType;
562
+ sameInputs: boolean;
563
+ prerequisite: string;
564
+ meaningfulWhen: string;
565
+ readinessLabel: string;
566
+ };
567
+ export type RemediationItemScope = "run_level" | "event_sequence" | "run_context" | "step" | "effect" | "quick_unit" | "quick_ingest";
568
+ export type RemediationItem = {
569
+ id: string;
570
+ scope: RemediationItemScope;
571
+ primary: boolean;
572
+ failedCheck: string;
573
+ reasonCodes: string[];
574
+ reason: string;
575
+ recommendedAction: RecommendedActionCode;
576
+ actionText: string;
577
+ expectedState: {
578
+ summary: string;
579
+ projectionKind?: CorrectnessEnforcementKind;
580
+ };
581
+ automation: {
582
+ class: AutomationClass;
583
+ label: string;
584
+ boundary: string;
585
+ };
586
+ humanReview: {
587
+ required: boolean;
588
+ decisionPrompt?: string;
589
+ hypotheses?: string[];
590
+ knownFacts?: string[];
591
+ evidenceToInspect?: string[];
592
+ };
593
+ rerunPath: RerunPath;
594
+ };
558
595
  export type RemediationNextAction = {
559
596
  id: string;
560
597
  text: string;
@@ -563,6 +600,8 @@ export type RemediationDecision = {
563
600
  actionableFailure: ActionableFailure;
564
601
  orderedNextActions: RemediationNextAction[];
565
602
  rerunReadiness: RerunReadiness;
603
+ remediationItems: RemediationItem[];
604
+ rerunPath: RerunPath;
566
605
  };
567
606
  export type FailureAnalysisEvidenceItem = {
568
607
  scope: "run_context" | "run_level" | "event_sequence" | "step" | "effect";