@burdenoff/fe-libs 2026.915.4 → 2026.916.1
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/shared/assistant/adminModeSendGate.d.ts +81 -0
- package/dist/shared/assistant/adminModeSendGate.d.ts.map +1 -0
- package/dist/shared/assistant/adminModeSendGate.js +37 -0
- package/dist/shared/assistant/api.d.ts +8 -6
- package/dist/shared/assistant/api.d.ts.map +1 -1
- package/dist/shared/assistant/api.js +2 -2
- package/dist/shared/assistant/conversation.d.ts +27 -0
- package/dist/shared/assistant/conversation.d.ts.map +1 -1
- package/dist/shared/assistant/i18nManifest.d.ts +9 -3
- package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
- package/dist/shared/assistant/i18nManifest.js +13 -10
- package/dist/shared/assistant/images.d.ts +37 -2
- package/dist/shared/assistant/images.d.ts.map +1 -1
- package/dist/shared/assistant/images.js +24 -16
- package/dist/shared/assistant/index.d.ts +3 -0
- package/dist/shared/assistant/index.d.ts.map +1 -1
- package/dist/shared/assistant/legacyFiller.d.ts.map +1 -1
- package/dist/shared/assistant/legacyFiller.js +2 -2
- package/dist/shared/assistant/modeCapabilities.d.ts +115 -0
- package/dist/shared/assistant/modeCapabilities.d.ts.map +1 -0
- package/dist/shared/assistant/modeCapabilities.js +46 -0
- package/dist/shared/assistant/modeCopy.d.ts +27 -7
- package/dist/shared/assistant/modeCopy.d.ts.map +1 -1
- package/dist/shared/assistant/modeCopy.js +7 -1
- package/dist/shared/assistant/modeIds.d.ts +67 -0
- package/dist/shared/assistant/modeIds.d.ts.map +1 -0
- package/dist/shared/assistant/modeIds.js +21 -0
- package/dist/shared/assistant/streamBudget.d.ts +18 -18
- package/dist/shared/assistant/streamBudget.d.ts.map +1 -1
- package/dist/shared/assistant/streamBudget.js +21 -19
- package/dist/shared/assistant/types.d.ts +31 -1
- package/dist/shared/assistant/types.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.js +338 -315
- package/dist/shared/assistant/ui/composer/AssistantModeSelector.d.ts +18 -2
- package/dist/shared/assistant/ui/composer/AssistantModeSelector.d.ts.map +1 -1
- package/dist/shared/assistant/ui/composer/AssistantModeSelector.js +38 -32
- package/dist/shared-assistant.js +118 -115
- package/package.json +1 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** The role check's latest answer: is it still running, and did it say yes? */
|
|
2
|
+
export interface AdminModeAccess {
|
|
3
|
+
readonly loading: boolean;
|
|
4
|
+
readonly canUseAdminModes: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* How long a send waits for the role check before giving up on it.
|
|
8
|
+
*
|
|
9
|
+
* Long enough that an ordinary round trip always wins the race, short enough
|
|
10
|
+
* that a check which never answers (an offline tab, a gateway black hole) ends
|
|
11
|
+
* as a message the person can act on instead of a spinner with no end. Reaching
|
|
12
|
+
* it is the ONLY way `adminOnlyModeSendRefusal` still sees `loading: true`.
|
|
13
|
+
*/
|
|
14
|
+
export declare const ADMIN_MODE_ACCESS_WAIT_MS = 10000;
|
|
15
|
+
/**
|
|
16
|
+
* The role check's answer, as something an already-running send can await.
|
|
17
|
+
*
|
|
18
|
+
* ★★ Why this exists at all. The mode list hides an admin-only mode from a
|
|
19
|
+
* non-admin, and an effect resets a persisted one back to Ask — both only AFTER
|
|
20
|
+
* the check resolves, so an admin's own persisted choice survives the window.
|
|
21
|
+
* The send had no way to do the same: a `useCallback` closes over one render's
|
|
22
|
+
* `loading`, so it could either dispatch while the answer was unknown, or refuse.
|
|
23
|
+
*
|
|
24
|
+
* Refusing is what shipped first, and it broke every product whose help button
|
|
25
|
+
* opens the panel and sends on the next tick: an admin whose persisted mode is
|
|
26
|
+
* an admin-only one got an error turn on every such send, because the check was
|
|
27
|
+
* still in flight at that instant. Holding is the honest behaviour — the person
|
|
28
|
+
* asked a question that they are, in fact, allowed to ask.
|
|
29
|
+
*
|
|
30
|
+
* A gate is read LIVE through a ref, so it does not keep a "yes" that a later
|
|
31
|
+
* render has already replaced, the way a value captured by `useCallback` would.
|
|
32
|
+
*
|
|
33
|
+
* ★ It is NOT a guarantee about org switches. The gate only ever knows what the
|
|
34
|
+
* check last told it, and the check learns of a new org one render late — so
|
|
35
|
+
* for that one commit the gate still holds the previous org's answer. Narrowing
|
|
36
|
+
* that belongs in the hook (reporting `loading` while the resolved scope is
|
|
37
|
+
* behind the requested one), not here; the mode list has the same window today.
|
|
38
|
+
*/
|
|
39
|
+
export interface AdminModeAccessGate {
|
|
40
|
+
/** Record the check's current state, releasing every held send once it lands. */
|
|
41
|
+
update(access: AdminModeAccess): void;
|
|
42
|
+
/**
|
|
43
|
+
* The state to decide on: now if the check has answered, otherwise once it
|
|
44
|
+
* does — or, at `timeoutMs`, whatever it still says (i.e. still loading).
|
|
45
|
+
*/
|
|
46
|
+
wait(timeoutMs?: number): Promise<AdminModeAccess>;
|
|
47
|
+
/**
|
|
48
|
+
* Settle every held send with what is known right now, and stop the clock.
|
|
49
|
+
*
|
|
50
|
+
* ★★ For unmount. Both host apps mount the panel conditionally, so closing it
|
|
51
|
+
* mid-check destroys the component while a send is still held. Without this
|
|
52
|
+
* the only thing left to settle that send is its own timeout, which fires up
|
|
53
|
+
* to `ADMIN_MODE_ACCESS_WAIT_MS` later and writes a refusal into the PERSISTED
|
|
54
|
+
* conversation — the user reopens the panel and finds a failed turn that was
|
|
55
|
+
* never actually refused, seconds after they closed it.
|
|
56
|
+
*
|
|
57
|
+
* It settles rather than dropping: an unsettled send never runs `handleSend`'s
|
|
58
|
+
* `finally`, which would leave the conversation marked in-flight for good and
|
|
59
|
+
* the re-entry guard would then refuse every later send in it.
|
|
60
|
+
*/
|
|
61
|
+
abandon(): void;
|
|
62
|
+
/** Sends currently held. Exposed so a test can prove holding really happens. */
|
|
63
|
+
readonly pendingCount: number;
|
|
64
|
+
}
|
|
65
|
+
export declare function createAdminModeAccessGate(initial: AdminModeAccess): AdminModeAccessGate;
|
|
66
|
+
/**
|
|
67
|
+
* Why this send must not go out, or null when it may — waiting for the role
|
|
68
|
+
* check first if the mode needs one.
|
|
69
|
+
*
|
|
70
|
+
* ★★ A mode with no `requiresAdmin` is never held and never awaits the gate.
|
|
71
|
+
* That matters for more than tidiness: the default read-only mode is what the
|
|
72
|
+
* overwhelming majority of sends use, and making those wait on an unrelated
|
|
73
|
+
* check would add the check's whole latency to the common path.
|
|
74
|
+
*
|
|
75
|
+
* The decision itself stays in `adminOnlyModeSendRefusal`, so the send, the mode
|
|
76
|
+
* list and the reset effect cannot drift apart about which modes are gated.
|
|
77
|
+
*/
|
|
78
|
+
export declare function adminOnlyModeSendRefusalAfterAccess(config: {
|
|
79
|
+
readonly requiresAdmin?: boolean;
|
|
80
|
+
} | null | undefined, gate: AdminModeAccessGate, timeoutMs?: number): Promise<string | null>;
|
|
81
|
+
//# sourceMappingURL=adminModeSendGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adminModeSendGate.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/adminModeSendGate.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACnD;;;;;;;;;;;;;OAaG;IACH,OAAO,IAAI,IAAI,CAAC;IAChB,gFAAgF;IAChF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAOD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,eAAe,GACvB,mBAAmB,CAsDrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mCAAmC,CACvD,MAAM,EAAE;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EAC/D,IAAI,EAAE,mBAAmB,EACzB,SAAS,GAAE,MAAkC,GAC5C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGxB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { adminOnlyModeSendRefusal as e } from "./modeCapabilities.js";
|
|
2
|
+
//#region src/shared/assistant/adminModeSendGate.ts
|
|
3
|
+
var t = 1e4;
|
|
4
|
+
function n(e) {
|
|
5
|
+
let n = e, r = [], i = (e) => {
|
|
6
|
+
let t = r;
|
|
7
|
+
r = [];
|
|
8
|
+
for (let n of t) n.timer !== null && clearTimeout(n.timer), n.settle(e);
|
|
9
|
+
};
|
|
10
|
+
return {
|
|
11
|
+
update(e) {
|
|
12
|
+
n = e, e.loading || i(e);
|
|
13
|
+
},
|
|
14
|
+
wait(e = t) {
|
|
15
|
+
return n.loading ? new Promise((t) => {
|
|
16
|
+
let i = {
|
|
17
|
+
settle: t,
|
|
18
|
+
timer: null
|
|
19
|
+
};
|
|
20
|
+
i.timer = setTimeout(() => {
|
|
21
|
+
r = r.filter((e) => e !== i), t(n);
|
|
22
|
+
}, e), r.push(i);
|
|
23
|
+
}) : Promise.resolve(n);
|
|
24
|
+
},
|
|
25
|
+
abandon() {
|
|
26
|
+
i(n);
|
|
27
|
+
},
|
|
28
|
+
get pendingCount() {
|
|
29
|
+
return r.length;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async function r(n, r, i = t) {
|
|
34
|
+
return n?.requiresAdmin ? e(n, await r.wait(i)) : null;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { t as ADMIN_MODE_ACCESS_WAIT_MS, r as adminOnlyModeSendRefusalAfterAccess, n as createAdminModeAccessGate };
|
|
@@ -10,10 +10,11 @@ import { AssistantMode, AssistantPromptPart, AssistantRawMessage, AssistantSandb
|
|
|
10
10
|
* - `api-calls` (Take action) acts through a delegated per-workspace app; the
|
|
11
11
|
* sandbox service mints and sends those credentials itself and never reads the
|
|
12
12
|
* forwarded tokens.
|
|
13
|
-
* - `vibe-plugins`, `general`
|
|
14
|
-
* no platform GraphQL calls at all. Their agent
|
|
15
|
-
* handed to one is a token a prompt injection can
|
|
16
|
-
* (BOFF-7304).
|
|
13
|
+
* - `vibe-plugins`, `general` and every PRODUCT-declared mode (see
|
|
14
|
+
* `declareAssistantMode`) make no platform GraphQL calls at all. Their agent
|
|
15
|
+
* has bash, so a user token handed to one is a token a prompt injection can
|
|
16
|
+
* read and replay as the user (BOFF-7304). A product cannot opt a mode into
|
|
17
|
+
* tokens: the test below is equality with the built-in id, not a capability.
|
|
17
18
|
*
|
|
18
19
|
* ★ Fails closed: an unknown, empty or absent mode forwards nothing. The sandbox
|
|
19
20
|
* service applies the same rule server-side from the sandbox's recorded mode
|
|
@@ -184,8 +185,9 @@ export declare function downloadAssistantArtifact(sandboxId: string, workspaceId
|
|
|
184
185
|
/**
|
|
185
186
|
* ★ `undefined` is accepted, and forwards no user tokens. A message persisted
|
|
186
187
|
* before its metadata carried `mode` cannot say which sandbox made it.
|
|
187
|
-
* Artifacts are only ever collected for
|
|
188
|
-
*
|
|
188
|
+
* Artifacts are only ever collected for a mode that `producesArtifacts` —
|
|
189
|
+
* `vibe-plugins` or a product-declared mode — and none of those needs a user
|
|
190
|
+
* token; the download is authorised by the sandbox's proxy token.
|
|
189
191
|
*/
|
|
190
192
|
mode: AssistantMode | undefined, authContext: AssistantSandboxAuthContext): Promise<DownloadedAssistantArtifact>;
|
|
191
193
|
export declare function checkAssistantAiCredits(workspaceId: string, authContext: AssistantSandboxAuthContext): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,EAC3B,YAAY,EACb,MAAM,SAAS,CAAC;AAMjB
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,7 @@ async function S(n, r, i, o, s, c = /* @__PURE__ */ new Set()) {
|
|
|
40
40
|
})).getActiveSandboxes ?? [], r, i, o, s, c);
|
|
41
41
|
}
|
|
42
42
|
function C(e, t, n, r, i, a = /* @__PURE__ */ new Set()) {
|
|
43
|
-
return e.find((e) => !a.has(e.id) && (e.status === "RUNNING" || e.status === "PROVISIONING" || e.status === "PENDING") && e.template === "AI_BUILDER" && h(e) === n && (!i.userId || e.createdBy === i.userId) && e.metadata?.authStrategy === "sandbox-app-client-headers-v1" && e.metadata?.assistantProduct === t && e.metadata?.imageTag === p(n, r) && (!w(n) || e.metadata?.confirmWrites === !0))?.id ?? null;
|
|
43
|
+
return e.find((e) => !a.has(e.id) && (e.status === "RUNNING" || e.status === "PROVISIONING" || e.status === "PENDING") && e.template === "AI_BUILDER" && h(e, [n]) === n && (!i.userId || e.createdBy === i.userId) && e.metadata?.authStrategy === "sandbox-app-client-headers-v1" && e.metadata?.assistantProduct === t && e.metadata?.imageTag === p(n, r) && (!w(n) || e.metadata?.confirmWrites === !0))?.id ?? null;
|
|
44
44
|
}
|
|
45
45
|
function w(e) {
|
|
46
46
|
return e === "api-calls";
|
|
@@ -192,7 +192,7 @@ async function M(e, t, n, r, i) {
|
|
|
192
192
|
}
|
|
193
193
|
function N(e, t, n, r, i) {
|
|
194
194
|
let a = p(n, r);
|
|
195
|
-
return e.filter((e) => e.metadata?.authStrategy === "sandbox-app-client-headers-v1" && e.metadata?.assistantProduct === t && (!i.userId || e.createdBy === i.userId) && !(h(e) === n && e.metadata?.imageTag === a)).map((e) => e.id);
|
|
195
|
+
return e.filter((e) => e.metadata?.authStrategy === "sandbox-app-client-headers-v1" && e.metadata?.assistantProduct === t && (!i.userId || e.createdBy === i.userId) && !(h(e, [n]) === n && e.metadata?.imageTag === a)).map((e) => e.id);
|
|
196
196
|
}
|
|
197
197
|
async function P(n, r, i, o, s) {
|
|
198
198
|
let c;
|
|
@@ -190,5 +190,32 @@ export interface AssistantModeConfig {
|
|
|
190
190
|
requiresAdmin?: boolean;
|
|
191
191
|
/** Executes mutations on live data → triggers the confirm-before-mutate guard. */
|
|
192
192
|
writeCapable?: boolean;
|
|
193
|
+
/**
|
|
194
|
+
* The mode's turns produce downloadable files: after each turn the panel lists
|
|
195
|
+
* the session's artifacts and renders them as tiles.
|
|
196
|
+
*
|
|
197
|
+
* Default: `true` for the built-in `vibe-plugins`, `false` for every other
|
|
198
|
+
* mode. Resolved by `resolveAssistantModeCapabilities`.
|
|
199
|
+
*/
|
|
200
|
+
producesArtifacts?: boolean;
|
|
201
|
+
/**
|
|
202
|
+
* How long (ms) the panel polls one turn before closing it with the
|
|
203
|
+
* incomplete-turn note. Must be finite, positive and at most
|
|
204
|
+
* `MAX_ASSISTANT_STREAM_BUDGET_MS`; anything else is ignored and the default
|
|
205
|
+
* applies.
|
|
206
|
+
*
|
|
207
|
+
* Default: 600_000 for the built-in `vibe-plugins`, 180_000 otherwise.
|
|
208
|
+
*/
|
|
209
|
+
streamBudgetMs?: number;
|
|
210
|
+
/**
|
|
211
|
+
* The turn keeps running server-side after the client stops waiting, so an
|
|
212
|
+
* unfinished turn says "still building — re-open this conversation"
|
|
213
|
+
* (`assistant.turnStillBuilding`) instead of "send it again"
|
|
214
|
+
* (`assistant.turnIncomplete`).
|
|
215
|
+
*
|
|
216
|
+
* Default: the value of `producesArtifacts` when that is set; otherwise `true`
|
|
217
|
+
* only for the built-in `vibe-plugins`.
|
|
218
|
+
*/
|
|
219
|
+
continuesInBackground?: boolean;
|
|
193
220
|
}
|
|
194
221
|
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/conversation.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -92,7 +92,8 @@ import { AssistantModeConfig } from './conversation';
|
|
|
92
92
|
* entity decoder calls `document.createElement` at load, so an extractor script
|
|
93
93
|
* importing `@burdenoff/fe-libs/shared/assistant` dies with `document is not
|
|
94
94
|
* defined` (measured against the built `dist`, 2026-09-14). This module's own
|
|
95
|
-
* runtime graph is
|
|
95
|
+
* runtime graph is a handful of modules: data tables and the pure mode-id and
|
|
96
|
+
* mode-capability checks, plus `i18n.tsx` for
|
|
96
97
|
* `assistantTranslationKey` and the I18n and product providers that module
|
|
97
98
|
* brings. Its one package is `react`, which every app already has, and it
|
|
98
99
|
* loads under plain `bun`; the test walks the graph so no UI module or other
|
|
@@ -305,13 +306,18 @@ export declare const ASSISTANT_I18N_COMPUTED_COPY: Readonly<Record<string, strin
|
|
|
305
306
|
*/
|
|
306
307
|
export declare const ASSISTANT_I18N_MANIFEST: Readonly<Record<string, string>>;
|
|
307
308
|
/** The part of a mode that decides its pill's key and English. */
|
|
308
|
-
export type AssistantModeCopySource = Pick<AssistantModeConfig, "id" | "label">;
|
|
309
|
+
export type AssistantModeCopySource = Pick<AssistantModeConfig, "id" | "label" | "producesArtifacts">;
|
|
309
310
|
/**
|
|
310
311
|
* `mode.<id>` for each mode a product offers, in the product's own words.
|
|
311
312
|
*
|
|
312
313
|
* Mirrors the pill, which asks for `mode.<id>` with the product's `label` as
|
|
313
|
-
* the English, or the shared name when the label is empty
|
|
314
|
+
* the English, or the shared name when the label is empty
|
|
315
|
+
* (`assistantModeFallbackLabel`, which also names a product-declared mode).
|
|
314
316
|
* Modes the product does not offer are never requested, so they are not here.
|
|
317
|
+
*
|
|
318
|
+
* @throws when a mode id is malformed. Its key could not be seeded — a `.`
|
|
319
|
+
* splits it, a capital or space makes it unmatchable — and a seed that
|
|
320
|
+
* silently carried it would deprecate nothing and translate nothing.
|
|
315
321
|
*/
|
|
316
322
|
export declare function assistantModeI18nCopy(modes: readonly AssistantModeCopySource[]): Record<string, string>;
|
|
317
323
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18nManifest.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/i18nManifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"i18nManifest.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/i18nManifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAS1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0GG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2MG,CAAC;AAE5C,mDAAmD;AACnD,MAAM,MAAM,uBAAuB,GAAG,MAAM,OAAO,2BAA2B,CAAC;AAW/E;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBtE,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIjE,CAAC;AAEL,kEAAkE;AAClE,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,mBAAmB,EACnB,IAAI,GAAG,OAAO,GAAG,mBAAmB,CACrC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,uBAAuB,EAAE,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAexB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9C,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiCzB"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { assistantTranslationKey as e } from "./i18n.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { assistantModeFallbackLabel as t } from "./modeCopy.js";
|
|
3
|
+
import { isAssistantModeId as n } from "./modeIds.js";
|
|
4
|
+
import { INCOMPLETE_TURN_NOTICES as r } from "./streamBudget.js";
|
|
5
|
+
import { STAGE_COPY as i, THINKING_PHRASES as a } from "./stageCopy.js";
|
|
6
|
+
import { VOICE_MUTED_LABEL as o, VOICE_THINKING_LABEL as s } from "./voice/voiceStatus.js";
|
|
7
|
+
import { ATTACHMENT_SOURCES as c } from "./attachmentSources.js";
|
|
7
8
|
//#region src/shared/assistant/i18nManifest.ts
|
|
8
9
|
var l = {
|
|
9
10
|
"apiCalls.consentBody": "In Take action mode the assistant can read AND change your data — creating records, logging activity, updating details, and more, on your behalf.",
|
|
@@ -184,17 +185,19 @@ var l = {
|
|
|
184
185
|
"voiceSession.transcriptTitle": "Voice transcript",
|
|
185
186
|
"voiceSession.unmute": "Turn the microphone on"
|
|
186
187
|
}, u = (e) => Object.fromEntries(e.map((e) => [e.key, e.fallback])), d = Object.freeze({
|
|
187
|
-
...u(Object.values(
|
|
188
|
+
...u(Object.values(i)),
|
|
189
|
+
...u(a),
|
|
190
|
+
...u([s, o]),
|
|
188
191
|
...u(r),
|
|
189
|
-
...
|
|
190
|
-
...u(c.map(t)),
|
|
191
|
-
...Object.fromEntries(o.map((e) => [e.labelKey, e.labelFallback]))
|
|
192
|
+
...Object.fromEntries(c.map((e) => [e.labelKey, e.labelFallback]))
|
|
192
193
|
}), f = Object.freeze({
|
|
193
194
|
...l,
|
|
194
195
|
...d
|
|
195
196
|
});
|
|
196
197
|
function p(e) {
|
|
197
|
-
|
|
198
|
+
let r = e.map((e) => e.id).filter((e) => !n(e));
|
|
199
|
+
if (r.length > 0) throw Error(`assistantModeI18nCopy: malformed mode id ${r.map((e) => JSON.stringify(e)).join(", ")}. Declare product modes with declareAssistantMode().`);
|
|
200
|
+
return Object.fromEntries(e.map((e) => [`mode.${e.id}`, e.label || t(e)]));
|
|
198
201
|
}
|
|
199
202
|
function m(t) {
|
|
200
203
|
let n = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AssistantMode } from './types';
|
|
1
|
+
import { AssistantMode, BuiltInAssistantMode } from './types';
|
|
2
2
|
declare const ASSISTANT_API_AUTH_STRATEGY = "sandbox-app-client-headers-v1";
|
|
3
3
|
/**
|
|
4
4
|
* Resolve the sandbox-image registry: build-time `VITE_SANDBOX_IMAGE_REGISTRY`
|
|
@@ -7,6 +7,22 @@ declare const ASSISTANT_API_AUTH_STRATEGY = "sandbox-app-client-headers-v1";
|
|
|
7
7
|
* see it, so the read is guarded (same pattern as config/gatewayUrls.ts).
|
|
8
8
|
*/
|
|
9
9
|
export declare function getSandboxImageRegistry(): string;
|
|
10
|
+
/**
|
|
11
|
+
* The built-in mode whose image, tag family and resources a sandbox for `mode`
|
|
12
|
+
* runs on.
|
|
13
|
+
*
|
|
14
|
+
* - A built-in mode runs on its own.
|
|
15
|
+
* - A PRODUCT-declared mode runs on `vibe-plugins`: the proxy-token image, which
|
|
16
|
+
* carries no platform identity, with the larger resource profile a build needs.
|
|
17
|
+
* The persona is chosen at boot from `AI_ASSISTANT_MODE`, exactly as
|
|
18
|
+
* `assistant` runs on the api-calls image — ai-assistant publishes images only
|
|
19
|
+
* for general / api-calls / vibe-plugins, so `ai-assistant-<product mode>` would
|
|
20
|
+
* name an image that does not exist.
|
|
21
|
+
*
|
|
22
|
+
* ★ Throws for anything else. A malformed id must not reach `CreateSandbox`,
|
|
23
|
+
* where it would become part of the sandbox name and metadata.
|
|
24
|
+
*/
|
|
25
|
+
export declare function sandboxBaseModeFor(mode: AssistantMode): BuiltInAssistantMode;
|
|
10
26
|
export declare function getImageTagForMode(mode: AssistantMode, isProd: boolean): string;
|
|
11
27
|
export declare function getImageForMode(mode: AssistantMode, isProd: boolean): string;
|
|
12
28
|
export declare function getResourcesForMode(mode: AssistantMode): {
|
|
@@ -16,8 +32,27 @@ export declare function getResourcesForMode(mode: AssistantMode): {
|
|
|
16
32
|
memoryLimit: string;
|
|
17
33
|
};
|
|
18
34
|
export { ASSISTANT_API_AUTH_STRATEGY };
|
|
35
|
+
/**
|
|
36
|
+
* The mode an existing sandbox was provisioned for, or null when it cannot be
|
|
37
|
+
* told.
|
|
38
|
+
*
|
|
39
|
+
* ★ A product-declared mode is recognised ONLY when the caller passes it in
|
|
40
|
+
* `declaredModes`, and only from the stamped metadata — never from the name.
|
|
41
|
+
* Names are prefixes, and `ai-assistant-<id>-` for a product id can be a prefix
|
|
42
|
+
* of another mode's names; every sandbox this library creates carries
|
|
43
|
+
* `metadata.assistantMode`, and reuse already requires this library's stamps. An
|
|
44
|
+
* undeclared id resolves to null, so its sandbox is never reused.
|
|
45
|
+
*
|
|
46
|
+
* ★★ The NAME is read only when the metadata names NO mode (`assistantMode`
|
|
47
|
+
* missing or null) — the legacy built-in sandboxes that predate the stamp.
|
|
48
|
+
* Metadata that names a mode this caller does not recognise is an answer, not a
|
|
49
|
+
* gap to fill from the name: `ai-assistant-general-docs-…` starts with
|
|
50
|
+
* `ai-assistant-general-`, so reading the name there handed a `general-docs`
|
|
51
|
+
* sandbox (another persona, and not read-only) to a `general` lookup, and an
|
|
52
|
+
* `assistant-lite` one to Ask, which would then send it the user's tokens.
|
|
53
|
+
*/
|
|
19
54
|
export declare function resolveSandboxAssistantMode(sandbox: {
|
|
20
55
|
metadata: Record<string, unknown> | null;
|
|
21
56
|
name?: string | null;
|
|
22
|
-
}): AssistantMode | null;
|
|
57
|
+
}, declaredModes?: readonly AssistantMode[]): AssistantMode | null;
|
|
23
58
|
//# sourceMappingURL=images.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/images.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/images.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAYnE,QAAA,MAAM,2BAA2B,kCAAkC,CAAC;AAEpE;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAShD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,oBAAoB,CAM5E;AAED,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,CAK5E;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,CAeA;AAED,OAAO,EAAE,2BAA2B,EAAE,CAAC;AAEvC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,EACD,aAAa,GAAE,SAAS,aAAa,EAAO,GAC3C,aAAa,GAAG,IAAI,CAiBtB"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { isBuiltInAssistantMode as e } from "./modeCopy.js";
|
|
2
|
+
import { isProductAssistantModeId as t } from "./modeIds.js";
|
|
1
3
|
//#region src/shared/assistant/images.ts
|
|
2
|
-
var
|
|
3
|
-
function
|
|
4
|
+
var n = "028127330334.dkr.ecr.ap-south-1.amazonaws.com", r = "sandbox-app-client-headers-v1";
|
|
5
|
+
function i() {
|
|
4
6
|
try {
|
|
5
7
|
let e = {
|
|
6
8
|
BASE_URL: "/",
|
|
@@ -11,22 +13,27 @@ function n() {
|
|
|
11
13
|
}?.VITE_SANDBOX_IMAGE_REGISTRY?.trim();
|
|
12
14
|
if (e) return e.replace(/\/+$/, "");
|
|
13
15
|
} catch {}
|
|
14
|
-
return
|
|
16
|
+
return n;
|
|
15
17
|
}
|
|
16
|
-
function
|
|
17
|
-
|
|
18
|
+
function a(n) {
|
|
19
|
+
if (e(n)) return n;
|
|
20
|
+
if (t(n)) return "vibe-plugins";
|
|
21
|
+
throw Error(`Unknown assistant mode ${JSON.stringify(n)}: no sandbox image is defined for it.`);
|
|
22
|
+
}
|
|
23
|
+
function o(e, t) {
|
|
24
|
+
switch (a(e)) {
|
|
18
25
|
case "general":
|
|
19
26
|
case "vibe-plugins": return t ? "prod" : "alpha-proxy-auth-v1";
|
|
20
27
|
case "assistant":
|
|
21
28
|
case "api-calls": return t ? "prod" : "alpha-delegated-auth-v11";
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
|
-
function
|
|
25
|
-
let
|
|
26
|
-
return `${
|
|
31
|
+
function s(e, t) {
|
|
32
|
+
let n = a(e), r = n === "assistant" ? "api-calls" : n;
|
|
33
|
+
return `${i()}/wspace/ai-assistant-${r}:${o(e, t)}`;
|
|
27
34
|
}
|
|
28
|
-
function
|
|
29
|
-
return e === "general" ? {
|
|
35
|
+
function c(e) {
|
|
36
|
+
return a(e) === "general" ? {
|
|
30
37
|
cpuRequest: "100m",
|
|
31
38
|
cpuLimit: "500m",
|
|
32
39
|
memoryRequest: "256Mi",
|
|
@@ -38,11 +45,12 @@ function a(e) {
|
|
|
38
45
|
memoryLimit: "1536Mi"
|
|
39
46
|
};
|
|
40
47
|
}
|
|
41
|
-
function
|
|
42
|
-
let
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
function l(n, r = []) {
|
|
49
|
+
let i = n.metadata?.assistantMode;
|
|
50
|
+
if (e(i) || t(i) && r.includes(i)) return i;
|
|
51
|
+
if (i != null) return null;
|
|
52
|
+
let a = n.name ?? "";
|
|
53
|
+
return a.startsWith("ai-assistant-vibe-plugins-") ? "vibe-plugins" : a.startsWith("ai-assistant-api-calls-") ? "api-calls" : a.startsWith("ai-assistant-general-") ? "general" : a.startsWith("ai-assistant-assistant-") ? "assistant" : null;
|
|
46
54
|
}
|
|
47
55
|
//#endregion
|
|
48
|
-
export {
|
|
56
|
+
export { r as ASSISTANT_API_AUTH_STRATEGY, s as getImageForMode, o as getImageTagForMode, c as getResourcesForMode, i as getSandboxImageRegistry, l as resolveSandboxAssistantMode, a as sandboxBaseModeFor };
|
|
@@ -66,6 +66,9 @@ export * from './speech/hostedTtsProtocol';
|
|
|
66
66
|
export * from './i18n';
|
|
67
67
|
export * from './i18nManifest';
|
|
68
68
|
export * from './modeCopy';
|
|
69
|
+
export * from './modeIds';
|
|
70
|
+
export * from './modeCapabilities';
|
|
71
|
+
export * from './adminModeSendGate';
|
|
69
72
|
export * from './voice/speechLabels';
|
|
70
73
|
export * from './voice/replyLanguage';
|
|
71
74
|
export * from './voice/speechPlayback';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AAGxB,cAAc,wBAAwB,CAAC;AAKvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,gBAAgB,CAAC;AAK/B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAG3C,cAAc,QAAQ,CAAC;AAIvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacyFiller.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/legacyFiller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AA0C1C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAIT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAGT;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAET;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"legacyFiller.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/legacyFiller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AA0C1C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAIT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAGT;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAET;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAiBf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { INCOMPLETE_TURN_NOTICES as e } from "./streamBudget.js";
|
|
2
2
|
import { STAGE_COPY as t, THINKING_PHRASES as n, stageText as r } from "./stageCopy.js";
|
|
3
3
|
//#region src/shared/assistant/legacyFiller.ts
|
|
4
4
|
var i = [
|
|
@@ -26,7 +26,7 @@ function l(n, r) {
|
|
|
26
26
|
let o = r.slice(0, i).trim();
|
|
27
27
|
if (!a(n, t.thinking, o)) return null;
|
|
28
28
|
let s = r.slice(i + 2);
|
|
29
|
-
return
|
|
29
|
+
return e.some((e) => {
|
|
30
30
|
let t = n(e.key, e.fallback);
|
|
31
31
|
return s.startsWith(e.fallback) || t !== "" && s.startsWith(t);
|
|
32
32
|
}) ? s : null;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { AssistantModeConfig } from './conversation';
|
|
2
|
+
import { AssistantMode, BuiltInAssistantMode } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* What a mode DOES, as far as the panel is concerned: whether its turns produce
|
|
5
|
+
* files, how long one turn may run, and whether an unfinished turn keeps going
|
|
6
|
+
* server-side.
|
|
7
|
+
*
|
|
8
|
+
* ★★ Capabilities, not mode ids. Each of these was a `mode === "vibe-plugins"`
|
|
9
|
+
* test scattered across the panel, which meant no other mode could ever list
|
|
10
|
+
* artifacts or run a long build — however it was configured — without another
|
|
11
|
+
* edit to shared code naming it. A product now says what its mode does on its
|
|
12
|
+
* `AssistantModeConfig`, and this is the one place that decides.
|
|
13
|
+
*
|
|
14
|
+
* ★ Built-in ids keep their built-in behaviour when the product says nothing.
|
|
15
|
+
* That is what keeps an existing product byte-identical: VibeControls' `Build`
|
|
16
|
+
* mode is `vibe-plugins` with none of these fields, and resolves exactly as the
|
|
17
|
+
* hard-coded checks did (artifacts, 600s, "still building").
|
|
18
|
+
*/
|
|
19
|
+
export interface AssistantModeCapabilities {
|
|
20
|
+
/** List `/sessions/:id/artifacts` after each turn and render them. */
|
|
21
|
+
readonly producesArtifacts: boolean;
|
|
22
|
+
/** How long the client polls one turn before closing it as unfinished. */
|
|
23
|
+
readonly streamBudgetMs: number;
|
|
24
|
+
/** An unfinished turn keeps building server-side — selects the "still building" note. */
|
|
25
|
+
readonly continuesInBackground: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* May the panel provision a sandbox for this mode at all.
|
|
28
|
+
*
|
|
29
|
+
* ★ `false` only for a mode that is neither built in nor declared by the
|
|
30
|
+
* product — a persisted id from another build, or a malformed one. It fails
|
|
31
|
+
* CLOSED: no sandbox, no artifacts, the default budget.
|
|
32
|
+
*/
|
|
33
|
+
readonly provisionable: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** The capability fields a product may set, plus the id they belong to. */
|
|
36
|
+
export type AssistantModeCapabilityConfig = Pick<AssistantModeConfig, "id" | "producesArtifacts" | "streamBudgetMs" | "continuesInBackground">;
|
|
37
|
+
/**
|
|
38
|
+
* The largest `streamBudgetMs` a product may configure: one hour.
|
|
39
|
+
*
|
|
40
|
+
* The sandbox TTL is extended every 30s while a turn is polled, so a long budget
|
|
41
|
+
* never outlives the sandbox — but a value like `Infinity` or a seconds/ms mix-up
|
|
42
|
+
* (`600_000_000`) would leave a spinner up for days. Out-of-range values fall
|
|
43
|
+
* back to the default rather than throwing, for the same reason a `NaN` must.
|
|
44
|
+
*/
|
|
45
|
+
export declare const MAX_ASSISTANT_STREAM_BUDGET_MS = 3600000;
|
|
46
|
+
/**
|
|
47
|
+
* The built-in modes' behaviour. The ONLY table in shared code that knows
|
|
48
|
+
* `vibe-plugins` builds things.
|
|
49
|
+
*/
|
|
50
|
+
export declare const BUILT_IN_MODE_CAPABILITIES: Readonly<Record<BuiltInAssistantMode, AssistantModeCapabilities>>;
|
|
51
|
+
/** Fail-closed result for a mode nobody declared. */
|
|
52
|
+
export declare const UNDECLARED_MODE_CAPABILITIES: AssistantModeCapabilities;
|
|
53
|
+
/**
|
|
54
|
+
* The capabilities of `mode`, given the product's config for it.
|
|
55
|
+
*
|
|
56
|
+
* - Built-in id: its built-in behaviour, with any field the product set applied
|
|
57
|
+
* over it.
|
|
58
|
+
* - Product-declared id WITH a config: chat defaults with the product's fields
|
|
59
|
+
* applied. Declared means "the product offers a config for exactly this id".
|
|
60
|
+
* - Anything else — an unoffered product id, a malformed id, no mode at all:
|
|
61
|
+
* `UNDECLARED_MODE_CAPABILITIES`.
|
|
62
|
+
*
|
|
63
|
+
* ★ A config whose `id` is not `mode` is IGNORED. The caller looked it up, and a
|
|
64
|
+
* lookup that fell back to another mode (as `resolveModeConfig` does, by design,
|
|
65
|
+
* for display) would otherwise lend one mode's 10-minute budget and artifact
|
|
66
|
+
* listing to another.
|
|
67
|
+
*
|
|
68
|
+
* ★ `continuesInBackground` follows `producesArtifacts` when only the latter is
|
|
69
|
+
* set: the "still building" note promises "any artifacts below will finish
|
|
70
|
+
* shortly", which is only ever true of a mode that produces them.
|
|
71
|
+
*/
|
|
72
|
+
export declare function resolveAssistantModeCapabilities(mode: AssistantMode | null | undefined, config?: AssistantModeCapabilityConfig | null): AssistantModeCapabilities;
|
|
73
|
+
/**
|
|
74
|
+
* Why a send in an admin-only mode must not go out yet, or null when it may.
|
|
75
|
+
*
|
|
76
|
+
* ★★ The mode list hides an admin-only mode from a non-admin, and an effect
|
|
77
|
+
* resets a persisted one back to Ask — but only AFTER the role check resolves,
|
|
78
|
+
* so an admin's own persisted choice is not reset during that window. A send in
|
|
79
|
+
* the window used to go straight through: the mode was provisioned while the
|
|
80
|
+
* answer was still unknown, and the proxy-token modes have no server-side admin
|
|
81
|
+
* check behind it. So the send asks the same question the list does.
|
|
82
|
+
*
|
|
83
|
+
* ★★ `loading` is NOT the send's normal path through here. The send WAITS for
|
|
84
|
+
* the check (`adminOnlyModeSendRefusalAfterAccess`), because refusing during it
|
|
85
|
+
* broke every product whose help button opens the panel and sends on the next
|
|
86
|
+
* tick. Reaching this branch means that wait timed out, so the copy says the
|
|
87
|
+
* check has not finished — it must never read as a refusal of the person.
|
|
88
|
+
*
|
|
89
|
+
* Only a config that says `requiresAdmin` is gated — Ask carries no such flag
|
|
90
|
+
* and is never held. Truthiness is read exactly as the mode list and the reset
|
|
91
|
+
* effect read it, so for any config the three agree.
|
|
92
|
+
*
|
|
93
|
+
* ★ The one case where they do not is a mode with NO config at all: the reset
|
|
94
|
+
* effect treats a missing config as blocked, while `requiresAdmin` is simply
|
|
95
|
+
* absent here, so nothing is gated. That is reachable only for a built-in id a
|
|
96
|
+
* build has stopped declaring — where there is no admin check to consult
|
|
97
|
+
* anyway, and `createApp` is RBAC-gated server-side regardless.
|
|
98
|
+
*/
|
|
99
|
+
export declare function adminOnlyModeSendRefusal(config: {
|
|
100
|
+
readonly requiresAdmin?: boolean;
|
|
101
|
+
} | null | undefined, access: {
|
|
102
|
+
readonly loading: boolean;
|
|
103
|
+
readonly canUseAdminModes: boolean;
|
|
104
|
+
}): string | null;
|
|
105
|
+
/**
|
|
106
|
+
* The product's config for EXACTLY this mode, or undefined.
|
|
107
|
+
*
|
|
108
|
+
* ★ Deliberately not `resolveModeConfig` (product.tsx), which falls back to the
|
|
109
|
+
* first mode so a stale id still renders suggestions. Behaviour must never be
|
|
110
|
+
* borrowed that way — see `resolveAssistantModeCapabilities`.
|
|
111
|
+
*/
|
|
112
|
+
export declare function findAssistantModeConfig<T extends {
|
|
113
|
+
id: AssistantMode;
|
|
114
|
+
}>(modes: readonly T[] | null | undefined, mode: AssistantMode | null | undefined): T | undefined;
|
|
115
|
+
//# sourceMappingURL=modeCapabilities.d.ts.map
|