@burdenoff/fe-libs 2026.1007.5 → 2026.1007.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.
Files changed (92) hide show
  1. package/dist/shared/assistant/api.d.ts +11 -0
  2. package/dist/shared/assistant/api.d.ts.map +1 -1
  3. package/dist/shared/assistant/api.js +6 -2
  4. package/dist/shared/assistant/conversation.d.ts +14 -0
  5. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  6. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts +8 -1
  7. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts.map +1 -1
  8. package/dist/shared/assistant/createSandboxAssistantTransport.js +70 -51
  9. package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -1
  10. package/dist/shared/assistant/history/historyMapping.js +19 -12
  11. package/dist/shared/assistant/i18nManifest.d.ts +9 -0
  12. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  13. package/dist/shared/assistant/i18nManifest.js +9 -0
  14. package/dist/shared/assistant/index.d.ts +6 -0
  15. package/dist/shared/assistant/index.d.ts.map +1 -1
  16. package/dist/shared/assistant/localUiCommandCopy.d.ts +23 -0
  17. package/dist/shared/assistant/localUiCommandCopy.d.ts.map +1 -1
  18. package/dist/shared/assistant/localUiCommandCopy.js +60 -23
  19. package/dist/shared/assistant/localUiCommands.d.ts +29 -0
  20. package/dist/shared/assistant/localUiCommands.d.ts.map +1 -1
  21. package/dist/shared/assistant/localUiCommands.js +18 -7
  22. package/dist/shared/assistant/types.d.ts +19 -8
  23. package/dist/shared/assistant/types.d.ts.map +1 -1
  24. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  25. package/dist/shared/assistant/ui/AssistantChatArea.js +1479 -1140
  26. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +18 -3
  27. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts.map +1 -1
  28. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.js +1 -1
  29. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts +5 -0
  30. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
  31. package/dist/shared/assistant/ui/AssistantMessageItem.js +89 -84
  32. package/dist/shared/assistant/ui/AssistantMessageList.d.ts +5 -0
  33. package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
  34. package/dist/shared/assistant/ui/AssistantMessageList.js +26 -25
  35. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts +45 -0
  36. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts.map +1 -0
  37. package/dist/shared/assistant/ui/AssistantUiOfferLink.js +56 -0
  38. package/dist/shared/assistant/ui/assistantOverlayState.d.ts +9 -0
  39. package/dist/shared/assistant/ui/assistantOverlayState.d.ts.map +1 -1
  40. package/dist/shared/assistant/ui/assistantOverlayState.js +37 -28
  41. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.d.ts.map +1 -1
  42. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.js +1 -1
  43. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +5 -0
  44. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  45. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +12 -11
  46. package/dist/shared/assistant/ui/voice/VoiceConversationView.d.ts +6 -1
  47. package/dist/shared/assistant/ui/voice/VoiceConversationView.d.ts.map +1 -1
  48. package/dist/shared/assistant/ui/voice/VoiceConversationView.js +7 -7
  49. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts +6 -1
  50. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts.map +1 -1
  51. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.js +15 -12
  52. package/dist/shared/assistant/uiActions/actOnResolve.d.ts +108 -0
  53. package/dist/shared/assistant/uiActions/actOnResolve.d.ts.map +1 -0
  54. package/dist/shared/assistant/uiActions/actOnResolve.js +51 -0
  55. package/dist/shared/assistant/uiActions/linkContext.d.ts +29 -0
  56. package/dist/shared/assistant/uiActions/linkContext.d.ts.map +1 -1
  57. package/dist/shared/assistant/uiActions/linkContext.js +37 -10
  58. package/dist/shared/assistant/uiActions/navIntent.d.ts +58 -0
  59. package/dist/shared/assistant/uiActions/navIntent.d.ts.map +1 -0
  60. package/dist/shared/assistant/uiActions/navIntent.js +79 -0
  61. package/dist/shared/assistant/uiActions/navigateAction.d.ts +6 -1
  62. package/dist/shared/assistant/uiActions/navigateAction.d.ts.map +1 -1
  63. package/dist/shared/assistant/uiActions/navigateAction.js +18 -14
  64. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts +16 -2
  65. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts.map +1 -1
  66. package/dist/shared/assistant/uiActions/navigationOutcome.js +6 -2
  67. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts +39 -0
  68. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts.map +1 -0
  69. package/dist/shared/assistant/uiActions/offerYesOnSurface.js +34 -0
  70. package/dist/shared/assistant/uiActions/uiCatalogue.d.ts +14 -0
  71. package/dist/shared/assistant/uiActions/uiCatalogue.d.ts.map +1 -1
  72. package/dist/shared/assistant/uiActions/uiCatalogue.js +23 -3
  73. package/dist/shared/assistant/uiActions/uiOffers.d.ts +249 -0
  74. package/dist/shared/assistant/uiActions/uiOffers.d.ts.map +1 -0
  75. package/dist/shared/assistant/uiActions/uiOffers.js +195 -0
  76. package/dist/shared/assistant/writeProposals.d.ts +6 -0
  77. package/dist/shared/assistant/writeProposals.d.ts.map +1 -1
  78. package/dist/shared/assistant/writeReplyBinder.d.ts +40 -0
  79. package/dist/shared/assistant/writeReplyBinder.d.ts.map +1 -1
  80. package/dist/shared/assistant/writeReplyBinder.js +100 -83
  81. package/dist/shared/assistant/writeReplySend.d.ts +14 -0
  82. package/dist/shared/assistant/writeReplySend.d.ts.map +1 -1
  83. package/dist/shared/assistant/writeReplySend.js +32 -29
  84. package/dist/shared/hooks/index.d.ts +2 -0
  85. package/dist/shared/hooks/index.d.ts.map +1 -1
  86. package/dist/shared/navigation/unsavedChanges.d.ts +83 -0
  87. package/dist/shared/navigation/unsavedChanges.d.ts.map +1 -0
  88. package/dist/shared/navigation/unsavedChanges.js +46 -0
  89. package/dist/shared-assistant.js +244 -238
  90. package/dist/shared-hooks.js +10 -9
  91. package/dist/shared.js +20 -19
  92. package/package.json +1 -1
@@ -36,10 +36,37 @@ export interface PendingChoice {
36
36
  */
37
37
  candidateIds: readonly string[];
38
38
  }
39
+ /** ★ BOFF-8060 (N3): an offered page among the reply's targets, by its registry path. */
40
+ export interface OfferedTarget {
41
+ offerId: string;
42
+ /** The registry entry, re-validated against the live registry by the caller. */
43
+ target: LocalDestination;
44
+ }
39
45
  export interface NavigationContext {
40
46
  links: ResolvedLinks;
41
47
  pendingChoice: PendingChoice | null;
48
+ /**
49
+ * ★ BOFF-8060 (N3): which of `links.targets` are offered pages (by path).
50
+ * Absent or empty: no offer, and "take me there" is N1b's.
51
+ */
52
+ offers?: ReadonlyArray<{
53
+ path: string;
54
+ offerId: string;
55
+ }>;
42
56
  }
57
+ /**
58
+ * ★ BOFF-8060 (N3, design §3.3): the reply's live, resolvable offers join its
59
+ * targets. De-duplicated by path against the inline links — an inline link to
60
+ * the same page BECOMES the offer target (the registry entry, `via: 'offer'`
61
+ * wins) — and appended after them otherwise. One offer per page: the first.
62
+ */
63
+ export declare function withOfferedTargets(links: ResolvedLinks, offers: readonly OfferedTarget[]): {
64
+ links: ResolvedLinks;
65
+ offers: Array<{
66
+ path: string;
67
+ offerId: string;
68
+ }>;
69
+ };
43
70
  /**
44
71
  * @param text what the person SEES of the message (`spokenTurnText`), never raw
45
72
  * content: a link inside a tool-step description is not a link they saw.
@@ -48,5 +75,7 @@ export declare function buildNavigationContext(input: {
48
75
  reply: SurfaceMessage | null;
49
76
  text: string;
50
77
  resolve: ResolveContext;
78
+ /** ★ N3: the reply's live offers, already re-validated (`liveOffersFor`). */
79
+ offers?: readonly OfferedTarget[];
51
80
  }): NavigationContext | null;
52
81
  //# sourceMappingURL=linkContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"linkContext.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/linkContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EACL,CAAC;QACC,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC5B,SAAS,CAAC;CACf;AAYD,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,cAAc,EAC3D,QAAQ,EAAE,SAAS,CAAC,EAAE,EACtB,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,CAAC,GAAG,IAAI,CAQV;AAaD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,gBAAgB,EAAE,GACtC,IAAI,CAWN;AAED,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,KAChB,gBAAgB,EAAE,GAAG,SAAqC,CAAC;AAE9D,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB,QAAO,IAAyB,CAAC;AAIjE,MAAM,WAAW,aAAa;IAC5B,wIAAwI;IACxI,UAAU,EAAE,aAAa,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1D;;;;OAIG;IACH,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;CACrC;AAiDD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,iBAAiB,GAAG,IAAI,CAI3B"}
1
+ {"version":3,"file":"linkContext.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/linkContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EACL,CAAC;QACC,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC5B,SAAS,CAAC;CACf;AAYD,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,cAAc,EAC3D,QAAQ,EAAE,SAAS,CAAC,EAAE,EACtB,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,CAAC,GAAG,IAAI,CAQV;AAaD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,gBAAgB,EAAE,GACtC,IAAI,CAWN;AAED,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,KAChB,gBAAgB,EAAE,GAAG,SAAqC,CAAC;AAE9D,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB,QAAO,IAAyB,CAAC;AAIjE,MAAM,WAAW,aAAa;IAC5B,wIAAwI;IACxI,UAAU,EAAE,aAAa,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1D;;;;OAIG;IACH,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,SAAS,aAAa,EAAE,GAC/B;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAW5E;AAiDD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;IACxB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CACnC,GAAG,iBAAiB,GAAG,IAAI,CAO3B"}
@@ -23,15 +23,34 @@ function c(e, t) {
23
23
  s.delete(e.value);
24
24
  }
25
25
  }
26
- var l = (e) => s.get(e), u = () => s.clear(), d = null, f = (e) => {
27
- if (d?.text === e) return d.links;
26
+ var l = (e) => s.get(e), u = () => s.clear();
27
+ function d(e, t) {
28
+ let n = [...e.targets], r = [];
29
+ for (let { offerId: e, target: i } of t) {
30
+ if (r.some((e) => e.path === i.path)) continue;
31
+ let t = n.findIndex((e) => e.path === i.path);
32
+ t >= 0 ? n[t] = i : n.push(i), r.push({
33
+ path: i.path,
34
+ offerId: e
35
+ });
36
+ }
37
+ return {
38
+ links: {
39
+ targets: n,
40
+ unresolved: e.unresolved
41
+ },
42
+ offers: r
43
+ };
44
+ }
45
+ var f = null, p = (e) => {
46
+ if (f?.text === e) return f.links;
28
47
  let t = r(e);
29
- return d = {
48
+ return f = {
30
49
  text: e,
31
50
  links: t
32
51
  }, t;
33
52
  };
34
- function p(t, r) {
53
+ function m(t, r) {
35
54
  let i = t.metadata?.localAction;
36
55
  if (typeof i != "object" || !i) return null;
37
56
  let a = i;
@@ -50,11 +69,19 @@ function p(t, r) {
50
69
  candidateIds: c
51
70
  };
52
71
  }
53
- function m(e) {
54
- return e.reply ? {
55
- links: t(f(e.text), e.resolve),
56
- pendingChoice: p(e.reply, e.resolve)
57
- } : null;
72
+ function h(e) {
73
+ if (!e.reply) return null;
74
+ let n = t(p(e.text), e.resolve), r = m(e.reply, e.resolve);
75
+ if (!e.offers || e.offers.length === 0) return {
76
+ links: n,
77
+ pendingChoice: r
78
+ };
79
+ let i = d(n, e.offers);
80
+ return {
81
+ links: i.links,
82
+ pendingChoice: r,
83
+ offers: i.offers
84
+ };
58
85
  }
59
86
  //#endregion
60
- export { m as buildNavigationContext, u as clearPresentedLists, a as latestReplyOnSurface, l as presentedListFor, c as rememberPresentedList };
87
+ export { h as buildNavigationContext, u as clearPresentedLists, a as latestReplyOnSurface, l as presentedListFor, c as rememberPresentedList, d as withOfferedTargets };
@@ -0,0 +1,58 @@
1
+ /**
2
+ * ★ BOFF-8060 (N3, design §8 R1): is what the person said THIS turn an
3
+ * explicit, imperative request to be taken somewhere?
4
+ *
5
+ * A FROZEN grammar with 0 false matches as its target: it is the first guard of
6
+ * act-on-resolve, the one case where the panel navigates after a model turn
7
+ * without a second question. Every doubt answers null, and a null only means
8
+ * the page stays an OFFER ("Open {page}") — nothing is lost.
9
+ *
10
+ * Imperative only, as a WHOLE utterance, in English:
11
+ *
12
+ * - `(please |can you |could you )?(take|bring|get) me (to|into) <x>( please)?`
13
+ * - `(please )?(go|navigate|jump|head) to <x>( please)?`
14
+ * - `(please )?open (the )?<x> (page|screen|section|settings)( please)?`
15
+ * - `(please )?show me (the )?<x> (page|screen|section)( please)?`
16
+ *
17
+ * Never: a question (a trailing `?` is allowed only on the `can you` /
18
+ * `could you` forms; any other question mark anywhere is refused); a negation;
19
+ * a conjunction or a clause break anywhere ("…and delete the old one",
20
+ * "…, rename it"), or `then` / `also`; an idiom that goes nowhere ("go to
21
+ * sleep", "head to head", "get me to understand…"); `<x>` longer than 12
22
+ * words; a newline. "where is…?" and "is there a page…" are never explicit.
23
+ *
24
+ * Pure: no React, no DOM, no registry. Relevance (R2b) is `navIntentRelevant`.
25
+ */
26
+ /** What the person asked to be taken to, as they named it. */
27
+ export interface NavIntent {
28
+ /** `<x>`, lower-cased, spaces collapsed. */
29
+ object: string;
30
+ /** Its content words, stop words removed and plurals folded (R2b). */
31
+ contentWords: string[];
32
+ }
33
+ /** The longest `<x>` the grammar accepts, in words. */
34
+ export declare const NAV_INTENT_OBJECT_MAX_WORDS = 12;
35
+ /** Simple plural folding: "templates" → "template", "policies" → "policy". */
36
+ export declare function foldNavIntentPlural(word: string): string;
37
+ /** Lower-case word tokens of a registry string, camelCase and ids split. */
38
+ export declare function navIntentWords(value: string): string[];
39
+ /**
40
+ * The person's sentence as one explicit "take me to <x>", or null.
41
+ *
42
+ * @param locale what it was typed or said in — English only (Hindi and Tamil
43
+ * wait for N7 and their own blind sets).
44
+ */
45
+ export declare function parseNavIntent(text: string, locale: string | null | undefined): NavIntent | null;
46
+ /** The registry's own words for a page (R2b): label, context and id. */
47
+ export interface NavIntentTarget {
48
+ id: string;
49
+ label: string;
50
+ context?: string;
51
+ }
52
+ /**
53
+ * R2b: at least one content word of what the person named appears among the
54
+ * target's registry label, context or id words (plurals folded). An offer for a
55
+ * page the person did not name is never acted on — it stays an offer.
56
+ */
57
+ export declare function navIntentRelevant(intent: NavIntent, target: NavIntentTarget): boolean;
58
+ //# sourceMappingURL=navIntent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navIntent.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/navIntent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,uDAAuD;AACvD,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAoI9C,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOtD;AAOD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,SAAS,GAAG,IAAI,CA+ClB;AAED,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAKrF"}
@@ -0,0 +1,79 @@
1
+ //#region src/shared/assistant/uiActions/navIntent.ts
2
+ var e = 12, t = (e) => e == null || /^en(?:[-_]|$)/i.test(e.trim()), n = /\b(?:not|never|no|don't|dont|do not|doesn't|doesnt|didn't|didnt|can't|cant|cannot|won't|wont|shouldn't|shouldnt|stop)\b/, r = /\b(?:then|also|afterwards|after that|before that)\b/, i = /\b(?:and|or|but|nor|plus)\b|[&+]/, a = /[,;:\u2013\u2014]|\s-+\s/, o = new Set([
3
+ "bed",
4
+ "breakfast",
5
+ "brunch",
6
+ "dinner",
7
+ "extremes",
8
+ "hell",
9
+ "lunch",
10
+ "pieces",
11
+ "sleep",
12
+ "town",
13
+ "trouble",
14
+ "war",
15
+ "waste"
16
+ ]), s = new Set([
17
+ "accept",
18
+ "agree",
19
+ "appreciate",
20
+ "believe",
21
+ "care",
22
+ "consider",
23
+ "decide",
24
+ "feel",
25
+ "focus",
26
+ "imagine",
27
+ "know",
28
+ "learn",
29
+ "realise",
30
+ "realize",
31
+ "remember",
32
+ "think",
33
+ "trust",
34
+ "understand",
35
+ "wonder"
36
+ ]), c = /^(?:please )?head to head\b/, l = /^(?:(please|can you|could you) )?(?:please )?(?:take|bring|get) me (?:to|into) (.+)$/, u = /^(?:please )?(?:go|navigate|jump|head) to (.+)$/, d = /^(?:please )?open (?:the )?(.+) (?:page|screen|section|settings)$/, f = /^(?:please )?show me (?:the )?(.+) (?:page|screen|section)$/, p = new Set(/* @__PURE__ */ "a.about.all.an.any.area.at.by.can.do.find.for.from.i.in.is.it.its.me.my.of.on.one.our.page.part.place.please.screen.section.see.some.that.the.their.there.these.this.those.to.view.we.where.which.with.you.your".split("."));
37
+ function m(e) {
38
+ return e.length > 4 && e.endsWith("ies") ? `${e.slice(0, -3)}y` : e.length > 4 && /(?:ss|sh|ch|x|z)es$/.test(e) ? e.slice(0, -2) : e.length > 3 && e.endsWith("s") && !e.endsWith("ss") ? e.slice(0, -1) : e;
39
+ }
40
+ function h(e) {
41
+ return e.replace(/([a-z0-9])([A-Z])/g, "$1 $2").normalize("NFKC").toLowerCase().split(/[^\p{L}\p{N}]+/u).filter((e) => e.length > 0);
42
+ }
43
+ var g = (e) => h(e).filter((e) => !p.has(e)).map(m);
44
+ function _(e, p) {
45
+ if (typeof e != "string" || !t(p) || /[\r\n\u2028\u2029]/.test(e)) return null;
46
+ let m = e.normalize("NFKC").toLowerCase().replace(/[\u2018\u2019\u02bc]/g, "'").replace(/\s+/g, " ").trim();
47
+ m = m.replace(/[.!]+$/, "").trim();
48
+ let h = m.endsWith("?");
49
+ if (h && (m = m.slice(0, -1).trim()), /[?¿؟?]/.test(m) || (m = m.replace(/,?\s*please$/, "").trim(), m = m.replace(/^please,\s*/, "please "), m.length === 0) || n.test(m) || r.test(m) || i.test(m) || a.test(m) || c.test(m)) return null;
50
+ let _, v = l.exec(m);
51
+ if (v) {
52
+ if (h && v[1] !== "can you" && v[1] !== "could you") return null;
53
+ _ = v[2];
54
+ } else {
55
+ if (h) return null;
56
+ _ = (u.exec(m) ?? d.exec(m) ?? f.exec(m))?.[1];
57
+ }
58
+ if (_ === void 0) return null;
59
+ _ = _.trim();
60
+ let y = _.split(" ").filter((e) => e.length > 0);
61
+ if (y.length === 0 || y.length > 12) return null;
62
+ let b = y[0] === "the" || y[0] === "a" || y[0] === "an" ? y[1] : y[0];
63
+ if (b !== void 0 && (o.has(b) || s.has(b))) return null;
64
+ let x = g(_);
65
+ return x.length === 0 ? null : {
66
+ object: y.join(" "),
67
+ contentWords: x
68
+ };
69
+ }
70
+ function v(e, t) {
71
+ let n = new Set([
72
+ t.label,
73
+ t.context ?? "",
74
+ t.id
75
+ ].flatMap(h).map(m));
76
+ return e.contentWords.some((e) => n.has(e));
77
+ }
78
+ //#endregion
79
+ export { e as NAV_INTENT_OBJECT_MAX_WORDS, m as foldNavIntentPlural, v as navIntentRelevant, h as navIntentWords, _ as parseNavIntent };
@@ -1,4 +1,4 @@
1
- import { AssistantNavigateAction, AssistantNavigateOutcome, AssistantNavigateVia } from '../conversation';
1
+ import { AssistantNavigateAction, AssistantNavigateOfferTrigger, AssistantNavigateOutcome, AssistantNavigateVia } from '../conversation';
2
2
  import { LocalDestination } from '../localUiCommands';
3
3
  import { NavigationOutcome } from './navigationOutcome';
4
4
  /** The server keeps a `localAction` of at most 1024 bytes; stay well inside it. */
@@ -17,6 +17,11 @@ export declare function buildNavigateAction(input: {
17
17
  alreadyHere: boolean;
18
18
  via: AssistantNavigateVia;
19
19
  outcome?: NavigationOutcome;
20
+ /** ★ BOFF-8060 (N3): how an offer was accepted. Kept only with `via: "offer"`. */
21
+ offer?: {
22
+ trigger: AssistantNavigateOfferTrigger;
23
+ offerId: string;
24
+ };
20
25
  }): AssistantNavigateAction;
21
26
  /** The registry label of the page at `path` (its target or its own path), or null. */
22
27
  export declare function labelForPath(destinations: readonly LocalDestination[], path: string): string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"navigateAction.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/navigateAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,mFAAmF;AACnF,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAQhD,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,wBAAwB,CAElF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B,GAAG,uBAAuB,CAgB1B;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAC1B,YAAY,EAAE,SAAS,gBAAgB,EAAE,EACzC,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAOf;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,SAAS,gBAAgB,EAAE,EACzC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,IAAI,CAQzB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACjG;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,MAAM,GAAG,IAAI,CAYf"}
1
+ {"version":3,"file":"navigateAction.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/navigateAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAC7B,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,mFAAmF;AACnF,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAUhD,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,wBAAwB,CAElF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,kFAAkF;IAClF,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,6BAA6B,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE,GAAG,uBAAuB,CAuB1B;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAC1B,YAAY,EAAE,SAAS,gBAAgB,EAAE,EACzC,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAOf;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,SAAS,gBAAgB,EAAE,EACzC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,IAAI,CAQzB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACjG;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,MAAM,GAAG,IAAI,CAYf"}
@@ -1,31 +1,35 @@
1
1
  import { isCurrentPath as e } from "../localUiCommands.js";
2
2
  import { pathnameOf as t } from "./navigationOutcome.js";
3
3
  //#region src/shared/assistant/uiActions/navigateAction.ts
4
- var n = 900, r = 256, i = 128, a = (e) => new TextEncoder().encode(JSON.stringify(e)).length, o = (e) => e.length <= r ? e : t(e).slice(0, r);
5
- function s(e) {
4
+ var n = 900, r = 256, i = 128, a = /^uo_[0-9a-f]{32}$/, o = (e) => new TextEncoder().encode(JSON.stringify(e)).length, s = (e) => e.length <= r ? e : t(e).slice(0, r);
5
+ function c(e) {
6
6
  return e.status;
7
7
  }
8
- function c(e) {
9
- let n = e.outcome && "landedPath" in e.outcome ? t(e.outcome.landedPath) : void 0, c = {
8
+ function l(e) {
9
+ let n = e.outcome && "landedPath" in e.outcome ? t(e.outcome.landedPath) : void 0, l = e.via === "offer" && e.offer && a.test(e.offer.offerId) ? {
10
+ trigger: e.offer.trigger,
11
+ offerId: e.offer.offerId
12
+ } : {}, u = {
10
13
  kind: "navigate",
11
14
  destinationId: e.destinationId.length <= i ? e.destinationId : "",
12
- path: o(e.path),
15
+ path: s(e.path),
13
16
  alreadyHere: e.alreadyHere,
14
17
  via: e.via,
15
- ...e.outcome ? { outcome: s(e.outcome) } : {}
16
- }, l = n !== void 0 && n.length <= r ? {
17
- ...c,
18
+ ...e.outcome ? { outcome: c(e.outcome) } : {},
19
+ ...l
20
+ }, d = n !== void 0 && n.length <= r ? {
21
+ ...u,
18
22
  landedPath: n
19
- } : c;
20
- return a(l) <= 900 ? l : c;
23
+ } : u;
24
+ return o(d) <= 900 ? d : u;
21
25
  }
22
- function l(t, n) {
26
+ function u(t, n) {
23
27
  return t.find((t) => [t.path, ...t.aliases ?? []].some((t) => e(t, n)))?.label ?? null;
24
28
  }
25
- function u(t, n) {
29
+ function d(t, n) {
26
30
  return t.find((t) => [t.path, ...t.aliases ?? []].some((t) => e(t, n))) ?? null;
27
31
  }
28
- function d(e, t) {
32
+ function f(e, t) {
29
33
  for (let n = e.length - 1; n >= 0; --n) {
30
34
  let r = e[n];
31
35
  if (!r || r.role !== "assistant") continue;
@@ -37,4 +41,4 @@ function d(e, t) {
37
41
  return null;
38
42
  }
39
43
  //#endregion
40
- export { n as NAVIGATE_RECORD_BUDGET_BYTES, c as buildNavigateAction, u as destinationForPath, l as labelForPath, d as newestAssistantOnSurface, s as outcomeStatus };
44
+ export { n as NAVIGATE_RECORD_BUDGET_BYTES, l as buildNavigateAction, d as destinationForPath, u as labelForPath, f as newestAssistantOnSurface, c as outcomeStatus };
@@ -1,4 +1,5 @@
1
- import { AssistantNavigate } from '../ui/AssistantMarkdownRenderer';
1
+ import { AssistantNavigate, AssistantNavigateInitiator } from '../ui/AssistantMarkdownRenderer';
2
+ import { UnsavedChange } from '../../navigation/unsavedChanges';
2
3
  /**
3
4
  * ★ BOFF-8060 (N1a, C7): never claim success before the landing is checked.
4
5
  *
@@ -19,9 +20,16 @@ export type NavigationOutcome = {
19
20
  landedPath: string;
20
21
  } | {
21
22
  status: "new-tab";
22
- } | {
23
+ }
24
+ /**
25
+ * Not routed. ★ BOFF-8060 (N4): `unsaved` names the unsaved changes that
26
+ * refused it (`reason: "unsaved-changes"`), for the reply only — it is never
27
+ * written into the navigate record.
28
+ */
29
+ | {
23
30
  status: "refused";
24
31
  reason: NavigationRefusal;
32
+ unsaved?: readonly UnsavedChange[];
25
33
  } | {
26
34
  status: "unconfirmed";
27
35
  };
@@ -34,6 +42,12 @@ export interface NavigationDeps {
34
42
  schedule: (fn: () => void, ms: number) => void;
35
43
  /** Is this path rendered WITHOUT the shell that hosts the panel? */
36
44
  isShellLess: (path: string) => boolean;
45
+ /**
46
+ * ★ BOFF-8060 (N4): who started it. Absent means the assistant, which the
47
+ * navigator refuses while the page holds unsaved changes; only a tap the
48
+ * person made on an "Open {page}" link passes `"person"`.
49
+ */
50
+ initiator?: AssistantNavigateInitiator;
37
51
  }
38
52
  /** Poll interval, quiet window and ceiling (ms). */
39
53
  export declare const NAVIGATION_POLL_MS = 50;
@@ -1 +1 @@
1
- {"version":3,"file":"navigationOutcome.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/navigationOutcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,iCAAiC,CAAC;AAGlG;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,cAAc,GAAG,WAAW,CAAC;AAEjF,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAE9B,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,qGAAqG;IACrG,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,oEAAoE;IACpE,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACxC;AAED,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AA2BD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,GAAG,IAAI,EAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAwC5B"}
1
+ {"version":3,"file":"navigationOutcome.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/navigationOutcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAE3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,cAAc,GAAG,WAAW,CAAC;AAEjF,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE;AACvB;;;;GAIG;GACD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAE9B,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,qGAAqG;IACrG,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,oEAAoE;IACpE,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,0BAA0B,CAAC;CACxC;AAED,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AA2BD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,GAAG,IAAI,EAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,iBAAiB,CAAC,CA4C5B"}
@@ -28,14 +28,18 @@ function o(e, t, n) {
28
28
  });
29
29
  let r = n.readPath(), i;
30
30
  try {
31
- i = e(t);
31
+ i = e(t, n.initiator ?? "assistant");
32
32
  } catch {
33
33
  return Promise.resolve({
34
34
  status: "refused",
35
35
  reason: "not-routable"
36
36
  });
37
37
  }
38
- return i && i.kind === "new-tab" ? Promise.resolve({ status: "new-tab" }) : i && i.kind === "refused" ? Promise.resolve({
38
+ return i && i.kind === "new-tab" ? Promise.resolve({ status: "new-tab" }) : i && i.kind === "refused" ? Promise.resolve(i.unsaved && i.unsaved.length > 0 ? {
39
+ status: "refused",
40
+ reason: i.reason,
41
+ unsaved: i.unsaved
42
+ } : {
39
43
  status: "refused",
40
44
  reason: i.reason
41
45
  }) : new Promise((e) => {
@@ -0,0 +1,39 @@
1
+ import { AssistantConversationStatus } from '../conversation';
2
+ import { SurfaceMessage } from './linkContext';
3
+ import { UiOfferSession, UiOfferYesInput, UiOfferYesState } from './uiOffers';
4
+ /**
5
+ * ★ BOFF-8060 (N3, design §6): what a bare "yes" could mean NOW, read from the
6
+ * conversation as the panel holds it — the chat area's `offerYesNow` and the
7
+ * frozen blind corpus (`offerAcceptCorpus.json`) both go through here, so the
8
+ * corpus measures the composition that ships, not a copy of it.
9
+ *
10
+ * - Y3: the newest assistant reply of the surface the "yes" came from (the chat
11
+ * thread for a typed one, that voice session for a spoken one), and only
12
+ * while no person message came after it there (`latestReplyOnSurface`).
13
+ * - A reply still being written has no settled offer: a turn in flight for it
14
+ * answers `none` ("ok go ahead" while the model works is forwarded).
15
+ * - Everything else is `offerYesState` (Y1, Y2, Y4–Y6), over what the person
16
+ * SAW of the reply (`displayedText`, for Y5).
17
+ *
18
+ * Pure: no React, no store, no DOM.
19
+ */
20
+ export interface UiOfferYesOnSurfaceInput<T extends SurfaceMessage> extends Omit<UiOfferYesInput, "newestReply"> {
21
+ /** The open conversation's messages, oldest first. */
22
+ messages: readonly T[];
23
+ /** The voice session a spoken "yes" came from; undefined for a typed one. */
24
+ voiceSessionId: string | undefined;
25
+ /** The conversation's turn state, when it has one. */
26
+ processing: {
27
+ status: AssistantConversationStatus;
28
+ messageId: string | null;
29
+ } | null | undefined;
30
+ /** What the person saw of a reply (the projection both surfaces render). */
31
+ displayedText: (reply: T) => string;
32
+ }
33
+ export interface UiOfferYesOnSurface<T extends SurfaceMessage> {
34
+ state: UiOfferYesState;
35
+ /** The reply that was read, when the state could be anything but `none`. */
36
+ reply: T | null;
37
+ }
38
+ export declare function offerYesOnSurface<T extends SurfaceMessage>(session: UiOfferSession, input: UiOfferYesOnSurfaceInput<T>): UiOfferYesOnSurface<T>;
39
+ //# sourceMappingURL=offerYesOnSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offerYesOnSurface.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/offerYesOnSurface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,cAAc,CAChE,SAAQ,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC;IAC5C,sDAAsD;IACtD,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;IACvB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,sDAAsD;IACtD,UAAU,EACN;QACE,MAAM,EAAE,2BAA2B,CAAC;QACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GACD,IAAI,GACJ,SAAS,CAAC;IACd,4EAA4E;IAC5E,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,cAAc;IAC3D,KAAK,EAAE,eAAe,CAAC;IACvB,4EAA4E;IAC5E,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,cAAc,EACxD,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,GACjC,mBAAmB,CAAC,CAAC,CAAC,CAoBxB"}
@@ -0,0 +1,34 @@
1
+ import { offerYesState as e } from "./uiOffers.js";
2
+ import { isTurnInFlight as t } from "../turnState.js";
3
+ import { latestReplyOnSurface as n } from "./linkContext.js";
4
+ //#region src/shared/assistant/uiActions/offerYesOnSurface.ts
5
+ function r(r, i) {
6
+ let a = n(i.messages, i.voiceSessionId);
7
+ if (!a) return {
8
+ state: "none",
9
+ reply: null
10
+ };
11
+ let { processing: o } = i;
12
+ if (o && o.messageId === a.id && t(o.status)) return {
13
+ state: "none",
14
+ reply: null
15
+ };
16
+ let s = e(r, {
17
+ registry: i.registry,
18
+ actorId: i.actorId,
19
+ conversationId: i.conversationId,
20
+ perfNow: i.perfNow,
21
+ newestReply: {
22
+ id: a.id,
23
+ text: i.displayedText(a)
24
+ },
25
+ productWriteApproval: i.productWriteApproval,
26
+ capabilitiesOf: i.capabilitiesOf
27
+ });
28
+ return {
29
+ state: s,
30
+ reply: s === "none" ? null : a
31
+ };
32
+ }
33
+ //#endregion
34
+ export { r as offerYesOnSurface };
@@ -23,8 +23,22 @@ export interface AssistantUiCatalogue {
23
23
  }
24
24
  export declare const UI_CATALOGUE_MAX_ENTRIES = 120;
25
25
  export declare const UI_CATALOGUE_MAX_BYTES: number;
26
+ /** The key of one sandbox session, as `uiCatalogueSent` and `markUiCatalogueSent` read it. */
27
+ export declare function uiCatalogueSessionKey(sandboxId: string, sessionId: string): string;
28
+ /** A catalogue was delivered to this sandbox session in this page. */
29
+ export declare function uiCatalogueSent(sessionKey: string): boolean;
30
+ /** Record a prompt that carried a catalogue as sent (the oldest key goes past the bound). */
31
+ export declare function markUiCatalogueSent(sessionKey: string): void;
32
+ /** Forget every session (a fresh page's state; the tests start from it). */
33
+ export declare function forgetSentUiCatalogues(): void;
26
34
  export declare function buildUiCatalogue(destinations: readonly LocalDestination[], gate: {
27
35
  permissionsSettled: boolean;
28
36
  simulating: boolean;
37
+ /**
38
+ * A catalogue was already sent to this sandbox session
39
+ * (`uiCatalogueSent`). Only then does a settled, real, EMPTY menu produce
40
+ * `{v:1, entries:[]}` — the replacement for the stale list (RV-1).
41
+ */
42
+ sentBefore?: boolean;
29
43
  }): AssistantUiCatalogue | null;
30
44
  //# sourceMappingURL=uiCatalogue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uiCatalogue.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/uiCatalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,EAAE,CAAC,CAAC;IACL,OAAO,EAAE,yBAAyB,EAAE,CAAC;CACtC;AAED,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,sBAAsB,QAAW,CAAC;AAK/C,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,SAAS,gBAAgB,EAAE,EACzC,IAAI,EAAE;IAAE,kBAAkB,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,GACzD,oBAAoB,GAAG,IAAI,CAkB7B"}
1
+ {"version":3,"file":"uiCatalogue.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/uiActions/uiCatalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,EAAE,CAAC,CAAC;IACL,OAAO,EAAE,yBAAyB,EAAE,CAAC;CACtC;AAED,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,sBAAsB,QAAW,CAAC;AAiB/C,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ5D;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,SAAS,gBAAgB,EAAE,EACzC,IAAI,EAAE;IACJ,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,oBAAoB,GAAG,IAAI,CAoB7B"}
@@ -1,7 +1,27 @@
1
1
  //#region src/shared/assistant/uiActions/uiCatalogue.ts
2
- var e = 120, t = 8 * 1024, n = (e) => new TextEncoder().encode(JSON.stringify(e)).length;
3
- function r(e, t) {
2
+ var e = 120, t = 8 * 1024, n = (e) => new TextEncoder().encode(JSON.stringify(e)).length, r = /* @__PURE__ */ new Set(), i = 64;
3
+ function a(e, t) {
4
+ return `${e}\n${t}`;
5
+ }
6
+ function o(e) {
7
+ return r.has(e);
8
+ }
9
+ function s(e) {
10
+ for (r.delete(e), r.add(e); r.size > i;) {
11
+ let e = r.values().next().value;
12
+ if (e === void 0) break;
13
+ r.delete(e);
14
+ }
15
+ }
16
+ function c() {
17
+ r.clear();
18
+ }
19
+ function l(e, t) {
4
20
  if (!t.permissionsSettled || t.simulating) return null;
21
+ if (e.length === 0) return t.sentBefore === !0 ? {
22
+ v: 1,
23
+ entries: []
24
+ } : null;
5
25
  let r = [];
6
26
  for (let t of e.slice(0, 120)) r.push({
7
27
  id: t.id,
@@ -19,4 +39,4 @@ function r(e, t) {
19
39
  } : null;
20
40
  }
21
41
  //#endregion
22
- export { t as UI_CATALOGUE_MAX_BYTES, e as UI_CATALOGUE_MAX_ENTRIES, r as buildUiCatalogue };
42
+ export { t as UI_CATALOGUE_MAX_BYTES, e as UI_CATALOGUE_MAX_ENTRIES, l as buildUiCatalogue, c as forgetSentUiCatalogues, s as markUiCatalogueSent, o as uiCatalogueSent, a as uiCatalogueSessionKey };