@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.
- package/CHANGELOG.md +36 -0
- package/LICENSE +194 -0
- package/README.md +319 -0
- package/dist/chief/ChiefDrawer.d.ts +11 -0
- package/dist/chief/ChiefDrawer.d.ts.map +1 -0
- package/dist/chief/ChiefDrawer.js +49 -0
- package/dist/chief/ChiefDrawer.js.map +1 -0
- package/dist/chief/ChiefPanel.d.ts +10 -0
- package/dist/chief/ChiefPanel.d.ts.map +1 -0
- package/dist/chief/ChiefPanel.js +46 -0
- package/dist/chief/ChiefPanel.js.map +1 -0
- package/dist/chief/ChiefRegion.d.ts +9 -0
- package/dist/chief/ChiefRegion.d.ts.map +1 -0
- package/dist/chief/ChiefRegion.js +55 -0
- package/dist/chief/ChiefRegion.js.map +1 -0
- package/dist/chief/ChiefSession.d.ts +21 -0
- package/dist/chief/ChiefSession.d.ts.map +1 -0
- package/dist/chief/ChiefSession.js +9 -0
- package/dist/chief/ChiefSession.js.map +1 -0
- package/dist/chief/directive.d.ts +15 -0
- package/dist/chief/directive.d.ts.map +1 -0
- package/dist/chief/directive.js +20 -0
- package/dist/chief/directive.js.map +1 -0
- package/dist/chief/turn-adapter.d.ts +52 -0
- package/dist/chief/turn-adapter.d.ts.map +1 -0
- package/dist/chief/turn-adapter.js +23 -0
- package/dist/chief/turn-adapter.js.map +1 -0
- package/dist/chief/use-chief-shortcut.d.ts +17 -0
- package/dist/chief/use-chief-shortcut.d.ts.map +1 -0
- package/dist/chief/use-chief-shortcut.js +61 -0
- package/dist/chief/use-chief-shortcut.js.map +1 -0
- package/dist/chief/use-chief-turn.d.ts +50 -0
- package/dist/chief/use-chief-turn.d.ts.map +1 -0
- package/dist/chief/use-chief-turn.js +99 -0
- package/dist/chief/use-chief-turn.js.map +1 -0
- package/dist/flavor/types.d.ts +189 -0
- package/dist/flavor/types.d.ts.map +1 -0
- package/dist/flavor/types.js +13 -0
- package/dist/flavor/types.js.map +1 -0
- package/dist/frame/OperatorShell.d.ts +91 -0
- package/dist/frame/OperatorShell.d.ts.map +1 -0
- package/dist/frame/OperatorShell.js +54 -0
- package/dist/frame/OperatorShell.js.map +1 -0
- package/dist/guard/PermissionProvider.d.ts +49 -0
- package/dist/guard/PermissionProvider.d.ts.map +1 -0
- package/dist/guard/PermissionProvider.js +103 -0
- package/dist/guard/PermissionProvider.js.map +1 -0
- package/dist/guard/RouteGuard.d.ts +45 -0
- package/dist/guard/RouteGuard.d.ts.map +1 -0
- package/dist/guard/RouteGuard.js +59 -0
- package/dist/guard/RouteGuard.js.map +1 -0
- package/dist/guard/permissions.d.ts +88 -0
- package/dist/guard/permissions.d.ts.map +1 -0
- package/dist/guard/permissions.js +105 -0
- package/dist/guard/permissions.js.map +1 -0
- package/dist/header/EnvironmentSwitcher.d.ts +5 -0
- package/dist/header/EnvironmentSwitcher.d.ts.map +1 -0
- package/dist/header/EnvironmentSwitcher.js +51 -0
- package/dist/header/EnvironmentSwitcher.js.map +1 -0
- package/dist/header/OperatorHeader.d.ts +25 -0
- package/dist/header/OperatorHeader.d.ts.map +1 -0
- package/dist/header/OperatorHeader.js +13 -0
- package/dist/header/OperatorHeader.js.map +1 -0
- package/dist/header/OperatorProfileMenu.d.ts +2 -0
- package/dist/header/OperatorProfileMenu.d.ts.map +1 -0
- package/dist/header/OperatorProfileMenu.js +14 -0
- package/dist/header/OperatorProfileMenu.js.map +1 -0
- package/dist/header/ThemeToggle.d.ts +2 -0
- package/dist/header/ThemeToggle.d.ts.map +1 -0
- package/dist/header/ThemeToggle.js +17 -0
- package/dist/header/ThemeToggle.js.map +1 -0
- package/dist/icons/registry.d.ts +57 -0
- package/dist/icons/registry.d.ts.map +1 -0
- package/dist/icons/registry.js +83 -0
- package/dist/icons/registry.js.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +129 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector/InspectorProvider.d.ts +41 -0
- package/dist/inspector/InspectorProvider.d.ts.map +1 -0
- package/dist/inspector/InspectorProvider.js +63 -0
- package/dist/inspector/InspectorProvider.js.map +1 -0
- package/dist/inspector/types.d.ts +91 -0
- package/dist/inspector/types.d.ts.map +1 -0
- package/dist/inspector/types.js +40 -0
- package/dist/inspector/types.js.map +1 -0
- package/dist/nav/routes.d.ts +39 -0
- package/dist/nav/routes.d.ts.map +1 -0
- package/dist/nav/routes.js +46 -0
- package/dist/nav/routes.js.map +1 -0
- package/dist/palette/CommandPalette.d.ts +40 -0
- package/dist/palette/CommandPalette.d.ts.map +1 -0
- package/dist/palette/CommandPalette.js +108 -0
- package/dist/palette/CommandPalette.js.map +1 -0
- package/dist/palette/commands.d.ts +58 -0
- package/dist/palette/commands.d.ts.map +1 -0
- package/dist/palette/commands.js +81 -0
- package/dist/palette/commands.js.map +1 -0
- package/dist/palette/search-sources.d.ts +126 -0
- package/dist/palette/search-sources.d.ts.map +1 -0
- package/dist/palette/search-sources.js +101 -0
- package/dist/palette/search-sources.js.map +1 -0
- package/dist/palette/use-search-results.d.ts +4 -0
- package/dist/palette/use-search-results.d.ts.map +1 -0
- package/dist/palette/use-search-results.js +51 -0
- package/dist/palette/use-search-results.js.map +1 -0
- package/dist/sidebar/OperatorSidebar.d.ts +44 -0
- package/dist/sidebar/OperatorSidebar.d.ts.map +1 -0
- package/dist/sidebar/OperatorSidebar.js +30 -0
- package/dist/sidebar/OperatorSidebar.js.map +1 -0
- package/dist/workspace/CanvasWorkspace.d.ts +78 -0
- package/dist/workspace/CanvasWorkspace.d.ts.map +1 -0
- package/dist/workspace/CanvasWorkspace.js +44 -0
- package/dist/workspace/CanvasWorkspace.js.map +1 -0
- package/dist/workspace/DashboardWorkspace.d.ts +91 -0
- package/dist/workspace/DashboardWorkspace.d.ts.map +1 -0
- package/dist/workspace/DashboardWorkspace.js +39 -0
- package/dist/workspace/DashboardWorkspace.js.map +1 -0
- package/dist/workspace/FormWorkspace.d.ts +107 -0
- package/dist/workspace/FormWorkspace.d.ts.map +1 -0
- package/dist/workspace/FormWorkspace.js +38 -0
- package/dist/workspace/FormWorkspace.js.map +1 -0
- package/dist/workspace/GraphWorkspace.d.ts +112 -0
- package/dist/workspace/GraphWorkspace.d.ts.map +1 -0
- package/dist/workspace/GraphWorkspace.js +147 -0
- package/dist/workspace/GraphWorkspace.js.map +1 -0
- package/dist/workspace/TableWorkspace.d.ts +74 -0
- package/dist/workspace/TableWorkspace.d.ts.map +1 -0
- package/dist/workspace/TableWorkspace.js +25 -0
- package/dist/workspace/TableWorkspace.js.map +1 -0
- package/dist/workspace/WorkspaceHost.d.ts +26 -0
- package/dist/workspace/WorkspaceHost.d.ts.map +1 -0
- package/dist/workspace/WorkspaceHost.js +21 -0
- package/dist/workspace/WorkspaceHost.js.map +1 -0
- package/dist/workspace/registry.d.ts +30 -0
- package/dist/workspace/registry.d.ts.map +1 -0
- package/dist/workspace/registry.js +33 -0
- package/dist/workspace/registry.js.map +1 -0
- package/dist/workspace/types.d.ts +79 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +48 -0
- package/dist/workspace/types.js.map +1 -0
- package/package.json +64 -0
- 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"}
|