@burdenoff/fe-libs 2026.713.4 → 2026.713.6
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/dist/chrome/ProductPickerSheet.d.ts.map +1 -1
- package/dist/chrome/ProductSwitcher.d.ts.map +1 -1
- package/dist/chrome/notificationCenter/NotificationList.d.ts.map +1 -1
- package/dist/shared/assistant/api.d.ts +34 -0
- package/dist/shared/assistant/api.d.ts.map +1 -0
- package/dist/shared/assistant/api.js +226 -0
- package/dist/shared/assistant/capabilities.d.ts +21 -0
- package/dist/shared/assistant/capabilities.d.ts.map +1 -0
- package/dist/shared/assistant/capabilities.js +21 -0
- package/dist/shared/assistant/createSandboxAssistantTransport.d.ts +7 -0
- package/dist/shared/assistant/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/shared/assistant/createSandboxAssistantTransport.js +91 -0
- package/dist/shared/assistant/gatewayClient.d.ts +11 -0
- package/dist/shared/assistant/gatewayClient.d.ts.map +1 -0
- package/dist/shared/assistant/gatewayClient.js +56 -0
- package/dist/shared/assistant/images.d.ts +16 -0
- package/dist/shared/assistant/images.d.ts.map +1 -0
- package/dist/shared/assistant/images.js +34 -0
- package/dist/shared/assistant/index.d.ts +14 -0
- package/dist/shared/assistant/index.d.ts.map +1 -0
- package/dist/shared/assistant/operations.d.ts +19 -0
- package/dist/shared/assistant/operations.d.ts.map +1 -0
- package/dist/shared/assistant/operations.js +4 -0
- package/dist/shared/assistant/progress.d.ts +26 -0
- package/dist/shared/assistant/progress.d.ts.map +1 -0
- package/dist/shared/assistant/progress.js +74 -0
- package/dist/shared/assistant/runtime.d.ts +34 -0
- package/dist/shared/assistant/runtime.d.ts.map +1 -0
- package/dist/shared/assistant/runtime.js +91 -0
- package/dist/shared/assistant/types.d.ts +114 -0
- package/dist/shared/assistant/types.d.ts.map +1 -0
- package/dist/shared/assistant/useSandboxAssistantTransport.d.ts +3 -0
- package/dist/shared/assistant/useSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/shared/assistant/useSandboxAssistantTransport.js +41 -0
- package/dist/shared/components/assistantWidget/AssistantWidget.d.ts.map +1 -1
- package/dist/shared/components/assistantWidget/AssistantWidget.js +10 -7
- package/dist/shared/components/assistantWidget/types.d.ts +4 -0
- package/dist/shared/components/assistantWidget/types.d.ts.map +1 -1
- package/dist/shared-assistant.d.ts +2 -0
- package/dist/shared-assistant.js +6 -0
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductPickerSheet.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductPickerSheet.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAO3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"ProductPickerSheet.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductPickerSheet.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAO3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAiI1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductSwitcher.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductSwitcher.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAShC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"ProductSwitcher.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductSwitcher.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAShC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACzF,QAAQ,EAAE,CAAC,EAAE,EACb,KAAK,EAAE,MAAM,GACZ,CAAC,EAAE,CASL;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,GAAG,SAAS,CAKrB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CA0NpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationList.d.ts","sourceRoot":"","sources":["../../../src/chrome/notificationCenter/NotificationList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"NotificationList.d.ts","sourceRoot":"","sources":["../../../src/chrome/notificationCenter/NotificationList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAkFtD,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AssistantMode, AssistantRawMessage, AssistantSandboxAuthContext, AssistantArtifact, StreamAccess } from './types';
|
|
2
|
+
export declare function findExistingSandbox(workspaceId: string, mode: AssistantMode, isProd: boolean, authContext: AssistantSandboxAuthContext): Promise<string | null>;
|
|
3
|
+
export declare function createAssistantSandbox(product: string, mode: AssistantMode, workspaceId: string, isProd: boolean, ttlSeconds: number, authContext: AssistantSandboxAuthContext): Promise<string>;
|
|
4
|
+
/**
|
|
5
|
+
* Wait for RUNNING. Prefers the svc long-poll (waitForSandboxRunning); on an
|
|
6
|
+
* older gateway that field errors → falls back to 2s getSandbox polling. Keeps
|
|
7
|
+
* the same terminal-error strings either way.
|
|
8
|
+
*/
|
|
9
|
+
export declare function waitForSandboxRunning(sandboxId: string, workspaceId: string, authContext: AssistantSandboxAuthContext, maxWaitMs?: number): Promise<void>;
|
|
10
|
+
export declare function waitForAssistantServiceReady(sandboxId: string, workspaceId: string, authContext: AssistantSandboxAuthContext, maxWaitMs?: number): Promise<void>;
|
|
11
|
+
export declare function createAssistantSession(sandboxId: string, workspaceId: string, mode: AssistantMode, authContext: AssistantSandboxAuthContext): Promise<{
|
|
12
|
+
sessionId: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function sendAssistantPromptAsync(sandboxId: string, workspaceId: string, sessionId: string, prompt: string, mode: AssistantMode, pageContext: Record<string, unknown> | undefined, authContext: AssistantSandboxAuthContext): Promise<{
|
|
15
|
+
messageID?: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function getAssistantMessages(sandboxId: string, workspaceId: string, sessionId: string, authContext: AssistantSandboxAuthContext, opts?: {
|
|
18
|
+
limit?: number;
|
|
19
|
+
sinceMs?: number;
|
|
20
|
+
}): Promise<AssistantRawMessage[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Ask the svc to mint a signed SSE stream URL. Returns null when unavailable
|
|
23
|
+
* (older backend / preview data plane off) → caller falls back to polling.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getAssistantStreamAccess(sandboxId: string, workspaceId: string, sessionId: string, authContext: AssistantSandboxAuthContext): Promise<StreamAccess | null>;
|
|
26
|
+
export declare function extendAssistantSandboxTTL(sandboxId: string, workspaceId: string, additionalSeconds: number, authContext: AssistantSandboxAuthContext): Promise<void>;
|
|
27
|
+
export declare function sendHeartbeat(sandboxId: string, workspaceId: string, sessionId: string, authContext: AssistantSandboxAuthContext): Promise<void>;
|
|
28
|
+
export declare function getAssistantArtifacts(sandboxId: string, workspaceId: string, sessionId: string, authContext: AssistantSandboxAuthContext): Promise<AssistantArtifact[]>;
|
|
29
|
+
export declare function checkAssistantAiCredits(workspaceId: string, authContext: AssistantSandboxAuthContext): Promise<boolean>;
|
|
30
|
+
export declare function reportAssistantAiTokenUsage(workspaceId: string, sessionId: string, messageId: string, model: string | undefined, tokens: {
|
|
31
|
+
input: number;
|
|
32
|
+
output: number;
|
|
33
|
+
}, authContext: AssistantSandboxAuthContext): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { buildSandboxContextInput as e, executeSandboxGraphQL as t } from "./gatewayClient.js";
|
|
2
|
+
import { CHECK_AI_CREDITS as n, CREATE_SANDBOX as r, EXTEND_SANDBOX_TTL as i, GET_ACTIVE_SANDBOXES as a, GET_SANDBOX as o, PROXY_SANDBOX_REQUEST as s, REPORT_AI_TOKEN_USAGE as c, WAIT_FOR_SANDBOX_RUNNING as l } from "./operations.js";
|
|
3
|
+
import { ASSISTANT_API_AUTH_STRATEGY as u, getImageForMode as d, getImageTagForMode as f, getResourcesForMode as p, resolveSandboxAssistantMode as m } from "./images.js";
|
|
4
|
+
import { getCapability as h, isUnknownFieldError as g, markSupported as _, markUnsupported as v } from "./capabilities.js";
|
|
5
|
+
//#region src/shared/assistant/api.ts
|
|
6
|
+
async function y(n, r, i, a, o, c) {
|
|
7
|
+
let l = (await t({
|
|
8
|
+
query: s,
|
|
9
|
+
operationName: "ProxySandboxRequest",
|
|
10
|
+
variables: { input: {
|
|
11
|
+
sandboxId: n,
|
|
12
|
+
path: i,
|
|
13
|
+
method: a,
|
|
14
|
+
body: o,
|
|
15
|
+
context: e(r, c)
|
|
16
|
+
} },
|
|
17
|
+
workspaceId: r,
|
|
18
|
+
authContext: c
|
|
19
|
+
})).proxySandboxRequest;
|
|
20
|
+
if (!l || l.status >= 400) {
|
|
21
|
+
let e = l?.body;
|
|
22
|
+
throw Error(e?.error ?? `Proxy error: ${l?.status ?? "unknown"}`);
|
|
23
|
+
}
|
|
24
|
+
return l.body;
|
|
25
|
+
}
|
|
26
|
+
async function b(n, r, i, o) {
|
|
27
|
+
return ((await t({
|
|
28
|
+
query: a,
|
|
29
|
+
operationName: "GetActiveSandboxes",
|
|
30
|
+
variables: { context: e(n, o) },
|
|
31
|
+
workspaceId: n,
|
|
32
|
+
authContext: o
|
|
33
|
+
})).getActiveSandboxes ?? []).find((e) => (e.status === "RUNNING" || e.status === "PROVISIONING" || e.status === "PENDING") && e.template === "AI_BUILDER" && m(e) === r && (!o.userId || e.createdBy === o.userId) && e.metadata?.authStrategy === "sandbox-app-client-headers-v1" && e.metadata?.imageTag === f(r, i))?.id ?? null;
|
|
34
|
+
}
|
|
35
|
+
async function x(n, i, a, o, s, c) {
|
|
36
|
+
let l = p(i), m = [
|
|
37
|
+
{
|
|
38
|
+
name: "AI_ASSISTANT_MODE",
|
|
39
|
+
value: i
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "HOSTNAME",
|
|
43
|
+
value: "0.0.0.0"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "WORKSPACE_ID",
|
|
47
|
+
value: a
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "AI_ASSISTANT_PRODUCT",
|
|
51
|
+
value: n
|
|
52
|
+
}
|
|
53
|
+
], h = (t) => ({
|
|
54
|
+
name: `ai-assistant-${i}-${Date.now()}`,
|
|
55
|
+
description: `AI Assistant sandbox (${i} mode)`,
|
|
56
|
+
template: "AI_BUILDER",
|
|
57
|
+
mode: "DEPLOYMENT",
|
|
58
|
+
containers: [{
|
|
59
|
+
name: "ai-assistant",
|
|
60
|
+
image: d(i, o),
|
|
61
|
+
ports: [{
|
|
62
|
+
containerPort: 8080,
|
|
63
|
+
name: "http"
|
|
64
|
+
}],
|
|
65
|
+
env: m
|
|
66
|
+
}],
|
|
67
|
+
resources: l,
|
|
68
|
+
ttlSeconds: t,
|
|
69
|
+
metadata: {
|
|
70
|
+
assistantMode: i,
|
|
71
|
+
assistantOwnerUserId: c.userId ?? null,
|
|
72
|
+
assistantOrganizationId: c.organizationId ?? null,
|
|
73
|
+
authStrategy: u,
|
|
74
|
+
imageTag: f(i, o)
|
|
75
|
+
},
|
|
76
|
+
context: e(a, c)
|
|
77
|
+
}), g = (e) => t({
|
|
78
|
+
query: r,
|
|
79
|
+
operationName: "CreateSandbox",
|
|
80
|
+
variables: { input: h(e) },
|
|
81
|
+
workspaceId: a,
|
|
82
|
+
authContext: c
|
|
83
|
+
}), _;
|
|
84
|
+
try {
|
|
85
|
+
_ = await g(s);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
let t = e instanceof Error ? e.message.toLowerCase() : String(e);
|
|
88
|
+
if (s > 600 && (t.includes("ttl") || t.includes("validation") || t.includes("maximum"))) _ = await g(600);
|
|
89
|
+
else throw e;
|
|
90
|
+
}
|
|
91
|
+
if (!_?.createSandbox?.id) throw Error("createSandbox returned empty response");
|
|
92
|
+
return _.createSandbox.id;
|
|
93
|
+
}
|
|
94
|
+
async function S(n, r, i) {
|
|
95
|
+
return (await t({
|
|
96
|
+
query: o,
|
|
97
|
+
operationName: "GetSandbox",
|
|
98
|
+
variables: {
|
|
99
|
+
id: n,
|
|
100
|
+
context: e(r, i)
|
|
101
|
+
},
|
|
102
|
+
workspaceId: r,
|
|
103
|
+
authContext: i
|
|
104
|
+
})).getSandbox;
|
|
105
|
+
}
|
|
106
|
+
function C(e, t) {
|
|
107
|
+
if (e === "FAILED" || e === "STOPPED" || e === "EXPIRED") throw Error(t ? `Sandbox ${e.toLowerCase()}: ${t}` : `Sandbox ${e.toLowerCase()}`);
|
|
108
|
+
}
|
|
109
|
+
async function w(n, r, i, a = 3e5) {
|
|
110
|
+
let o = Date.now();
|
|
111
|
+
if (h("waitForSandboxRunning") !== "unsupported") for (; Date.now() - o < a;) try {
|
|
112
|
+
let a = await t({
|
|
113
|
+
query: l,
|
|
114
|
+
operationName: "WaitForSandboxRunning",
|
|
115
|
+
variables: {
|
|
116
|
+
id: n,
|
|
117
|
+
timeoutSeconds: 25,
|
|
118
|
+
context: e(r, i)
|
|
119
|
+
},
|
|
120
|
+
workspaceId: r,
|
|
121
|
+
authContext: i
|
|
122
|
+
});
|
|
123
|
+
_("waitForSandboxRunning");
|
|
124
|
+
let o = a.waitForSandboxRunning;
|
|
125
|
+
if (o?.status === "RUNNING") return;
|
|
126
|
+
C(o?.status, o?.errorMessage);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
if (g(e)) {
|
|
129
|
+
v("waitForSandboxRunning");
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
throw e;
|
|
133
|
+
}
|
|
134
|
+
for (; Date.now() - o < a;) {
|
|
135
|
+
let e = await S(n, r, i);
|
|
136
|
+
if (e?.status === "RUNNING") return;
|
|
137
|
+
C(e?.status, e?.errorMessage), await new Promise((e) => setTimeout(e, 2e3));
|
|
138
|
+
}
|
|
139
|
+
throw Error("Sandbox startup timed out");
|
|
140
|
+
}
|
|
141
|
+
async function T(e, t, n, r = 9e4) {
|
|
142
|
+
let i = Date.now();
|
|
143
|
+
for (; Date.now() - i < r;) {
|
|
144
|
+
try {
|
|
145
|
+
await y(e, t, "/health", "GET", void 0, n);
|
|
146
|
+
return;
|
|
147
|
+
} catch (e) {
|
|
148
|
+
let t = e instanceof Error ? e.message : String(e);
|
|
149
|
+
if (!/proxy error: 502|proxy error: 503|proxy error: 404|service not available|starting/i.test(t)) throw e;
|
|
150
|
+
}
|
|
151
|
+
await new Promise((e) => setTimeout(e, 2e3));
|
|
152
|
+
}
|
|
153
|
+
throw Error("Assistant service did not become healthy before timeout");
|
|
154
|
+
}
|
|
155
|
+
async function E(e, t, n, r) {
|
|
156
|
+
return { sessionId: (await y(e, t, "/sessions", "POST", { mode: n }, r)).session.id };
|
|
157
|
+
}
|
|
158
|
+
async function D(e, t, n, r, i, a, o) {
|
|
159
|
+
let s = await y(e, t, `/sessions/${n}/prompt-async`, "POST", {
|
|
160
|
+
mode: i,
|
|
161
|
+
prompt: r,
|
|
162
|
+
pageContext: a
|
|
163
|
+
}, o);
|
|
164
|
+
return { messageID: typeof s.messageID == "string" ? s.messageID : void 0 };
|
|
165
|
+
}
|
|
166
|
+
async function O(e, t, n, r, i) {
|
|
167
|
+
let a = `/sessions/${n}/messages?limit=${i?.limit ?? 50}`;
|
|
168
|
+
i?.sinceMs && h("sinceParam") !== "unsupported" && (a += `&since=${i.sinceMs}`);
|
|
169
|
+
let o = await y(e, t, a, "GET", void 0, r);
|
|
170
|
+
return typeof o.now == "number" && _("sinceParam"), o.messages ?? [];
|
|
171
|
+
}
|
|
172
|
+
async function k(e, t, n, r) {
|
|
173
|
+
if (h("sse") === "unsupported") return null;
|
|
174
|
+
try {
|
|
175
|
+
let i = await y(e, t, `/sessions/${n}/stream-url`, "GET", void 0, r);
|
|
176
|
+
return typeof i.url == "string" && typeof i.expiresAt == "number" ? (_("sse"), {
|
|
177
|
+
url: i.url,
|
|
178
|
+
expiresAt: i.expiresAt
|
|
179
|
+
}) : (v("sse"), null);
|
|
180
|
+
} catch {
|
|
181
|
+
return v("sse"), null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function A(n, r, a, o) {
|
|
185
|
+
await t({
|
|
186
|
+
query: i,
|
|
187
|
+
operationName: "ExtendSandboxTtl",
|
|
188
|
+
variables: {
|
|
189
|
+
id: n,
|
|
190
|
+
additionalSeconds: a,
|
|
191
|
+
context: e(r, o)
|
|
192
|
+
},
|
|
193
|
+
workspaceId: r,
|
|
194
|
+
authContext: o
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async function j(e, t, n, r) {
|
|
198
|
+
await y(e, t, `/sessions/${n}/heartbeat`, "POST", void 0, r).catch(() => void 0);
|
|
199
|
+
}
|
|
200
|
+
async function M(e, r) {
|
|
201
|
+
return (await t({
|
|
202
|
+
query: n,
|
|
203
|
+
operationName: "CheckAiCredits",
|
|
204
|
+
variables: {},
|
|
205
|
+
workspaceId: e,
|
|
206
|
+
authContext: r
|
|
207
|
+
})).checkAiCredits;
|
|
208
|
+
}
|
|
209
|
+
async function N(e, n, r, i, a, o) {
|
|
210
|
+
let s = Math.max(0, Math.round(a.input ?? 0)), l = Math.max(0, Math.round(a.output ?? 0));
|
|
211
|
+
s + l === 0 || !i || await t({
|
|
212
|
+
query: c,
|
|
213
|
+
operationName: "ReportAiTokenUsage",
|
|
214
|
+
variables: { input: {
|
|
215
|
+
sessionId: n,
|
|
216
|
+
messageId: r,
|
|
217
|
+
model: i,
|
|
218
|
+
inputTokens: s,
|
|
219
|
+
outputTokens: l
|
|
220
|
+
} },
|
|
221
|
+
workspaceId: e,
|
|
222
|
+
authContext: o
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
export { M as checkAssistantAiCredits, x as createAssistantSandbox, E as createAssistantSession, A as extendAssistantSandboxTTL, b as findExistingSandbox, O as getAssistantMessages, k as getAssistantStreamAccess, N as reportAssistantAiTokenUsage, D as sendAssistantPromptAsync, j as sendHeartbeat, T as waitForAssistantServiceReady, w as waitForSandboxRunning };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-page-load capability cache — the entire backward-compat story for a
|
|
3
|
+
* mixed-version rollout. Each capability starts `unknown`; a successful use flips
|
|
4
|
+
* it `supported`, a "Cannot query field" / 404 flips it `unsupported`. No
|
|
5
|
+
* coordinated feature flags: the FE simply degrades (delta→full poll,
|
|
6
|
+
* long-poll→2s poll, SSE→poll) against an older backend, and lights up
|
|
7
|
+
* automatically once the backend advertises the capability.
|
|
8
|
+
*/
|
|
9
|
+
export type CapabilityState = 'unknown' | 'supported' | 'unsupported';
|
|
10
|
+
interface AssistantCapabilities {
|
|
11
|
+
waitForSandboxRunning: CapabilityState;
|
|
12
|
+
sinceParam: CapabilityState;
|
|
13
|
+
sse: CapabilityState;
|
|
14
|
+
}
|
|
15
|
+
export declare function getCapability(key: keyof AssistantCapabilities): CapabilityState;
|
|
16
|
+
export declare function markSupported(key: keyof AssistantCapabilities): void;
|
|
17
|
+
export declare function markUnsupported(key: keyof AssistantCapabilities): void;
|
|
18
|
+
/** True when an error indicates the server doesn't know a field/route yet. */
|
|
19
|
+
export declare function isUnknownFieldError(error: unknown): boolean;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAEtE,UAAU,qBAAqB;IAC7B,qBAAqB,EAAE,eAAe,CAAC;IACvC,UAAU,EAAE,eAAe,CAAC;IAC5B,GAAG,EAAE,eAAe,CAAC;CACtB;AAQD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,qBAAqB,GAAG,eAAe,CAE/E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,qBAAqB,GAAG,IAAI,CAEpE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,qBAAqB,GAAG,IAAI,CAEtE;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK3D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/shared/assistant/capabilities.ts
|
|
2
|
+
var e = {
|
|
3
|
+
waitForSandboxRunning: "unknown",
|
|
4
|
+
sinceParam: "unknown",
|
|
5
|
+
sse: "unknown"
|
|
6
|
+
};
|
|
7
|
+
function t(t) {
|
|
8
|
+
return e[t];
|
|
9
|
+
}
|
|
10
|
+
function n(t) {
|
|
11
|
+
e[t] = "supported";
|
|
12
|
+
}
|
|
13
|
+
function r(t) {
|
|
14
|
+
e[t] = "unsupported";
|
|
15
|
+
}
|
|
16
|
+
function i(e) {
|
|
17
|
+
let t = e instanceof Error ? e.message : String(e);
|
|
18
|
+
return /Cannot query field|Unknown field|Unknown argument|not defined by type|\b404\b|not found/i.test(t);
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { t as getCapability, i as isUnknownFieldError, n as markSupported, r as markUnsupported };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AssistantSandboxAuthContext, SandboxAssistantConfig, SandboxAssistantTransport } from './types';
|
|
2
|
+
export interface TransportDeps {
|
|
3
|
+
getAuthContext: () => AssistantSandboxAuthContext;
|
|
4
|
+
getWorkspaceId: () => string;
|
|
5
|
+
}
|
|
6
|
+
export declare function createSandboxAssistantTransport(config: SandboxAssistantConfig, deps: TransportDeps): SandboxAssistantTransport;
|
|
7
|
+
//# sourceMappingURL=createSandboxAssistantTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,KAAK,EAGV,2BAA2B,EAE3B,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAOjB,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,2BAA2B,CAAC;IAClD,cAAc,EAAE,MAAM,MAAM,CAAC;CAC9B;AAYD,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,sBAAsB,EAC9B,IAAI,EAAE,aAAa,GAClB,yBAAyB,CA8K3B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { isQuotaExhaustedError as e } from "./gatewayClient.js";
|
|
2
|
+
import { checkAssistantAiCredits as t, getAssistantMessages as n, getAssistantStreamAccess as r, reportAssistantAiTokenUsage as i, sendAssistantPromptAsync as a } from "./api.js";
|
|
3
|
+
import { AssistantRuntimeManager as o } from "./runtime.js";
|
|
4
|
+
import { buildProgress as s, isRecoverable as c, mergeMessagesById as l, sanitize as u } from "./progress.js";
|
|
5
|
+
//#region src/shared/assistant/createSandboxAssistantTransport.ts
|
|
6
|
+
var d = 42e4, f = 400, p = 2e3, m = 5e3;
|
|
7
|
+
function h() {
|
|
8
|
+
return typeof window > "u" ? {} : {
|
|
9
|
+
currentUrl: window.location.href,
|
|
10
|
+
currentPage: window.location.pathname.split("/").filter(Boolean).slice(0, 3).join("/") || "home",
|
|
11
|
+
viewportSize: `${window.innerWidth}x${window.innerHeight}`
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function g(g, _) {
|
|
15
|
+
let v = g.mode ?? "assistant", y = g.streamBudgetMs ?? d, b = g.ttlSeconds ?? 3600, x = g.isProdRuntime ?? (() => !1), S = g.enableCredits ?? !1, C = new o({
|
|
16
|
+
product: g.product,
|
|
17
|
+
mode: v,
|
|
18
|
+
ttlSeconds: b,
|
|
19
|
+
isProd: x,
|
|
20
|
+
getWorkspaceId: _.getWorkspaceId,
|
|
21
|
+
getAuthContext: _.getAuthContext
|
|
22
|
+
}), w = () => g.gatherPageContext ? { ...g.gatherPageContext() } : h();
|
|
23
|
+
async function T(e, t, o, d) {
|
|
24
|
+
try {
|
|
25
|
+
let { sandboxId: c, sessionId: d } = await C.ensureRuntime();
|
|
26
|
+
C.startKeepWarm();
|
|
27
|
+
let h = Date.now();
|
|
28
|
+
await a(c, t, d, e.prompt, v, w(), o);
|
|
29
|
+
let _ = null, b = null, x = await r(c, t, d, o).catch(() => null);
|
|
30
|
+
if (x && typeof EventSource < "u") try {
|
|
31
|
+
b = new EventSource(x.url);
|
|
32
|
+
let e = () => {
|
|
33
|
+
if (_) {
|
|
34
|
+
let e = _;
|
|
35
|
+
_ = null, e();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
b.onmessage = e, b.addEventListener("message.part.updated", e), b.addEventListener("message.updated", e), b.onerror = () => {
|
|
39
|
+
b?.close(), b = null;
|
|
40
|
+
};
|
|
41
|
+
} catch {
|
|
42
|
+
b = null;
|
|
43
|
+
}
|
|
44
|
+
let T = (t) => new Promise((n) => {
|
|
45
|
+
if (e.signal.aborted) return n();
|
|
46
|
+
let r = setTimeout(() => {
|
|
47
|
+
_ = null, n();
|
|
48
|
+
}, t);
|
|
49
|
+
_ = () => {
|
|
50
|
+
clearTimeout(r), n();
|
|
51
|
+
};
|
|
52
|
+
}), E = h + y, D = [], O = s([], h), k = h;
|
|
53
|
+
for (; Date.now() < E;) {
|
|
54
|
+
if (e.signal.aborted) throw Error("Cancelled");
|
|
55
|
+
let r = await n(c, t, d, o, { sinceMs: k });
|
|
56
|
+
D = l(D, r);
|
|
57
|
+
for (let e of r) {
|
|
58
|
+
let t = e.info?.time?.created;
|
|
59
|
+
typeof t == "number" && t > k && (k = t);
|
|
60
|
+
}
|
|
61
|
+
if (O = s(D, h), e.onProgress(u(O.content)), O.done) break;
|
|
62
|
+
let i = Date.now() - h < m ? f : p;
|
|
63
|
+
await (b ? T(i) : new Promise((e) => setTimeout(e, i)));
|
|
64
|
+
}
|
|
65
|
+
if (b?.close(), !O.done) throw Error("The assistant timed out while responding. Please try again.");
|
|
66
|
+
let A = await n(c, t, d, o, { limit: 50 }).catch(() => D), j = s(l(D, A), h);
|
|
67
|
+
if (S) {
|
|
68
|
+
let e = A.filter((e) => e.info?.role === "assistant").sort((e, t) => (t.info?.time?.created ?? 0) - (e.info?.time?.created ?? 0))[0], n = e?.info?.tokens, r = e?.info?.providerID && e?.info?.modelID ? `${e.info.providerID}/${e.info.modelID}` : void 0;
|
|
69
|
+
e?.info?.id && n && i(t, d, e.info.id, r, n, o).then(() => g.onCreditsUpdated?.()).catch(() => void 0);
|
|
70
|
+
}
|
|
71
|
+
return { text: u(j.content) };
|
|
72
|
+
} catch (n) {
|
|
73
|
+
if (d === 1 && c(n)) return C.reset(), T(e, t, o, 2);
|
|
74
|
+
throw n;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
sendPrompt: async (n) => {
|
|
79
|
+
let r = _.getWorkspaceId();
|
|
80
|
+
if (!r) throw Error("The assistant needs an active workspace. Open a workspace and try again.");
|
|
81
|
+
let i = _.getAuthContext();
|
|
82
|
+
return S && t(r, i).catch((t) => {
|
|
83
|
+
e(t) && g.onQuotaExhausted?.(t);
|
|
84
|
+
}), T(n, r, i, 1);
|
|
85
|
+
},
|
|
86
|
+
prewarm: (e) => C.prewarm(e),
|
|
87
|
+
suspend: () => C.stopKeepWarm()
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { g as createSandboxAssistantTransport };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AssistantSandboxAuthContext } from './types';
|
|
2
|
+
export declare function isQuotaExhaustedError(error: unknown): boolean;
|
|
3
|
+
export declare function buildSandboxContextInput(workspaceId: string, authContext?: AssistantSandboxAuthContext): Record<string, unknown>;
|
|
4
|
+
export declare function executeSandboxGraphQL<TData>(params: {
|
|
5
|
+
query: string;
|
|
6
|
+
operationName: string;
|
|
7
|
+
variables: Record<string, unknown>;
|
|
8
|
+
workspaceId: string;
|
|
9
|
+
authContext?: AssistantSandboxAuthContext;
|
|
10
|
+
}): Promise<TData>;
|
|
11
|
+
//# sourceMappingURL=gatewayClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gatewayClient.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/gatewayClient.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAe3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAO7D;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,2BAA2B,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB;AAuCD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,2BAA2B,CAAC;CAC3C,GAAG,OAAO,CAAC,KAAK,CAAC,CAqBjB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { graphqlFetch as e } from "../graphql/fetch.js";
|
|
2
|
+
import "../../shared-graphql.js";
|
|
3
|
+
//#region src/shared/assistant/gatewayClient.ts
|
|
4
|
+
function t() {
|
|
5
|
+
try {
|
|
6
|
+
return `bf-assistant-${crypto.randomUUID()}`;
|
|
7
|
+
} catch {
|
|
8
|
+
return `bf-assistant-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function n(e) {
|
|
12
|
+
let t = e;
|
|
13
|
+
if (t?.statusCode === 429 || t?.extensions?.code === "QUOTA_EXHAUSTED") return !0;
|
|
14
|
+
let n = t instanceof Error ? t.message.toLowerCase() : String(t).toLowerCase();
|
|
15
|
+
return n.includes("quota") && (n.includes("exhaust") || n.includes("exceeded"));
|
|
16
|
+
}
|
|
17
|
+
function r(e, t) {
|
|
18
|
+
return {
|
|
19
|
+
workspaceId: e,
|
|
20
|
+
...t?.organizationId ? { custom: { organizationId: t.organizationId } } : {}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function i(n) {
|
|
24
|
+
let r = await e({
|
|
25
|
+
gateway: "workspace",
|
|
26
|
+
query: n.query,
|
|
27
|
+
operationName: n.operationName,
|
|
28
|
+
variables: n.variables,
|
|
29
|
+
authToken: n.authContext?.accessToken ?? void 0,
|
|
30
|
+
workspaceToken: !0,
|
|
31
|
+
workspaceId: n.workspaceId,
|
|
32
|
+
organizationId: n.authContext?.organizationId ?? !0,
|
|
33
|
+
suppressGlobalErrorEvent: !0,
|
|
34
|
+
extraHeaders: { "x-request-id": t() }
|
|
35
|
+
});
|
|
36
|
+
if (r.errors?.length) {
|
|
37
|
+
let e = r.errors[0], t = Error(e.message);
|
|
38
|
+
throw t.extensions = e.extensions, t;
|
|
39
|
+
}
|
|
40
|
+
if (r.data == null) throw Error("Sandbox GraphQL returned no data");
|
|
41
|
+
return r.data;
|
|
42
|
+
}
|
|
43
|
+
async function a(e) {
|
|
44
|
+
let t;
|
|
45
|
+
for (let n = 0; n < 3; n++) try {
|
|
46
|
+
return await i(e);
|
|
47
|
+
} catch (e) {
|
|
48
|
+
t = e;
|
|
49
|
+
let r = e instanceof Error ? e.message.toLowerCase() : String(e).toLowerCase();
|
|
50
|
+
if (!(r.includes("failed to fetch") || r.includes("networkerror") || r.includes("network request failed") || r.includes("aborted") || r.includes("load failed")) || n === 2) throw e;
|
|
51
|
+
await new Promise((e) => setTimeout(e, 250 * 2 ** n));
|
|
52
|
+
}
|
|
53
|
+
throw t;
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { r as buildSandboxContextInput, a as executeSandboxGraphQL, n as isQuotaExhaustedError };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AssistantMode } from './types';
|
|
2
|
+
declare const ASSISTANT_API_AUTH_STRATEGY = "sandbox-app-client-headers-v1";
|
|
3
|
+
export declare function getImageTagForMode(mode: AssistantMode, isProd: boolean): string;
|
|
4
|
+
export declare function getImageForMode(mode: AssistantMode, isProd: boolean): string;
|
|
5
|
+
export declare function getResourcesForMode(mode: AssistantMode): {
|
|
6
|
+
cpuRequest: string;
|
|
7
|
+
cpuLimit: string;
|
|
8
|
+
memoryRequest: string;
|
|
9
|
+
memoryLimit: string;
|
|
10
|
+
};
|
|
11
|
+
export { ASSISTANT_API_AUTH_STRATEGY };
|
|
12
|
+
export declare function resolveSandboxAssistantMode(sandbox: {
|
|
13
|
+
metadata: Record<string, unknown> | null;
|
|
14
|
+
name?: string | null;
|
|
15
|
+
}): AssistantMode | null;
|
|
16
|
+
//# sourceMappingURL=images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/images.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,QAAA,MAAM,2BAA2B,kCAAkC,CAAC;AAEpE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAS/E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAI5E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CAKA;AAED,OAAO,EAAE,2BAA2B,EAAE,CAAC;AAEvC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GAAG,aAAa,GAAG,IAAI,CAgBvB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/shared/assistant/images.ts
|
|
2
|
+
var e = "burdenoffregistry.azurecr.io", t = "sandbox-app-client-headers-v1";
|
|
3
|
+
function n(e, t) {
|
|
4
|
+
switch (e) {
|
|
5
|
+
case "general":
|
|
6
|
+
case "vibe-plugins": return t ? "prod" : "alpha-proxy-auth-v1";
|
|
7
|
+
case "assistant":
|
|
8
|
+
case "api-calls": return t ? "prod" : "alpha-delegated-auth-v11";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function r(t, r) {
|
|
12
|
+
return `${e}/wspace/ai-assistant-${t === "assistant" ? "api-calls" : t}:${n(t, r)}`;
|
|
13
|
+
}
|
|
14
|
+
function i(e) {
|
|
15
|
+
return e === "general" ? {
|
|
16
|
+
cpuRequest: "100m",
|
|
17
|
+
cpuLimit: "500m",
|
|
18
|
+
memoryRequest: "256Mi",
|
|
19
|
+
memoryLimit: "1Gi"
|
|
20
|
+
} : {
|
|
21
|
+
cpuRequest: "150m",
|
|
22
|
+
cpuLimit: "750m",
|
|
23
|
+
memoryRequest: "384Mi",
|
|
24
|
+
memoryLimit: "1536Mi"
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function a(e) {
|
|
28
|
+
let t = e.metadata?.assistantMode;
|
|
29
|
+
if (t === "assistant" || t === "general" || t === "api-calls" || t === "vibe-plugins") return t;
|
|
30
|
+
let n = e.name ?? "";
|
|
31
|
+
return n.startsWith("ai-assistant-vibe-plugins-") ? "vibe-plugins" : n.startsWith("ai-assistant-api-calls-") ? "api-calls" : n.startsWith("ai-assistant-general-") ? "general" : n.startsWith("ai-assistant-assistant-") ? "assistant" : null;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { t as ASSISTANT_API_AUTH_STRATEGY, r as getImageForMode, n as getImageTagForMode, i as getResourcesForMode, a as resolveSandboxAssistantMode };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @burdenoff/fe-libs/shared/assistant — the one sandbox-backed AI-assistant
|
|
3
|
+
* transport for all products. A product's MFE typically only needs:
|
|
4
|
+
*
|
|
5
|
+
* export const useAssistantTransport = () =>
|
|
6
|
+
* useSandboxAssistantTransport({ product: 'myproduct', gatherPageContext });
|
|
7
|
+
*/
|
|
8
|
+
export { useSandboxAssistantTransport } from './useSandboxAssistantTransport';
|
|
9
|
+
export { createSandboxAssistantTransport } from './createSandboxAssistantTransport';
|
|
10
|
+
export { AssistantRuntimeManager } from './runtime';
|
|
11
|
+
export { isQuotaExhaustedError } from './gatewayClient';
|
|
12
|
+
export { buildProgress, sanitize, isRecoverable, mergeMessagesById, mapSessionToHistory, } from './progress';
|
|
13
|
+
export type { AssistantMode, PageContext, SandboxAssistantConfig, SandboxAssistantTransport, AssistantSendArgs, PrewarmLevel, AssistantRawMessage, AssistantWidgetMessage, AssistantArtifact, StreamAccess, } from './types';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL operations as plain strings — deliberately NOT imported from any
|
|
3
|
+
* product's generated `wspace-operations`, so this module has no per-MFE
|
|
4
|
+
* dependency and every product's ~15-line wrapper stays trivial.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CREATE_SANDBOX = "\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) {\n id\n name\n status\n network {\n internalUrl\n }\n }\n }\n";
|
|
7
|
+
export declare const GET_SANDBOX = "\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) {\n id\n status\n errorMessage\n network {\n internalUrl\n }\n }\n }\n";
|
|
8
|
+
/**
|
|
9
|
+
* Server-side readiness long-poll (new). Feature-detected: on an older gateway
|
|
10
|
+
* this errors "Cannot query field waitForSandboxRunning" and the transport falls
|
|
11
|
+
* back to polling getSandbox.
|
|
12
|
+
*/
|
|
13
|
+
export declare const WAIT_FOR_SANDBOX_RUNNING = "\n query WaitForSandboxRunning($id: ID!, $timeoutSeconds: Int, $context: ContextInput!) {\n waitForSandboxRunning(id: $id, timeoutSeconds: $timeoutSeconds, context: $context) {\n id\n status\n errorMessage\n }\n }\n";
|
|
14
|
+
export declare const GET_ACTIVE_SANDBOXES = "\n query GetActiveSandboxes($context: ContextInput!) {\n getActiveSandboxes(context: $context) {\n id\n name\n status\n metadata\n template\n createdBy\n }\n }\n";
|
|
15
|
+
export declare const PROXY_SANDBOX_REQUEST = "\n mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {\n proxySandboxRequest(input: $input) {\n status\n body\n }\n }\n";
|
|
16
|
+
export declare const EXTEND_SANDBOX_TTL = "\n mutation ExtendSandboxTtl($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) {\n id\n expiresAt\n }\n }\n";
|
|
17
|
+
export declare const CHECK_AI_CREDITS = "\n mutation CheckAiCredits {\n checkAiCredits\n }\n";
|
|
18
|
+
export declare const REPORT_AI_TOKEN_USAGE = "\n mutation ReportAiTokenUsage($input: ReportAiTokenUsageInput!) {\n reportAiTokenUsage(input: $input)\n }\n";
|
|
19
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/operations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,cAAc,mMAW1B,CAAC;AAEF,eAAO,MAAM,WAAW,qNAWvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,mPAQpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,4MAWhC,CAAC;AAEF,eAAO,MAAM,qBAAqB,4JAOjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,qOAO9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,6DAI5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,sHAIjC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
//#region src/shared/assistant/operations.ts
|
|
2
|
+
var e = "\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) {\n id\n name\n status\n network {\n internalUrl\n }\n }\n }\n", t = "\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) {\n id\n status\n errorMessage\n network {\n internalUrl\n }\n }\n }\n", n = "\n query WaitForSandboxRunning($id: ID!, $timeoutSeconds: Int, $context: ContextInput!) {\n waitForSandboxRunning(id: $id, timeoutSeconds: $timeoutSeconds, context: $context) {\n id\n status\n errorMessage\n }\n }\n", r = "\n query GetActiveSandboxes($context: ContextInput!) {\n getActiveSandboxes(context: $context) {\n id\n name\n status\n metadata\n template\n createdBy\n }\n }\n", i = "\n mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {\n proxySandboxRequest(input: $input) {\n status\n body\n }\n }\n", a = "\n mutation ExtendSandboxTtl($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) {\n id\n expiresAt\n }\n }\n", o = "\n mutation CheckAiCredits {\n checkAiCredits\n }\n", s = "\n mutation ReportAiTokenUsage($input: ReportAiTokenUsageInput!) {\n reportAiTokenUsage(input: $input)\n }\n";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { o as CHECK_AI_CREDITS, e as CREATE_SANDBOX, a as EXTEND_SANDBOX_TTL, r as GET_ACTIVE_SANDBOXES, t as GET_SANDBOX, i as PROXY_SANDBOX_REQUEST, s as REPORT_AI_TOKEN_USAGE, n as WAIT_FOR_SANDBOX_RUNNING };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AssistantRawMessage, AssistantWidgetMessage } from './types';
|
|
2
|
+
export declare function getRawMessageCreatedAt(message: AssistantRawMessage): number;
|
|
3
|
+
export declare function getAssistantText(parts: AssistantRawMessage['parts']): string;
|
|
4
|
+
export declare function getToolProgress(parts: AssistantRawMessage['parts']): string[];
|
|
5
|
+
/**
|
|
6
|
+
* Reduce the assistant messages created at/after `sinceMs` into display content +
|
|
7
|
+
* a done flag. Done ⇔ the newest assistant message has `info.time.completed` and
|
|
8
|
+
* carries either text or tool progress.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildProgress(messages: AssistantRawMessage[], sinceMs: number): {
|
|
11
|
+
content: string;
|
|
12
|
+
done: boolean;
|
|
13
|
+
};
|
|
14
|
+
/** Redact credentials that might leak into a rendered answer. */
|
|
15
|
+
export declare function sanitize(response: string): string;
|
|
16
|
+
/** Whether an error is worth one retry from a clean runtime (union of fleet fragments). */
|
|
17
|
+
export declare function isRecoverable(error: unknown): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Upsert delta messages into an accumulator keyed by message id. Correct against
|
|
20
|
+
* BOTH a `?since=` delta (a few messages) and an old agent that returns the full
|
|
21
|
+
* window (upsert is idempotent), so enabling the delta param is always safe.
|
|
22
|
+
*/
|
|
23
|
+
export declare function mergeMessagesById(accumulator: AssistantRawMessage[], incoming: AssistantRawMessage[]): AssistantRawMessage[];
|
|
24
|
+
/** Map raw session messages to widget history, dropping injected-context noReply turns. */
|
|
25
|
+
export declare function mapSessionToHistory(messages: AssistantRawMessage[]): AssistantWidgetMessage[];
|
|
26
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/progress.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAA2B,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEpG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAE3E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,MAAM,CAM5E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAU7E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAkBpC;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAyBrD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,mBAAmB,EAAE,EAClC,QAAQ,EAAE,mBAAmB,EAAE,GAC9B,mBAAmB,EAAE,CAavB;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,sBAAsB,EAAE,CAqB7F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//#region src/shared/assistant/progress.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
return e.info?.time?.created ?? 0;
|
|
4
|
+
}
|
|
5
|
+
function t(e) {
|
|
6
|
+
return (e ?? []).filter((e) => e.type === "text" && typeof e.text == "string").map((e) => e.text?.trim() ?? "").filter(Boolean).join("\n");
|
|
7
|
+
}
|
|
8
|
+
function n(e) {
|
|
9
|
+
return (e ?? []).filter((e) => e.type === "tool" && e.tool).map((e) => {
|
|
10
|
+
let t = e.state?.status ?? "running", n = e.tool ?? "tool";
|
|
11
|
+
return t === "completed" ? `Completed: ${n}` : t === "failed" ? `Failed: ${n}` : `Running: ${n}`;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function r(r, i) {
|
|
15
|
+
let a = r.filter((t) => t.info?.role === "assistant" && e(t) >= i).sort((t, n) => e(t) - e(n));
|
|
16
|
+
if (a.length === 0) return {
|
|
17
|
+
content: "Thinking…",
|
|
18
|
+
done: !1
|
|
19
|
+
};
|
|
20
|
+
let o = a[a.length - 1], s = t(o.parts), c = n(o.parts);
|
|
21
|
+
return {
|
|
22
|
+
content: [s, ...c].filter(Boolean).join("\n\n") || "Thinking…",
|
|
23
|
+
done: !!o.info?.time?.completed && (!!s || c.length > 0)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function i(e) {
|
|
27
|
+
return e.replace(/(Authorization\s*:\s*Bearer\s+)[^\s\n]+/gi, "$1[REDACTED]").replace(/(X-Workspace-Authorization\s*:\s*Bearer\s+)[^\s\n]+/gi, "$1[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9._-]+\.[A-Za-z0-9._-]+\b/g, "[REDACTED_JWT]").replace(/\bsk-ant-[A-Za-z0-9-]+\b/g, "[REDACTED_API_KEY]");
|
|
28
|
+
}
|
|
29
|
+
function a(e) {
|
|
30
|
+
let t = e instanceof Error ? e.message.toLowerCase() : String(e).toLowerCase();
|
|
31
|
+
return t.includes("rate limit exceeded") || t.includes("unauthorized") || t.includes("k8s api error 401") ? !1 : [
|
|
32
|
+
"sandbox not found",
|
|
33
|
+
"sandbox is not running",
|
|
34
|
+
"sandbox service not available yet",
|
|
35
|
+
"sandbox failed",
|
|
36
|
+
"sandbox startup timed out",
|
|
37
|
+
"assistant service did not become healthy",
|
|
38
|
+
"assistant service not available",
|
|
39
|
+
"image pull",
|
|
40
|
+
"unexpected error",
|
|
41
|
+
"failed to fetch",
|
|
42
|
+
"proxy error: 404",
|
|
43
|
+
"proxy error: 502",
|
|
44
|
+
"proxy error: 503"
|
|
45
|
+
].some((e) => t.includes(e));
|
|
46
|
+
}
|
|
47
|
+
function o(t, n) {
|
|
48
|
+
let r = /* @__PURE__ */ new Map();
|
|
49
|
+
for (let e of t) {
|
|
50
|
+
let t = e.info?.id;
|
|
51
|
+
t && r.set(t, e);
|
|
52
|
+
}
|
|
53
|
+
for (let e of n) {
|
|
54
|
+
let t = e.info?.id;
|
|
55
|
+
t && r.set(t, e);
|
|
56
|
+
}
|
|
57
|
+
return Array.from(r.values()).sort((t, n) => e(t) - e(n));
|
|
58
|
+
}
|
|
59
|
+
function s(n) {
|
|
60
|
+
let r = [];
|
|
61
|
+
for (let i of n) {
|
|
62
|
+
let n = i.info?.role;
|
|
63
|
+
if (n !== "user" && n !== "assistant") continue;
|
|
64
|
+
let a = t(i.parts);
|
|
65
|
+
a && (n === "user" && (a.startsWith("[Context file:") || a.startsWith("User's current context:")) || r.push({
|
|
66
|
+
id: i.info?.id ?? `${n}-${e(i)}`,
|
|
67
|
+
role: n,
|
|
68
|
+
content: a
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
return r;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { r as buildProgress, a as isRecoverable, s as mapSessionToHistory, o as mergeMessagesById, i as sanitize };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AssistantMode, AssistantSandboxAuthContext, PrewarmLevel } from './types';
|
|
2
|
+
export interface RuntimeDeps {
|
|
3
|
+
product: string;
|
|
4
|
+
mode: AssistantMode;
|
|
5
|
+
ttlSeconds: number;
|
|
6
|
+
isProd: () => boolean;
|
|
7
|
+
getWorkspaceId: () => string;
|
|
8
|
+
getAuthContext: () => AssistantSandboxAuthContext;
|
|
9
|
+
}
|
|
10
|
+
export declare class AssistantRuntimeManager {
|
|
11
|
+
private readonly deps;
|
|
12
|
+
private sandboxId;
|
|
13
|
+
private sessionId;
|
|
14
|
+
private inFlight;
|
|
15
|
+
private keepWarmTimer;
|
|
16
|
+
private visibilityHandler;
|
|
17
|
+
constructor(deps: RuntimeDeps);
|
|
18
|
+
private key;
|
|
19
|
+
private persist;
|
|
20
|
+
/** Drop the warm refs after a recoverable error so the next call re-provisions. */
|
|
21
|
+
reset(): void;
|
|
22
|
+
/** Single-flight provision: find-or-create → ready → service-health → session. */
|
|
23
|
+
ensureRuntime(): Promise<{
|
|
24
|
+
sandboxId: string;
|
|
25
|
+
sessionId: string;
|
|
26
|
+
}>;
|
|
27
|
+
/** Intent pre-warm. 'probe' never creates a paid sandbox; 'full' provisions. */
|
|
28
|
+
prewarm(level?: PrewarmLevel): void;
|
|
29
|
+
/** Start the visibility-gated keep-warm heartbeat while the widget is open. */
|
|
30
|
+
startKeepWarm(): void;
|
|
31
|
+
stopKeepWarm(): void;
|
|
32
|
+
getSandboxId(): string | null;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,aAAa,EAAE,2BAA2B,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIxF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,2BAA2B,CAAC;CACnD;AAED,qBAAa,uBAAuB;IAOtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAkE;IAClF,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,iBAAiB,CAA6B;gBAEzB,IAAI,EAAE,WAAW;IAU9C,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,OAAO;IAWf,mFAAmF;IACnF,KAAK,IAAI,IAAI;IAOb,kFAAkF;IAClF,aAAa,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA8DlE,gFAAgF;IAChF,OAAO,CAAC,KAAK,GAAE,YAAqB,GAAG,IAAI;IAsB3C,+EAA+E;IAC/E,aAAa,IAAI,IAAI;IAsBrB,YAAY,IAAI,IAAI;IAWpB,YAAY,IAAI,MAAM,GAAG,IAAI;CAG9B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createAssistantSandbox as e, createAssistantSession as t, extendAssistantSandboxTTL as n, findExistingSandbox as r, sendHeartbeat as i, waitForAssistantServiceReady as a, waitForSandboxRunning as o } from "./api.js";
|
|
2
|
+
//#region src/shared/assistant/runtime.ts
|
|
3
|
+
var s = 240 * 1e3, c = class {
|
|
4
|
+
sandboxId = null;
|
|
5
|
+
sessionId = null;
|
|
6
|
+
inFlight = null;
|
|
7
|
+
keepWarmTimer = null;
|
|
8
|
+
visibilityHandler = null;
|
|
9
|
+
constructor(e) {
|
|
10
|
+
this.deps = e;
|
|
11
|
+
try {
|
|
12
|
+
this.sandboxId = sessionStorage.getItem(this.key("sandbox")) || null, this.sessionId = sessionStorage.getItem(this.key("session")) || null;
|
|
13
|
+
} catch {}
|
|
14
|
+
}
|
|
15
|
+
key(e) {
|
|
16
|
+
return `bf-assistant:${this.deps.product}:${this.deps.mode}:${e}`;
|
|
17
|
+
}
|
|
18
|
+
persist() {
|
|
19
|
+
try {
|
|
20
|
+
this.sandboxId ? sessionStorage.setItem(this.key("sandbox"), this.sandboxId) : sessionStorage.removeItem(this.key("sandbox")), this.sessionId ? sessionStorage.setItem(this.key("session"), this.sessionId) : sessionStorage.removeItem(this.key("session"));
|
|
21
|
+
} catch {}
|
|
22
|
+
}
|
|
23
|
+
reset() {
|
|
24
|
+
this.sandboxId = null, this.sessionId = null, this.inFlight = null, this.persist();
|
|
25
|
+
}
|
|
26
|
+
ensureRuntime() {
|
|
27
|
+
if (this.sandboxId && this.sessionId) return Promise.resolve({
|
|
28
|
+
sandboxId: this.sandboxId,
|
|
29
|
+
sessionId: this.sessionId
|
|
30
|
+
});
|
|
31
|
+
if (this.inFlight) return this.inFlight;
|
|
32
|
+
let n = this.deps.getWorkspaceId();
|
|
33
|
+
if (!n) return Promise.reject(/* @__PURE__ */ Error("The assistant needs an active workspace. Open a workspace and try again."));
|
|
34
|
+
let i = this.deps.getAuthContext();
|
|
35
|
+
return this.inFlight = (async () => {
|
|
36
|
+
let s = this.deps.isProd(), c = this.sandboxId;
|
|
37
|
+
if (!c) {
|
|
38
|
+
if (c = await r(n, this.deps.mode, s, i), !c) {
|
|
39
|
+
if (!i.accessToken) throw Error("The assistant requires an authenticated session. Please sign in again.");
|
|
40
|
+
c = await e(this.deps.product, this.deps.mode, n, s, this.deps.ttlSeconds, i);
|
|
41
|
+
}
|
|
42
|
+
await o(c, n, i), await a(c, n, i), this.sandboxId = c;
|
|
43
|
+
}
|
|
44
|
+
let l = this.sessionId;
|
|
45
|
+
return l || (l = (await t(c, n, this.deps.mode, i)).sessionId, this.sessionId = l), this.persist(), {
|
|
46
|
+
sandboxId: c,
|
|
47
|
+
sessionId: l
|
|
48
|
+
};
|
|
49
|
+
})(), this.inFlight.catch(() => {
|
|
50
|
+
this.inFlight = null;
|
|
51
|
+
}).then(() => {
|
|
52
|
+
this.inFlight = null;
|
|
53
|
+
}), this.inFlight;
|
|
54
|
+
}
|
|
55
|
+
prewarm(e = "full") {
|
|
56
|
+
if (this.sandboxId && this.sessionId) return;
|
|
57
|
+
let t = this.deps.getWorkspaceId();
|
|
58
|
+
if (t) {
|
|
59
|
+
if (e === "probe") {
|
|
60
|
+
if (this.sandboxId || this.inFlight) return;
|
|
61
|
+
let e = this.deps.getAuthContext();
|
|
62
|
+
r(t, this.deps.mode, this.deps.isProd(), e).then(async (n) => {
|
|
63
|
+
n && (await a(n, t, e).catch(() => void 0), this.sandboxId = n, this.persist());
|
|
64
|
+
}).catch(() => void 0);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.ensureRuntime().catch(() => void 0);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
startKeepWarm() {
|
|
71
|
+
if (this.keepWarmTimer) return;
|
|
72
|
+
let e = () => {
|
|
73
|
+
if (typeof document < "u" && document.visibilityState !== "visible" || !this.sandboxId) return;
|
|
74
|
+
let e = this.deps.getWorkspaceId();
|
|
75
|
+
if (!e) return;
|
|
76
|
+
let t = this.deps.getAuthContext();
|
|
77
|
+
n(this.sandboxId, e, this.deps.ttlSeconds, t).catch(() => void 0), this.sessionId && i(this.sandboxId, e, this.sessionId, t);
|
|
78
|
+
};
|
|
79
|
+
this.keepWarmTimer = setInterval(e, s), this.visibilityHandler = () => {
|
|
80
|
+
typeof document < "u" && document.visibilityState === "visible" && e();
|
|
81
|
+
}, typeof document < "u" && document.addEventListener("visibilitychange", this.visibilityHandler);
|
|
82
|
+
}
|
|
83
|
+
stopKeepWarm() {
|
|
84
|
+
this.keepWarmTimer &&= (clearInterval(this.keepWarmTimer), null), this.visibilityHandler && typeof document < "u" && (document.removeEventListener("visibilitychange", this.visibilityHandler), this.visibilityHandler = null);
|
|
85
|
+
}
|
|
86
|
+
getSandboxId() {
|
|
87
|
+
return this.sandboxId;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
//#endregion
|
|
91
|
+
export { c as AssistantRuntimeManager };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared AI-assistant transport types (Layer 1, fe-libs).
|
|
3
|
+
*
|
|
4
|
+
* One implementation of the sandbox-backed assistant transport for ALL products.
|
|
5
|
+
* Previously each `microfe-<product>` shipped a near-identical ~600-900 line copy
|
|
6
|
+
* of this logic; this module centralizes it behind a config-driven factory. The
|
|
7
|
+
* only genuine per-product inputs are the product id and its `gatherPageContext`.
|
|
8
|
+
*/
|
|
9
|
+
export type AssistantMode = 'general' | 'api-calls' | 'vibe-plugins' | 'assistant';
|
|
10
|
+
/** Local mirror of a product's PageContext; the transport forwards a subset. */
|
|
11
|
+
export interface PageContext {
|
|
12
|
+
currentUrl?: string;
|
|
13
|
+
currentPage?: string;
|
|
14
|
+
entityType?: string;
|
|
15
|
+
entityId?: string;
|
|
16
|
+
platform?: string;
|
|
17
|
+
version?: string;
|
|
18
|
+
viewportSize?: string;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
export interface AssistantSandboxAuthContext {
|
|
22
|
+
accessToken?: string | null;
|
|
23
|
+
workspaceToken?: string | null;
|
|
24
|
+
userId?: string | null;
|
|
25
|
+
organizationId?: string | null;
|
|
26
|
+
}
|
|
27
|
+
export interface AssistantRawMessagePart {
|
|
28
|
+
type?: string;
|
|
29
|
+
text?: string;
|
|
30
|
+
tool?: string;
|
|
31
|
+
state?: {
|
|
32
|
+
status?: string;
|
|
33
|
+
input?: unknown;
|
|
34
|
+
output?: unknown;
|
|
35
|
+
raw?: unknown;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface AssistantRawMessage {
|
|
39
|
+
info?: {
|
|
40
|
+
id?: string;
|
|
41
|
+
role?: string;
|
|
42
|
+
providerID?: string;
|
|
43
|
+
modelID?: string;
|
|
44
|
+
tokens?: {
|
|
45
|
+
input: number;
|
|
46
|
+
output: number;
|
|
47
|
+
};
|
|
48
|
+
time?: {
|
|
49
|
+
created?: number;
|
|
50
|
+
completed?: number;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
parts?: AssistantRawMessagePart[];
|
|
54
|
+
}
|
|
55
|
+
export interface AssistantArtifact {
|
|
56
|
+
name: string;
|
|
57
|
+
path: string;
|
|
58
|
+
type: string;
|
|
59
|
+
size: number;
|
|
60
|
+
downloadPath: string;
|
|
61
|
+
}
|
|
62
|
+
export interface AssistantWidgetMessage {
|
|
63
|
+
id: string;
|
|
64
|
+
role: 'user' | 'assistant';
|
|
65
|
+
content: string;
|
|
66
|
+
pending?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** What a product passes to build its transport. Only `product` is required. */
|
|
69
|
+
export interface SandboxAssistantConfig {
|
|
70
|
+
/** AI_ASSISTANT_PRODUCT for the sandbox container (drives per-product docs). */
|
|
71
|
+
product: string;
|
|
72
|
+
/**
|
|
73
|
+
* Per-product page-context gatherer; a minimal window-based default is used if
|
|
74
|
+
* absent. Typed as `() => object` (not the exported `PageContext`) so a
|
|
75
|
+
* product's own `PageContext` interface — which lacks an index signature — is
|
|
76
|
+
* accepted without friction. The transport reads it as a plain record.
|
|
77
|
+
*/
|
|
78
|
+
gatherPageContext?: () => object;
|
|
79
|
+
/** Session mode. Default 'assistant' (combined docs + api-calls). */
|
|
80
|
+
mode?: AssistantMode;
|
|
81
|
+
/** Enable AI-credit metering (preflight + post-turn report). Fails open. */
|
|
82
|
+
enableCredits?: boolean;
|
|
83
|
+
/** Overall per-turn deadline. Default 420_000ms. */
|
|
84
|
+
streamBudgetMs?: number;
|
|
85
|
+
/** Sandbox TTL at create (retries at 600 on validation error). Default 3600. */
|
|
86
|
+
ttlSeconds?: number;
|
|
87
|
+
/** Optional prod-runtime detector for image-tag pinning (hostname-based). */
|
|
88
|
+
isProdRuntime?: () => boolean;
|
|
89
|
+
/** Called when a quota error is detected (widget/panel surfaces it). */
|
|
90
|
+
onQuotaExhausted?: (error: unknown) => void;
|
|
91
|
+
/** Called after a successful post-turn credit charge. */
|
|
92
|
+
onCreditsUpdated?: () => void;
|
|
93
|
+
}
|
|
94
|
+
export interface AssistantSendArgs {
|
|
95
|
+
prompt: string;
|
|
96
|
+
onProgress: (partialText: string) => void;
|
|
97
|
+
signal: AbortSignal;
|
|
98
|
+
}
|
|
99
|
+
export type PrewarmLevel = 'probe' | 'full';
|
|
100
|
+
/** The transport contract consumed by the fe-libs AssistantWidget. */
|
|
101
|
+
export interface SandboxAssistantTransport {
|
|
102
|
+
sendPrompt: (args: AssistantSendArgs) => Promise<{
|
|
103
|
+
text: string;
|
|
104
|
+
}>;
|
|
105
|
+
/** Fire-and-forget warm-up (single-flighted). 'probe' never creates a sandbox. */
|
|
106
|
+
prewarm: (level?: PrewarmLevel) => void;
|
|
107
|
+
/** Stop the keep-warm heartbeat (widget closed / tab hidden). */
|
|
108
|
+
suspend: () => void;
|
|
109
|
+
}
|
|
110
|
+
export interface StreamAccess {
|
|
111
|
+
url: string;
|
|
112
|
+
expiresAt: number;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/useSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAEV,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AA+BjB,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,sBAAsB,GAC7B,yBAAyB,CAqB3B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useAuthToken as e } from "../providers/shell/AuthTokenProvider.js";
|
|
2
|
+
import "../../shared-providers-shell.js";
|
|
3
|
+
import { createSandboxAssistantTransport as t } from "./createSandboxAssistantTransport.js";
|
|
4
|
+
import { useEffect as n, useMemo as r } from "react";
|
|
5
|
+
//#region src/shared/assistant/useSandboxAssistantTransport.ts
|
|
6
|
+
function i(e) {
|
|
7
|
+
try {
|
|
8
|
+
let t = e === "workspaceId" ? "burdenoff-active-context-workspace" : "burdenoff-active-context-organization", n = localStorage.getItem(t);
|
|
9
|
+
if (n) return n;
|
|
10
|
+
let r = sessionStorage.getItem("bf-active-profile");
|
|
11
|
+
if (!r) return "";
|
|
12
|
+
let i = localStorage.getItem(`bf-p-${r}-context`);
|
|
13
|
+
return i ? JSON.parse(i)[e] ?? "" : "";
|
|
14
|
+
} catch {
|
|
15
|
+
return "";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function a() {
|
|
19
|
+
return new URLSearchParams(window.location.search).get("workspace") ?? i("workspaceId");
|
|
20
|
+
}
|
|
21
|
+
function o() {
|
|
22
|
+
return new URLSearchParams(window.location.search).get("org") ?? i("organizationId");
|
|
23
|
+
}
|
|
24
|
+
function s(i) {
|
|
25
|
+
let { getAccessToken: s, getWorkspaceToken: c, userId: l } = e(), u = r(() => t(i, {
|
|
26
|
+
getWorkspaceId: a,
|
|
27
|
+
getAuthContext: () => ({
|
|
28
|
+
accessToken: s(),
|
|
29
|
+
workspaceToken: c(),
|
|
30
|
+
userId: l,
|
|
31
|
+
organizationId: o()
|
|
32
|
+
})
|
|
33
|
+
}), [
|
|
34
|
+
i.product,
|
|
35
|
+
i.mode,
|
|
36
|
+
l
|
|
37
|
+
]);
|
|
38
|
+
return n(() => () => u.suspend(), [u]), u;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { s as useSandboxAssistantTransport };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAef,OAAO,KAAK,EAA2B,kBAAkB,EAA0B,MAAM,SAAS,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AAyB1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAef,OAAO,KAAK,EAA2B,kBAAkB,EAA0B,MAAM,SAAS,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AAyB1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAgiBpD,CAAC"}
|
|
@@ -24,15 +24,15 @@ function y() {
|
|
|
24
24
|
}
|
|
25
25
|
var b = ({ transport: g, title: b = "AI Assistant", subtitle: x = "Ask me to do things on this screen — I can run them for you.", placeholder: S = "Ask anything, or describe what to create…", launcherClassName: C, voiceLang: w = "en-US", layout: T = "floating", showSessionPanel: ae = !1, onNavigate: oe }) => {
|
|
26
26
|
let [E, D] = s(() => _()), [O, k] = s([]), [A, j] = s(""), [M, N] = s(!1), [P, F] = s(!1), [I, L] = s([]), [R, z] = s(!1), [B, V] = s(!1), H = o(null), U = o(null), W = o(null), G = o(!1), K = T === "sidebar", se = ae && !!g.newSession, q = t(w), J = r(() => {
|
|
27
|
-
v(!0), D(!0);
|
|
28
|
-
}, []), Y = r(() => {
|
|
29
|
-
v(!1), D(!1);
|
|
30
|
-
}, []), X = r(() => {
|
|
27
|
+
v(!0), D(!0), g.prewarm?.("full");
|
|
28
|
+
}, [g]), Y = r(() => {
|
|
29
|
+
v(!1), D(!1), g.suspend?.();
|
|
30
|
+
}, [g]), X = r(() => {
|
|
31
31
|
D((e) => {
|
|
32
32
|
let t = !e;
|
|
33
|
-
return v(t), t;
|
|
33
|
+
return v(t), t ? g.prewarm?.("full") : g.suspend?.(), t;
|
|
34
34
|
});
|
|
35
|
-
}, []);
|
|
35
|
+
}, [g]);
|
|
36
36
|
i(() => {
|
|
37
37
|
let e = (e) => {
|
|
38
38
|
let t = e.detail;
|
|
@@ -172,6 +172,8 @@ var b = ({ transport: g, title: b = "AI Assistant", subtitle: x = "Ask me to do
|
|
|
172
172
|
return /* @__PURE__ */ m(f, { children: [a(() => /* @__PURE__ */ p("button", {
|
|
173
173
|
type: "button",
|
|
174
174
|
onClick: X,
|
|
175
|
+
onMouseEnter: () => !E && g.prewarm?.("probe"),
|
|
176
|
+
onFocus: () => !E && g.prewarm?.("probe"),
|
|
175
177
|
"aria-label": E ? "Close AI assistant" : "Open AI assistant",
|
|
176
178
|
"aria-expanded": E,
|
|
177
179
|
"data-testid": "assistant-widget-launcher",
|
|
@@ -180,7 +182,8 @@ var b = ({ transport: g, title: b = "AI Assistant", subtitle: x = "Ask me to do
|
|
|
180
182
|
}), [
|
|
181
183
|
E,
|
|
182
184
|
X,
|
|
183
|
-
C
|
|
185
|
+
C,
|
|
186
|
+
g
|
|
184
187
|
]), E ? /* @__PURE__ */ m("div", {
|
|
185
188
|
role: "dialog",
|
|
186
189
|
"aria-label": b,
|
|
@@ -46,6 +46,10 @@ export interface AssistantTransport {
|
|
|
46
46
|
sendPrompt: (args: AssistantSendArgs) => Promise<{
|
|
47
47
|
text: string;
|
|
48
48
|
}>;
|
|
49
|
+
/** Warm the runtime ahead of the first prompt. 'probe' must not create a sandbox. */
|
|
50
|
+
prewarm?: (level?: 'probe' | 'full') => void;
|
|
51
|
+
/** Stop keep-warm work (widget closed / hidden). */
|
|
52
|
+
suspend?: () => void;
|
|
49
53
|
/** All conversations for this user/sandbox, newest first. */
|
|
50
54
|
listSessions?: () => Promise<AssistantSessionSummary[]>;
|
|
51
55
|
/** Start an empty conversation and make it active. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAQnE,qFAAqF;IACrF,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAOrB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACxD,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACzE;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;CACvD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { isQuotaExhaustedError as e } from "./shared/assistant/gatewayClient.js";
|
|
2
|
+
import { AssistantRuntimeManager as t } from "./shared/assistant/runtime.js";
|
|
3
|
+
import { buildProgress as n, isRecoverable as r, mapSessionToHistory as i, mergeMessagesById as a, sanitize as o } from "./shared/assistant/progress.js";
|
|
4
|
+
import { createSandboxAssistantTransport as s } from "./shared/assistant/createSandboxAssistantTransport.js";
|
|
5
|
+
import { useSandboxAssistantTransport as c } from "./shared/assistant/useSandboxAssistantTransport.js";
|
|
6
|
+
export { t as AssistantRuntimeManager, n as buildProgress, s as createSandboxAssistantTransport, e as isQuotaExhaustedError, r as isRecoverable, i as mapSessionToHistory, a as mergeMessagesById, o as sanitize, c as useSandboxAssistantTransport };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/fe-libs",
|
|
3
|
-
"version": "2026.713.
|
|
3
|
+
"version": "2026.713.6",
|
|
4
4
|
"description": "Burdenoff frontend primitives and domain libraries",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"imports": {
|
|
@@ -102,6 +102,10 @@
|
|
|
102
102
|
"types": "./dist/shared/graphql/index.d.ts",
|
|
103
103
|
"import": "./dist/shared-graphql.js"
|
|
104
104
|
},
|
|
105
|
+
"./shared/assistant": {
|
|
106
|
+
"types": "./dist/shared/assistant/index.d.ts",
|
|
107
|
+
"import": "./dist/shared-assistant.js"
|
|
108
|
+
},
|
|
105
109
|
"./shared/graphql/client": {
|
|
106
110
|
"types": "./dist/shared/graphql/client.d.ts",
|
|
107
111
|
"import": "./dist/shared/graphql/client.js"
|