@consciousclouds/operator-shell 0.1.0

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 (145) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +194 -0
  3. package/README.md +319 -0
  4. package/dist/chief/ChiefDrawer.d.ts +11 -0
  5. package/dist/chief/ChiefDrawer.d.ts.map +1 -0
  6. package/dist/chief/ChiefDrawer.js +49 -0
  7. package/dist/chief/ChiefDrawer.js.map +1 -0
  8. package/dist/chief/ChiefPanel.d.ts +10 -0
  9. package/dist/chief/ChiefPanel.d.ts.map +1 -0
  10. package/dist/chief/ChiefPanel.js +46 -0
  11. package/dist/chief/ChiefPanel.js.map +1 -0
  12. package/dist/chief/ChiefRegion.d.ts +9 -0
  13. package/dist/chief/ChiefRegion.d.ts.map +1 -0
  14. package/dist/chief/ChiefRegion.js +55 -0
  15. package/dist/chief/ChiefRegion.js.map +1 -0
  16. package/dist/chief/ChiefSession.d.ts +21 -0
  17. package/dist/chief/ChiefSession.d.ts.map +1 -0
  18. package/dist/chief/ChiefSession.js +9 -0
  19. package/dist/chief/ChiefSession.js.map +1 -0
  20. package/dist/chief/directive.d.ts +15 -0
  21. package/dist/chief/directive.d.ts.map +1 -0
  22. package/dist/chief/directive.js +20 -0
  23. package/dist/chief/directive.js.map +1 -0
  24. package/dist/chief/turn-adapter.d.ts +52 -0
  25. package/dist/chief/turn-adapter.d.ts.map +1 -0
  26. package/dist/chief/turn-adapter.js +23 -0
  27. package/dist/chief/turn-adapter.js.map +1 -0
  28. package/dist/chief/use-chief-shortcut.d.ts +17 -0
  29. package/dist/chief/use-chief-shortcut.d.ts.map +1 -0
  30. package/dist/chief/use-chief-shortcut.js +61 -0
  31. package/dist/chief/use-chief-shortcut.js.map +1 -0
  32. package/dist/chief/use-chief-turn.d.ts +50 -0
  33. package/dist/chief/use-chief-turn.d.ts.map +1 -0
  34. package/dist/chief/use-chief-turn.js +99 -0
  35. package/dist/chief/use-chief-turn.js.map +1 -0
  36. package/dist/flavor/types.d.ts +189 -0
  37. package/dist/flavor/types.d.ts.map +1 -0
  38. package/dist/flavor/types.js +13 -0
  39. package/dist/flavor/types.js.map +1 -0
  40. package/dist/frame/OperatorShell.d.ts +91 -0
  41. package/dist/frame/OperatorShell.d.ts.map +1 -0
  42. package/dist/frame/OperatorShell.js +54 -0
  43. package/dist/frame/OperatorShell.js.map +1 -0
  44. package/dist/guard/PermissionProvider.d.ts +49 -0
  45. package/dist/guard/PermissionProvider.d.ts.map +1 -0
  46. package/dist/guard/PermissionProvider.js +103 -0
  47. package/dist/guard/PermissionProvider.js.map +1 -0
  48. package/dist/guard/RouteGuard.d.ts +45 -0
  49. package/dist/guard/RouteGuard.d.ts.map +1 -0
  50. package/dist/guard/RouteGuard.js +59 -0
  51. package/dist/guard/RouteGuard.js.map +1 -0
  52. package/dist/guard/permissions.d.ts +88 -0
  53. package/dist/guard/permissions.d.ts.map +1 -0
  54. package/dist/guard/permissions.js +105 -0
  55. package/dist/guard/permissions.js.map +1 -0
  56. package/dist/header/EnvironmentSwitcher.d.ts +5 -0
  57. package/dist/header/EnvironmentSwitcher.d.ts.map +1 -0
  58. package/dist/header/EnvironmentSwitcher.js +51 -0
  59. package/dist/header/EnvironmentSwitcher.js.map +1 -0
  60. package/dist/header/OperatorHeader.d.ts +25 -0
  61. package/dist/header/OperatorHeader.d.ts.map +1 -0
  62. package/dist/header/OperatorHeader.js +13 -0
  63. package/dist/header/OperatorHeader.js.map +1 -0
  64. package/dist/header/OperatorProfileMenu.d.ts +2 -0
  65. package/dist/header/OperatorProfileMenu.d.ts.map +1 -0
  66. package/dist/header/OperatorProfileMenu.js +14 -0
  67. package/dist/header/OperatorProfileMenu.js.map +1 -0
  68. package/dist/header/ThemeToggle.d.ts +2 -0
  69. package/dist/header/ThemeToggle.d.ts.map +1 -0
  70. package/dist/header/ThemeToggle.js +17 -0
  71. package/dist/header/ThemeToggle.js.map +1 -0
  72. package/dist/icons/registry.d.ts +57 -0
  73. package/dist/icons/registry.d.ts.map +1 -0
  74. package/dist/icons/registry.js +83 -0
  75. package/dist/icons/registry.js.map +1 -0
  76. package/dist/index.d.ts +77 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +129 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/inspector/InspectorProvider.d.ts +41 -0
  81. package/dist/inspector/InspectorProvider.d.ts.map +1 -0
  82. package/dist/inspector/InspectorProvider.js +63 -0
  83. package/dist/inspector/InspectorProvider.js.map +1 -0
  84. package/dist/inspector/types.d.ts +91 -0
  85. package/dist/inspector/types.d.ts.map +1 -0
  86. package/dist/inspector/types.js +40 -0
  87. package/dist/inspector/types.js.map +1 -0
  88. package/dist/nav/routes.d.ts +39 -0
  89. package/dist/nav/routes.d.ts.map +1 -0
  90. package/dist/nav/routes.js +46 -0
  91. package/dist/nav/routes.js.map +1 -0
  92. package/dist/palette/CommandPalette.d.ts +40 -0
  93. package/dist/palette/CommandPalette.d.ts.map +1 -0
  94. package/dist/palette/CommandPalette.js +108 -0
  95. package/dist/palette/CommandPalette.js.map +1 -0
  96. package/dist/palette/commands.d.ts +58 -0
  97. package/dist/palette/commands.d.ts.map +1 -0
  98. package/dist/palette/commands.js +81 -0
  99. package/dist/palette/commands.js.map +1 -0
  100. package/dist/palette/search-sources.d.ts +126 -0
  101. package/dist/palette/search-sources.d.ts.map +1 -0
  102. package/dist/palette/search-sources.js +101 -0
  103. package/dist/palette/search-sources.js.map +1 -0
  104. package/dist/palette/use-search-results.d.ts +4 -0
  105. package/dist/palette/use-search-results.d.ts.map +1 -0
  106. package/dist/palette/use-search-results.js +51 -0
  107. package/dist/palette/use-search-results.js.map +1 -0
  108. package/dist/sidebar/OperatorSidebar.d.ts +44 -0
  109. package/dist/sidebar/OperatorSidebar.d.ts.map +1 -0
  110. package/dist/sidebar/OperatorSidebar.js +30 -0
  111. package/dist/sidebar/OperatorSidebar.js.map +1 -0
  112. package/dist/workspace/CanvasWorkspace.d.ts +78 -0
  113. package/dist/workspace/CanvasWorkspace.d.ts.map +1 -0
  114. package/dist/workspace/CanvasWorkspace.js +44 -0
  115. package/dist/workspace/CanvasWorkspace.js.map +1 -0
  116. package/dist/workspace/DashboardWorkspace.d.ts +91 -0
  117. package/dist/workspace/DashboardWorkspace.d.ts.map +1 -0
  118. package/dist/workspace/DashboardWorkspace.js +39 -0
  119. package/dist/workspace/DashboardWorkspace.js.map +1 -0
  120. package/dist/workspace/FormWorkspace.d.ts +107 -0
  121. package/dist/workspace/FormWorkspace.d.ts.map +1 -0
  122. package/dist/workspace/FormWorkspace.js +38 -0
  123. package/dist/workspace/FormWorkspace.js.map +1 -0
  124. package/dist/workspace/GraphWorkspace.d.ts +112 -0
  125. package/dist/workspace/GraphWorkspace.d.ts.map +1 -0
  126. package/dist/workspace/GraphWorkspace.js +147 -0
  127. package/dist/workspace/GraphWorkspace.js.map +1 -0
  128. package/dist/workspace/TableWorkspace.d.ts +74 -0
  129. package/dist/workspace/TableWorkspace.d.ts.map +1 -0
  130. package/dist/workspace/TableWorkspace.js +25 -0
  131. package/dist/workspace/TableWorkspace.js.map +1 -0
  132. package/dist/workspace/WorkspaceHost.d.ts +26 -0
  133. package/dist/workspace/WorkspaceHost.d.ts.map +1 -0
  134. package/dist/workspace/WorkspaceHost.js +21 -0
  135. package/dist/workspace/WorkspaceHost.js.map +1 -0
  136. package/dist/workspace/registry.d.ts +30 -0
  137. package/dist/workspace/registry.d.ts.map +1 -0
  138. package/dist/workspace/registry.js +33 -0
  139. package/dist/workspace/registry.js.map +1 -0
  140. package/dist/workspace/types.d.ts +79 -0
  141. package/dist/workspace/types.d.ts.map +1 -0
  142. package/dist/workspace/types.js +48 -0
  143. package/dist/workspace/types.js.map +1 -0
  144. package/package.json +64 -0
  145. package/styles/source.css +16 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,36 @@
1
+ # Changelog — @consciousclouds/operator-shell
2
+
3
+ Versioned on the independent frontend-SDK lifecycle (NOT `contract_version`).
4
+
5
+ ## [0.1.0] — 2026-07-04
6
+
7
+ ### Added
8
+
9
+ - **Shell archetype** (Frontend Platform Layer 4): frame, header, sidebar rail,
10
+ permission-aware navigation (async resolvers + `RouteGuard`/`usePermission`,
11
+ fail-closed), first-class icon seam, command palette, inspector seam keyed by
12
+ entity kind, environment-switcher chrome over `frontend-runtime`.
13
+ - **Workspace Framework**: the shell's main region is a workspace; workspace
14
+ types include canvas (hosted over the published `canvas-sdk` +
15
+ `canvas-runtime`), dashboard, table, form, and graph. Unknown workspace type
16
+ ⇒ unavailable state.
17
+ - **AI Region** over `assistant-surface` with an injected `TurnAdapter`
18
+ (vocabulary = `conductor-sdk` event types + `conductor-react`
19
+ `NavigationDirective`); placement modes rail | drawer.
20
+ - **Chief invocation parity** — the shell-owned ⌘J/Ctrl+J keybinding (the
21
+ palette's ⌘K twin): rail focuses the composer, drawer (declared or the
22
+ below-xl fallback) toggles through assistant-surface's open/close
23
+ lifecycle; shift/alt refuse the match (⌘⇧J stays the browser's). Exported:
24
+ `useChiefShortcut` · `isChiefShortcut` · `CHIEF_SHORTCUT_KEY` ·
25
+ `CHIEF_SHORTCUT_LABEL`.
26
+ - **`OperatorFlavor`** consumed as inert data — zero functions/JSX, zero
27
+ transport URLs; everything executable is injected through shell props.
28
+
29
+ ### Notes
30
+
31
+ - Consumes, never rebuilds, the published seams: assistant-surface,
32
+ canvas-sdk/runtime, conductor-sdk/react, frontend-runtime. No BFF routes,
33
+ gateway URLs, personality defaults, or credentials in package code.
34
+ - Prepared-publishable per the assistant-surface packaging template. Publish
35
+ order at the gate: **conductor-sdk → conductor-react → operator-shell**, via
36
+ `bun publish` so `workspace:*` deps are rewritten to real versions.
package/LICENSE ADDED
@@ -0,0 +1,194 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship made available under
36
+ the License, as indicated by a copyright notice that is included in
37
+ or attached to the work (an example is provided in the Appendix below).
38
+
39
+ "Derivative Works" shall mean any work, whether in Source or Object
40
+ form, that is based on (or derived from) the Work and for which the
41
+ editorial revisions, annotations, elaborations, or other modifications
42
+ represent, as a whole, an original work of authorship. For the purposes
43
+ of this License, Derivative Works shall not include works that remain
44
+ separable from, or merely link (or bind by name) to the interfaces of,
45
+ the Work and Derivative Works thereof.
46
+
47
+ "Contribution" shall mean, as submitted to the Licensor for inclusion
48
+ in the Work by the copyright owner or by an individual or Legal Entity
49
+ authorized to submit on behalf of the copyright owner. For the purposes
50
+ of this definition, "submitted" means any form of electronic, verbal,
51
+ or written communication sent to the Licensor or its representatives,
52
+ including but not limited to communication on electronic mailing lists,
53
+ source code control systems, and issue tracking systems that are managed
54
+ by, or on behalf of, the Licensor for the purpose of discussing and
55
+ improving the Work, but excluding communication that is conspicuously
56
+ marked or designated in writing by the copyright owner as "Not a
57
+ Contribution."
58
+
59
+ "Contributor" shall mean Licensor and any Legal Entity on behalf of
60
+ whom a Contribution has been received by the Licensor and included
61
+ within the Work.
62
+
63
+ 2. Grant of Copyright License. Subject to the terms and conditions of
64
+ this License, each Contributor hereby grants to You a perpetual,
65
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
66
+ copyright license to reproduce, prepare Derivative Works of,
67
+ publicly display, publicly perform, sublicense, and distribute the
68
+ Work and such Derivative Works in Source or Object form.
69
+
70
+ 3. Grant of Patent License. Subject to the terms and conditions of
71
+ this License, each Contributor hereby grants to You a perpetual,
72
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
73
+ (except as stated in this section) patent license to make, have made,
74
+ use, offer to sell, sell, import, and otherwise transfer the Work,
75
+ where such license applies only to those patent claims licensable
76
+ by such Contributor that are necessarily infringed by their
77
+ Contribution(s) alone or by the combination of their Contribution(s)
78
+ with the Work to which such Contribution(s) was submitted. If You
79
+ institute patent litigation against any entity (including a cross-claim
80
+ or counterclaim in a lawsuit) alleging that the Work or any
81
+ Contribution embodied within the Work constitutes direct or contributory
82
+ patent infringement, then any patent licenses granted to You under
83
+ this License for that Work shall terminate as of the date such
84
+ litigation is filed.
85
+
86
+ 4. Redistribution. You may reproduce and distribute copies of the
87
+ Work or Derivative Works thereof in any medium, with or without
88
+ modifications, and in Source or Object form, provided that You
89
+ meet the following conditions:
90
+
91
+ (a) You must give any other recipients of the Work or Derivative Works
92
+ a copy of this License; and
93
+
94
+ (b) You must cause any modified files to carry prominent notices
95
+ stating that You changed the files; and
96
+
97
+ (c) You must retain, in the Source form of any Derivative Works that
98
+ You distribute, all copyright, patent, trademark, and attribution
99
+ notices from the Source form of the Work, excluding those notices
100
+ that do not pertain to any part of the Derivative Works; and
101
+
102
+ (d) If the Work includes a "NOTICE" text file as part of its
103
+ distribution, You must include a readable copy of the attribution
104
+ notices contained within such NOTICE file, in at least one of the
105
+ following places: within a NOTICE text provided as part of the
106
+ Derivative Works; within the Source form or documentation, if
107
+ provided along with the Derivative Works; or, within a display
108
+ generated by the Derivative Works, if and wherever such third-party
109
+ notices normally appear. The contents of the NOTICE file are for
110
+ informational purposes only and do not modify the License. You may
111
+ add Your own attribution notices within Derivative Works that You
112
+ distribute, alongside or in addition to the NOTICE text from the
113
+ Work, provided that such additional attribution notices cannot be
114
+ construed as modifying the License.
115
+
116
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
117
+ any Contribution intentionally submitted for inclusion in the Work by
118
+ You to the Licensor shall be under the terms and conditions of this
119
+ License, without any additional terms or conditions.
120
+
121
+ 6. Trademarks. This License does not grant permission to use the trade
122
+ names, trademarks, service marks, or product names of the Licensor,
123
+ except as required for reasonable and customary use in describing the
124
+ origin of the Work and reproducing the content of the NOTICE file.
125
+
126
+ 7. Disclaimer of Warranty. Unless required by applicable law or
127
+ agreed to in writing, Licensor provides the Work (and each
128
+ Contributor provides its Contributions) on an "AS IS" BASIS,
129
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
130
+ implied, including, without limitation, any conditions of TITLE,
131
+ MERCHANTIBILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
132
+ responsible for determining the appropriateness of using or
133
+ redistributing the Work and assume any risks associated with Your
134
+ exercise of permissions under this License.
135
+
136
+ 8. Limitation of Liability. In no event and under no legal theory,
137
+ whether in tort (including negligence), contract, or otherwise,
138
+ unless required by applicable law (such as deliberate and grossly
139
+ negligent acts) or agreed to in writing, shall any Contributor be
140
+ liable to You for damages, including any direct, indirect, special,
141
+ incidental, or exemplary damages of any character arising as a result
142
+ of this License or out of the use or inability to use the Work
143
+ (including but not limited to damages for loss of goodwill, work
144
+ stoppage, computer failure or malfunction, or all other commercial
145
+ damages or losses), even if such Contributor has been advised of the
146
+ possibility of such damages.
147
+
148
+ 9. Accepting Warranty or Liability. While redistributing the Work or
149
+ Derivative Works thereof, You may choose to offer, and charge a fee
150
+ for, acceptance of support, warranty, indemnity, or other liability
151
+ obligations and/or rights consistent with this License. However, in
152
+ accepting such obligations, You may offer such obligations only on
153
+ Your own behalf and on Your sole responsibility, not on behalf of any
154
+ other Contributor, and only if You agree to indemnify, defend, and
155
+ hold each Contributor harmless for any liability incurred by, or
156
+ claims asserted against, such Contributor by reason of your accepting
157
+ any such warranty or additional liability.
158
+
159
+ Copyright 2024 Conscious Clouds
160
+
161
+ Licensed under the Apache License, Version 2.0 (the "License");
162
+ you may not use this file except in compliance with the License.
163
+ You may obtain a copy of the License at
164
+
165
+ http://www.apache.org/licenses/LICENSE-2.0
166
+
167
+ Unless required by applicable law or agreed to in writing, software
168
+ distributed under the License is distributed on an "AS IS" BASIS,
169
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
170
+ See the License for the specific language governing permissions and
171
+ limitations under the License.
172
+
173
+ ---
174
+
175
+ Portions of this package are derived from shadcn/ui (https://ui.shadcn.com),
176
+ Copyright (c) 2023 shadcn, licensed under the MIT License:
177
+
178
+ Permission is hereby granted, free of charge, to any person obtaining a copy
179
+ of this software and associated documentation files (the "Software"), to deal
180
+ in the Software without restriction, including without limitation the rights
181
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
182
+ copies of the Software, and to permit persons to whom the Software is
183
+ furnished to do so, subject to the following conditions:
184
+
185
+ The above copyright notice and this permission notice shall be included in all
186
+ copies or substantial portions of the Software.
187
+
188
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
189
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
190
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
191
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
192
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
193
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
194
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,319 @@
1
+ # @consciousclouds/operator-shell
2
+
3
+ The **ConsciousClouds Operator Shell** — the operator-console shell archetype,
4
+ Layer 4 of the Frontend Platform.
5
+
6
+ It ships the shared operator experience, composed from the **open MIT
7
+ shadcn/ui registry** (sidebar-16's header-above-sidebar geometry, sidebar-07's
8
+ icon-collapsible rail) over `@consciousclouds/ui` primitives:
9
+
10
+ - **Frame** — `OperatorShell`: sticky full-width header, icon-collapsible
11
+ left sidebar (⌘B, mobile sheet), main content, and the AI Region
12
+ (Chief — invoked with **⌘J/Ctrl+J**, the palette's ⌘K twin).
13
+ - **Header** — brand slot (rendered through the Brand Platform's
14
+ `BrandLogo` + `useBrand`; the shell never bakes an image or a mark string),
15
+ the search button that opens the command palette, notifications, theme
16
+ toggle (the Token System's `useTheme`), and a **profile slot** with a
17
+ neutral default menu.
18
+ - **Command palette** — `CommandPalette` (mounted by the frame; ⌘K/Ctrl+K
19
+ and the header search button open the one instance; Chief's invocation
20
+ binding sits next to it — **⌘J/Ctrl+J**, see the Chief region) over the registry
21
+ `command`/cmdk vocabulary in `@consciousclouds/ui`. Commands are
22
+ **declarative**: route commands are auto-derived from `flavor.nav` (the
23
+ same tree the sidebar renders — no second route list), and optional
24
+ `flavor.commands` adds inert reference entries (id · label · icon name ·
25
+ `href` **or** a `command` reference — zero functions, Declarative-Flavor
26
+ law). Non-route execution is product-injected via the shell's `runCommand`
27
+ prop (the same injection pattern as icons and the resolver); a `command`
28
+ entry with no runner is hidden. Every entry passes the sidebar's
29
+ fail-closed permission gate (`derivePaletteGroups` is the pure, provable
30
+ derivation).
31
+ - **Search sources** — the doctrine skeleton's **Search experience** as a
32
+ typed injection: the palette is also the search surface. The product
33
+ injects `SearchSource` values through the shell's `searchSources` prop
34
+ (**product code, never Flavor content** — a source's `query` is a function
35
+ running the product's own reads, so it cannot live in an inert Flavor; same
36
+ injection pattern as icons / the resolver / `inspectorViews` /
37
+ `runCommand`). Each source declares `id` · `label` (its palette group
38
+ heading) · optional `requiredPermission` · `query(text) →
39
+ Promise<SearchResult[]>`; results carry `label` / icon **name** / keywords
40
+ and a PaletteAction-shaped action — `navigate` (href) or `inspect` (open
41
+ the shell-owned inspector by entity kind with the ALREADY-RESOLVED entity;
42
+ the inspector's own fail-closed gate still applies). Sources gate through
43
+ the **same fail-closed permission snapshot** as the palette's commands —
44
+ a denied/unknown/still-resolving source is **never queried** — and an
45
+ erroring, in-flight, or absent source contributes **nothing** (never a
46
+ crash; siblings unaffected). `querySearchSources` + `useSearchResults` are
47
+ the pure/provable core. No transport enters this package: the wire behind
48
+ `query` is the product's own BFF.
49
+ - **Nav engine** — reads an inert `OperatorFlavor`: groups → items with
50
+ **string icon names**, active-state (`/` exact, others by prefix), the
51
+ product-context block from `flavor.product`.
52
+ - **Icon Platform** — the string-name → icon resolution seam. The Flavor
53
+ declares **inert string names** (`icon: "home"` — never a component,
54
+ Declarative-Flavor law); the shell ships the built-in operator vocabulary
55
+ (`OPERATOR_ICONS`: `home`, `bot`, `plug`, `activity`, `bar-chart-3`,
56
+ `waypoints`) and the product **extends** it through the `icons` shell prop
57
+ (`IconRegistry`: string name → Lucide component; extensions may
58
+ deliberately override built-ins). Unknown names **fail closed** to the
59
+ exported `UNKNOWN_ICON` — one deterministic neutral glyph for every
60
+ unresolved name (own-property lookup, so prototype names like `"toString"`
61
+ are unknown too; never a crash, never permission-bearing). The **icon
62
+ family** is a Brand-level declaration (`Brand.iconFamily`,
63
+ `@consciousclouds/brand` — inert data): the frame reads it and
64
+ `resolveIconFamily` read-and-defaults anything the shell doesn't ship to
65
+ `SHIPPED_ICON_FAMILY` (`lucide`, per the license allowlist — the only
66
+ family that ships today).
67
+ - **Permission-guard seam** — the shell owns **fail-closed** gating; the
68
+ product injects a `PermissionResolver` (unknown ⇒ denied; the exported
69
+ `allowAllPermissions` is the explicit dev-open choice).
70
+ - **Inspector** — the shell-owned detail panel: open/close/focus lifecycle
71
+ over the registry `sheet` primitive (Radix focus trap, Esc-to-close,
72
+ overlay dismiss), **keyed by entity kind**. The Flavor DECLARES the
73
+ entity-kind references (`flavor.inspector.entityKinds` — inert strings,
74
+ Declarative-Flavor law); the product INJECTS the detail views through the
75
+ shell's `inspectorViews` prop keyed by those references (components can't
76
+ live in a Flavor — same injection pattern as icons / the resolver /
77
+ `runCommand`). Pages open it via `useInspector().open({ kind, entity,
78
+ title?, description? })` with an ALREADY-RESOLVED entity — the shell never
79
+ fetches. Fail-closed twice over: an undeclared or view-less kind refuses to
80
+ open (`open` returns `false` — no panel, no crash;
81
+ `resolveInspectorView` is the pure, provable gate), and `useInspector`
82
+ outside a provider returns an inert API instead of throwing.
83
+ - **Environment switcher** — `EnvironmentSwitcher` (mounted by the header):
84
+ environment chrome over the published `@consciousclouds/frontend-runtime`
85
+ context, **consumed as-is** (`RuntimeProvider` / `useRuntime` /
86
+ `resolveTarget` — never rebuilt). The PRODUCT mounts `RuntimeProvider` with
87
+ its targets — **target URLs and transport stay product code** (membrane:
88
+ this package ships no URL; it renders labels + a connection dot and hands
89
+ the runtime's own `NamedTarget` values back into `switchTo`). Fail-closed
90
+ and honest: no provider ⇒ no chrome; ONE configured environment ⇒ a
91
+ single-entry **indicator** (not a pretend menu); two or more named targets
92
+ ⇒ a dropdown switcher.
93
+ - **Workspace-switcher seam** — typed + documented, **INERT until backend
94
+ PRE-1** (per-(project, environment) enrollment keying,
95
+ `docs/design/ccu-control-plane.md` §8 — the prerequisite for a second
96
+ workspace existing at all): the Flavor may declare
97
+ `workspaces?: OperatorFlavorWorkspace[]` (labels/refs only) and the shell
98
+ ships the `workspaceSwitcher` slot on `OperatorShellProps` (rendered in
99
+ the sidebar header). Products inject nothing today, the shell renders
100
+ nothing, and the static product block stays the whole context chrome — a
101
+ missing switcher beats a fake one.
102
+ - **Workspace Framework** — the main-region seam (the charter's AI-native
103
+ correction: the shell's main region is a WORKSPACE, not a page body). A
104
+ deliberately **frame-free** subtree (`src/workspace/` imports nothing from
105
+ the shell frame — Separation Law: a later extraction is a photograph):
106
+ - **The vocabulary** — nine V1 type ids declared up front
107
+ (`WORKSPACE_TYPE_IDS`): `canvas` · `dashboard` · `table` · `form` ·
108
+ `graph` · `map` · `timeline` · `workflow` · `ai-session`. Later types are
109
+ additions, never surgery; `map`/`timeline`/`workflow`/`ai-session` are
110
+ typed seams that fail closed until an honest data source exists.
111
+ - **The registry** — `createWorkspaceRegistry([...])`: value-based and
112
+ immutable (no module-global state); the app composes shell built-ins +
113
+ product types ONCE; a duplicate id **throws** (composition-time error,
114
+ never a silent replacement).
115
+ - **The host** — `<WorkspaceHost registry typeId title? input>`: resolves
116
+ the type id (runtime data — any string accepted) and mounts the type's
117
+ component with the mount contract (`typeId` / `title` / opaque `input` —
118
+ the framework carries input, never interprets it). Unknown/unregistered
119
+ ids render the exported `WorkspaceUnavailable` state — fail-closed,
120
+ never a crash, never product content.
121
+ - **Built-in types** (each an exported `WorkspaceType` value +
122
+ component): `canvasWorkspaceType` — **Canvas is first-class**: hosting
123
+ state machine (error → loading → empty → ready) over the published
124
+ `@consciousclouds/canvas-runtime` `CanvasRenderer` (consumed, never
125
+ rebuilt; the product injects the `ComponentMap` + slot content);
126
+ `dashboardWorkspaceType` — StatCard grid + titled widget sections over
127
+ the graduated workspace components; `tableWorkspaceType` — hosts the
128
+ graduated `InteractiveDataTable`; `formWorkspaceType` — structured input
129
+ over the presentational Field vocabulary (validation judgment +
130
+ submission transport stay product-owned); `graphWorkspaceType` —
131
+ entity-relationship exploration over a typed nodes/edges contract,
132
+ rendered as adjacency-style traversal from registry primitives (no
133
+ viz dependency — react-flow/d3 sit outside the license allowlist;
134
+ dangling edge endpoints fail closed).
135
+ - **Registering a product workspace type** is data + a component, never
136
+ shell surgery: implement `WorkspaceType<TInput>` (`id` from the declared
137
+ vocabulary · `displayName` · optional `icon` by NAME · `Component`
138
+ receiving `WorkspaceComponentProps<TInput>`) and include it in your
139
+ `createWorkspaceRegistry` composition alongside the built-ins.
140
+ - **Chief region** — the AI Region. `ChiefRegion` resolves
141
+ `flavor.chief.placement` (`rail` | `drawer`) to a presentation; BOTH run
142
+ the identical turn flow (`useChiefTurn` over the injected TurnAdapter) and
143
+ body (`ChiefSession`), mounted through the headless
144
+ `@consciousclouds/assistant-surface` hook. Turn lifecycle,
145
+ routed-directive handling (directive → href validated against routes
146
+ **derived from `flavor.nav`**), and streaming/routed/error states. Below
147
+ the xl breakpoint the rail placement falls back to the drawer — Chief
148
+ stays reachable. Placement moves the panel and NOTHING else (a Flavor can
149
+ move Chief's panel; it can never widen Chief's reach).
150
+ **Invocation parity — ⌘J/Ctrl+J** (the palette's ⌘K twin, shell-owned,
151
+ wired where the mounted presentation lives just as ⌘K lives with the
152
+ palette): on the **rail** it focuses the composer; on the **drawer**
153
+ (declared, or the rail's below-xl fallback) it toggles open/closed through
154
+ assistant-surface's one open/close lifecycle. Exactly one presentation
155
+ mounts at a time (single-surface rule), so exactly one listener is ever
156
+ attached. Shift/alt refuse the match — ⌘⇧J stays the browser's downloads
157
+ chord; no Flavor field is involved (placement remains the only Chief
158
+ decoration). `isChiefShortcut` is the exported pure match rule;
159
+ `CHIEF_SHORTCUT_LABEL` carries the display copy.
160
+
161
+ **The shell owns the panel; the product owns the wire.** Transport is injected
162
+ via a **TurnAdapter** typed against the published turn vocabulary
163
+ (`ConductorEventName` / `ConductorEventDataMap` from
164
+ `@consciousclouds/conductor-sdk`, `NavigationDirective` from
165
+ `@consciousclouds/conductor-react`). No BFF route, gateway URL, personality
166
+ default, or credential logic ever enters this package — enrollment and the
167
+ verified actor authorize Chief, on the product's rail.
168
+
169
+ ## Adopting the shell — the second product's path
170
+
171
+ A new product surface is **Brand + Flavor + pages + product BFF code**;
172
+ everything else comes from the platform packages. From install to a rendered
173
+ shell:
174
+
175
+ **1. Install + styles.** Add `@consciousclouds/{tokens,ui,brand,operator-shell}`.
176
+ Tailwind v4 does not scan `node_modules` — the app's Tailwind entry must
177
+ register the platform sources:
178
+
179
+ ```css
180
+ @import "tailwindcss";
181
+ @import "@consciousclouds/tokens/styles/house.css";
182
+ @import "@consciousclouds/ui/styles/source.css";
183
+ @import "@consciousclouds/operator-shell/styles/source.css";
184
+ ```
185
+
186
+ **2. Theme.** Mount tokens' `ThemeProvider` in the root layout (tokens is a
187
+ runtime **peer** of this package — one theme context; the header's toggle
188
+ reads it through tokens' `useTheme`).
189
+
190
+ **3. Brand.** Declare your product's `Brand` (identity · logo renditions by
191
+ role × mode · optional mode-aware `tokenOverrides` · `iconFamily`) as product
192
+ data and mount `BrandProvider`. See `@consciousclouds/brand`'s README.
193
+
194
+ **4. Flavor.** Write ONE inert `OperatorFlavor` per surface: the product
195
+ block, nav groups (route strings + icon NAMES + optional permission
196
+ references), `defaultLanding`, optional palette `commands` (references),
197
+ `inspector.entityKinds` (references), and Chief decoration (placement/copy +
198
+ an inert personality reference — never an endpoint).
199
+
200
+ **5. The four injections.** Mount the shell from a **client component**
201
+ (adapters/resolvers are functions — they cannot be serialized from a server
202
+ layout):
203
+
204
+ ```tsx
205
+ <ThemeProvider> {/* @consciousclouds/tokens */}
206
+ <BrandProvider brand={MY_BRAND}> {/* injection 1 — the product's Brand */}
207
+ <OperatorShell
208
+ flavor={MY_FLAVOR} /* injection 2 — inert OperatorFlavor */
209
+ turnAdapter={myTurnAdapter} /* injection 3 — product transport */
210
+ resolvePermission={myResolver}/* injection 4 — governance resolution */
211
+ icons={myIcons} /* optional: icon-vocabulary extensions */
212
+ inspectorViews={myViews} /* optional: views for declared entity kinds */
213
+ runCommand={myRunner} /* optional: executes flavor command refs */
214
+ searchSources={mySources} /* optional: ⌘K searchable sources */
215
+ >
216
+ {children}
217
+ </OperatorShell>
218
+ </BrandProvider>
219
+ </ThemeProvider>
220
+ ```
221
+
222
+ The **TurnAdapter** is product code wrapping YOUR transport (a same-origin
223
+ BFF, `@consciousclouds/ai-client`, …), typed against the published vocabulary
224
+ (`ConductorEventName`/`ConductorEventDataMap`, `NavigationDirective`) — never
225
+ a parallel dialect. The **permission resolver** maps the Flavor's reference
226
+ strings onto your governance rail (sync or async); unknown ⇒ denied, and
227
+ `allowAllPermissions` is the explicit dev-open choice, never a default.
228
+
229
+ **6. Pages as workspaces.** Compose your workspace registry once and mount
230
+ pages through the host:
231
+
232
+ ```tsx
233
+ const registry = createWorkspaceRegistry([
234
+ canvasWorkspaceType, dashboardWorkspaceType, tableWorkspaceType,
235
+ graphWorkspaceType, formWorkspaceType,
236
+ myProductWorkspaceType, // your own WorkspaceType, if any
237
+ ]);
238
+
239
+ <WorkspaceHost registry={registry} typeId="canvas" title="Home" input={input} />
240
+ ```
241
+
242
+ **7. Optional: searchable sources (the ⌘K Search experience).** Declare one
243
+ `SearchSource` per searchable read as a **stable module const** in product
244
+ code (never in the Flavor — `query` is a function) and inject the array
245
+ through `searchSources`. A source's `query` receives the trimmed palette
246
+ text and returns already-filtered results over reads YOUR side of the
247
+ membrane holds (typically a same-origin BFF proxy of an existing read —
248
+ never a new backend):
249
+
250
+ ```ts
251
+ export const MY_SOURCES: SearchSource[] = [{
252
+ id: "personalities",
253
+ label: "Personalities", // its palette group heading
254
+ // requiredPermission: "ai.read", // optional — same fail-closed gate as commands
255
+ query: async (text) => {
256
+ const read = await fetch("/api/search/personalities").then((r) => {
257
+ if (!r.ok) throw new Error("read failed"); // throwing ⇒ contributes nothing
258
+ return r.json();
259
+ });
260
+ return read.personalities
261
+ .filter((p) => p.name.toLowerCase().includes(text.toLowerCase()))
262
+ .map((p) => ({
263
+ id: p.id,
264
+ label: p.name,
265
+ icon: "bot", // icon by NAME, through the registry
266
+ action: { // navigate by href, or open the inspector:
267
+ kind: "inspect", entityKind: "personality",
268
+ entity: p, title: p.name, description: p.id,
269
+ },
270
+ }));
271
+ },
272
+ }];
273
+ ```
274
+
275
+ An `inspect` action needs its entity kind declared in
276
+ `flavor.inspector.entityKinds` **and** a view injected via `inspectorViews`
277
+ — otherwise selecting the result fails closed (no panel, palette stays).
278
+
279
+ **8. Optional chrome.** Mount `frontend-runtime`'s `RuntimeProvider` with
280
+ your environment targets to light up the environment switcher; wire a
281
+ favicon from your Brand's `favicon` role.
282
+
283
+ The reference implementation of every step is CCU Admin
284
+ (`platform/frontend/consciousclouds-admin/` — `app/operator-console.tsx`,
285
+ `lib/{brand,flavor,turn-adapter,workspaces,search-sources}.ts`).
286
+
287
+ ## The membrane gates — what may never enter this package
288
+
289
+ - **No transport meaning:** no BFF route, gateway URL, personality default,
290
+ or credential logic — enrollment + the verified actor authorize Chief, on
291
+ the product's rail (Chief-authority law). The Flavor decorates Chief; the
292
+ adapter carries the wire; governance authorizes.
293
+ - **No product vocabulary:** nav trees, permission strings, entity kinds,
294
+ command references, workspace inputs are all injected references the
295
+ product implements.
296
+ - **Declarative-Flavor law, review test verbatim:** *the Flavor file contains
297
+ zero functions/JSX and zero transport URLs.* Everything executable (icon
298
+ components, inspector views, command runners, adapters, resolvers) enters
299
+ through shell props instead.
300
+ - **Fail-closed everywhere:** unknown permission ⇒ denied · unknown icon ⇒
301
+ `UNKNOWN_ICON` · unknown workspace type ⇒ `WorkspaceUnavailable` ·
302
+ undeclared/view-less inspector kind ⇒ refuses to open · runner-less
303
+ command ⇒ hidden · denied/erroring/in-flight search source ⇒ contributes
304
+ nothing.
305
+ - **Consume, never rebuild:** assistant-surface, canvas-runtime,
306
+ conductor-sdk/react, frontend-runtime are published seams mounted as-is.
307
+
308
+ ## Dependency posture
309
+
310
+ Runtime: `ui` · `brand` · `assistant-surface` · `conductor-sdk` /
311
+ `conductor-react` (types + directive handling) · `frontend-runtime`
312
+ (environment context — consumed, never rebuilt) · `canvas-runtime` /
313
+ `canvas-sdk` (the canvas workspace type — consumed, never rebuilt) ·
314
+ `lucide-react`. Peers: `react`, `next` (>=15 <17), and
315
+ `@consciousclouds/tokens` — tokens is a peer (not a bundled dep) because
316
+ theme state is token machinery: the app mounts tokens' `ThemeProvider`; the
317
+ shell's theme toggle reads the same single instance through tokens'
318
+ `useTheme`. Contracts: `docs/design/operator-platform-contracts.md`
319
+ §2/§4/§5/§6. Platform overview: [`platform/frontend/README.md`](../README.md).
@@ -0,0 +1,11 @@
1
+ import type { OperatorFlavor } from "../flavor/types.js";
2
+ import type { TurnAdapter } from "./turn-adapter.js";
3
+ export interface ChiefDrawerProps {
4
+ flavor: OperatorFlavor;
5
+ /** The product's transport (P1-1). The shell owns the panel, never the wire. */
6
+ adapter: TurnAdapter;
7
+ /** Extra classes on the floating trigger button. */
8
+ triggerClassName?: string;
9
+ }
10
+ export declare function ChiefDrawer({ flavor, adapter, triggerClassName }: ChiefDrawerProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=ChiefDrawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChiefDrawer.d.ts","sourceRoot":"","sources":["../../src/chief/ChiefDrawer.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,gFAAgF;IAChF,OAAO,EAAE,WAAW,CAAC;IACrB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,gBAAgB,2CA0DlF"}
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * ChiefDrawer — the AI Region's DRAWER placement: the same Chief content
5
+ * (useChiefTurn + ChiefSession, shared verbatim with the rail) mounted
6
+ * through the registry sheet primitive behind a floating trigger, with
7
+ * assistant-surface's open/close lifecycle driving the one open state.
8
+ *
9
+ * Division of behavior (no doubled handlers): useAssistantSurface owns the
10
+ * LIFECYCLE — the single-surface registration, open/close state semantics,
11
+ * trigger wiring (aria-haspopup/expanded), and focus restore to the trigger
12
+ * on close; the sheet primitive owns the modal PRESENTATION — portal,
13
+ * overlay, escape/outside-click dismissal, and focus containment — reporting
14
+ * every dismissal back through the same onOpenChange. The hook stays
15
+ * non-modal/non-dismissible so neither layer duplicates the other's job.
16
+ *
17
+ * The turn state lives OUTSIDE the sheet content (in this component), so
18
+ * closing and reopening the drawer keeps the thread — parity with the
19
+ * always-mounted rail. Transport is the injected TurnAdapter's — the shell
20
+ * never owns the wire (P1-1).
21
+ */
22
+ import * as React from "react";
23
+ import { Sparkles } from "lucide-react";
24
+ import { useAssistantSurface } from "@consciousclouds/assistant-surface";
25
+ import { Button, Sheet, SheetContent, SheetHeader, SheetTitle, cn } from "@consciousclouds/ui";
26
+ import { ChiefSession } from "./ChiefSession.js";
27
+ import { useChiefShortcut } from "./use-chief-shortcut.js";
28
+ import { useChiefTurn } from "./use-chief-turn.js";
29
+ export function ChiefDrawer({ flavor, adapter, triggerClassName }) {
30
+ const [open, setOpen] = React.useState(false);
31
+ const session = useChiefTurn({ flavor, adapter });
32
+ // The shell-owned Chief keybinding (⌘J / Ctrl+J — use-chief-shortcut.ts).
33
+ // Drawer invocation = toggle, through the SAME setOpen the
34
+ // assistant-surface lifecycle and the sheet's dismissals drive — one open
35
+ // state, whoever moves it.
36
+ useChiefShortcut(() => setOpen((o) => !o));
37
+ // Assistant-surface lifecycle (same surface id as the rail — one AI Region
38
+ // per application, whatever its placement). Defaults keep it non-modal and
39
+ // non-dismissible at the hook level: the sheet primitive supplies the
40
+ // modal presentation and reports dismissals through onOpenChange.
41
+ const surface = useAssistantSurface({
42
+ open,
43
+ onOpenChange: setOpen,
44
+ surfaceId: "operator-shell-chief",
45
+ "aria-label": session.title,
46
+ });
47
+ return (_jsxs(_Fragment, { children: [_jsxs(Button, { type: "button", ref: surface.triggerRef, ...surface.triggerProps, className: cn("fixed right-4 bottom-4 z-40 gap-2 rounded-full shadow-lg", triggerClassName), "aria-label": `Open ${session.title}`, children: [_jsx(Sparkles, { className: "size-4" }), session.title] }), _jsx(Sheet, { open: open, onOpenChange: setOpen, children: _jsx(SheetContent, { side: "right", "aria-describedby": undefined, className: "w-[340px] gap-0 sm:max-w-[340px]", children: _jsxs("div", { ref: surface.surfaceRef, ...surface.surfaceProps, className: "flex h-full min-h-0 flex-col", children: [_jsxs(SheetHeader, { className: "h-12 shrink-0 flex-row items-center gap-2 space-y-0 border-b border-border px-4 py-0", children: [_jsx("div", { className: "flex size-6 items-center justify-center rounded-md bg-primary/10 text-primary", children: _jsx(Sparkles, { className: "size-3.5" }) }), _jsx(SheetTitle, { className: "text-sm font-medium", children: session.title })] }), _jsx(ChiefSession, { session: session })] }) }) })] }));
48
+ }
49
+ //# sourceMappingURL=ChiefDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChiefDrawer.js","sourceRoot":"","sources":["../../src/chief/ChiefDrawer.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAG/F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUnD,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAoB;IACjF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAElD,0EAA0E;IAC1E,2DAA2D;IAC3D,0EAA0E;IAC1E,2BAA2B;IAC3B,gBAAgB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,2EAA2E;IAC3E,2EAA2E;IAC3E,sEAAsE;IACtE,kEAAkE;IAClE,MAAM,OAAO,GAAG,mBAAmB,CAAC;QAClC,IAAI;QACJ,YAAY,EAAE,OAAO;QACrB,SAAS,EAAE,sBAAsB;QACjC,YAAY,EAAE,OAAO,CAAC,KAAK;KAC5B,CAAC,CAAC;IAEH,OAAO,CACL,8BACE,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,OAAO,CAAC,UAAU,KACnB,OAAO,CAAC,YAAY,EACxB,SAAS,EAAE,EAAE,CAAC,0DAA0D,EAAE,gBAAgB,CAAC,gBAC/E,QAAQ,OAAO,CAAC,KAAK,EAAE,aAEnC,KAAC,QAAQ,IAAC,SAAS,EAAC,QAAQ,GAAG,EAC9B,OAAO,CAAC,KAAK,IACP,EAET,KAAC,KAAK,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,YACtC,KAAC,YAAY,IACX,IAAI,EAAC,OAAO,sBACM,SAAS,EAC3B,SAAS,EAAC,kCAAkC,YAE5C,eACE,GAAG,EAAE,OAAO,CAAC,UAAU,KACnB,OAAO,CAAC,YAAY,EACxB,SAAS,EAAC,8BAA8B,aAExC,MAAC,WAAW,IAAC,SAAS,EAAC,sFAAsF,aAC3G,cAAK,SAAS,EAAC,+EAA+E,YAC5F,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,GAC7B,EACN,KAAC,UAAU,IAAC,SAAS,EAAC,qBAAqB,YAAE,OAAO,CAAC,KAAK,GAAc,IAC5D,EAEd,KAAC,YAAY,IAAC,OAAO,EAAE,OAAO,GAAI,IAC9B,GACO,GACT,IACP,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { OperatorFlavor } from "../flavor/types.js";
2
+ import type { TurnAdapter } from "./turn-adapter.js";
3
+ export interface ChiefPanelProps {
4
+ flavor: OperatorFlavor;
5
+ /** The product's transport (P1-1). The shell owns the panel, never the wire. */
6
+ adapter: TurnAdapter;
7
+ className?: string;
8
+ }
9
+ export declare function ChiefPanel({ flavor, adapter, className }: ChiefPanelProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=ChiefPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChiefPanel.d.ts","sourceRoot":"","sources":["../../src/chief/ChiefPanel.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,gFAAgF;IAChF,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,eAAe,2CAqCzE"}