@principles/core 1.76.0 → 1.78.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 (68) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +12 -0
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/feedback/create-report.test.d.ts +2 -0
  4. package/dist/runtime-v2/__tests__/feedback/create-report.test.d.ts.map +1 -0
  5. package/dist/runtime-v2/__tests__/feedback/create-report.test.js +402 -0
  6. package/dist/runtime-v2/__tests__/feedback/create-report.test.js.map +1 -0
  7. package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.d.ts +2 -0
  8. package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.d.ts.map +1 -0
  9. package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.js +128 -0
  10. package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.js.map +1 -0
  11. package/dist/runtime-v2/__tests__/feedback/redact-sensitive.test.d.ts +2 -0
  12. package/dist/runtime-v2/__tests__/feedback/redact-sensitive.test.d.ts.map +1 -0
  13. package/dist/runtime-v2/__tests__/feedback/redact-sensitive.test.js +231 -0
  14. package/dist/runtime-v2/__tests__/feedback/redact-sensitive.test.js.map +1 -0
  15. package/dist/runtime-v2/__tests__/feedback/render-github-url.test.d.ts +2 -0
  16. package/dist/runtime-v2/__tests__/feedback/render-github-url.test.d.ts.map +1 -0
  17. package/dist/runtime-v2/__tests__/feedback/render-github-url.test.js +102 -0
  18. package/dist/runtime-v2/__tests__/feedback/render-github-url.test.js.map +1 -0
  19. package/dist/runtime-v2/__tests__/feedback/render-markdown.test.d.ts +2 -0
  20. package/dist/runtime-v2/__tests__/feedback/render-markdown.test.d.ts.map +1 -0
  21. package/dist/runtime-v2/__tests__/feedback/render-markdown.test.js +130 -0
  22. package/dist/runtime-v2/__tests__/feedback/render-markdown.test.js.map +1 -0
  23. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +11 -0
  24. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  25. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  26. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +3 -1
  27. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  28. package/dist/runtime-v2/feedback/create-report.d.ts +14 -0
  29. package/dist/runtime-v2/feedback/create-report.d.ts.map +1 -0
  30. package/dist/runtime-v2/feedback/create-report.js +257 -0
  31. package/dist/runtime-v2/feedback/create-report.js.map +1 -0
  32. package/dist/runtime-v2/feedback/feedback-types.d.ts +120 -0
  33. package/dist/runtime-v2/feedback/feedback-types.d.ts.map +1 -0
  34. package/dist/runtime-v2/feedback/feedback-types.js +243 -0
  35. package/dist/runtime-v2/feedback/feedback-types.js.map +1 -0
  36. package/dist/runtime-v2/feedback/index.d.ts +9 -0
  37. package/dist/runtime-v2/feedback/index.d.ts.map +1 -0
  38. package/dist/runtime-v2/feedback/index.js +11 -0
  39. package/dist/runtime-v2/feedback/index.js.map +1 -0
  40. package/dist/runtime-v2/feedback/internal-guards.d.ts +2 -0
  41. package/dist/runtime-v2/feedback/internal-guards.d.ts.map +1 -0
  42. package/dist/runtime-v2/feedback/internal-guards.js +6 -0
  43. package/dist/runtime-v2/feedback/internal-guards.js.map +1 -0
  44. package/dist/runtime-v2/feedback/privacy-preview.d.ts +14 -0
  45. package/dist/runtime-v2/feedback/privacy-preview.d.ts.map +1 -0
  46. package/dist/runtime-v2/feedback/privacy-preview.js +128 -0
  47. package/dist/runtime-v2/feedback/privacy-preview.js.map +1 -0
  48. package/dist/runtime-v2/feedback/redact-sensitive.d.ts +37 -0
  49. package/dist/runtime-v2/feedback/redact-sensitive.d.ts.map +1 -0
  50. package/dist/runtime-v2/feedback/redact-sensitive.js +272 -0
  51. package/dist/runtime-v2/feedback/redact-sensitive.js.map +1 -0
  52. package/dist/runtime-v2/feedback/render-github-url.d.ts +21 -0
  53. package/dist/runtime-v2/feedback/render-github-url.d.ts.map +1 -0
  54. package/dist/runtime-v2/feedback/render-github-url.js +57 -0
  55. package/dist/runtime-v2/feedback/render-github-url.js.map +1 -0
  56. package/dist/runtime-v2/feedback/render-markdown.d.ts +12 -0
  57. package/dist/runtime-v2/feedback/render-markdown.d.ts.map +1 -0
  58. package/dist/runtime-v2/feedback/render-markdown.js +166 -0
  59. package/dist/runtime-v2/feedback/render-markdown.js.map +1 -0
  60. package/dist/runtime-v2/feedback/safe-stringify.d.ts +6 -0
  61. package/dist/runtime-v2/feedback/safe-stringify.d.ts.map +1 -0
  62. package/dist/runtime-v2/feedback/safe-stringify.js +115 -0
  63. package/dist/runtime-v2/feedback/safe-stringify.js.map +1 -0
  64. package/dist/runtime-v2/index.d.ts +2 -0
  65. package/dist/runtime-v2/index.d.ts.map +1 -1
  66. package/dist/runtime-v2/index.js +7 -0
  67. package/dist/runtime-v2/index.js.map +1 -1
  68. package/package.json +5 -1
@@ -0,0 +1,243 @@
1
+ // feedback-types.ts
2
+ // Core type definitions and runtime validators for the feedback report contract.
3
+ // ERR-001/005/013: no `as` casts on untrusted input. All validation uses typeof + Object.hasOwn + isRecord.
4
+ // ERR-002: failure paths include reason + nextAction.
5
+ import { isString } from './internal-guards.js';
6
+ // ── Type guards ──────────────────────────────────────────────────────────────
7
+ const FEEDBACK_TYPES = [
8
+ 'bug',
9
+ 'confusing',
10
+ 'privacy_concern',
11
+ 'feature_request',
12
+ 'other',
13
+ ];
14
+ const USER_SEVERITIES = ['low', 'medium', 'high'];
15
+ const FEEDBACK_SOURCES = ['console', 'cli', 'agent'];
16
+ export function isFeedbackType(value) {
17
+ return typeof value === 'string' && FEEDBACK_TYPES.includes(value);
18
+ }
19
+ export function isUserSeverity(value) {
20
+ return typeof value === 'string' && USER_SEVERITIES.includes(value);
21
+ }
22
+ export function isFeedbackSource(value) {
23
+ return typeof value === 'string' && FEEDBACK_SOURCES.includes(value);
24
+ }
25
+ export function isRecord(value) {
26
+ if (typeof value !== 'object' || value === null)
27
+ return false;
28
+ if (Array.isArray(value))
29
+ return false;
30
+ return true;
31
+ }
32
+ export function isBoolean(value) {
33
+ return typeof value === 'boolean';
34
+ }
35
+ // Re-export the shared isString guard so callers can import everything from one place.
36
+ export { isString } from './internal-guards.js';
37
+ // ── Validators (return ValidationError[]; do not throw) ──────────────────────
38
+ function validateOptionalString(value, field, errors) {
39
+ if (value === undefined)
40
+ return undefined;
41
+ if (!isString(value)) {
42
+ errors.push({
43
+ field,
44
+ reason: `${field} must be a string when provided (ERR-010)`,
45
+ nextAction: `provide a string value for ${field} or omit it`,
46
+ });
47
+ return undefined;
48
+ }
49
+ return value;
50
+ }
51
+ function validateFeedbackContext(value) {
52
+ const errors = [];
53
+ if (!isRecord(value)) {
54
+ errors.push({
55
+ field: 'context',
56
+ reason: 'context must be a non-null object when provided',
57
+ nextAction: 'provide a valid context object or omit it',
58
+ });
59
+ return errors;
60
+ }
61
+ if (!Object.hasOwn(value, 'source')) {
62
+ errors.push({
63
+ field: 'context.source',
64
+ reason: 'context.source is required when context is provided (ERR-009)',
65
+ nextAction: 'add context.source with a value of console, cli, or agent',
66
+ });
67
+ }
68
+ else if (!isFeedbackSource(value.source)) {
69
+ errors.push({
70
+ field: 'context.source',
71
+ reason: 'context.source must be one of: console, cli, agent (ERR-010)',
72
+ nextAction: 'set context.source to a valid FeedbackSource value',
73
+ });
74
+ }
75
+ validateOptionalString(value.page, 'context.page', errors);
76
+ validateOptionalString(value.painId, 'context.painId', errors);
77
+ validateOptionalString(value.principleId, 'context.principleId', errors);
78
+ validateOptionalString(value.approvalId, 'context.approvalId', errors);
79
+ validateOptionalString(value.activationId, 'context.activationId', errors);
80
+ validateOptionalString(value.updateAttemptId, 'context.updateAttemptId', errors);
81
+ return errors;
82
+ }
83
+ function validateAgentDraft(value) {
84
+ const errors = [];
85
+ if (!isRecord(value)) {
86
+ errors.push({
87
+ field: 'agentDraft',
88
+ reason: 'agentDraft must be a non-null object when provided',
89
+ nextAction: 'provide a valid agentDraft object or omit it',
90
+ });
91
+ return errors;
92
+ }
93
+ if (!Object.hasOwn(value, 'summary')) {
94
+ errors.push({
95
+ field: 'agentDraft.summary',
96
+ reason: 'agentDraft.summary is required when agentDraft is provided (ERR-009)',
97
+ nextAction: 'add a summary field to agentDraft',
98
+ });
99
+ }
100
+ else if (!isString(value.summary)) {
101
+ errors.push({
102
+ field: 'agentDraft.summary',
103
+ reason: 'agentDraft.summary must be a string (ERR-010)',
104
+ nextAction: 'provide a string value for agentDraft.summary',
105
+ });
106
+ }
107
+ validateOptionalString(value.observedFailure, 'agentDraft.observedFailure', errors);
108
+ validateOptionalString(value.commandSummary, 'agentDraft.commandSummary', errors);
109
+ return errors;
110
+ }
111
+ /**
112
+ * Validate and normalize a `FeedbackDraftInput` value.
113
+ * Returns a discriminated union. Never throws.
114
+ */
115
+ export function normalizeFeedbackDraftInput(value) {
116
+ const errors = [];
117
+ if (!isRecord(value)) {
118
+ errors.push({
119
+ field: 'root',
120
+ reason: 'feedback input must be a non-null object',
121
+ nextAction: 'provide a valid feedback draft input object',
122
+ });
123
+ return { ok: false, errors };
124
+ }
125
+ // Required: type
126
+ if (!Object.hasOwn(value, 'type')) {
127
+ errors.push({
128
+ field: 'type',
129
+ reason: 'type is required (ERR-009)',
130
+ nextAction: 'add a type field with a valid FeedbackType value',
131
+ });
132
+ }
133
+ else if (!isFeedbackType(value.type)) {
134
+ errors.push({
135
+ field: 'type',
136
+ reason: 'type must be one of: bug, confusing, privacy_concern, feature_request, other (ERR-010)',
137
+ nextAction: 'provide a valid FeedbackType string',
138
+ });
139
+ }
140
+ // Required: title
141
+ if (!Object.hasOwn(value, 'title')) {
142
+ errors.push({
143
+ field: 'title',
144
+ reason: 'title is required (ERR-009)',
145
+ nextAction: 'add a title field with a string value',
146
+ });
147
+ }
148
+ else if (!isString(value.title)) {
149
+ errors.push({
150
+ field: 'title',
151
+ reason: 'title must be a string (ERR-010)',
152
+ nextAction: 'provide a string value for title',
153
+ });
154
+ }
155
+ // Required: description
156
+ if (!Object.hasOwn(value, 'description')) {
157
+ errors.push({
158
+ field: 'description',
159
+ reason: 'description is required (ERR-009)',
160
+ nextAction: 'add a description field with a string value',
161
+ });
162
+ }
163
+ else if (!isString(value.description)) {
164
+ errors.push({
165
+ field: 'description',
166
+ reason: 'description must be a string (ERR-010)',
167
+ nextAction: 'provide a string value for description',
168
+ });
169
+ }
170
+ // Optional: stepsToReproduce, expectedBehavior, actualBehavior
171
+ validateOptionalString(value.stepsToReproduce, 'stepsToReproduce', errors);
172
+ validateOptionalString(value.expectedBehavior, 'expectedBehavior', errors);
173
+ validateOptionalString(value.actualBehavior, 'actualBehavior', errors);
174
+ // Optional: userSeverity
175
+ if (value.userSeverity !== undefined && !isUserSeverity(value.userSeverity)) {
176
+ errors.push({
177
+ field: 'userSeverity',
178
+ reason: 'userSeverity must be one of: low, medium, high (ERR-010)',
179
+ nextAction: 'provide a valid UserSeverity value or omit it',
180
+ });
181
+ }
182
+ // Optional: context (object, validated recursively)
183
+ let context = undefined;
184
+ if (value.context !== undefined) {
185
+ const ctxErrors = validateFeedbackContext(value.context);
186
+ for (const e of ctxErrors)
187
+ errors.push(e);
188
+ if (isRecord(value.context) && isFeedbackSource(value.context.source)) {
189
+ const c = value.context;
190
+ const built = { source: c.source };
191
+ if (isString(c.page))
192
+ built.page = c.page;
193
+ if (isString(c.painId))
194
+ built.painId = c.painId;
195
+ if (isString(c.principleId))
196
+ built.principleId = c.principleId;
197
+ if (isString(c.approvalId))
198
+ built.approvalId = c.approvalId;
199
+ if (isString(c.activationId))
200
+ built.activationId = c.activationId;
201
+ if (isString(c.updateAttemptId))
202
+ built.updateAttemptId = c.updateAttemptId;
203
+ context = built;
204
+ }
205
+ }
206
+ // Optional: agentDraft
207
+ let agentDraft = undefined;
208
+ if (value.agentDraft !== undefined) {
209
+ const adErrors = validateAgentDraft(value.agentDraft);
210
+ for (const e of adErrors)
211
+ errors.push(e);
212
+ if (isRecord(value.agentDraft) && isString(value.agentDraft.summary)) {
213
+ const a = value.agentDraft;
214
+ const built = { summary: a.summary };
215
+ if (isString(a.observedFailure))
216
+ built.observedFailure = a.observedFailure;
217
+ if (isString(a.commandSummary))
218
+ built.commandSummary = a.commandSummary;
219
+ agentDraft = built;
220
+ }
221
+ }
222
+ if (errors.length > 0)
223
+ return { ok: false, errors };
224
+ const type = value.type;
225
+ const title = value.title;
226
+ const description = value.description;
227
+ const userText = { description };
228
+ if (isString(value.stepsToReproduce))
229
+ userText.stepsToReproduce = value.stepsToReproduce;
230
+ if (isString(value.expectedBehavior))
231
+ userText.expectedBehavior = value.expectedBehavior;
232
+ if (isString(value.actualBehavior))
233
+ userText.actualBehavior = value.actualBehavior;
234
+ if (isUserSeverity(value.userSeverity))
235
+ userText.userSeverity = value.userSeverity;
236
+ const normalized = { type, title, userText };
237
+ if (context)
238
+ normalized.context = context;
239
+ if (agentDraft)
240
+ normalized.agentDraft = agentDraft;
241
+ return { ok: true, value: normalized };
242
+ }
243
+ //# sourceMappingURL=feedback-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-types.js","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/feedback-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type { FeedbackType, UserSeverity, FeedbackSource, FeedbackContext, AgentDraft, FeedbackUserText, FeedbackDraftInput, NormalizedDraft, RecentEvent, CanaryStatus, DiagnosticSummary, ContextRef, PrivacyPreview, FeedbackReport, ValidationError, NormalizeResult, } from './feedback-types.js';
2
+ export { isFeedbackType, isUserSeverity, isFeedbackSource, isRecord, isBoolean, normalizeFeedbackDraftInput, } from './feedback-types.js';
3
+ export { redactAbsolutePaths, redactTokenLikeValues, redactEnvLikeValues, redactStackTrace, redactSensitiveFields, REDACTED_PATH, REDACTED_VALUE, NO_STACK, type RedactResult, } from './redact-sensitive.js';
4
+ export { renderReportMarkdown, MAX_MARKDOWN_LENGTH } from './render-markdown.js';
5
+ export { buildGitHubIssueDraftUrl, MAX_URL_BODY_LENGTH, GITHUB_REPO, type GithubUrlResult, } from './render-github-url.js';
6
+ export { buildPrivacyPreview, buildEmailText, DEFAULT_INCLUDED_SECTIONS, DEFAULT_EXCLUDED_CATEGORIES, } from './privacy-preview.js';
7
+ export { createFeedbackReport, type CreateReportResult } from './create-report.js';
8
+ export { safeStringifyPreview } from './safe-stringify.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,QAAQ,EACR,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,WAAW,EACX,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ // feedback/index.ts
2
+ // Barrel re-exports for the feedback report contract.
3
+ // Pure logic only — no I/O, no fs, no process, no db, no network.
4
+ export { isFeedbackType, isUserSeverity, isFeedbackSource, isRecord, isBoolean, normalizeFeedbackDraftInput, } from './feedback-types.js';
5
+ export { redactAbsolutePaths, redactTokenLikeValues, redactEnvLikeValues, redactStackTrace, redactSensitiveFields, REDACTED_PATH, REDACTED_VALUE, NO_STACK, } from './redact-sensitive.js';
6
+ export { renderReportMarkdown, MAX_MARKDOWN_LENGTH } from './render-markdown.js';
7
+ export { buildGitHubIssueDraftUrl, MAX_URL_BODY_LENGTH, GITHUB_REPO, } from './render-github-url.js';
8
+ export { buildPrivacyPreview, buildEmailText, DEFAULT_INCLUDED_SECTIONS, DEFAULT_EXCLUDED_CATEGORIES, } from './privacy-preview.js';
9
+ export { createFeedbackReport } from './create-report.js';
10
+ export { safeStringifyPreview } from './safe-stringify.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,sDAAsD;AACtD,kEAAkE;AAqBlE,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,QAAQ,GAET,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,WAAW,GAEZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAA2B,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isString(value: unknown): value is string;
2
+ //# sourceMappingURL=internal-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-guards.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/internal-guards.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD"}
@@ -0,0 +1,6 @@
1
+ // internal-guards.ts
2
+ // Re-exported shared primitive guards used across the feedback module.
3
+ export function isString(value) {
4
+ return typeof value === 'string';
5
+ }
6
+ //# sourceMappingURL=internal-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-guards.js","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/internal-guards.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,uEAAuE;AAEvE,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { FeedbackReport, PrivacyPreview } from './feedback-types.js';
2
+ export declare const DEFAULT_INCLUDED_SECTIONS: readonly string[];
3
+ export declare const DEFAULT_EXCLUDED_CATEGORIES: readonly string[];
4
+ /**
5
+ * Build a fresh PrivacyPreview object. Each call returns new arrays so callers
6
+ * may mutate the result without affecting the defaults.
7
+ */
8
+ export declare function buildPrivacyPreview(redactionNotes: string[]): PrivacyPreview;
9
+ /**
10
+ * Build an email-ready plain-text version of a FeedbackReport.
11
+ * Uses real '\n' newlines. BigInt/cycle-safe via safeStringifyPreview.
12
+ */
13
+ export declare function buildEmailText(report: FeedbackReport): string;
14
+ //# sourceMappingURL=privacy-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-preview.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/privacy-preview.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1E,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAOtD,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EASxD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,cAAc,CAM5E;AAWD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA4E7D"}
@@ -0,0 +1,128 @@
1
+ // privacy-preview.ts
2
+ // Privacy metadata and email-text rendering.
3
+ // ERR-014/016/017: correct '\n' newlines, BigInt-safe, never throws on cycles.
4
+ import { safeStringifyPreview } from './safe-stringify.js';
5
+ import { redactAbsolutePaths, redactTokenLikeValues, redactEnvLikeValues } from './redact-sensitive.js';
6
+ export const DEFAULT_INCLUDED_SECTIONS = [
7
+ 'versions',
8
+ 'platform',
9
+ 'featureFlags',
10
+ 'canary',
11
+ 'userText',
12
+ 'contextIds',
13
+ ];
14
+ export const DEFAULT_EXCLUDED_CATEGORIES = [
15
+ 'rawPrompt',
16
+ 'rawChat',
17
+ 'rawTrajectory',
18
+ 'fileContents',
19
+ 'fullPaths',
20
+ 'envVars',
21
+ 'tokens',
22
+ 'fullStackTraces',
23
+ ];
24
+ /**
25
+ * Build a fresh PrivacyPreview object. Each call returns new arrays so callers
26
+ * may mutate the result without affecting the defaults.
27
+ */
28
+ export function buildPrivacyPreview(redactionNotes) {
29
+ return {
30
+ includedSections: [...DEFAULT_INCLUDED_SECTIONS],
31
+ excludedByDefault: [...DEFAULT_EXCLUDED_CATEGORIES],
32
+ redactionNotes: redactionNotes.slice(),
33
+ };
34
+ }
35
+ const MAX_EMAIL_FIELD = 1500;
36
+ const MAX_EMAIL_DIAGNOSTIC_FIELD = 1200;
37
+ function safe(s, max) {
38
+ if (typeof s !== 'string')
39
+ return '';
40
+ if (s.length <= max)
41
+ return s;
42
+ return s.slice(0, max) + '…';
43
+ }
44
+ /**
45
+ * Build an email-ready plain-text version of a FeedbackReport.
46
+ * Uses real '\n' newlines. BigInt/cycle-safe via safeStringifyPreview.
47
+ */
48
+ export function buildEmailText(report) {
49
+ const lines = [];
50
+ lines.push(`Subject: [PD feedback] [${report.type}] ${redactAbsolutePaths(report.title)}`);
51
+ lines.push('');
52
+ lines.push('— PD Feedback Report —');
53
+ lines.push(`ID: ${report.id}`);
54
+ lines.push(`Created: ${report.createdAt}`);
55
+ if (report.userText.userSeverity) {
56
+ lines.push(`User severity: ${report.userText.userSeverity}`);
57
+ }
58
+ lines.push('');
59
+ lines.push('— Description —');
60
+ lines.push(safe(report.userText.description, MAX_EMAIL_FIELD));
61
+ if (report.userText.stepsToReproduce) {
62
+ lines.push('');
63
+ lines.push('— Steps to reproduce —');
64
+ lines.push(safe(report.userText.stepsToReproduce, MAX_EMAIL_FIELD));
65
+ }
66
+ if (report.userText.expectedBehavior) {
67
+ lines.push('');
68
+ lines.push('— Expected behavior —');
69
+ lines.push(safe(report.userText.expectedBehavior, MAX_EMAIL_FIELD));
70
+ }
71
+ if (report.userText.actualBehavior) {
72
+ lines.push('');
73
+ lines.push('— Actual behavior —');
74
+ lines.push(safe(report.userText.actualBehavior, MAX_EMAIL_FIELD));
75
+ }
76
+ lines.push('');
77
+ lines.push('— Diagnostics (low-sensitivity) —');
78
+ lines.push('versions:');
79
+ lines.push(safeStringifyPreview(report.diagnosticSummary.versions).slice(0, MAX_EMAIL_DIAGNOSTIC_FIELD));
80
+ lines.push('platform:');
81
+ lines.push(safeStringifyPreview(report.diagnosticSummary.platform).slice(0, MAX_EMAIL_DIAGNOSTIC_FIELD));
82
+ lines.push('featureFlags:');
83
+ lines.push(safeStringifyPreview(report.diagnosticSummary.featureFlags).slice(0, MAX_EMAIL_DIAGNOSTIC_FIELD));
84
+ if (report.diagnosticSummary.canary.status === 'available') {
85
+ lines.push(`canary: available${report.diagnosticSummary.canary.summary ? ` — ${report.diagnosticSummary.canary.summary}` : ''}`);
86
+ }
87
+ else {
88
+ lines.push(`canary: unavailable${report.diagnosticSummary.canary.unavailableReason ? ` — ${report.diagnosticSummary.canary.unavailableReason}` : ''}`);
89
+ }
90
+ if (report.contextRefs.length > 0) {
91
+ lines.push('');
92
+ lines.push('— Context references —');
93
+ const maxContextRefs = 12;
94
+ const shownRefs = report.contextRefs.slice(0, maxContextRefs);
95
+ for (const r of shownRefs) {
96
+ const label = r.label ? ` — ${r.label}` : '';
97
+ lines.push(`- ${r.kind}: ${r.id}${label}`);
98
+ }
99
+ if (report.contextRefs.length > maxContextRefs) {
100
+ lines.push(`- … and ${report.contextRefs.length - maxContextRefs} more`);
101
+ }
102
+ }
103
+ lines.push('');
104
+ lines.push('— Privacy —');
105
+ lines.push('Included by default:');
106
+ for (const s of report.privacy.includedSections)
107
+ lines.push(`- ${s}`);
108
+ lines.push('Excluded by default:');
109
+ for (const s of report.privacy.excludedByDefault)
110
+ lines.push(`- ${s}`);
111
+ if (report.privacy.redactionNotes.length > 0) {
112
+ lines.push('Redaction notes:');
113
+ const maxNotes = 12;
114
+ const shownNotes = report.privacy.redactionNotes.slice(0, maxNotes);
115
+ for (const n of shownNotes)
116
+ lines.push(`- ${n}`);
117
+ if (report.privacy.redactionNotes.length > maxNotes) {
118
+ lines.push(`- … and ${report.privacy.redactionNotes.length - maxNotes} more`);
119
+ }
120
+ }
121
+ // Defense-in-depth: scrub any absolute path / token / env value that slipped through.
122
+ let email = lines.join('\n');
123
+ email = redactAbsolutePaths(email);
124
+ email = redactTokenLikeValues(email);
125
+ email = redactEnvLikeValues(email);
126
+ return email;
127
+ }
128
+ //# sourceMappingURL=privacy-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-preview.js","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/privacy-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export declare const REDACTED_PATH = "<redacted-path>";
2
+ export declare const REDACTED_VALUE = "[REDACTED]";
3
+ export declare const NO_STACK = "<no-stack>";
4
+ /**
5
+ * Replace absolute paths with `<redacted-path>`. Relative paths are left alone.
6
+ */
7
+ export declare function redactAbsolutePaths(text: string): string;
8
+ /**
9
+ * Replace token-like values with `[REDACTED]`.
10
+ */
11
+ export declare function redactTokenLikeValues(text: string): string;
12
+ export declare function redactEnvLikeValues(text: string): string;
13
+ /**
14
+ * Reduce a stack trace to the error name and the first N frames (paths redacted).
15
+ * Empty input returns `<no-stack>`.
16
+ */
17
+ export declare function redactStackTrace(text: string, maxFrames?: number): string;
18
+ export type RedactResult = {
19
+ ok: true;
20
+ value: unknown;
21
+ notes: string[];
22
+ } | {
23
+ ok: false;
24
+ error: string;
25
+ nextAction: string;
26
+ };
27
+ /**
28
+ * Recursively redact sensitive fields in an unknown value.
29
+ * Never throws. Returns a structured result with notes describing what was redacted.
30
+ *
31
+ * ERR-002: returns `{ok:false,error,nextAction}` for non-object top-level input
32
+ * because field redaction is a structured-data operation. Primitives carry no
33
+ * fields; their values should be sanitized via `redactTokenLikeValues` /
34
+ * `redactEnvLikeValues` / `redactAbsolutePaths` instead.
35
+ */
36
+ export declare function redactSensitiveFields(value: unknown): RedactResult;
37
+ //# sourceMappingURL=redact-sensitive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-sensitive.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/redact-sensitive.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,eAAO,MAAM,cAAc,eAAe,CAAC;AAC3C,eAAO,MAAM,QAAQ,eAAe,CAAC;AAWrC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAaD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO1D;AAOD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiC,GAAG,MAAM,CAUnG;AAyCD,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAgIrD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CA2BlE"}