@burdenoff/fe-libs 2026.904.2 → 2026.904.4

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 (41) hide show
  1. package/dist/shared/assistant/attachments.d.ts +340 -0
  2. package/dist/shared/assistant/attachments.d.ts.map +1 -0
  3. package/dist/shared/assistant/attachments.js +370 -0
  4. package/dist/shared/assistant/conversation.d.ts +153 -0
  5. package/dist/shared/assistant/conversation.d.ts.map +1 -0
  6. package/dist/shared/assistant/documentText.d.ts +261 -0
  7. package/dist/shared/assistant/documentText.d.ts.map +1 -0
  8. package/dist/shared/assistant/documentText.js +235 -0
  9. package/dist/shared/assistant/gatewayLimits.d.ts +25 -0
  10. package/dist/shared/assistant/gatewayLimits.d.ts.map +1 -0
  11. package/dist/shared/assistant/gatewayLimits.js +4 -0
  12. package/dist/shared/assistant/index.d.ts +6 -0
  13. package/dist/shared/assistant/index.d.ts.map +1 -1
  14. package/dist/shared/assistant/store.d.ts +114 -0
  15. package/dist/shared/assistant/store.d.ts.map +1 -0
  16. package/dist/shared/assistant/store.js +198 -0
  17. package/dist/shared/assistant/turnState.d.ts +16 -0
  18. package/dist/shared/assistant/turnState.d.ts.map +1 -0
  19. package/dist/shared/assistant/turnState.js +6 -0
  20. package/dist/shared/config/authBridgeUrls.d.ts.map +1 -1
  21. package/dist/shared/config/authBridgeUrls.js +16 -15
  22. package/dist/shared/config/gatewayUrls.d.ts +29 -0
  23. package/dist/shared/config/gatewayUrls.d.ts.map +1 -1
  24. package/dist/shared/config/gatewayUrls.js +44 -20
  25. package/dist/shared/config/index.d.ts.map +1 -1
  26. package/dist/shared/native/capacitor.d.ts +49 -0
  27. package/dist/shared/native/capacitor.d.ts.map +1 -0
  28. package/dist/shared/native/capacitor.js +31 -0
  29. package/dist/shared/native/index.d.ts +2 -0
  30. package/dist/shared/native/index.d.ts.map +1 -1
  31. package/dist/shared/providers/shell/MultiGatewayProvider.d.ts.map +1 -1
  32. package/dist/shared/providers/shell/MultiGatewayProvider.js +101 -100
  33. package/dist/shared/utils/authCookie.d.ts.map +1 -1
  34. package/dist/shared/utils/authCookie.js +35 -34
  35. package/dist/shared/utils/gatewayFetchRewrite.d.ts.map +1 -1
  36. package/dist/shared/utils/gatewayFetchRewrite.js +95 -87
  37. package/dist/shared-assistant.js +6 -1
  38. package/dist/shared-config.js +9 -1
  39. package/dist/shared-native.js +23 -22
  40. package/dist/shared.js +124 -123
  41. package/package.json +2 -2
@@ -0,0 +1,340 @@
1
+ import { DocumentExtraction, DocumentFormat } from './documentText';
2
+ import { AssistantPromptPart } from './types';
3
+ export declare const MAX_ATTACHMENTS = 5;
4
+ /** Per-file ceiling before downscaling (images) / rejection (everything else). */
5
+ export declare const MAX_FILE_BYTES: number;
6
+ /** Per-file inline budget for text-like content, in characters. */
7
+ export declare const MAX_INLINE_CHARS_PER_FILE = 8000;
8
+ /** Total inline budget across all attachments in one turn. */
9
+ export declare const MAX_INLINE_CHARS_TOTAL = 20000;
10
+ export type AssistantAttachmentKind = "image" | "text" | "document";
11
+ export type AssistantAttachmentStatus = "pending" | "uploading" | "ready" | "error";
12
+ export type AttachmentRejection = "too-many" | "too-large" | "empty" | "unreadable" | "unsupported-image";
13
+ /**
14
+ * Thrown while PREPARING a file (after it passed `validateFile`) to reject it
15
+ * with a specific reason rather than the generic 'unreadable'.
16
+ *
17
+ * `validateFile` runs before the bytes have been touched, so it cannot know
18
+ * whether an oversized image will actually survive the downscale — that verdict
19
+ * only exists once the browser has tried to rasterise it.
20
+ */
21
+ export declare class AttachmentRejectedError extends Error {
22
+ readonly reason: AttachmentRejection;
23
+ constructor(reason: AttachmentRejection);
24
+ }
25
+ export interface AssistantAttachment {
26
+ /** Client-side id; stable for the lifetime of the draft + the sent message. */
27
+ id: string;
28
+ filename: string;
29
+ mimeType: string;
30
+ /** Size of the bytes we actually kept (post-downscale for images). */
31
+ size: number;
32
+ kind: AssistantAttachmentKind;
33
+ status: AssistantAttachmentStatus;
34
+ /** Object/data URL for the composer thumbnail. Images only; never persisted. */
35
+ previewUrl?: string;
36
+ /**
37
+ * A smaller `data:` URL of the same image, sized for the request body rather
38
+ * than for the eye. Preferred over `previewUrl` when building the multimodal
39
+ * parts; see `MAX_TURN_BODY_BYTES`. Images only; never persisted.
40
+ */
41
+ inlineDataUrl?: string;
42
+ /** wspace-files-svc id, once the upload lands. */
43
+ fileId?: string;
44
+ /** Short-lived presigned URL, resolved at send time. */
45
+ downloadUrl?: string;
46
+ /**
47
+ * Inlined content for this attachment, already truncated to
48
+ * `MAX_INLINE_CHARS_PER_FILE`. Text files carry the file itself; PDF/DOCX/XLSX
49
+ * carry whatever `extractDocumentText` pulled out of them (BOFF-6291).
50
+ */
51
+ textContent?: string;
52
+ /** True when `textContent` is a prefix of a longer file. */
53
+ textTruncated?: boolean;
54
+ /**
55
+ * Outcome of the client-side document extraction. Present on every `document`
56
+ * we ATTEMPTED to read — including the failures, which is the point: a scanned
57
+ * or encrypted PDF has to reach the model as a sentence rather than as
58
+ * nothing. Absent means no extractor exists for the type.
59
+ */
60
+ extraction?: DocumentExtraction;
61
+ /**
62
+ * Per-page text for a PDF, kept so the SHARED inline budget can also cut on a
63
+ * page boundary rather than mid-sentence. Already trimmed to the per-file
64
+ * budget at prepare time, so this never holds a whole 50-page document.
65
+ * Draft-only; `toMessageAttachment` never carries it to storage.
66
+ */
67
+ documentPages?: string[];
68
+ /** Human-readable failure reason when `status === 'error'`. */
69
+ error?: string;
70
+ /**
71
+ * Why an upload that is still `uploading` is taking so long — e.g. "File service
72
+ * is starting up — retry 2 of 3".
73
+ *
74
+ * wspace-files-svc runs at minReplicas 0 and needs >=51s to bind its port against
75
+ * the gateway's 15s budget, so the first attachment after a quiet period
76
+ * legitimately sits for about a minute while fe-libs walks its retry ladder. A
77
+ * spinner alone reads as a hang. Draft-only, and NEVER a failure: `status` is still
78
+ * `uploading` and `error` is still unset.
79
+ */
80
+ progressNote?: string;
81
+ }
82
+ /**
83
+ * The slice of an attachment that is safe to keep on a sent message.
84
+ *
85
+ * Conversations are persisted to (profile-scoped) localStorage by the assistant
86
+ * store, so the heavy fields — the base64 `previewUrl` and the inlined
87
+ * `textContent` — MUST NOT travel here: five 1280px JPEG data URLs would exhaust
88
+ * the ~5 MB quota on their own and take the whole conversation history down with
89
+ * them. The bubble re-resolves a thumbnail from `fileId` on demand instead, the
90
+ * same way the pest-scan list does.
91
+ */
92
+ export interface AssistantMessageAttachment {
93
+ id: string;
94
+ filename: string;
95
+ mimeType: string;
96
+ size: number;
97
+ kind: AssistantAttachmentKind;
98
+ fileId?: string;
99
+ }
100
+ export declare function toMessageAttachment(attachment: AssistantAttachment): AssistantMessageAttachment;
101
+ export declare function getExtension(filename: string): string;
102
+ export declare function classifyAttachment(mimeType: string, filename: string): AssistantAttachmentKind;
103
+ /**
104
+ * Document formats we can turn into text in the browser (BOFF-6291).
105
+ *
106
+ * Anything else stays a `document` with no extraction, and the prompt block
107
+ * says so — the honest fallback that used to be the ONLY behaviour.
108
+ */
109
+ export type { DocumentFormat } from './documentText';
110
+ /**
111
+ * Which extractor (if any) can read this file.
112
+ *
113
+ * MIME first, extension second — same order as `classifyAttachment`, and for
114
+ * the same reason: Windows reports `application/octet-stream` for plenty of
115
+ * files whose extension is perfectly informative.
116
+ */
117
+ export declare function detectDocumentFormat(mimeType: string, filename: string): DocumentFormat | null;
118
+ /**
119
+ * The composer's `<input accept>` — DERIVED from what we can actually read.
120
+ *
121
+ * It used to be a hand-written list (`…,.pdf,.csv,.json,.md,.txt,.xlsx,.docx`)
122
+ * that invited exactly the files the model could not see: a farmer picked a
123
+ * soil-test PDF because the picker offered it, and the assistant then asked
124
+ * them to paste it as text. Building the list from `TEXT_EXTENSIONS` and
125
+ * `DOCUMENT_EXTENSIONS` makes that class of mismatch a compile-time
126
+ * impossibility rather than a thing to remember.
127
+ */
128
+ export declare const ATTACHMENT_ACCEPT: string;
129
+ export declare function formatBytes(bytes: number): string;
130
+ /**
131
+ * Is there attachment work in flight that must block sending?
132
+ *
133
+ * `preparingCount` counts files the user has ALREADY dropped/picked but whose
134
+ * image-downscale or text-read has not resolved yet. Those files have no id and
135
+ * no row in `attachments`, so a check that looked only at `attachments` reported
136
+ * "idle" during the whole preparation window — the composer stayed sendable, the
137
+ * turn went out without the photo, and the photo then attached itself to the
138
+ * user's NEXT message. Both halves must be counted.
139
+ */
140
+ export declare function hasAttachmentWorkInFlight(preparingCount: number, attachments: AssistantAttachment[]): boolean;
141
+ /**
142
+ * The attachments a send would ACTUALLY carry to the model.
143
+ *
144
+ * This is the single definition of "sendable" — `buildAttachmentPromptBlock`,
145
+ * `buildPromptParts`, `countInlineImageCandidates` and the composer's send
146
+ * handler all route through it, so the set the user is shown and the set the
147
+ * model receives cannot drift apart by one of them being updated and the others
148
+ * not.
149
+ *
150
+ * `status` is the whole test, and that is deliberate rather than lazy: an
151
+ * attachment whose content is already inlined does not need its upload to have
152
+ * worked, so `useAssistantAttachments` marks a text file — and, since
153
+ * BOFF-6291, a document whose text WAS extracted — `ready` even when the upload
154
+ * failed. Such a file is sendable and does not block: its contents travel in
155
+ * the prompt block, and all it lost is the URL. Only attachments with nothing
156
+ * left to send (an image, or a document that could not be read) reach 'error',
157
+ * and those are exactly the ones worth stopping a turn for.
158
+ */
159
+ export declare function getSendableAttachments(attachments: AssistantAttachment[]): AssistantAttachment[];
160
+ /** Why a draft cannot be sent yet, as far as its attachments are concerned. */
161
+ export type AttachmentSendBlocker = "in-flight" | "failed";
162
+ /**
163
+ * Whether the attachments block sending, and why — `null` when they do not.
164
+ *
165
+ * Two distinct reasons, deliberately not collapsed into one boolean:
166
+ *
167
+ * - `'in-flight'` is momentary and resolves itself; the composer shows a
168
+ * spinner and the user just waits.
169
+ * - `'failed'` never resolves on its own. It is the case this function was
170
+ * added for: a failed attachment is omitted from the outgoing turn by
171
+ * `getSendableAttachments`, but send used to stay enabled as long as there
172
+ * was message text, and `clear()` then wiped the failed chip along with the
173
+ * draft. So the user watched their photo's chip vanish into a sent message
174
+ * that never contained it, and the assistant answered a question about an
175
+ * image it was never given. Blocking is the honest response: the chip offers
176
+ * both retry and remove, so the user picks whether the file matters, and
177
+ * whichever they pick the UI and the model end up agreeing.
178
+ *
179
+ * In-flight is reported first: while an upload is still running the failure is
180
+ * not yet final, and "wait" is better advice than "retry or remove".
181
+ *
182
+ * Nothing here needs to special-case text files or extracted documents: they
183
+ * never reach 'error' in the first place (see `getSendableAttachments`), so a
184
+ * soil-test PDF the browser read but the file library refused still sends, with
185
+ * its text, and never blocks.
186
+ */
187
+ export declare function getAttachmentSendBlocker(preparingCount: number, attachments: AssistantAttachment[]): AttachmentSendBlocker | null;
188
+ /**
189
+ * Gate a candidate file. Images over the ceiling are still accepted — the
190
+ * composer downscales them before upload, so a 12 MB phone photo is fine while
191
+ * a 12 MB PDF is not.
192
+ *
193
+ * That exemption is a PROMISE, not a fact: it holds only if the browser can
194
+ * actually rasterise the image. When it cannot (HEIC), `prepareFile` re-applies
195
+ * this ceiling to the original bytes and rejects there instead.
196
+ */
197
+ export declare function validateFile(file: File, currentCount: number): AttachmentRejection | null;
198
+ /**
199
+ * Truncate on a line boundary where possible, so an inlined CSV/JSON prefix ends
200
+ * at a row rather than mid-token (which reads as corrupt data to the model).
201
+ */
202
+ export declare function truncateForInline(content: string, limit: number): {
203
+ text: string;
204
+ truncated: boolean;
205
+ };
206
+ /**
207
+ * What the modelled body genuinely misses: `buildPromptForMode` prepends its
208
+ * preambles AFTER this block is built, and `parts[0]` duplicates the whole
209
+ * prompt, so each is charged twice.
210
+ *
211
+ * api-calls preamble ~493 bytes x2 = ~986
212
+ * language directive ~290 bytes x2 = ~580 (BOFF-7107)
213
+ * total ~1,566
214
+ *
215
+ * The old 1,024 covered only the api-calls preamble, so adding the language
216
+ * directive could push a turn that `fitInlineBudget` promised would keep its
217
+ * pixels over the cap — and `buildPromptParts` would then demote the very image
218
+ * the question was about.
219
+ *
220
+ * The GraphQL document and page context remain covered many times over by
221
+ * `TURN_BODY_HEADROOM_BYTES`. Still deliberately tight: every byte here is a
222
+ * byte of document text a farmer does not get.
223
+ */
224
+ export declare const PROMPT_ENVELOPE_RESERVE_BYTES = 2048;
225
+ /**
226
+ * Render the attachment block appended to the outgoing prompt. Returns '' when
227
+ * there is nothing to say, so callers can concatenate unconditionally.
228
+ *
229
+ * `userText` is the user's own message — the rest of the prompt this block will
230
+ * be concatenated with. It is optional only so existing callers and tests keep
231
+ * compiling; passing it is what lets the budget be measured against the real
232
+ * turn rather than against the block alone.
233
+ *
234
+ * Attachments that failed to upload are omitted: the user already sees the
235
+ * failure in the composer, and a half-described file only confuses the model.
236
+ */
237
+ export declare function buildAttachmentPromptBlock(attachments: AssistantAttachment[], userText?: string): string;
238
+ /**
239
+ * Compose the text actually sent to the agent: the user's words, then the
240
+ * attachment block. The user-facing bubble keeps the raw text (attachments are
241
+ * rendered as chips there), matching how `buildPromptForMode` already separates
242
+ * agent-only preamble from displayed content.
243
+ */
244
+ export declare function buildPromptWithAttachments(content: string, attachments: AssistantAttachment[]): string;
245
+ export type { AssistantPromptPart };
246
+ /**
247
+ * How many images may travel INLINE in one turn.
248
+ *
249
+ * Inline bytes are what make vision work without the sandbox needing egress to
250
+ * our storage. Images beyond the budget still travel, by URL only, and the
251
+ * prompt block still describes them.
252
+ */
253
+ export declare const MAX_INLINE_IMAGE_PARTS = 3;
254
+ /**
255
+ * Belt-and-braces per-turn ceiling on base64 characters.
256
+ *
257
+ * Kept as a cheap guard against a pathological single image, but it is NO
258
+ * LONGER the operative limit — `MAX_TURN_BODY_BYTES` is. See below for why the
259
+ * previous 1.5M-character budget was a fiction.
260
+ */
261
+ export declare const MAX_INLINE_IMAGE_BASE64_CHARS = 1500000;
262
+ /**
263
+ * The real ceiling: what the gateway will accept as a request body.
264
+ *
265
+ * `wspace-public-gateway` enforces `MAX_REQUEST_BODY_SIZE`, and both the alpha
266
+ * and prod configs set it to **256kb** (`burdenoff-gitops`
267
+ * `apps/config-workspace{,-prod}/wspace-public-gateway-config.yaml`). It is
268
+ * checked against `Content-Length` before authentication and before anything is
269
+ * forwarded, and it answers 413 with a JSON body — which fe-libs' `graphqlFetch`
270
+ * maps to the generic 4xx sentence, discarding the status. So an oversized turn
271
+ * does not degrade: it dies, and the user is told to refresh.
272
+ *
273
+ * The old budget (1.5M base64 characters ≈ 1.43 MB) was ~5.7x that cap, so a
274
+ * single ordinary 1280px photo — 150-400 KB, i.e. 200-530 KB of base64 — was
275
+ * enough to lose the whole turn. Measure the body instead of guessing at it.
276
+ */
277
+ export declare const MAX_TURN_BODY_BYTES = 262144;
278
+ /**
279
+ * Headroom left for everything `estimateTurnBodyBytes` does not model: the
280
+ * GraphQL query document, the operation name, the sandbox id / path / method,
281
+ * the context input and the page context.
282
+ *
283
+ * Measured, that overhead is under 1 KB — the ProxySandboxRequest document is
284
+ * ~150 bytes and the page context a few hundred. 32 KB is therefore deliberately
285
+ * ~30x the real figure, because the two ways of being wrong are not
286
+ * symmetrical: reserve too much and one photo travels as a link instead of as
287
+ * pixels; reserve too little and the entire turn is rejected and the farmer's
288
+ * question is lost.
289
+ */
290
+ export declare const TURN_BODY_HEADROOM_BYTES = 32768;
291
+ /** What the modelled part of the body must fit inside. */
292
+ export declare const MAX_INLINE_TURN_BODY_BYTES: number;
293
+ /**
294
+ * Encode settings for the copy of an image that travels INSIDE the turn.
295
+ *
296
+ * Separate from the upload encode (1280px / q0.72) on purpose: the file that
297
+ * lands in the farmer's file library should not be degraded to fit a transport
298
+ * limit. At 768px / q0.6 a photo is typically 40-90 KB — 53-120 KB of base64 —
299
+ * so one image fits inside `MAX_INLINE_TURN_BODY_BYTES` with room for the
300
+ * prompt, and often two do. Vision models downsample to roughly this size
301
+ * anyway, so the diagnostic detail that matters survives.
302
+ */
303
+ export declare const INLINE_IMAGE_MAX_DIM = 768;
304
+ export declare const INLINE_IMAGE_QUALITY = 0.6;
305
+ /**
306
+ * Estimate the bytes the prompt + parts will occupy in the POSTed body.
307
+ *
308
+ * Shaped like the JSON fe-libs actually builds (`{ mode, prompt, pageContext,
309
+ * parts }` inside `proxySandboxRequest.body`), so the number tracks the thing
310
+ * being limited rather than a proxy for it. Deliberately an UNDER-estimate of
311
+ * the full request — `TURN_BODY_HEADROOM_BYTES` covers the difference.
312
+ */
313
+ export declare function estimateTurnBodyBytes(promptText: string, parts?: AssistantPromptPart[]): number;
314
+ /**
315
+ * How many attachments COULD have travelled as pixels — i.e. are ready images
316
+ * that have a `data:` URL to inline.
317
+ *
318
+ * Compared against how many actually did, this is what tells the user their
319
+ * photo was demoted to a link. Without it the deterministic budget path is
320
+ * silent, and only the transport-rejection path ever admits to anything.
321
+ */
322
+ export declare function countInlineImageCandidates(attachments: AssistantAttachment[]): number;
323
+ /** How many parts actually carry image bytes. */
324
+ export declare function countInlinedImageParts(parts: AssistantPromptPart[] | undefined): number;
325
+ /** Split a `data:<mime>;base64,<payload>` URL. Returns null for anything else. */
326
+ export declare function parseDataUrl(dataUrl: string): {
327
+ mimeType: string;
328
+ base64: string;
329
+ } | null;
330
+ /**
331
+ * Build the structured multimodal turn.
332
+ *
333
+ * `promptText` MUST be the exact string also sent as `prompt`, so the two
334
+ * channels are equivalent: a bridge that understands `parts` sees everything a
335
+ * text-only bridge sees, plus the images. Returns `undefined` when there is
336
+ * nothing an image/file part could add, which keeps the wire body byte-identical
337
+ * to a pre-multimodal client for every ordinary text turn.
338
+ */
339
+ export declare function buildPromptParts(promptText: string, attachments: AssistantAttachment[]): AssistantPromptPart[] | undefined;
340
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/attachments.ts"],"names":[],"mappings":"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"}