veryfront 0.1.1123 → 0.1.1124
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.
- package/esm/deno.js +1 -1
- package/esm/src/chat/message-prep.d.ts.map +1 -1
- package/esm/src/chat/message-prep.js +3 -6
- package/esm/src/chat/provider-errors.d.ts +3 -10
- package/esm/src/chat/provider-errors.d.ts.map +1 -1
- package/esm/src/chat/provider-errors.js +2 -9
- package/esm/src/embedding/veryfront-cloud/rag-store.d.ts.map +1 -1
- package/esm/src/embedding/veryfront-cloud/rag-store.js +5 -2
- package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts +3 -3
- package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/operations.js +4 -4
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts +4 -15
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.js +6 -110
- package/esm/src/platform/adapters/veryfront-api-transport.d.ts +40 -0
- package/esm/src/platform/adapters/veryfront-api-transport.d.ts.map +1 -0
- package/esm/src/platform/adapters/veryfront-api-transport.js +142 -0
- package/esm/src/provider/runtime-loader/provider-http.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader/provider-http.js +5 -1
- package/esm/src/react/components/ui/anchored-surface.d.ts +44 -0
- package/esm/src/react/components/ui/anchored-surface.d.ts.map +1 -0
- package/esm/src/react/components/ui/anchored-surface.js +58 -0
- package/esm/src/react/components/ui/collapsible.d.ts.map +1 -1
- package/esm/src/react/components/ui/collapsible.js +3 -9
- package/esm/src/react/components/ui/dialog.d.ts +4 -7
- package/esm/src/react/components/ui/dialog.d.ts.map +1 -1
- package/esm/src/react/components/ui/dialog.js +13 -59
- package/esm/src/react/components/ui/disclosure.d.ts +12 -0
- package/esm/src/react/components/ui/disclosure.d.ts.map +1 -0
- package/esm/src/react/components/ui/disclosure.js +22 -0
- package/esm/src/react/components/ui/drawer.d.ts +5 -7
- package/esm/src/react/components/ui/drawer.d.ts.map +1 -1
- package/esm/src/react/components/ui/drawer.js +13 -57
- package/esm/src/react/components/ui/dropdown-menu.d.ts +4 -7
- package/esm/src/react/components/ui/dropdown-menu.d.ts.map +1 -1
- package/esm/src/react/components/ui/dropdown-menu.js +12 -31
- package/esm/src/react/components/ui/modal-surface.d.ts +43 -0
- package/esm/src/react/components/ui/modal-surface.d.ts.map +1 -0
- package/esm/src/react/components/ui/modal-surface.js +83 -0
- package/esm/src/react/components/ui/popover.d.ts +4 -7
- package/esm/src/react/components/ui/popover.d.ts.map +1 -1
- package/esm/src/react/components/ui/popover.js +11 -31
- package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/framework-candidates.generated.js +175 -49
- package/esm/src/utils/index.d.ts +1 -0
- package/esm/src/utils/index.d.ts.map +1 -1
- package/esm/src/utils/index.js +1 -0
- package/esm/src/utils/json.d.ts +19 -0
- package/esm/src/utils/json.d.ts.map +1 -0
- package/esm/src/utils/json.js +17 -0
- package/esm/src/utils/logger/redact.d.ts.map +1 -1
- package/esm/src/utils/logger/redact.js +7 -3
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/backends/redis/index.d.ts.map +1 -1
- package/esm/src/workflow/backends/redis/index.js +6 -7
- package/package.json +5 -5
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-prep.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AASjC,OAAO,EAKL,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAE1B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-prep.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { convertUiMessagesToProviderModelMessages, copyProviderModelMessageSourceId, getStringField, isReasoningPart, isToolCallPart, isToolResultPart, } from "./conversation.js";
|
|
2
2
|
import { buildDataFileAnnotation, normalizeInlineAttachmentMediaType, } from "./types.js";
|
|
3
3
|
import { historicalToolSummaries } from "../integrations/_tool_summaries.js";
|
|
4
|
+
import { safeJsonParse } from "../utils/json.js";
|
|
4
5
|
/** Default limits for chat history preparation. */
|
|
5
6
|
export const DEFAULT_MESSAGE_PREP_LIMITS = {
|
|
6
7
|
charsPerToken: 4,
|
|
@@ -300,12 +301,8 @@ function stableHash(value) {
|
|
|
300
301
|
function tryParseJson(value) {
|
|
301
302
|
if (typeof value !== "string")
|
|
302
303
|
return value;
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
306
|
-
catch {
|
|
307
|
-
return value;
|
|
308
|
-
}
|
|
304
|
+
const r = safeJsonParse(value);
|
|
305
|
+
return r.ok ? r.value : value;
|
|
309
306
|
}
|
|
310
307
|
function isRecord(value) {
|
|
311
308
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1,19 +1,12 @@
|
|
|
1
|
+
import { safeJsonParse } from "../utils/json.js";
|
|
2
|
+
export { safeJsonParse };
|
|
3
|
+
export type { SafeJsonParseResult } from "../utils/json.js";
|
|
1
4
|
/** Error shape for parsed provider. */
|
|
2
5
|
export interface ParsedProviderError {
|
|
3
6
|
code: string;
|
|
4
7
|
message: string;
|
|
5
8
|
status?: number;
|
|
6
9
|
}
|
|
7
|
-
/** Result returned from safe JSON parse. */
|
|
8
|
-
export type SafeJsonParseResult = {
|
|
9
|
-
ok: true;
|
|
10
|
-
value: unknown;
|
|
11
|
-
} | {
|
|
12
|
-
ok: false;
|
|
13
|
-
error: Error;
|
|
14
|
-
};
|
|
15
|
-
/** Parse JSON safely without throwing. */
|
|
16
|
-
export declare function safeJsonParse(value: string): SafeJsonParseResult;
|
|
17
10
|
/** Parses known problem body. */
|
|
18
11
|
export declare function parseKnownProblemBody(body: unknown): ParsedProviderError | null;
|
|
19
12
|
/** Returns true when the normalizedMessage indicates a credit or spend limit error. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-errors.d.ts","sourceRoot":"","sources":["../../../src/src/chat/provider-errors.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"provider-errors.d.ts","sourceRoot":"","sources":["../../../src/src/chat/provider-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAmDD,iCAAiC;AACjC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CA+B/E;AAcD,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAOvE;AAsID,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAEtE"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { safeJsonParse } from "../utils/json.js";
|
|
2
|
+
export { safeJsonParse };
|
|
1
3
|
const DEFAULT_EXTERNAL_SERVICE_ERROR = {
|
|
2
4
|
code: "EXTERNAL_SERVICE_ERROR",
|
|
3
5
|
message: "LLM provider service error",
|
|
@@ -23,15 +25,6 @@ const AI_PROVIDER_BILLING_ERROR = {
|
|
|
23
25
|
function isErrorRecord(value) {
|
|
24
26
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
27
|
}
|
|
26
|
-
/** Parse JSON safely without throwing. */
|
|
27
|
-
export function safeJsonParse(value) {
|
|
28
|
-
try {
|
|
29
|
-
return { ok: true, value: JSON.parse(value) };
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
return { ok: false, error: error instanceof Error ? error : new Error(String(error)) };
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
28
|
function parseErrorJson(value) {
|
|
36
29
|
const parsed = safeJsonParse(value);
|
|
37
30
|
return parsed.ok ? parsed.value : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag-store.d.ts","sourceRoot":"","sources":["../../../../src/src/embedding/veryfront-cloud/rag-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAKV,QAAQ,EACR,cAAc,EACf,MAAM,aAAa,CAAC;AA4ErB,KAAK,2BAA2B,GAAG,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"rag-store.d.ts","sourceRoot":"","sources":["../../../../src/src/embedding/veryfront-cloud/rag-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAKV,QAAQ,EACR,cAAc,EACf,MAAM,aAAa,CAAC;AA4ErB,KAAK,2BAA2B,GAAG,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAklBtE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,2BAA2B,GAAG,QAAQ,CAuI1F"}
|
|
@@ -52,12 +52,15 @@ function normalizeEmbeddingModelDescriptor(model, dimension) {
|
|
|
52
52
|
dimension,
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
+
function normalizeExtension(type) {
|
|
56
|
+
return type?.trim().toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
57
|
+
}
|
|
55
58
|
function buildDocumentFilePath(documentId, type) {
|
|
56
|
-
const extension = type
|
|
59
|
+
const extension = normalizeExtension(type);
|
|
57
60
|
return `${DOCUMENTS_DIR}/${documentId}.${extension || "txt"}`;
|
|
58
61
|
}
|
|
59
62
|
function buildRefreshDocumentFilePath(documentId, type) {
|
|
60
|
-
const extension = type
|
|
63
|
+
const extension = normalizeExtension(type);
|
|
61
64
|
return `${DOCUMENTS_DIR}/${documentId}.refresh-${dntShim.crypto.randomUUID()}.${extension || "txt"}`;
|
|
62
65
|
}
|
|
63
66
|
function isRecord(value) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type TransportRetryConfig } from "../veryfront-api-transport.js";
|
|
2
2
|
import { type LookupDomainResponse, type PageInfo, type Project, type ProjectFile, type ReleaseAssetManifestApiResponse, type ReleaseAssetManifestBuildResponse, type ReleaseAssetManifestStateResponse, type ReleaseAssetUploadResponse } from "./schemas/index.js";
|
|
3
3
|
export type TokenProvider = () => string;
|
|
4
4
|
export interface ListFilesOptions {
|
|
@@ -63,10 +63,10 @@ export interface ProjectStyleArtifactResolution {
|
|
|
63
63
|
}
|
|
64
64
|
export declare class VeryfrontAPIOperations {
|
|
65
65
|
private apiBaseUrl;
|
|
66
|
-
private retryConfig;
|
|
67
66
|
private projectId?;
|
|
68
67
|
private tokenProvider;
|
|
69
|
-
|
|
68
|
+
private transport;
|
|
69
|
+
constructor(apiBaseUrl: string, tokenOrProvider: string | TokenProvider, retryConfig: TransportRetryConfig, projectId?: string | undefined);
|
|
70
70
|
setTokenProvider(provider: TokenProvider): void;
|
|
71
71
|
getToken(): string;
|
|
72
72
|
setProjectId(projectId: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/operations.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logger as baseLogger } from "../../../utils/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { createCanonicalVeryfrontApiTransport, } from "../veryfront-api-transport.js";
|
|
3
3
|
import { API_CLIENT_ERROR, VeryfrontError } from "./types.js";
|
|
4
4
|
import { getBranchFileDetailSchema, getEnvironmentFileDetailSchema, getListBranchFilesResponseSchema, getListEnvironmentFilesResponseSchema, getListProjectsResponseSchema, getListReleaseFilesResponseSchema, getProjectSchema, getProjectWithEnvironmentsSchema, getReleaseAssetManifestBuildResponseSchema, getReleaseAssetManifestResponseSchema, getReleaseAssetManifestStateResponseSchema, getReleaseAssetUploadResponseSchema, getReleaseFileDetailSchema, getStyleArtifactResolveResponseSchema, } from "./schemas/index.js";
|
|
5
5
|
import { withSpan } from "../../../observability/tracing/otlp-setup.js";
|
|
@@ -73,16 +73,16 @@ async function listAllFiles(list) {
|
|
|
73
73
|
}
|
|
74
74
|
export class VeryfrontAPIOperations {
|
|
75
75
|
apiBaseUrl;
|
|
76
|
-
retryConfig;
|
|
77
76
|
projectId;
|
|
78
77
|
tokenProvider;
|
|
78
|
+
transport;
|
|
79
79
|
constructor(apiBaseUrl, tokenOrProvider, retryConfig, projectId) {
|
|
80
80
|
this.apiBaseUrl = apiBaseUrl;
|
|
81
|
-
this.retryConfig = retryConfig;
|
|
82
81
|
this.projectId = projectId;
|
|
83
82
|
this.tokenProvider = typeof tokenOrProvider === "string"
|
|
84
83
|
? () => tokenOrProvider
|
|
85
84
|
: tokenOrProvider;
|
|
85
|
+
this.transport = createCanonicalVeryfrontApiTransport(apiBaseUrl, () => this.tokenProvider(), retryConfig);
|
|
86
86
|
}
|
|
87
87
|
setTokenProvider(provider) {
|
|
88
88
|
this.tokenProvider = provider;
|
|
@@ -414,6 +414,6 @@ export class VeryfrontAPIOperations {
|
|
|
414
414
|
return getReleaseAssetManifestResponseSchema().parse(raw);
|
|
415
415
|
}
|
|
416
416
|
request(endpoint, options = {}) {
|
|
417
|
-
return withSpan(SpanNames.API_REQUEST, () =>
|
|
417
|
+
return withSpan(SpanNames.API_REQUEST, () => this.transport.request(`${this.apiBaseUrl}${endpoint}`, options), { "api.endpoint": endpoint, "api.base_url": this.apiBaseUrl });
|
|
418
418
|
}
|
|
419
419
|
}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
export interface RequestOptions {
|
|
7
|
-
returnText?: boolean;
|
|
8
|
-
/** Request timeout in milliseconds. Defaults to 30000ms (30 seconds). */
|
|
9
|
-
timeoutMs?: number;
|
|
10
|
-
method?: string;
|
|
11
|
-
body?: BodyInit | null;
|
|
12
|
-
headers?: HeadersInit;
|
|
13
|
-
/** Demote an expected 404 miss to debug while preserving thrown error semantics. */
|
|
14
|
-
expected404?: boolean;
|
|
15
|
-
}
|
|
1
|
+
import { type TransportRequestInit, type TransportRetryConfig } from "../veryfront-api-transport.js";
|
|
2
|
+
export type RetryConfig = TransportRetryConfig;
|
|
3
|
+
export type RequestOptions = TransportRequestInit;
|
|
4
|
+
/** Backward-compat alias; prefer holding a transport instance directly. */
|
|
16
5
|
export declare function requestWithRetry(url: string, apiToken: string, retryConfig: RetryConfig, options?: RequestOptions): Promise<unknown>;
|
|
17
6
|
//# sourceMappingURL=retry-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/retry-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/retry-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAC/C,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAIlB"}
|
|
@@ -1,111 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const apiLog = logger.component("api");
|
|
8
|
-
const veryfrontApiClientLog = logger.component("veryfront-api-client");
|
|
9
|
-
/** Default timeout for API requests (30 seconds) */
|
|
10
|
-
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
11
|
-
function logTimedOut(url, timeoutMs, attempt) {
|
|
12
|
-
veryfrontApiClientLog.warn("Request timed out", {
|
|
13
|
-
url: url.replace(/token=[^&]+/, "token=***"),
|
|
14
|
-
timeoutMs,
|
|
15
|
-
attempt: attempt + 1,
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
export async function requestWithRetry(url, apiToken, retryConfig, options = {}) {
|
|
19
|
-
const urlObj = new URL(url);
|
|
20
|
-
const urlPath = urlObj.pathname;
|
|
21
|
-
const { maxRetries, initialDelay, maxDelay } = retryConfig;
|
|
22
|
-
const timeoutMs = options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
23
|
-
// Note: We only trace the individual fetch attempts (HTTP_CLIENT_FETCH),
|
|
24
|
-
// not the outer retry wrapper, to reduce span nesting and trace size.
|
|
25
|
-
const result = await retryWithBackoff((signal, attempt) => {
|
|
26
|
-
return withSpan(SpanNames.HTTP_CLIENT_FETCH, async () => {
|
|
27
|
-
const startTime = performance.now();
|
|
28
|
-
const headers = new Headers(options.headers);
|
|
29
|
-
headers.set("Authorization", `Bearer ${apiToken}`);
|
|
30
|
-
if (!headers.has("Content-Type")) {
|
|
31
|
-
headers.set("Content-Type", "application/json");
|
|
32
|
-
}
|
|
33
|
-
injectContext(headers);
|
|
34
|
-
const response = await fetch(url, {
|
|
35
|
-
method: options.method ?? "GET",
|
|
36
|
-
headers,
|
|
37
|
-
body: options.body,
|
|
38
|
-
signal,
|
|
39
|
-
});
|
|
40
|
-
const duration = performance.now() - startTime;
|
|
41
|
-
recordApiRequest(response.status);
|
|
42
|
-
apiLog.debug("Request completed", {
|
|
43
|
-
path: urlPath,
|
|
44
|
-
status: response.status,
|
|
45
|
-
durationMs: Math.round(duration),
|
|
46
|
-
});
|
|
47
|
-
if (!response.ok) {
|
|
48
|
-
const text = await response.text();
|
|
49
|
-
// Optional probes (for example stylesheet candidates) may expect a 404.
|
|
50
|
-
// Keep only explicit opt-ins below warn while preserving thrown error semantics.
|
|
51
|
-
const isExpected404 = options.expected404 === true && response.status === 404;
|
|
52
|
-
// 4xx = client errors (expected, e.g. 404 for missing deno.json) → warn
|
|
53
|
-
// 5xx = server errors (unexpected) → error
|
|
54
|
-
const logLevel = isExpected404 ? "debug" : response.status >= 500 ? "error" : "warn";
|
|
55
|
-
veryfrontApiClientLog[logLevel]("Request failed", {
|
|
56
|
-
url: url.replace(/token=[^&]+/, "token=***"),
|
|
57
|
-
status: response.status,
|
|
58
|
-
statusText: response.statusText,
|
|
59
|
-
responseText: text.slice(0, 500),
|
|
60
|
-
});
|
|
61
|
-
throw API_CLIENT_ERROR.create({
|
|
62
|
-
detail: `API request failed: ${response.status} ${response.statusText}`,
|
|
63
|
-
status: response.status,
|
|
64
|
-
context: { details: { url, responseText: text } },
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
const data = options.returnText ? await response.text() : await response.json();
|
|
68
|
-
return { data, status: response.status, duration };
|
|
69
|
-
}, {
|
|
70
|
-
"http.method": options.method ?? "GET",
|
|
71
|
-
"http.url": url,
|
|
72
|
-
"http.target": urlPath,
|
|
73
|
-
"http.host": urlObj.host,
|
|
74
|
-
"http.scheme": urlObj.protocol.replace(":", ""),
|
|
75
|
-
"http.retry_attempt": attempt,
|
|
76
|
-
});
|
|
77
|
-
}, {
|
|
78
|
-
maxAttempts: maxRetries + 1,
|
|
79
|
-
initialDelay,
|
|
80
|
-
maxDelay,
|
|
81
|
-
timeoutMs,
|
|
82
|
-
shouldRetry: (error) => {
|
|
83
|
-
if (!(error instanceof VeryfrontError) || error.slug !== "api-client-error")
|
|
84
|
-
return true;
|
|
85
|
-
const status = error.status;
|
|
86
|
-
return !status || status < 400 || status >= 500 || status === 429;
|
|
87
|
-
},
|
|
88
|
-
onRetry: ({ error, attempt, delay, isTimeout }) => {
|
|
89
|
-
if (isTimeout)
|
|
90
|
-
logTimedOut(url, timeoutMs, attempt);
|
|
91
|
-
recordApiRetry();
|
|
92
|
-
veryfrontApiClientLog.warn("Request failed, retrying...", {
|
|
93
|
-
attempt: attempt + 1,
|
|
94
|
-
maxRetries,
|
|
95
|
-
delay,
|
|
96
|
-
error: error.message,
|
|
97
|
-
timeout: isTimeout,
|
|
98
|
-
});
|
|
99
|
-
},
|
|
100
|
-
wrapFinalError: (lastError, lastAttempt) => {
|
|
101
|
-
if (lastError.name === "AbortError")
|
|
102
|
-
logTimedOut(url, timeoutMs, lastAttempt);
|
|
103
|
-
return API_CLIENT_ERROR.create({
|
|
104
|
-
detail: `API request failed after ${maxRetries} retries: ${lastError.message}`,
|
|
105
|
-
cause: lastError,
|
|
106
|
-
context: { details: { originalError: lastError } },
|
|
107
|
-
});
|
|
108
|
-
},
|
|
109
|
-
});
|
|
110
|
-
return result.data;
|
|
1
|
+
import { createCanonicalVeryfrontApiTransport, } from "../veryfront-api-transport.js";
|
|
2
|
+
/** Backward-compat alias; prefer holding a transport instance directly. */
|
|
3
|
+
export function requestWithRetry(url, apiToken, retryConfig, options = {}) {
|
|
4
|
+
const { origin } = new URL(url);
|
|
5
|
+
return createCanonicalVeryfrontApiTransport(origin, () => apiToken, retryConfig)
|
|
6
|
+
.request(url, options);
|
|
111
7
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface TransportRetryConfig {
|
|
2
|
+
maxRetries: number;
|
|
3
|
+
initialDelay: number;
|
|
4
|
+
maxDelay: number;
|
|
5
|
+
}
|
|
6
|
+
export interface TransportRequestInit {
|
|
7
|
+
method?: string;
|
|
8
|
+
headers?: HeadersInit;
|
|
9
|
+
body?: BodyInit | null;
|
|
10
|
+
returnText?: boolean;
|
|
11
|
+
expected404?: boolean;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface VeryfrontApiTransportConfig<T> {
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
getToken: () => string;
|
|
17
|
+
retry: TransportRetryConfig;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
defaultHeaders?: Record<string, string>;
|
|
20
|
+
onResponse?: (response: Response, init: TransportRequestInit, url: string) => Promise<T>;
|
|
21
|
+
afterFetch?: (status: number, durationMs: number) => void;
|
|
22
|
+
shouldRetry?: (error: unknown, attempt: number) => boolean;
|
|
23
|
+
onRetry?: (info: {
|
|
24
|
+
error: Error;
|
|
25
|
+
attempt: number;
|
|
26
|
+
delay: number;
|
|
27
|
+
isTimeout: boolean;
|
|
28
|
+
url: string;
|
|
29
|
+
timeoutMs: number;
|
|
30
|
+
}) => void;
|
|
31
|
+
wrapFinalError?: (lastError: Error, lastAttempt: number) => Error;
|
|
32
|
+
wrapFetch?: (fn: () => Promise<T>, url: string, method: string, attempt: number) => Promise<T>;
|
|
33
|
+
}
|
|
34
|
+
export interface VeryfrontApiTransport<T> {
|
|
35
|
+
request(pathOrUrl: string, init?: TransportRequestInit): Promise<T>;
|
|
36
|
+
}
|
|
37
|
+
export declare function createVeryfrontApiTransport<T>(config: VeryfrontApiTransportConfig<T>): VeryfrontApiTransport<T>;
|
|
38
|
+
/** Canonical transport: span tracing, request metrics, API_CLIENT_ERROR mapping. */
|
|
39
|
+
export declare function createCanonicalVeryfrontApiTransport(baseUrl: string, getToken: () => string, retry: TransportRetryConfig): VeryfrontApiTransport<unknown>;
|
|
40
|
+
//# sourceMappingURL=veryfront-api-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"veryfront-api-transport.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/adapters/veryfront-api-transport.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B,CAAC,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACzF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QACf,KAAK,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;KACnB,KAAK,IAAI,CAAC;IACX,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC;IAClE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACrE;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACrC,qBAAqB,CAAC,CAAC,CAAC,CAwE1B;AAED,oFAAoF;AACpF,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,MAAM,EACtB,KAAK,EAAE,oBAAoB,GAC1B,qBAAqB,CAAC,OAAO,CAAC,CAgChC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { retryWithBackoff } from "../../errors/error-handlers.js";
|
|
2
|
+
import { API_CLIENT_ERROR } from "../../errors/error-registry.js";
|
|
3
|
+
import { VeryfrontError } from "../../errors/types.js";
|
|
4
|
+
import { injectContext, withSpan } from "../../observability/tracing/otlp-setup.js";
|
|
5
|
+
import { SpanNames } from "../../observability/tracing/span-names.js";
|
|
6
|
+
import { recordApiRequest, recordApiRetry, } from "../../observability/simple-metrics/metrics-recorder.js";
|
|
7
|
+
import { serverLogger } from "../../utils/logger/logger.js";
|
|
8
|
+
const log = serverLogger.component("veryfront-api-transport");
|
|
9
|
+
const apiClientLog = serverLogger.component("veryfront-api-client");
|
|
10
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
11
|
+
export function createVeryfrontApiTransport(config) {
|
|
12
|
+
const { baseUrl, getToken, retry: { maxRetries, initialDelay, maxDelay }, timeoutMs: cfgTimeout = DEFAULT_TIMEOUT_MS, defaultHeaders = {}, afterFetch, wrapFetch, } = config;
|
|
13
|
+
const onResponse = config.onResponse ??
|
|
14
|
+
defaultOnResponse;
|
|
15
|
+
const shouldRetry = config.shouldRetry ?? defaultShouldRetry;
|
|
16
|
+
const wrapFinalError = config.wrapFinalError ??
|
|
17
|
+
((err) => API_CLIENT_ERROR.create({
|
|
18
|
+
detail: `API request failed after ${maxRetries} retries: ${err.message}`,
|
|
19
|
+
cause: err,
|
|
20
|
+
context: { details: { originalError: err } },
|
|
21
|
+
}));
|
|
22
|
+
return {
|
|
23
|
+
request(pathOrUrl, init = {}) {
|
|
24
|
+
const url = pathOrUrl.startsWith("http") ? pathOrUrl : `${baseUrl}${pathOrUrl}`;
|
|
25
|
+
const method = init.method ?? "GET";
|
|
26
|
+
const timeoutMs = init.timeoutMs ?? cfgTimeout;
|
|
27
|
+
// Capture the token once per request: retries of this request must not
|
|
28
|
+
// pick up mid-flight token mutations (setRequestToken/clearRequestToken),
|
|
29
|
+
// matching the pre-transport requestWithRetry semantics.
|
|
30
|
+
const token = getToken();
|
|
31
|
+
return retryWithBackoff((signal, attempt) => {
|
|
32
|
+
const doFetch = async () => {
|
|
33
|
+
const headers = new Headers(init.headers);
|
|
34
|
+
for (const [k, v] of Object.entries(defaultHeaders)) {
|
|
35
|
+
if (!headers.has(k))
|
|
36
|
+
headers.set(k, v);
|
|
37
|
+
}
|
|
38
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
39
|
+
injectContext(headers);
|
|
40
|
+
const start = performance.now();
|
|
41
|
+
const res = await fetch(url, { method, headers, body: init.body, signal });
|
|
42
|
+
afterFetch?.(res.status, performance.now() - start);
|
|
43
|
+
return onResponse(res, init, url);
|
|
44
|
+
};
|
|
45
|
+
return wrapFetch ? wrapFetch(doFetch, url, method, attempt) : doFetch();
|
|
46
|
+
}, {
|
|
47
|
+
maxAttempts: maxRetries + 1,
|
|
48
|
+
initialDelay,
|
|
49
|
+
maxDelay,
|
|
50
|
+
timeoutMs,
|
|
51
|
+
shouldRetry,
|
|
52
|
+
onRetry: config.onRetry
|
|
53
|
+
? ({ error, attempt, delay, isTimeout }) => config.onRetry({ error, attempt, delay, isTimeout, url, timeoutMs })
|
|
54
|
+
: ({ error, attempt, delay, isTimeout }) => {
|
|
55
|
+
if (isTimeout)
|
|
56
|
+
logTimeout(url, timeoutMs, attempt);
|
|
57
|
+
log.warn("Request failed, retrying...", {
|
|
58
|
+
attempt: attempt + 1,
|
|
59
|
+
maxRetries,
|
|
60
|
+
delay,
|
|
61
|
+
error: error.message,
|
|
62
|
+
timeout: isTimeout,
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
wrapFinalError(lastError, lastAttempt) {
|
|
66
|
+
if (lastError.name === "AbortError")
|
|
67
|
+
logTimeout(url, timeoutMs, lastAttempt);
|
|
68
|
+
return wrapFinalError(lastError, lastAttempt);
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Canonical transport: span tracing, request metrics, API_CLIENT_ERROR mapping. */
|
|
75
|
+
export function createCanonicalVeryfrontApiTransport(baseUrl, getToken, retry) {
|
|
76
|
+
return createVeryfrontApiTransport({
|
|
77
|
+
baseUrl,
|
|
78
|
+
getToken,
|
|
79
|
+
retry,
|
|
80
|
+
defaultHeaders: { "Content-Type": "application/json" },
|
|
81
|
+
afterFetch(status) {
|
|
82
|
+
recordApiRequest(status);
|
|
83
|
+
},
|
|
84
|
+
onRetry({ error, attempt, delay, isTimeout, url, timeoutMs }) {
|
|
85
|
+
if (isTimeout)
|
|
86
|
+
logTimeout(url, timeoutMs, attempt);
|
|
87
|
+
recordApiRetry();
|
|
88
|
+
apiClientLog.warn("Request failed, retrying...", {
|
|
89
|
+
attempt: attempt + 1,
|
|
90
|
+
maxRetries: retry.maxRetries,
|
|
91
|
+
delay,
|
|
92
|
+
error: error.message,
|
|
93
|
+
timeout: isTimeout,
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
wrapFetch(fn, url, method, attempt) {
|
|
97
|
+
const { pathname, host, protocol } = new URL(url);
|
|
98
|
+
return withSpan(SpanNames.HTTP_CLIENT_FETCH, fn, {
|
|
99
|
+
"http.method": method,
|
|
100
|
+
"http.url": url,
|
|
101
|
+
"http.target": pathname,
|
|
102
|
+
"http.host": host,
|
|
103
|
+
"http.scheme": protocol.replace(":", ""),
|
|
104
|
+
"http.retry_attempt": attempt,
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function logTimeout(url, timeoutMs, attempt) {
|
|
110
|
+
log.warn("Request timed out", {
|
|
111
|
+
url: url.replace(/token=[^&]+/, "token=***"),
|
|
112
|
+
timeoutMs,
|
|
113
|
+
attempt: attempt + 1,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async function defaultOnResponse(response, init, url) {
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const text = await response.text();
|
|
119
|
+
const isExpected404 = init.expected404 === true && response.status === 404;
|
|
120
|
+
const level = isExpected404 ? "debug" : response.status >= 500 ? "error" : "warn";
|
|
121
|
+
const redactedUrl = url.replace(/token=[^&]+/g, "token=***");
|
|
122
|
+
apiClientLog[level]("Request failed", {
|
|
123
|
+
url: redactedUrl,
|
|
124
|
+
status: response.status,
|
|
125
|
+
statusText: response.statusText,
|
|
126
|
+
responseText: text.slice(0, 500),
|
|
127
|
+
});
|
|
128
|
+
throw API_CLIENT_ERROR.create({
|
|
129
|
+
detail: `API request failed: ${response.status} ${response.statusText}`,
|
|
130
|
+
status: response.status,
|
|
131
|
+
// Redacted so error telemetry cannot leak token query params.
|
|
132
|
+
context: { details: { url: redactedUrl, responseText: text } },
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return init.returnText ? response.text() : response.json();
|
|
136
|
+
}
|
|
137
|
+
function defaultShouldRetry(error) {
|
|
138
|
+
if (!(error instanceof VeryfrontError) || error.slug !== "api-client-error")
|
|
139
|
+
return true;
|
|
140
|
+
const { status } = error;
|
|
141
|
+
return !status || status < 400 || status >= 500 || status === 429;
|
|
142
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-http.d.ts","sourceRoot":"","sources":["../../../../src/src/provider/runtime-loader/provider-http.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAKxF;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,SAAiB,YAAY,CAAC,EAAE,MAAM,CAAC;gBAE3B,OAAO,EAAE;QACnB,QAAQ,EAAE,YAAY,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CAUF;AAED,4EAA4E;AAC5E,qBAAa,uBAAwB,SAAQ,aAAa;CAAG;AAE7D,mFAAmF;AACnF,qBAAa,sBAAuB,SAAQ,aAAa;CAAG;AAE5D,2DAA2D;AAC3D,qBAAa,kBAAmB,SAAQ,aAAa;CAAG;AAExD,6DAA6D;AAC7D,qBAAa,oBAAqB,SAAQ,aAAa;CAAG;AAe1D,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAY3E;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"provider-http.d.ts","sourceRoot":"","sources":["../../../../src/src/provider/runtime-loader/provider-http.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAKxF;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,SAAiB,YAAY,CAAC,EAAE,MAAM,CAAC;gBAE3B,OAAO,EAAE;QACnB,QAAQ,EAAE,YAAY,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CAUF;AAED,4EAA4E;AAC5E,qBAAa,uBAAwB,SAAQ,aAAa;CAAG;AAE7D,mFAAmF;AACnF,qBAAa,sBAAuB,SAAQ,aAAa;CAAG;AAE5D,2DAA2D;AAC3D,qBAAa,kBAAmB,SAAQ,aAAa;CAAG;AAExD,6DAA6D;AAC7D,qBAAa,oBAAqB,SAAQ,aAAa;CAAG;AAe1D,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAY3E;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,CAqJxB;AAED,yCAAyC;AACzC,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACnC,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,CAAC,CASnB;AAED,oCAAoC;AACpC,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACnC,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;CAC5B,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAkBtC"}
|
|
@@ -193,7 +193,11 @@ export async function buildProviderError(provider, response) {
|
|
|
193
193
|
errorType === "invalid_request_error" &&
|
|
194
194
|
parsedBody !== undefined &&
|
|
195
195
|
!truncated;
|
|
196
|
-
|
|
196
|
+
const problemSlug = typeof parsedBody?.slug === "string" ? parsedBody.slug : undefined;
|
|
197
|
+
const isStructuredVeryfrontCreditProblem = status === 402 &&
|
|
198
|
+
(problemSlug === "insufficient-credits" || problemSlug === "resource-limit-exceeded") &&
|
|
199
|
+
!truncated;
|
|
200
|
+
return isStructuredInvalidRequest || isStructuredVeryfrontCreditProblem
|
|
197
201
|
? preserveStructuredResponseBody(requestError, rawBody)
|
|
198
202
|
: requestError;
|
|
199
203
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared behavioral machinery for Popover and DropdownMenu.
|
|
3
|
+
* TODO(a11y): focus trap, portal + collision-aware positioning (flip/shift),
|
|
4
|
+
* aria-controls, side/align offsets.
|
|
5
|
+
* DropdownMenu: roving focus, typeahead, Tab, aria-activedescendant, sub menus.
|
|
6
|
+
* @module react/components/ui/anchored-surface
|
|
7
|
+
*/
|
|
8
|
+
import * as React from "react";
|
|
9
|
+
import { type DisclosureOptions } from "./disclosure.js";
|
|
10
|
+
/** Context value shared between an anchored skin's Root and its parts. */
|
|
11
|
+
export interface AnchoredState {
|
|
12
|
+
open: boolean;
|
|
13
|
+
setOpen: (open: boolean) => void;
|
|
14
|
+
anchorRef: React.RefObject<HTMLElement | null>;
|
|
15
|
+
}
|
|
16
|
+
/** Props for `AnchoredTrigger` (returned by the factory). */
|
|
17
|
+
export interface AnchoredTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
18
|
+
asChild?: boolean;
|
|
19
|
+
/** `aria-haspopup` value -- `"dialog"` for Popover, `"menu"` for DropdownMenu. */
|
|
20
|
+
haspopup: NonNullable<React.AriaAttributes["aria-haspopup"]>;
|
|
21
|
+
}
|
|
22
|
+
/** Props for `AnchoredContent` (returned by the factory). */
|
|
23
|
+
export interface AnchoredContentProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
24
|
+
align?: "start" | "end";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates a fresh context instance plus the AnchoredRoot, AnchoredTrigger, and
|
|
28
|
+
* AnchoredContent parts -- all bound to that context.
|
|
29
|
+
*
|
|
30
|
+
* Each skin (Popover, DropdownMenu) calls this ONCE at module scope so their
|
|
31
|
+
* contexts are distinct objects. This prevents cross-binding when one skin is
|
|
32
|
+
* nested inside the other or inside a modal skin: a DropdownMenuItem close
|
|
33
|
+
* call only affects the DropdownMenu whose context is in scope, never a
|
|
34
|
+
* Popover above it in the tree.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createAnchoredSurfaceParts(): {
|
|
37
|
+
Context: any;
|
|
38
|
+
AnchoredRoot: ({ children, open, defaultOpen, onOpenChange }: DisclosureOptions & {
|
|
39
|
+
children: React.ReactNode;
|
|
40
|
+
}) => React.ReactElement;
|
|
41
|
+
AnchoredTrigger: ({ children, asChild, onClick, haspopup, ...props }: AnchoredTriggerProps) => React.ReactElement;
|
|
42
|
+
AnchoredContent: ({ children, className, align, ...props }: AnchoredContentProps) => React.ReactElement | null;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=anchored-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchored-surface.d.ts","sourceRoot":"","sources":["../../../../../src/src/react/components/ui/anchored-surface.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAqB,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;CAC9D;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAqB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAChF,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B;;kEAQS,iBAAiB,GAAG;QACjE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;KAC3B,KACA,KAAK,CAAC,YAAY;0EAkBiC,oBAAoB,KACvE,KAAK,CAAC,YAAY;gEAsBuB,oBAAoB,KAC7D,KAAK,CAAC,YAAY,GAAG,IAAI;EAqB7B"}
|