@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.
Files changed (39) hide show
  1. package/dist/shared/assistant/adminModeSendGate.d.ts +81 -0
  2. package/dist/shared/assistant/adminModeSendGate.d.ts.map +1 -0
  3. package/dist/shared/assistant/adminModeSendGate.js +37 -0
  4. package/dist/shared/assistant/api.d.ts +8 -6
  5. package/dist/shared/assistant/api.d.ts.map +1 -1
  6. package/dist/shared/assistant/api.js +2 -2
  7. package/dist/shared/assistant/conversation.d.ts +27 -0
  8. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  9. package/dist/shared/assistant/i18nManifest.d.ts +9 -3
  10. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  11. package/dist/shared/assistant/i18nManifest.js +13 -10
  12. package/dist/shared/assistant/images.d.ts +37 -2
  13. package/dist/shared/assistant/images.d.ts.map +1 -1
  14. package/dist/shared/assistant/images.js +24 -16
  15. package/dist/shared/assistant/index.d.ts +3 -0
  16. package/dist/shared/assistant/index.d.ts.map +1 -1
  17. package/dist/shared/assistant/legacyFiller.d.ts.map +1 -1
  18. package/dist/shared/assistant/legacyFiller.js +2 -2
  19. package/dist/shared/assistant/modeCapabilities.d.ts +115 -0
  20. package/dist/shared/assistant/modeCapabilities.d.ts.map +1 -0
  21. package/dist/shared/assistant/modeCapabilities.js +46 -0
  22. package/dist/shared/assistant/modeCopy.d.ts +27 -7
  23. package/dist/shared/assistant/modeCopy.d.ts.map +1 -1
  24. package/dist/shared/assistant/modeCopy.js +7 -1
  25. package/dist/shared/assistant/modeIds.d.ts +67 -0
  26. package/dist/shared/assistant/modeIds.d.ts.map +1 -0
  27. package/dist/shared/assistant/modeIds.js +21 -0
  28. package/dist/shared/assistant/streamBudget.d.ts +18 -18
  29. package/dist/shared/assistant/streamBudget.d.ts.map +1 -1
  30. package/dist/shared/assistant/streamBudget.js +21 -19
  31. package/dist/shared/assistant/types.d.ts +31 -1
  32. package/dist/shared/assistant/types.d.ts.map +1 -1
  33. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  34. package/dist/shared/assistant/ui/AssistantChatArea.js +338 -315
  35. package/dist/shared/assistant/ui/composer/AssistantModeSelector.d.ts +18 -2
  36. package/dist/shared/assistant/ui/composer/AssistantModeSelector.d.ts.map +1 -1
  37. package/dist/shared/assistant/ui/composer/AssistantModeSelector.js +38 -32
  38. package/dist/shared-assistant.js +118 -115
  39. 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` (and `fluidgrids-node` on the service side) make
14
- * no platform GraphQL calls at all. Their agent has bash, so a user token
15
- * handed to one is a token a prompt injection can read and replay as the user
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 `vibe-plugins`, which needs no user
188
- * token, and the download is authorised by the sandbox's proxy token.
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":"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"}
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 thirteen modules: data tables, plus `i18n.tsx` for
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;AAQ1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG;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,CAiBtE,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,CAAC,mBAAmB,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC;AAEhF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,uBAAuB,EAAE,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;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
+ {"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 { incompleteTurnNotice as t } from "./streamBudget.js";
3
- import { STAGE_COPY as n, THINKING_PHRASES as r } from "./stageCopy.js";
4
- import { VOICE_MUTED_LABEL as i, VOICE_THINKING_LABEL as a } from "./voice/voiceStatus.js";
5
- import { ATTACHMENT_SOURCES as o } from "./attachmentSources.js";
6
- import { ASSISTANT_MODE_FALLBACK_LABELS as s, ASSISTANT_MODE_IDS as c } from "./modeCopy.js";
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(n)),
188
+ ...u(Object.values(i)),
189
+ ...u(a),
190
+ ...u([s, o]),
188
191
  ...u(r),
189
- ...u([a, i]),
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
- return Object.fromEntries(e.map((e) => [`mode.${e.id}`, e.label || s[e.id]]));
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;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAY7C,QAAA,MAAM,2BAA2B,kCAAkC,CAAC;AAEpE;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAShD;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,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,CAeA;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"}
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 e = "028127330334.dkr.ecr.ap-south-1.amazonaws.com", t = "sandbox-app-client-headers-v1";
3
- function n() {
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 e;
16
+ return n;
15
17
  }
16
- function r(e, t) {
17
- switch (e) {
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 i(e, t) {
25
- let i = e === "assistant" ? "api-calls" : e;
26
- return `${n()}/wspace/ai-assistant-${i}:${r(e, t)}`;
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 a(e) {
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 o(e) {
42
- let t = e.metadata?.assistantMode;
43
- if (t === "assistant" || t === "general" || t === "api-calls" || t === "vibe-plugins") return t;
44
- let n = e.name ?? "";
45
- 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;
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 { t as ASSISTANT_API_AUTH_STRATEGY, i as getImageForMode, r as getImageTagForMode, a as getResourcesForMode, n as getSandboxImageRegistry, o as resolveSandboxAssistantMode };
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":"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"}
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,CAkBf"}
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 { incompleteTurnNotice as e } from "./streamBudget.js";
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 [e("assistant"), e("vibe-plugins")].some((e) => {
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