@burdenoff/fe-libs 2026.1004.4 → 2026.1004.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 (105) hide show
  1. package/dist/chrome/ContextSwitcher.d.ts.map +1 -1
  2. package/dist/chrome/ContextSwitcher.js +73 -50
  3. package/dist/chrome/GlobalSearch.d.ts.map +1 -1
  4. package/dist/chrome/GlobalSearch.js +76 -72
  5. package/dist/chrome/LanguageSwitcher.d.ts.map +1 -1
  6. package/dist/chrome/LanguageSwitcher.js +61 -40
  7. package/dist/chrome/NotificationCenter.d.ts.map +1 -1
  8. package/dist/chrome/NotificationCenter.js +71 -68
  9. package/dist/chrome/ProfileSwitcher.d.ts.map +1 -1
  10. package/dist/chrome/ProfileSwitcher.js +87 -81
  11. package/dist/chrome/SideNavigation.d.ts.map +1 -1
  12. package/dist/chrome/SideNavigation.js +120 -76
  13. package/dist/shared/assistant/appControls/copy.d.ts +12 -0
  14. package/dist/shared/assistant/appControls/copy.d.ts.map +1 -0
  15. package/dist/shared/assistant/appControls/copy.js +98 -0
  16. package/dist/shared/assistant/appControls/grammar.d.ts +102 -0
  17. package/dist/shared/assistant/appControls/grammar.d.ts.map +1 -0
  18. package/dist/shared/assistant/appControls/grammar.js +236 -0
  19. package/dist/shared/assistant/appControls/languages.d.ts +6 -0
  20. package/dist/shared/assistant/appControls/languages.d.ts.map +1 -0
  21. package/dist/shared/assistant/appControls/languages.js +52 -0
  22. package/dist/shared/assistant/appControls/names.d.ts +22 -0
  23. package/dist/shared/assistant/appControls/names.d.ts.map +1 -0
  24. package/dist/shared/assistant/appControls/names.js +29 -0
  25. package/dist/shared/assistant/appControls/pageAdapters.d.ts +59 -0
  26. package/dist/shared/assistant/appControls/pageAdapters.d.ts.map +1 -0
  27. package/dist/shared/assistant/appControls/pageAdapters.js +87 -0
  28. package/dist/shared/assistant/appControls/plan.d.ts +148 -0
  29. package/dist/shared/assistant/appControls/plan.d.ts.map +1 -0
  30. package/dist/shared/assistant/appControls/plan.js +511 -0
  31. package/dist/shared/assistant/appControls/registry.d.ts +9 -0
  32. package/dist/shared/assistant/appControls/registry.d.ts.map +1 -0
  33. package/dist/shared/assistant/appControls/registry.js +38 -0
  34. package/dist/shared/assistant/appControls/snapshot.d.ts +42 -0
  35. package/dist/shared/assistant/appControls/snapshot.d.ts.map +1 -0
  36. package/dist/shared/assistant/appControls/snapshot.js +40 -0
  37. package/dist/shared/assistant/appControls/text.d.ts +7 -0
  38. package/dist/shared/assistant/appControls/text.d.ts.map +1 -0
  39. package/dist/shared/assistant/appControls/text.js +6 -0
  40. package/dist/shared/assistant/appControls/types.d.ts +183 -0
  41. package/dist/shared/assistant/appControls/types.d.ts.map +1 -0
  42. package/dist/shared/assistant/appControls/types.js +25 -0
  43. package/dist/shared/assistant/appControls/useAssistantControl.d.ts +24 -0
  44. package/dist/shared/assistant/appControls/useAssistantControl.d.ts.map +1 -0
  45. package/dist/shared/assistant/appControls/useAssistantControl.js +13 -0
  46. package/dist/shared/assistant/conversation.d.ts +12 -1
  47. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  48. package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -1
  49. package/dist/shared/assistant/history/historyMapping.js +130 -114
  50. package/dist/shared/assistant/i18nManifest.d.ts +74 -0
  51. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  52. package/dist/shared/assistant/i18nManifest.js +86 -12
  53. package/dist/shared/assistant/index.d.ts +16 -0
  54. package/dist/shared/assistant/index.d.ts.map +1 -1
  55. package/dist/shared/assistant/localUiCommandCopy.d.ts +7 -0
  56. package/dist/shared/assistant/localUiCommandCopy.d.ts.map +1 -1
  57. package/dist/shared/assistant/localUiCommandCopy.js +1 -1
  58. package/dist/shared/assistant/localUiCommands.d.ts +16 -0
  59. package/dist/shared/assistant/localUiCommands.d.ts.map +1 -1
  60. package/dist/shared/assistant/localUiCommands.js +92 -84
  61. package/dist/shared/assistant/store.d.ts +10 -0
  62. package/dist/shared/assistant/store.d.ts.map +1 -1
  63. package/dist/shared/assistant/store.js +52 -44
  64. package/dist/shared/assistant/ui/AIAssistantPanel.d.ts.map +1 -1
  65. package/dist/shared/assistant/ui/AIAssistantPanel.js +57 -49
  66. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  67. package/dist/shared/assistant/ui/AssistantChatArea.js +1085 -1016
  68. package/dist/shared/assistant/ui/AssistantControlConfirmDialog.d.ts +38 -0
  69. package/dist/shared/assistant/ui/AssistantControlConfirmDialog.d.ts.map +1 -0
  70. package/dist/shared/assistant/ui/AssistantControlConfirmDialog.js +65 -0
  71. package/dist/shared/assistant/ui/AssistantMoreMenu.d.ts.map +1 -1
  72. package/dist/shared/assistant/ui/AssistantMoreMenu.js +58 -56
  73. package/dist/shared/assistant/ui/AssistantSpeechProvider.d.ts.map +1 -1
  74. package/dist/shared/assistant/ui/AssistantSpeechProvider.js +106 -105
  75. package/dist/shared/assistant/ui/composer/AssistantVoiceGraceSelector.d.ts +20 -0
  76. package/dist/shared/assistant/ui/composer/AssistantVoiceGraceSelector.d.ts.map +1 -0
  77. package/dist/shared/assistant/ui/composer/AssistantVoiceGraceSelector.js +39 -0
  78. package/dist/shared/assistant/ui/controlConfirmDialog.d.ts +30 -0
  79. package/dist/shared/assistant/ui/controlConfirmDialog.d.ts.map +1 -0
  80. package/dist/shared/assistant/ui/controlConfirmDialog.js +46 -0
  81. package/dist/shared/assistant/ui/useVoiceSession.d.ts +35 -2
  82. package/dist/shared/assistant/ui/useVoiceSession.d.ts.map +1 -1
  83. package/dist/shared/assistant/ui/useVoiceSession.js +232 -171
  84. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +15 -1
  85. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  86. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +173 -150
  87. package/dist/shared/assistant/voice/handsFree.d.ts +160 -0
  88. package/dist/shared/assistant/voice/handsFree.d.ts.map +1 -0
  89. package/dist/shared/assistant/voice/handsFree.js +104 -0
  90. package/dist/shared/assistant/voice/supersededTurns.d.ts +29 -0
  91. package/dist/shared/assistant/voice/supersededTurns.d.ts.map +1 -0
  92. package/dist/shared/assistant/voice/supersededTurns.js +17 -0
  93. package/dist/shared/assistant/voice/useVoiceInput.d.ts +7 -0
  94. package/dist/shared/assistant/voice/useVoiceInput.d.ts.map +1 -1
  95. package/dist/shared/assistant/voice/useVoiceInput.js +13 -10
  96. package/dist/shared/assistant/voice/voiceSession.d.ts +64 -20
  97. package/dist/shared/assistant/voice/voiceSession.d.ts.map +1 -1
  98. package/dist/shared/assistant/voice/voiceSession.js +120 -67
  99. package/dist/shared/components/KeyboardHelpDialogWrapper.d.ts.map +1 -1
  100. package/dist/shared/components/KeyboardHelpDialogWrapper.js +11 -9
  101. package/dist/shared/providers/shell/GlobalUiProvider.d.ts +2 -0
  102. package/dist/shared/providers/shell/GlobalUiProvider.d.ts.map +1 -1
  103. package/dist/shared/providers/shell/GlobalUiProvider.js +4 -1
  104. package/dist/shared-assistant.js +219 -203
  105. package/package.json +1 -1
@@ -1,46 +1,90 @@
1
1
  import { Tooltip as e, TooltipContent as t, TooltipProvider as n, TooltipTrigger as r } from "../ui/tooltip.js";
2
- import { useShellLabel as i } from "../shared/providers/shell/useShellLabel.js";
3
- import { NavItemRenderer as a } from "./sideNavigation/NavItemRenderer.js";
4
- import { SidebarHeader as o } from "./sideNavigation/SidebarHeader.js";
5
- import { MobileActionsBar as s } from "./sideNavigation/MobileActionsBar.js";
6
- import { useSideNavigationState as c } from "./sideNavigation/useSideNavigationState.js";
7
- import { useRef as l } from "react";
8
- import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
2
+ import { useAssistantControl as i } from "../shared/assistant/appControls/useAssistantControl.js";
3
+ import { useShellLabel as a } from "../shared/providers/shell/useShellLabel.js";
4
+ import "./sideNavigation/navVisibility.js";
5
+ import { NavItemRenderer as o } from "./sideNavigation/NavItemRenderer.js";
6
+ import { SidebarHeader as s } from "./sideNavigation/SidebarHeader.js";
7
+ import { MobileActionsBar as c } from "./sideNavigation/MobileActionsBar.js";
8
+ import { useSideNavigationState as l } from "./sideNavigation/useSideNavigationState.js";
9
+ import { useMemo as u, useRef as d } from "react";
10
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
9
11
  //#region src/chrome/SideNavigation.tsx
10
- var p = ({ items: p, currentPath: m, collapsed: h = !1, onItemClick: g, onToggleCollapse: _, collapseLabel: v, header: y, footer: b, mobileActions: x, groupOrder: S, groupLabels: C, maxDepth: w = 4, contextSearchParams: T }) => {
11
- let E = l(null), { expandedItems: D, toggleExpand: O, collapseAll: k } = c({
12
- items: p,
13
- currentPath: m,
14
- collapsed: h,
15
- onToggleCollapse: _,
16
- navRef: E
17
- }), A = i(), j = v ?? A("nav.collapse", "Collapse"), M = A("nav.expand", "Expand"), N = p.filter((e) => e.visible !== !1), P = (() => {
18
- if (h) return [{
12
+ var h = ({ items: h, currentPath: g, collapsed: _ = !1, onItemClick: v, onToggleCollapse: y, collapseLabel: b, header: x, footer: S, mobileActions: C, groupOrder: w, groupLabels: T, maxDepth: E = 4, contextSearchParams: D }) => {
13
+ let O = d(null), { expandedItems: k, toggleExpand: A, collapseAll: j } = l({
14
+ items: h,
15
+ currentPath: g,
16
+ collapsed: _,
17
+ onToggleCollapse: y,
18
+ navRef: O
19
+ }), M = d({
20
+ items: h,
21
+ collapsed: _,
22
+ onToggleCollapse: y,
23
+ expandedItems: k,
24
+ toggleExpand: A
25
+ });
26
+ M.current = {
27
+ items: h,
28
+ collapsed: _,
29
+ onToggleCollapse: y,
30
+ expandedItems: k,
31
+ toggleExpand: A
32
+ };
33
+ let N = y !== void 0;
34
+ i("sidebar", u(() => N ? {
35
+ collapsed: () => M.current.collapsed,
36
+ setCollapsed: (e) => {
37
+ let t = M.current;
38
+ return t.collapsed === e ? { status: "already" } : (t.onToggleCollapse?.(), { status: "done" });
39
+ },
40
+ entries: () => {
41
+ let e = M.current;
42
+ if (e.collapsed) return [];
43
+ let t = [], n = (r) => {
44
+ for (let i of r) {
45
+ if (i.visible === !1 || i.id.startsWith("__nav_more__:")) continue;
46
+ let r = i.children?.filter((e) => e.visible !== !1) ?? [];
47
+ r.length > 0 && (t.push({
48
+ id: i.id,
49
+ label: i.label,
50
+ expanded: e.expandedItems.has(i.id)
51
+ }), n(r));
52
+ }
53
+ };
54
+ return n(e.items), t;
55
+ },
56
+ setExpanded: (e, t) => {
57
+ let n = M.current;
58
+ return n.expandedItems.has(e) === t ? { status: "already" } : (n.toggleExpand(e), { status: "done" });
59
+ }
60
+ } : null, [N]));
61
+ let P = a(), F = b ?? P("nav.collapse", "Collapse"), I = P("nav.expand", "Expand"), L = h.filter((e) => e.visible !== !1), R = (() => {
62
+ if (_) return [{
19
63
  id: "__all__",
20
64
  label: null,
21
- items: N
65
+ items: L
22
66
  }];
23
67
  let e = /* @__PURE__ */ new Map();
24
- for (let t of N) {
68
+ for (let t of L) {
25
69
  let n = t.group ?? "__default__", r = e.get(n);
26
70
  r ? r.push(t) : e.set(n, [t]);
27
71
  }
28
- return [...S ?? [], ...Array.from(e.keys()).filter((e) => !(S ?? []).includes(e))].filter((t) => (e.get(t)?.length ?? 0) > 0).map((t) => ({
72
+ return [...w ?? [], ...Array.from(e.keys()).filter((e) => !(w ?? []).includes(e))].filter((t) => (e.get(t)?.length ?? 0) > 0).map((t) => ({
29
73
  id: t,
30
- label: t === "__default__" ? null : C?.[t] ?? t,
74
+ label: t === "__default__" ? null : T?.[t] ?? t,
31
75
  items: e.get(t) ?? []
32
76
  }));
33
77
  })();
34
- return /* @__PURE__ */ f(u, { children: [!h && /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d("div", {
78
+ return /* @__PURE__ */ m(f, { children: [!_ && /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("div", {
35
79
  className: "fixed inset-0 bg-bg-overlay z-[109] md:hidden",
36
80
  "aria-hidden": "true"
37
- }), /* @__PURE__ */ d("button", {
81
+ }), /* @__PURE__ */ p("button", {
38
82
  type: "button",
39
83
  className: "fixed inset-y-0 right-0 left-64 z-[112] md:hidden cursor-pointer",
40
- onClick: _,
84
+ onClick: y,
41
85
  "aria-label": "Close sidebar"
42
- })] }), /* @__PURE__ */ f("aside", {
43
- ref: E,
86
+ })] }), /* @__PURE__ */ m("aside", {
87
+ ref: O,
44
88
  className: `
45
89
  bg-bg-canvas supports-[backdrop-filter]:bg-[var(--color-surface-glass)] supports-[backdrop-filter]:backdrop-blur-[var(--blur-glass)]
46
90
  border-r border-border-seam
@@ -51,28 +95,28 @@ var p = ({ items: p, currentPath: m, collapsed: h = !1, onItemClick: g, onToggle
51
95
  z-[110] md:z-auto
52
96
  md:h-full
53
97
  overflow-x-hidden
54
- ${h ? "-translate-x-full md:translate-x-0" : "translate-x-0"}
98
+ ${_ ? "-translate-x-full md:translate-x-0" : "translate-x-0"}
55
99
  w-64 md:w-auto
56
- ${h ? "md:w-16" : "md:w-64"}
100
+ ${_ ? "md:w-16" : "md:w-64"}
57
101
  `,
58
102
  style: {
59
103
  paddingTop: "env(safe-area-inset-top)",
60
104
  paddingBottom: "env(safe-area-inset-bottom)"
61
105
  },
62
106
  children: [
63
- !h && _ && /* @__PURE__ */ d("div", {
107
+ !_ && y && /* @__PURE__ */ p("div", {
64
108
  className: "md:hidden flex justify-end px-2 pt-2",
65
- children: /* @__PURE__ */ d("button", {
109
+ children: /* @__PURE__ */ p("button", {
66
110
  type: "button",
67
- onClick: _,
111
+ onClick: y,
68
112
  className: "p-2 rounded-button hover:bg-bg-sunken text-text-secondary hover:text-text-primary transition-colors",
69
113
  "aria-label": "Close sidebar",
70
- children: /* @__PURE__ */ d("svg", {
114
+ children: /* @__PURE__ */ p("svg", {
71
115
  className: "size-5",
72
116
  fill: "none",
73
117
  stroke: "currentColor",
74
118
  viewBox: "0 0 24 24",
75
- children: /* @__PURE__ */ d("path", {
119
+ children: /* @__PURE__ */ p("path", {
76
120
  strokeLinecap: "round",
77
121
  strokeLinejoin: "round",
78
122
  strokeWidth: 2,
@@ -81,62 +125,62 @@ var p = ({ items: p, currentPath: m, collapsed: h = !1, onItemClick: g, onToggle
81
125
  })
82
126
  })
83
127
  }),
84
- (y || _) && /* @__PURE__ */ d(o, {
85
- header: y,
86
- collapsed: h,
87
- expandedCount: D.size,
88
- onCollapseAll: k,
89
- onToggleCollapse: _,
90
- collapseLabel: j,
91
- expandLabel: M
128
+ (x || y) && /* @__PURE__ */ p(s, {
129
+ header: x,
130
+ collapsed: _,
131
+ expandedCount: k.size,
132
+ onCollapseAll: j,
133
+ onToggleCollapse: y,
134
+ collapseLabel: F,
135
+ expandLabel: I
92
136
  }),
93
- /* @__PURE__ */ d("nav", {
137
+ /* @__PURE__ */ p("nav", {
94
138
  className: "scrollbar-slim scrollbar-hover-only flex-1 min-h-0 py-card-padding overflow-y-auto overflow-x-hidden",
95
- children: /* @__PURE__ */ d(n, {
139
+ children: /* @__PURE__ */ p(n, {
96
140
  delayDuration: 300,
97
- children: /* @__PURE__ */ d("ul", {
141
+ children: /* @__PURE__ */ p("ul", {
98
142
  className: "space-y-list-gap",
99
- children: P.map((n, i) => /* @__PURE__ */ f("li", {
143
+ children: R.map((n, i) => /* @__PURE__ */ m("li", {
100
144
  className: "list-none",
101
145
  children: [
102
- i > 0 && !h && /* @__PURE__ */ d("div", { className: "my-2 border-t border-border-subtle" }),
103
- n.label && !h && /* @__PURE__ */ d("p", {
146
+ i > 0 && !_ && /* @__PURE__ */ p("div", { className: "my-2 border-t border-border-subtle" }),
147
+ n.label && !_ && /* @__PURE__ */ p("p", {
104
148
  className: "px-3 pb-1.5 pt-0.5 text-[11px] font-medium uppercase tracking-wider text-text-muted",
105
149
  children: n.label
106
150
  }),
107
- /* @__PURE__ */ d("ul", {
151
+ /* @__PURE__ */ p("ul", {
108
152
  className: "space-y-list-gap",
109
- children: n.items.map((n) => h ? /* @__PURE__ */ f(e, { children: [/* @__PURE__ */ d(r, {
153
+ children: n.items.map((n) => _ ? /* @__PURE__ */ m(e, { children: [/* @__PURE__ */ p(r, {
110
154
  asChild: !0,
111
- children: /* @__PURE__ */ d(a, {
155
+ children: /* @__PURE__ */ p(o, {
112
156
  item: n,
113
157
  depth: 0,
114
- maxDepth: w,
115
- currentPath: m,
116
- expandedItems: D,
117
- toggleExpand: O,
118
- onItemClick: g,
119
- onToggleCollapse: _,
120
- collapsed: h,
121
- contextSearchParams: T
158
+ maxDepth: E,
159
+ currentPath: g,
160
+ expandedItems: k,
161
+ toggleExpand: A,
162
+ onItemClick: v,
163
+ onToggleCollapse: y,
164
+ collapsed: _,
165
+ contextSearchParams: D
122
166
  })
123
- }), /* @__PURE__ */ f(t, {
167
+ }), /* @__PURE__ */ m(t, {
124
168
  side: "right",
125
- children: [/* @__PURE__ */ d("p", { children: n.label }), n.badge !== void 0 && n.badge > 0 && /* @__PURE__ */ d("span", {
169
+ children: [/* @__PURE__ */ p("p", { children: n.label }), n.badge !== void 0 && n.badge > 0 && /* @__PURE__ */ p("span", {
126
170
  className: "ml-2 text-xs bg-status-error-bg-subtle text-status-error-text px-2 py-0.5 rounded-full",
127
171
  children: n.badge
128
172
  })]
129
- })] }, n.id) : /* @__PURE__ */ d(a, {
173
+ })] }, n.id) : /* @__PURE__ */ p(o, {
130
174
  item: n,
131
175
  depth: 0,
132
- maxDepth: w,
133
- currentPath: m,
134
- expandedItems: D,
135
- toggleExpand: O,
136
- onItemClick: g,
137
- onToggleCollapse: _,
138
- collapsed: h,
139
- contextSearchParams: T
176
+ maxDepth: E,
177
+ currentPath: g,
178
+ expandedItems: k,
179
+ toggleExpand: A,
180
+ onItemClick: v,
181
+ onToggleCollapse: y,
182
+ collapsed: _,
183
+ contextSearchParams: D
140
184
  }, n.id))
141
185
  })
142
186
  ]
@@ -144,17 +188,17 @@ var p = ({ items: p, currentPath: m, collapsed: h = !1, onItemClick: g, onToggle
144
188
  })
145
189
  })
146
190
  }),
147
- b && /* @__PURE__ */ d("div", {
148
- className: `py-card-padding border-t border-border-subtle ${h ? "md:px-2" : "px-card-padding"}`,
149
- children: b
191
+ S && /* @__PURE__ */ p("div", {
192
+ className: `py-card-padding border-t border-border-subtle ${_ ? "md:px-2" : "px-card-padding"}`,
193
+ children: S
150
194
  }),
151
- x && x.length > 0 && /* @__PURE__ */ d(s, {
152
- actions: x,
153
- collapsed: h,
154
- onToggleCollapse: _
195
+ C && C.length > 0 && /* @__PURE__ */ p(c, {
196
+ actions: C,
197
+ collapsed: _,
198
+ onToggleCollapse: y
155
199
  })
156
200
  ]
157
201
  })] });
158
202
  };
159
203
  //#endregion
160
- export { p as SideNavigation };
204
+ export { h as SideNavigation };
@@ -0,0 +1,12 @@
1
+ import { AssistantTr } from '../i18n';
2
+ import { LocalCommandCopy } from '../localUiCommandCopy';
3
+ import { ConfirmPrompt, ControlReply } from './plan';
4
+ export declare function appControlCopy(tr: AssistantTr, reply: ControlReply): LocalCommandCopy;
5
+ /** The confirmation dialog's words for a stronger-confirmation control. */
6
+ export interface ConfirmDialogCopy {
7
+ title: string;
8
+ body: string;
9
+ confirm: string;
10
+ }
11
+ export declare function confirmDialogCopy(tr: AssistantTr, prompt: ConfirmPrompt): ConfirmDialogCopy;
12
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/appControls/copy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAEV,aAAa,EACb,YAAY,EAEb,MAAM,QAAQ,CAAC;AAuFhB,wBAAgB,cAAc,CAC5B,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,YAAY,GAClB,gBAAgB,CAsdlB;AAED,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,aAAa,GACpB,iBAAiB,CAqBnB"}
@@ -0,0 +1,98 @@
1
+ import { interpolate as e } from "../../providers/shell/interpolate.js";
2
+ import { markdownText as t } from "../localUiCommandCopy.js";
3
+ //#region src/shared/assistant/appControls/copy.ts
4
+ var n = (t, n) => e(t, n);
5
+ function r(e, t) {
6
+ let n = e.every(([e, t]) => e !== t);
7
+ return {
8
+ text: t(e.map(([e, t]) => n ? e : t)),
9
+ translated: n
10
+ };
11
+ }
12
+ var i = (e) => e.map(t).join(", "), a = (e, t) => {
13
+ switch (t) {
14
+ case "notifications": return [e("appControl.opened.notifications", "Opened your notifications."), "Opened your notifications."];
15
+ case "help": return [e("appControl.opened.help", "Opened help and keyboard shortcuts."), "Opened help and keyboard shortcuts."];
16
+ case "context": return [e("appControl.opened.context", "Opened the workspace switcher."), "Opened the workspace switcher."];
17
+ case "history": return [e("appControl.opened.history", "Opened your conversation history."), "Opened your conversation history."];
18
+ case "transcript": return [e("appControl.opened.transcript", "Opened the voice transcript."), "Opened the voice transcript."];
19
+ case "preview": return [e("appControl.opened.preview", "Opened the AI preview."), "Opened the AI preview."];
20
+ case "conversation": return [e("appControl.opened.conversation", "Started a new conversation."), "Started a new conversation."];
21
+ }
22
+ }, o = (e, t) => {
23
+ switch (t) {
24
+ case "tab": return [e("appControl.what.tab", "tab"), "tab"];
25
+ case "filter": return [e("appControl.what.filter", "filter option"), "filter option"];
26
+ case "menu": return [e("appControl.what.menu", "menu"), "menu"];
27
+ case "workspace": return [e("appControl.what.workspace", "workspace"), "workspace"];
28
+ case "column": return [e("appControl.what.column", "column"), "column"];
29
+ case "form": return [e("appControl.what.form", "form"), "form"];
30
+ }
31
+ };
32
+ function s(e, s) {
33
+ switch (s.code) {
34
+ case "opened": return r([a(e, s.what)], ([e]) => e ?? "");
35
+ case "search-opened": return s.query === null ? r([[e("appControl.searchOpened", "Opened search."), "Opened search."]], ([e]) => e ?? "") : r([[e("appControl.searchOpenedFor", "Opened search for “{{query}}”."), "Opened search for “{{query}}”."]], ([e]) => n(e ?? "", { query: t(s.query ?? "") }));
36
+ case "sidebar": return r(s.already ? [s.collapsed ? [e("appControl.sidebarAlreadyCollapsed", "The sidebar is already collapsed."), "The sidebar is already collapsed."] : [e("appControl.sidebarAlreadyExpanded", "The sidebar is already expanded."), "The sidebar is already expanded."]] : [s.collapsed ? [e("appControl.sidebarCollapsed", "Collapsed the sidebar."), "Collapsed the sidebar."] : [e("appControl.sidebarExpanded", "Expanded the sidebar."), "Expanded the sidebar."]], ([e]) => e ?? "");
37
+ case "sidebar-entry": return r([s.already ? s.expanded ? [e("appControl.entryAlreadyExpanded", "{{name}} is already expanded."), "{{name}} is already expanded."] : [e("appControl.entryAlreadyCollapsed", "{{name}} is already collapsed."), "{{name}} is already collapsed."] : s.expanded ? [e("appControl.entryExpanded", "Expanded {{name}}."), "Expanded {{name}}."] : [e("appControl.entryCollapsed", "Collapsed {{name}}."), "Collapsed {{name}}."]], ([e]) => n(e ?? "", { name: t(s.name) }));
38
+ case "language": return s.already ? r([[e("appControl.languageAlready", "The app is already in {{language}}."), "The app is already in {{language}}."]], ([e]) => n(e ?? "", { language: t(s.label) })) : r([[e("appControl.languageSet", "The app language is now {{language}}. Assistant replies and voice keep their own settings."), "The app language is now {{language}}. Assistant replies and voice keep their own settings."]], ([e]) => n(e ?? "", { language: t(s.label) }));
39
+ case "language-not-offered": return r([[e("appControl.languageNotOffered", "{{language}} isn't one of the languages this app offers."), "{{language}} isn't one of the languages this app offers."]], ([e]) => n(e ?? "", { language: s.label }));
40
+ case "workspace-confirm": return r([[e("appControl.workspaceConfirm", "Switch to {{name}}? Nothing changes until you choose Switch on screen."), "Switch to {{name}}? Nothing changes until you choose Switch on screen."]], ([e]) => n(e ?? "", { name: t(s.name) }));
41
+ case "workspace-switched": return r([[e("appControl.workspaceSwitched", "Switching to {{name}}."), "Switching to {{name}}."]], ([e]) => n(e ?? "", { name: t(s.name) }));
42
+ case "workspace-already": return r([[e("appControl.workspaceAlready", "You're already in {{name}}."), "You're already in {{name}}."]], ([e]) => n(e ?? "", { name: t(s.name) }));
43
+ case "workspace-none": return r([[e("appControl.workspaceNone", "There is no other workspace to switch to."), "There is no other workspace to switch to."]], ([e]) => e ?? "");
44
+ case "logout-confirm": return r([[e("appControl.logoutConfirm", "Log out of your account? Nothing changes until you choose Log out on screen."), "Log out of your account? Nothing changes until you choose Log out on screen."]], ([e]) => e ?? "");
45
+ case "logout-done": return r([[e("appControl.logoutDone", "Logging you out."), "Logging you out."]], ([e]) => e ?? "");
46
+ case "tab": return r([s.already ? [e("appControl.tabAlready", "You're already on the {{name}} tab."), "You're already on the {{name}} tab."] : [e("appControl.tabOpened", "Opened the {{name}} tab."), "Opened the {{name}} tab."]], ([e]) => n(e ?? "", { name: t(s.name) }));
47
+ case "filter-set": return r([s.already ? [e("appControl.filterAlready", "{{filter}}: {{option}} is already on."), "{{filter}}: {{option}} is already on."] : [e("appControl.filterSet", "Filtered by {{filter}}: {{option}}."), "Filtered by {{filter}}: {{option}}."]], ([e]) => n(e ?? "", {
48
+ filter: t(s.filter),
49
+ option: t(s.option)
50
+ }));
51
+ case "filter-cleared": return s.filter === null ? r([[e("appControl.filtersCleared", "Cleared the filters."), "Cleared the filters."]], ([e]) => e ?? "") : r([[e("appControl.filterCleared", "Cleared the {{filter}} filter."), "Cleared the {{filter}} filter."]], ([e]) => n(e ?? "", { filter: t(s.filter ?? "") }));
52
+ case "sorted": {
53
+ let i = s.direction === "asc" ? [e("appControl.directionAsc", "ascending"), "ascending"] : [e("appControl.directionDesc", "descending"), "descending"];
54
+ return r([s.already ? [e("appControl.sortedAlready", "{{page}} is already sorted by {{field}}, {{direction}}."), "{{page}} is already sorted by {{field}}, {{direction}}."] : [e("appControl.sorted", "Sorted {{page}} by {{field}}, {{direction}}."), "Sorted {{page}} by {{field}}, {{direction}}."], i], ([e, r]) => n(e ?? "", {
55
+ page: t(s.page),
56
+ field: t(s.field),
57
+ direction: r ?? ""
58
+ }));
59
+ }
60
+ case "sort-needs-field": return r([[e("appControl.sortNeedsField", "Say which column to sort by."), "Say which column to sort by."]], ([e]) => e ?? "");
61
+ case "searched": return r([[e("appControl.searched", "Searched {{page}} for “{{query}}”."), "Searched {{page}} for “{{query}}”."]], ([e]) => n(e ?? "", {
62
+ page: t(s.page),
63
+ query: t(s.query)
64
+ }));
65
+ case "search-cleared": return r([[e("appControl.searchCleared", "Cleared the search."), "Cleared the search."]], ([e]) => e ?? "");
66
+ case "form-opened": return r([[e("appControl.formOpened", "Opened {{name}}. Nothing is saved until you submit it."), "Opened {{name}}. Nothing is saved until you submit it."]], ([e]) => n(e ?? "", { name: t(s.name) }));
67
+ case "not-found": return r([s.what === "tab" ? [e("appControl.notFound.tab", "There's no tab called “{{name}}” on {{page}}. Tabs: {{options}}."), "There's no tab called “{{name}}” on {{page}}. Tabs: {{options}}."] : s.what === "filter" ? [e("appControl.notFound.filter", "{{page}} has no filter option called “{{name}}”. Filters: {{options}}."), "{{page}} has no filter option called “{{name}}”. Filters: {{options}}."] : s.what === "filter-option" ? [e("appControl.notFound.filterOption", "The {{filter}} filter has no option called “{{name}}”. Options: {{options}}."), "The {{filter}} filter has no option called “{{name}}”. Options: {{options}}."] : s.what === "sort" ? [e("appControl.notFound.sort", "{{page}} can't be sorted by “{{name}}”. Columns: {{options}}."), "{{page}} can't be sorted by “{{name}}”. Columns: {{options}}."] : s.what === "form" ? [e("appControl.notFound.form", "There's no “{{name}}” form to open on {{page}}. Available: {{options}}."), "There's no “{{name}}” form to open on {{page}}. Available: {{options}}."] : [e("appControl.notFound.workspace", "I couldn't find a workspace called “{{name}}”. You can switch to: {{options}}."), "I couldn't find a workspace called “{{name}}”. You can switch to: {{options}}."]], ([e]) => n(e ?? "", {
68
+ page: t(s.page),
69
+ name: t(s.name),
70
+ options: i(s.options),
71
+ filter: t(s.filter ?? "")
72
+ }));
73
+ case "ambiguous": return r([[e("appControl.ambiguous", "More than one {{what}} matches “{{name}}”: {{options}}. Say which one."), "More than one {{what}} matches “{{name}}”: {{options}}. Say which one."], o(e, s.what)], ([e, r]) => n(e ?? "", {
74
+ what: r ?? "",
75
+ name: t(s.name),
76
+ options: i(s.options)
77
+ }));
78
+ case "filter-choose": return r([[e("appControl.filterChoose", "Which {{filter}}? Options: {{options}}."), "Which {{filter}}? Options: {{options}}."]], ([e]) => n(e ?? "", {
79
+ filter: t(s.filter),
80
+ options: i(s.options)
81
+ }));
82
+ case "failed": return r([[e("appControl.failed", "That didn't work. Nothing was changed."), "That didn't work. Nothing was changed."]], ([e]) => e ?? "");
83
+ case "blocked": return s.reason === "voice-session" ? r([[e("appControl.blockedVoice", "I can't open that while the voice screen is up. End the voice session, or use the button in the assistant's header."), "I can't open that while the voice screen is up. End the voice session, or use the button in the assistant's header."]], ([e]) => e ?? "") : r([[e("appControl.blockedPermission", "That isn't available to you here."), "That isn't available to you here."]], ([e]) => e ?? "");
84
+ }
85
+ }
86
+ function c(e, t) {
87
+ return t.kind === "logout" ? {
88
+ title: e("appControl.dialog.logoutTitle", "Log out?"),
89
+ body: e("appControl.dialog.logoutBody", "You'll be signed out of this account on this device."),
90
+ confirm: e("appControl.dialog.logoutConfirm", "Log out")
91
+ } : {
92
+ title: e("appControl.dialog.workspaceTitle", "Switch workspace?"),
93
+ body: n(e("appControl.dialog.workspaceBody", "You'll switch to {{name}}. The page may reload."), { name: t.name }),
94
+ confirm: e("appControl.dialog.workspaceConfirm", "Switch")
95
+ };
96
+ }
97
+ //#endregion
98
+ export { s as appControlCopy, c as confirmDialogCopy };
@@ -0,0 +1,102 @@
1
+ import { ControlSnapshot } from './snapshot';
2
+ import { SortDirection, UiLanguageCode } from './types';
3
+ /**
4
+ * ★ BOFF-8060: the grammar of the app-wide controls.
5
+ *
6
+ * Strict on purpose, for the same reason `localUiCommands` is: a miss costs
7
+ * only latency (the sentence goes to the model as before), but a false match
8
+ * operates the app on a sentence that meant something else. So:
9
+ *
10
+ * - the WHOLE utterance must be the command ("open notifications and mark them
11
+ * read" falls through);
12
+ * - a control is matched only when something REGISTERED it — no handler, no
13
+ * match, the model answers as it always did;
14
+ * - names (a tab, a filter option, a sidebar menu, a workspace) are the
15
+ * product's own labels, never guessed: a name that is not there is answered
16
+ * "there is no tab called …" by the plan, not by a model;
17
+ * - English only (the caller decides). A bare "yes"/"ok" never matches;
18
+ * - NOTHING here can match "submit", "save", "create", "delete", "approve" or
19
+ * "confirm": opening a form is UI navigation, filling it is draft
20
+ * preparation and submitting it is a business write with its own
21
+ * confirmation. The grammar has no rule for the last two, so no sentence can
22
+ * reach them through this door.
23
+ *
24
+ * `weak`: the sentence is also how a page is asked for ("open notifications"
25
+ * could be the sidebar's Notifications page). A weak match yields to a page the
26
+ * sidebar names; an explicit one ("open the notification bell") does not.
27
+ */
28
+ export type AppControlRequest = {
29
+ control: "header.notifications";
30
+ } | {
31
+ control: "header.search";
32
+ query: string | null;
33
+ } | {
34
+ control: "header.help";
35
+ } | {
36
+ control: "header.context";
37
+ } | {
38
+ control: "header.workspace";
39
+ target: string;
40
+ } | {
41
+ control: "account.logout";
42
+ } | {
43
+ control: "sidebar";
44
+ collapsed: boolean;
45
+ } | {
46
+ control: "sidebar.entry";
47
+ name: string;
48
+ expanded: boolean;
49
+ } | {
50
+ control: "language";
51
+ code: UiLanguageCode;
52
+ } | {
53
+ control: "assistant.history";
54
+ } | {
55
+ control: "assistant.transcript";
56
+ } | {
57
+ control: "assistant.preview";
58
+ } | {
59
+ control: "assistant.conversation.new";
60
+ } | {
61
+ control: "page.tab";
62
+ name: string;
63
+ } | {
64
+ control: "page.filter";
65
+ filter: string | null;
66
+ option: string;
67
+ } | {
68
+ control: "page.filter.clear";
69
+ filter: string | null;
70
+ } | {
71
+ control: "page.sort";
72
+ field: string | null;
73
+ direction: SortDirection | null;
74
+ } | {
75
+ control: "page.search";
76
+ query: string;
77
+ } | {
78
+ control: "page.search.clear";
79
+ } | {
80
+ control: "page.open";
81
+ name: string;
82
+ };
83
+ export interface AppControlMatch {
84
+ request: AppControlRequest;
85
+ weak: boolean;
86
+ }
87
+ /**
88
+ * The person's own words for a query the grammar found in the CANONICAL text,
89
+ * with their case and inner punctuation ("O'Brien", "a@b.com"). Found by
90
+ * aligning the canonical words in the original, last match first (the query is
91
+ * the tail of the sentence); the canonical text itself when it cannot be.
92
+ */
93
+ export declare function queryAsSaid(original: string, canonicalQuery: string): string;
94
+ /**
95
+ * The control this whole utterance is, or null to leave it to the next rule
96
+ * (and, in the end, the model).
97
+ *
98
+ * `utterance` is `normaliseUtterance(text)`; `original` is the text as typed or
99
+ * transcribed — queries keep the person's own case and punctuation.
100
+ */
101
+ export declare function matchAppControl(utterance: string, original: string, snapshot: ControlSnapshot): AppControlMatch | null;
102
+ //# sourceMappingURL=grammar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/appControls/grammar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,sBAAsB,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClD;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC7B;IAAE,OAAO,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC7B;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC1C;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7D;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAC7C;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAChC;IAAE,OAAO,EAAE,sBAAsB,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAChC;IAAE,OAAO,EAAE,4BAA4B,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,OAAO,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvD;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,GAC/E;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAChC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;CACf;AAYD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAW5E;AAiJD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,eAAe,GACxB,eAAe,GAAG,IAAI,CA0LxB"}