@innspel/core 0.1.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.
@@ -0,0 +1,579 @@
1
+ /**
2
+ * Opak koblingsnøkkel til et maskinsignal hos leietakeren (krasj-ID, sesjons-ID, avspillings-ID). Plattformen validerer at kind er deklarert og at value matcher kind-ens pattern, og tolker eller følger aldri verdien (DD-43).
3
+ */
4
+ type CommonCorrelation = {
5
+ /**
6
+ * Deklarert av leietakeren i innstillingene. «crash» er forhåndsdefinert.
7
+ */
8
+ kind: string;
9
+ value: string;
10
+ };
11
+ /**
12
+ * Maskinlesbar feilkode. Klienten forgrener på denne, aldri på message. Meldingen navngir feltet som feilet, aldri innsendte verdier — den kan inneholde fritekst fra innsenderen.
13
+ */
14
+ type CommonErrorCode = 'validation_failed' | 'unknown_field' | 'text_too_short' | 'text_too_long' | 'correlation_invalid' | 'unauthenticated' | 'feedback_token_required' | 'feedback_token_invalid' | 'feedback_token_expired' | 'mfa_required' | 'insufficient_role' | 'insufficient_scope' | 'screenshots_disabled' | 'submission_not_found' | 'known_issue_not_found' | 'program_not_found' | 'invitation_invalid' | 'task_not_found' | 'follow_up_not_found' | 'participant_not_found' | 'subject_not_found' | 'attachment_not_found' | 'webhook_not_found' | 'delivery_not_found' | 'product_not_found' | 'key_not_found' | 'receipt_not_found' | 'report_not_found' | 'handoff_invalid' | 'invalid_status_transition' | 'reply_exists' | 'invitation_already_answered' | 'program_incomplete' | 'program_full' | 'task_already_completed' | 'follow_up_already_answered' | 'report_frozen' | 'webhook_not_verified' | 'attachment_already_uploaded' | 'reply_required' | 'reason_code_required' | 'template_unmodified' | 'fixed_in_required' | 'canonical_is_duplicate' | 'known_issue_conflict' | 'deadline_cannot_be_extended' | 'minors_present_conflict' | 'contacts_exceed_tenant_cap' | 'data_limitations_required' | 'attachment_too_large' | 'attachment_type_not_allowed' | 'rate_limited' | 'not_implemented';
15
+ /**
16
+ * Plattformen innsendingen kom fra. Lukket liste fra dag én, inkludert storskjerm — en verdi som legges til senere er en kontraktendring hos alle SDK-er (ideer/storskjerm-qr-handoff.md).
17
+ */
18
+ type CommonPlatform = 'ios' | 'android' | 'web' | 'tvos' | 'androidtv' | 'tizen' | 'webos';
19
+ /**
20
+ * Kjent feil-kortet slik SDK-et og portalen viser det, FØR innsending i feilsporet (differensiatoren, M2.4). Tre deler: hva, omvei, gjelder versjon (DD-30). Tre svar i klienten: «Ja, jeg også» (KnownIssues.confirm) · «Ligner, men ikke helt» (relatedKnownIssueId på innsendingen) · «Nei, det er noe annet» (vanlig innsending) (DD-29). Aldri Reach — innsenderen ser ikke hvor mange andre.
21
+ */
22
+ type KnownIssuesKnownIssueCard = {
23
+ id: string;
24
+ /**
25
+ * I brukerens ord, 1–3 setninger.
26
+ */
27
+ title: string;
28
+ /**
29
+ * Valgfri omvei, 1–3 setninger.
30
+ */
31
+ workaround?: string;
32
+ status: KnownIssuesKnownIssueStatus;
33
+ /**
34
+ * Versjonen feilen rettes eller er rettet i. Vises som «Rettes i X» når aktiv, «Rettet i X» når fikset.
35
+ */
36
+ fixedIn?: string;
37
+ };
38
+ /**
39
+ * aktiv vises i skjemaet (DD-03); fikset krever fixedIn og utløser Rettet-varselet til alle med Reach (DD-31). Kortet vises for fikset så lenge innsenderens appVersion ≤ fixedIn, og skjules for nyere (DD-30).
40
+ */
41
+ type KnownIssuesKnownIssueStatus = 'aktiv' | 'fikset';
42
+ /**
43
+ * paaminnelse bærer alltid fristen i teksten; tilbud_om_utgang er eneste lovlige form for den betingede kontakten når ingen oppgave er gjort (DD-34).
44
+ */
45
+ type ProgramsFollowUpKind = 'paaminnelse' | 'hvordan_gikk_det' | 'sjekkpunkt' | 'tilbud_om_utgang';
46
+ /**
47
+ * En oppfølging som er sendt ut til kalleren og ikke besvart. Teksten bærer fristen når kind = paaminnelse (DD-34).
48
+ */
49
+ type ProgramsFollowUpView = {
50
+ id: string;
51
+ programId: string;
52
+ kind: ProgramsFollowUpKind;
53
+ question: string;
54
+ deadlineAt?: string;
55
+ emittedAt: string;
56
+ };
57
+ /**
58
+ * utloept er utledet av klokka, aldri skrevet.
59
+ */
60
+ type ProgramsInvitationStatus = 'sendt' | 'akseptert' | 'avslaatt' | 'utloept';
61
+ /**
62
+ * Invitasjon rettet til kallerens subject. Tokenet finnes ikke her — det kom via leietakerens kanal (DD-12); listen viser at invitasjonen finnes så banneret kan tegnes.
63
+ */
64
+ type ProgramsInvitationView = {
65
+ id: string;
66
+ program: ProgramsProgramView;
67
+ status: ProgramsInvitationStatus;
68
+ expiresAt: string;
69
+ };
70
+ /**
71
+ * Alt om betaprogram for kallerens subject i ett kall — SDK-ets programs.list(). Krever feedback-token; anonym modus har ingen programmer.
72
+ */
73
+ type ProgramsMyPrograms = {
74
+ invitations: Array<ProgramsInvitationView>;
75
+ participations: Array<ProgramsParticipationView>;
76
+ pendingFollowUps: Array<ProgramsFollowUpView>;
77
+ };
78
+ /**
79
+ * trukket: deltakeren gikk ut selv («Gå ut» er alltid synlig, DD-36). Ut av segmentet umiddelbart.
80
+ */
81
+ type ProgramsParticipantStatus = 'aktiv' | 'fullfoert' | 'trukket';
82
+ /**
83
+ * Kallerens egen deltakelse med oppgavestatus. contactsSent / maxContacts vises i fanen.
84
+ */
85
+ type ProgramsParticipationView = {
86
+ id: string;
87
+ program: ProgramsProgramView;
88
+ status: ProgramsParticipantStatus;
89
+ joinedAt: string;
90
+ completions: Array<ProgramsTaskCompletionView>;
91
+ contactsSent: number;
92
+ };
93
+ /**
94
+ * Programmet slik testeren ser det i aksepten (DD-13, DD-32) og i fanen. Ingen andre deltakere, ingen tall om andre.
95
+ */
96
+ type ProgramsProgramView = {
97
+ id: string;
98
+ name: string;
99
+ /**
100
+ * Hva som testes — vises først i aksepten.
101
+ */
102
+ hypothesis: string;
103
+ opensAt: string;
104
+ closesAt: string;
105
+ /**
106
+ * Maks antall kontakter testeren kan få. Vises ved aksept; plattformen nekter å sende flere (DD-14).
107
+ */
108
+ maxContacts: number;
109
+ /**
110
+ * Forpliktelsesfri form: ingen insentiv, ingen frist, ingen vilkår. Tvunget ved minorsPresent (K37).
111
+ */
112
+ commitmentFree: boolean;
113
+ /**
114
+ * Leietakerens vilkår som lenke — aldri avkryssing som binder (DD-37). Alltid null ved commitmentFree.
115
+ */
116
+ termsUrl?: string;
117
+ tasks: Array<ProgramsTask>;
118
+ /**
119
+ * Kjente feil merket visibleToTesters, vist i aksepten (hele lista, DD-13) med samme kort som widgeten.
120
+ */
121
+ knownIssues: Array<KnownIssuesKnownIssueCard>;
122
+ };
123
+ /**
124
+ * Én oppgave i programmet. estimatedMinutes er obligatorisk — aksepten viser «N oppgaver × M minutter» (DD-32).
125
+ */
126
+ type ProgramsTask = {
127
+ id: string;
128
+ /**
129
+ * Rekkefølge fra 1. Oppgave 1 foreslås som «Send ditt første innspill» (DD-33).
130
+ */
131
+ order: number;
132
+ title: string;
133
+ instruction: string;
134
+ /**
135
+ * Skjermen oppgaven gjelder — hint til testeren, aldri en dyplenke plattformen følger.
136
+ */
137
+ screenHint?: string;
138
+ estimatedMinutes: number;
139
+ };
140
+ /**
141
+ * Én fullført oppgave, som testeren ser den.
142
+ */
143
+ type ProgramsTaskCompletionView = {
144
+ taskId: string;
145
+ outcome: ProgramsTaskOutcome;
146
+ at: string;
147
+ submissionId?: string;
148
+ };
149
+ /**
150
+ * Utfallet av én oppgave, valgt av testeren. Tre lukkede valg, aldri skala (rapport 4).
151
+ */
152
+ type ProgramsTaskOutcome = 'fungerte' | 'delvis' | 'ikke';
153
+ /**
154
+ * Minimal peker til en kjent feil, for visning i innsenderens liste.
155
+ */
156
+ type SubmissionsKnownIssueRef = {
157
+ id: string;
158
+ title: string;
159
+ };
160
+ /**
161
+ * Begrunnelseskode ved avvist. Obligatorisk sammen med fritekst (DD-09). Fire koder, ingen «annet» — en søppelbøtte undergraver tvangen. Rapport 3 navngir kun ikke_prioritert; de tre andre er wireframens forslag og bekreftes av produkteier ved godkjenning av denne kontrakten.
162
+ */
163
+ type SubmissionsReasonCode = 'ikke_prioritert' | 'utenfor_omfang' | 'kan_ikke_gjenskape' | 'allerede_mulig';
164
+ /**
165
+ * Svaret fra leietakeren, slik innsenderen ser det i «mine innspill» (DD-27). Samme tekst som på saken i panelet.
166
+ */
167
+ type SubmissionsReplyView = {
168
+ text: string;
169
+ reasonCode?: SubmissionsReasonCode;
170
+ at: string;
171
+ };
172
+ /**
173
+ * Statuskategori — maskinens felt, utledet av status (DD-22). reviewing: ny, vurderes · active: planlagt, bygges · complete: levert, kjent_feil med fikset KnownIssue · closed: avvist, duplikat.
174
+ */
175
+ type SubmissionsStatusType = 'reviewing' | 'active' | 'complete' | 'closed';
176
+ /**
177
+ * Tilstandsmaskinen i domain-model.md. Navnet innsenderen ser velges per spor i klienten (DD-22): levert vises som «Rettet» i feilsporet og «Levert» i ønskesporet; kjent_feil → fikset vises som «Rettet».
178
+ */
179
+ type SubmissionsSubmissionStatus = 'ny' | 'vurderes' | 'planlagt' | 'bygges' | 'levert' | 'kjent_feil' | 'duplikat' | 'avvist';
180
+ /**
181
+ * Innsenderens egen visning av en innsending. Ingen tekst fra andre, ingen notater, ingen Reach.
182
+ */
183
+ type SubmissionsSubmissionStatusView = {
184
+ id: string;
185
+ type: SubmissionsSubmissionType;
186
+ /**
187
+ * Innsenderens egen tekst, speilet tilbake så «mine innspill» kan vises uten lokal lagring. Tom for kjent_feil-bekreftelser.
188
+ */
189
+ text: string;
190
+ status: SubmissionsSubmissionStatus;
191
+ /**
192
+ * Utledet av status (DD-22). Klienten velger visningsnavn per spor.
193
+ */
194
+ statusType: SubmissionsStatusType;
195
+ /**
196
+ * Svarfristen som dato — det eneste tidsløftet (DD-28). Satt kun i vurderes: statusChangedAt + leietakerens reviewDeadlineDays.
197
+ */
198
+ deadlineAt?: string;
199
+ /**
200
+ * Versjonen feilen er rettet i / ønsket levert i. Satt ved levert, og ved kjent_feil når KnownIssue er fikset (DD-31).
201
+ */
202
+ fixedIn?: string;
203
+ /**
204
+ * Kjent feil denne innsendingen bekreftet («Ja, jeg også») — kortets tittel så «mine innspill» kan vise hva som ble bekreftet.
205
+ */
206
+ knownIssue?: SubmissionsKnownIssueRef;
207
+ /**
208
+ * Kjent feil innsendingen ble lenket til med «Ligner, men ikke helt». Fjernes hvis behandleren avviser lenken.
209
+ */
210
+ relatedKnownIssue?: SubmissionsKnownIssueRef;
211
+ reply?: SubmissionsReplyView;
212
+ /**
213
+ * Om innsendingen har et vedlegg. Selve bildet returneres aldri her — det vises ikke i «mine innspill».
214
+ */
215
+ hasAttachment: boolean;
216
+ createdAt: string;
217
+ statusChangedAt: string;
218
+ };
219
+ /**
220
+ * Sporet. Første valg i widgeten er «Noe virker ikke» / «Jeg ønsker meg noe», aldri et tredje (DD-02).
221
+ */
222
+ type SubmissionsSubmissionType = 'feil' | 'onske';
223
+
224
+ /**
225
+ * Lagring injiseres av verten — kjernen har ingen nettleser-API-er (CLAUDE.md,
226
+ * «SDK»). Tre metoder er nok: offline-køen er det eneste som lagres, og
227
+ * feedback-tokenet lagres aldri (K20).
228
+ */
229
+ interface InnspelStorage {
230
+ get(key: string): Promise<string | null>;
231
+ set(key: string, value: string): Promise<void>;
232
+ remove(key: string): Promise<void>;
233
+ }
234
+ /**
235
+ * Gir et ferskt feedback-token fra vertens eget token-endepunkt (ES256,
236
+ * `aud=innspel`, `sub` = pseudonym, `exp` ≤ 15 min). Kalles hver gang et token
237
+ * trengs — kjernen cacher det aldri på disk.
238
+ *
239
+ * `null` som RETURVERDI betyr «ingen innlogget bruker akkurat nå»; `null` som
240
+ * OPSJON betyr anonym modus for hele klienten.
241
+ */
242
+ type IdentityProvider = () => Promise<string | null> | string | null;
243
+ /**
244
+ * Den lukkede hvitelista for teknisk kontekst (K5). Leses ved feltnavn — et
245
+ * ukjent felt avvises av `init` og `capture` med feltnavnet i meldingen, før
246
+ * det rekker å bli 400 unknown_field fra plattformen.
247
+ *
248
+ * Aldri enhets-ID, aldri IP, aldri hva som stod på skjermen: `screen` er rutens
249
+ * NAVN. `sdkVersion` settes av kjernen og kan ikke overstyres.
250
+ */
251
+ interface ContextInput {
252
+ platform: CommonPlatform;
253
+ appVersion?: string;
254
+ build?: string;
255
+ os?: string;
256
+ screen?: string;
257
+ locale?: string;
258
+ }
259
+ /** Hendelsene i `docs/maaling.md`. Ingen av dem bærer tekst, skjermbilde eller pseudonym. */
260
+ type TelemetryEvent = {
261
+ name: 'widget_opened';
262
+ } | {
263
+ name: 'track_selected';
264
+ type: 'feil' | 'onske';
265
+ } | {
266
+ name: 'known_issue_shown';
267
+ count: number;
268
+ } | {
269
+ name: 'known_issue_confirmed';
270
+ } | {
271
+ name: 'submission_sent';
272
+ type: 'feil' | 'onske';
273
+ hasAttachment: boolean;
274
+ offlineQueued: boolean;
275
+ } | {
276
+ name: 'submission_failed';
277
+ reason: string;
278
+ } | {
279
+ name: 'invitation_accepted';
280
+ } | {
281
+ name: 'invitation_declined';
282
+ } | {
283
+ name: 'task_completed';
284
+ outcome: string;
285
+ } | {
286
+ name: 'followup_answered';
287
+ } | {
288
+ name: 'status_viewed';
289
+ };
290
+ /**
291
+ * Telemetri går til et injisert grensesnitt. Standard er `noop`; plattformens
292
+ * eget mottak kobles på i M4.2 (tech-decisions.md). Uten opsjonen sendes
293
+ * ingenting noe sted.
294
+ */
295
+ interface Telemetry {
296
+ emit(event: TelemetryEvent): void;
297
+ }
298
+ /** Tekstgrensen per leietaker. Lukket valg — kontrakten har to verdier. */
299
+ type TextMaxLength = 140 | 280;
300
+ interface InnspelOptions {
301
+ /** Plattformens API-rot. Ingen standard: SDK-et skal aldri gjette hvor dataene havner. */
302
+ baseUrl: string;
303
+ /**
304
+ * Den offentlige SDK-nøkkelen (`Product.key`). Skrivende, bundet til
305
+ * bundle-ID eller origin, kan aldri lese (K3). Hører hjemme i appens konfig.
306
+ */
307
+ tenantKey: string;
308
+ /**
309
+ * Funksjon som gir et ferskt feedback-token, eller `null` for anonym modus.
310
+ * Forkastet: stille fallback ved glemt opsjon — anonym modus er et eksplisitt
311
+ * valg (tech-decisions.md, «SDK — dokumentasjon og utvikleropplevelse»).
312
+ */
313
+ identityProvider: IdentityProvider | null;
314
+ /** Offline-køen bor her (DD-41). */
315
+ storage: InnspelStorage;
316
+ /** Teknisk kontekst som følger hver innsending. `platform` er påkrevd. */
317
+ context: ContextInput;
318
+ /**
319
+ * Leietakerens tekstgrense. Ingest-flaten har ingen klientkonfig ennå, så
320
+ * standarden er den strammeste (140, verdien ved `minorsPresent`). Verten
321
+ * overstyrer med verdien fra panelet.
322
+ */
323
+ textMaxLength?: TextMaxLength;
324
+ /** Send-knappen er aktiv fra dette antallet tegn. Standard 10 (DD-44). */
325
+ minTextLength?: number;
326
+ /**
327
+ * Om skjermbilde-steget finnes. Standard `false`: steget skal ikke være en
328
+ * deaktivert knapp, det skal ikke finnes (DD-26). Vedlegg er M1.3.
329
+ */
330
+ screenshotsEnabled?: boolean;
331
+ /** Standard er `noop`. */
332
+ telemetry?: Telemetry;
333
+ /** Injiserbar `fetch`, for test og for verter med egen nettverksstakk. */
334
+ fetch?: typeof fetch;
335
+ /** Tidsavbrudd per kall i millisekunder. Standard 10 000 (wireframe 2i). */
336
+ timeoutMs?: number;
337
+ }
338
+ /** Leietakerens innstillinger slik klienten kjenner dem. */
339
+ interface ResolvedSettings {
340
+ textMaxLength: TextMaxLength;
341
+ minTextLength: number;
342
+ screenshotsEnabled: boolean;
343
+ }
344
+ /** Felles felter for begge spor. */
345
+ interface CaptureBase {
346
+ text: string;
347
+ /** Legges på konteksten fra `init` — typisk `screen`. */
348
+ context?: Partial<ContextInput>;
349
+ /**
350
+ * Idempotensnøkkel for offline-køen. Settes av kjernen hvis den utelates:
351
+ * en ny UUID per INNSENDING, aldri per enhet eller installasjon (K20).
352
+ */
353
+ clientRef?: string;
354
+ /** Krever feedback-token og aktiv deltakelse. Betaprogram er M3. */
355
+ programId?: string;
356
+ taskId?: string;
357
+ }
358
+ /** «Noe virker ikke» — eneste spor med koblingsnøkler og lenke til kjent feil (DD-02). */
359
+ interface CaptureFeil extends CaptureBase {
360
+ type: 'feil';
361
+ /** Opake koblingsnøkler til maskinsignaler hos leietakeren, maks tre. `crash` er forhåndsdefinert (DD-43). */
362
+ correlation?: CommonCorrelation[];
363
+ /** «Ligner, men ikke helt» (DD-29): lenke uten tvunget match. */
364
+ relatedKnownIssueId?: string;
365
+ }
366
+ /** «Jeg ønsker meg noe» — ingen koblingsnøkler, ingen reproduksjonsfelt (DD-02). */
367
+ interface CaptureOnske extends CaptureBase {
368
+ type: 'onske';
369
+ }
370
+ type CaptureInput = CaptureFeil | CaptureOnske;
371
+ type CaptureResult = {
372
+ status: 'sent';
373
+ submission: SubmissionsSubmissionStatusView;
374
+ } | {
375
+ status: 'queued';
376
+ clientRef: string;
377
+ };
378
+ /** En rad i offline-køen. Kun tekst — et skjermbilde køes aldri (rapport 3, kap. 5). */
379
+ interface QueuedSubmission {
380
+ clientRef: string;
381
+ type: 'feil' | 'onske';
382
+ text: string;
383
+ queuedAt: string;
384
+ }
385
+ /** Resultatet av en flush. */
386
+ interface FlushResult {
387
+ sent: number;
388
+ /** Rader plattformen avviste med 400 — de blir aldri gyldige og forkastes. */
389
+ failed: number;
390
+ /** Rader som fortsatt venter, typisk fordi nettet er nede. */
391
+ remaining: number;
392
+ }
393
+ /**
394
+ * En rad i «Mine innspill» (DD-27, DD-41): plattformens egne innsendinger, pluss
395
+ * køen gjort synlig. `pending` skiller dem — en køet rad har ingen saksnummer.
396
+ */
397
+ type MySubmission = (SubmissionsSubmissionStatusView & {
398
+ pending?: false;
399
+ }) | {
400
+ pending: true;
401
+ clientRef: string;
402
+ type: 'feil' | 'onske';
403
+ text: string;
404
+ queuedAt: string;
405
+ };
406
+ /** Klassene mønstervarselet kjenner (DD-46). */
407
+ type PatternKind = 'email' | 'phone' | 'card' | 'ip' | 'token';
408
+ interface PatternFinding {
409
+ kind: PatternKind;
410
+ match: string;
411
+ start: number;
412
+ end: number;
413
+ }
414
+ interface KnownIssueQuery {
415
+ screen?: string;
416
+ version?: string;
417
+ platform?: CommonPlatform;
418
+ }
419
+ /**
420
+ * Visningen `openFeedback` åpner. Registreres av `@innspel/react-native`;
421
+ * kjernen har ingen UI (CLAUDE.md, «SDK»).
422
+ */
423
+ interface Presenter {
424
+ open(options?: OpenFeedbackOptions): Promise<void>;
425
+ }
426
+ interface OpenFeedbackOptions {
427
+ /** Rutenavnet innsenderen kom fra. Styrer hvilke kjente feil som vises (DD-30). */
428
+ screen?: string;
429
+ /** Start i et bestemt spor og hopp over 2b. */
430
+ track?: 'feil' | 'onske';
431
+ }
432
+
433
+ /** Klienten `init` gir deg. Én per app; den er trygg å holde på. */
434
+ interface InnspelClient {
435
+ /** Versjonen av `@innspel/core`. Følger med hver innsending som `context.sdkVersion`. */
436
+ readonly version: string;
437
+ /** `true` når `identityProvider` er `null` — innsendinger kan ikke følges opp. */
438
+ readonly isAnonymous: boolean;
439
+ /** Leietakerens grenser slik klienten kjenner dem. */
440
+ readonly settings: ResolvedSettings;
441
+ /** Konteksten som følger hver innsending, med `sdkVersion` satt av kjernen. */
442
+ readonly context: ContextInput & {
443
+ sdkVersion: string;
444
+ };
445
+ capture(input: CaptureInput): Promise<CaptureResult>;
446
+ readonly knownIssues: {
447
+ /** Kortene som vises FØR feltet i feilsporet (DD-03). Feiler oppslaget, er lista tom. */
448
+ for(query?: KnownIssueQuery): Promise<KnownIssuesKnownIssueCard[]>;
449
+ /** «Ja, jeg også» (DD-29): Reach +1 uten ny sak. */
450
+ confirm(knownIssueId: string): Promise<SubmissionsSubmissionStatusView>;
451
+ };
452
+ readonly subjects: {
453
+ /** «Mine innspill» (DD-27), med køen gjort synlig (DD-41). */
454
+ submissions(): Promise<MySubmission[]>;
455
+ status(submissionId: string): Promise<SubmissionsSubmissionStatusView>;
456
+ };
457
+ readonly programs: {
458
+ list(): Promise<ProgramsMyPrograms>;
459
+ };
460
+ readonly queue: {
461
+ pending(): Promise<QueuedSubmission[]>;
462
+ /** Sendes ellers automatisk når widgeten åpnes. Aldri ved oppstart (DD-41). */
463
+ flush(): Promise<FlushResult>;
464
+ };
465
+ /** Mønstervarsel (DD-46). Returnerer funn — fjerner aldri noe. */
466
+ scanText(text: string): PatternFinding[];
467
+ /** Emitter en tragt-hendelse. Brukes av UI-laget for `widget_opened` og `track_selected`. */
468
+ track(event: TelemetryEvent): void;
469
+ /** Åpner widgeten. Krever `@innspel/react-native`. */
470
+ openFeedback(options?: OpenFeedbackOptions): Promise<void>;
471
+ /** Registrerer visningen. Kalles av `@innspel/react-native`, ikke av verten. */
472
+ registerPresenter(presenter: Presenter): void;
473
+ }
474
+ /**
475
+ * Setter opp SDK-et. Validerer opsjonene ved kjøretid og kaster umiddelbart med
476
+ * feltnavnet ved feil bruk — typer stopper ikke en JavaScript-vert eller en feil
477
+ * `.env` (tech-decisions.md, «SDK — dokumentasjon og utvikleropplevelse»).
478
+ *
479
+ * Kaller ingenting og sender ingenting: køen tømmes ALDRI ved oppstart (DD-41).
480
+ *
481
+ * @example
482
+ * ```ts
483
+ * const innspel = init({
484
+ * baseUrl: 'https://api.innspel.example',
485
+ * tenantKey: 'ik_pub_xxxxxxxx',
486
+ * identityProvider: hentFeedbackToken, // eller null = anonym
487
+ * storage,
488
+ * context: { platform: 'ios', appVersion: '1.4.2' },
489
+ * });
490
+ * ```
491
+ */
492
+ declare function init(options: InnspelOptions): InnspelClient;
493
+
494
+ /**
495
+ * Leter etter e-post, telefonnummer, kortnummer (Luhn-validert), IP-adresser og
496
+ * token-lignende strenger i en innspillstekst.
497
+ *
498
+ * Rekkefølgen på reglene er bevisst: de spesifikke først, så et treff som
499
+ * allerede er dekket av en sterkere regel ikke varsles to ganger. Et kortnummer
500
+ * er ikke også et telefonnummer.
501
+ *
502
+ * @param text Teksten innsenderen har skrevet. Endres ikke.
503
+ * @returns Funnene med posisjon, så verten kan markere dem i feltet. Tom liste
504
+ * for en vanlig innsending.
505
+ */
506
+ declare function scanText(text: string): PatternFinding[];
507
+
508
+ /**
509
+ * DD-41 — «Offline-køen er maks 30, tømmes aldri ved oppstart, og er synlig.»
510
+ *
511
+ * Kilde: Sentry `maxQueueSize` 30 og `flushAtStartup` false; Shake «Feedback
512
+ * pending sync» er den eneste leverandøren som viser tilstanden til brukeren.
513
+ * Kvitteringen i DD-07 kan ikke love svar på noe som ikke er sendt — derfor er
514
+ * køen synlig i «Mine innspill», ikke en usynlig bakgrunnsjobb.
515
+ *
516
+ * Rate limit-tallet per subject i M1.1 er satt til 60 nettopp for at en full kø
517
+ * på 30 skal kunne tømmes på ett minutt (tech-decisions.md, «M1.1»).
518
+ */
519
+ declare const KO_TAK = 30;
520
+
521
+ /**
522
+ * Utviklerfeil: opsjoner som er feil eller mangler, kontekstfelter utenfor
523
+ * hvitelisten, tekst utenfor grensene. Kastes umiddelbart og navngir feltet —
524
+ * aldri en stille tom widget (tech-decisions.md, «SDK — dokumentasjon og
525
+ * utvikleropplevelse»).
526
+ */
527
+ declare class InnspelConfigError extends Error {
528
+ readonly name = "InnspelConfigError";
529
+ /** Feltet som er galt, slik det heter i `init`-opsjonene. */
530
+ readonly field: string;
531
+ constructor(field: string, hva: string, hvor?: string);
532
+ }
533
+ /**
534
+ * Feil fra plattformen. Forgren på `code`, aldri på `message` — meldingen er
535
+ * for mennesker og kan endres uten varsel (contracts/models/common.tsp).
536
+ */
537
+ declare class InnspelApiError extends Error {
538
+ readonly name = "InnspelApiError";
539
+ readonly code: CommonErrorCode | 'unknown';
540
+ readonly status: number;
541
+ /** Sekunder til neste forsøk, fra Retry-After. Kun ved 429. */
542
+ readonly retryAfter: number | undefined;
543
+ constructor(status: number, code: CommonErrorCode | 'unknown', message: string, retryAfter?: number);
544
+ }
545
+ /**
546
+ * Offline-køen er full. Taket er 30 (DD-41), og den eldste beholdes: det første
547
+ * innspillet er like mye verdt som det siste, og å kaste det stille ville brutt
548
+ * løftet om at teksten aldri mistes.
549
+ */
550
+ declare class InnspelQueueFullError extends Error {
551
+ readonly name = "InnspelQueueFullError";
552
+ readonly code: "queue_full";
553
+ /** Tekst som kan vises til innsenderen. Køen skal være synlig, ikke stille. */
554
+ readonly userMessage: string;
555
+ constructor(tak: number);
556
+ }
557
+
558
+ /**
559
+ * Den lukkede hvitelista (K5), som feltnavn. Listen er kilden både til
560
+ * valideringen og til det som faktisk sendes — et felt som ikke står her kommer
561
+ * aldri ut av kjernen, uansett hva verten fyller inn.
562
+ *
563
+ * `sdkVersion` står ikke her fordi den ikke kommer fra verten: kjernen setter
564
+ * den selv, og en vert som prøver å overstyre den blir ignorert.
565
+ */
566
+ declare const KONTEKST_FELTER: readonly ["platform", "appVersion", "build", "os", "screen", "locale"];
567
+
568
+ /**
569
+ * Versjonen som sendes som `context.sdkVersion` på hver innsending.
570
+ *
571
+ * `maaling.md` teller SDK-versjonsspredning per leietaker — «en gammel SDK er
572
+ * et vedlikeholdsproblem som ellers er usynlig». Derfor er dette en konstant og
573
+ * ikke et `require('../package.json')`: kjernen skal virke i en bundler som
574
+ * ikke kan lese JSON, og `test/versjon.test.ts` holder den i takt med
575
+ * `package.json`.
576
+ */
577
+ declare const VERSJON = "0.1.0";
578
+
579
+ export { type CaptureFeil, type CaptureInput, type CaptureOnske, type CaptureResult, type ContextInput, type CommonCorrelation as Correlation, type CommonErrorCode as ErrorCode, type FlushResult, type IdentityProvider, InnspelApiError, type InnspelClient, InnspelConfigError, type InnspelOptions, InnspelQueueFullError, type InnspelStorage, KONTEKST_FELTER, KO_TAK, type KnownIssuesKnownIssueCard as KnownIssueCard, type KnownIssueQuery, type SubmissionsKnownIssueRef as KnownIssueRef, type KnownIssuesKnownIssueStatus as KnownIssueStatus, type ProgramsMyPrograms as MyPrograms, type MySubmission, type OpenFeedbackOptions, type PatternFinding, type PatternKind, type CommonPlatform as Platform, type Presenter, type QueuedSubmission, type SubmissionsReasonCode as ReasonCode, type SubmissionsReplyView as ReplyView, type ResolvedSettings, type SubmissionsStatusType as StatusType, type SubmissionsSubmissionStatus as SubmissionStatus, type SubmissionsSubmissionStatusView as SubmissionStatusView, type SubmissionsSubmissionType as SubmissionType, type Telemetry, type TelemetryEvent, type TextMaxLength, VERSJON, init, scanText };