@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/dist/index.d.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @consciousclouds/operator-shell — the operator-console shell archetype
|
|
3
|
+
* (Layer 4 of the Frontend Platform).
|
|
4
|
+
*
|
|
5
|
+
* Frame + header + sidebar + nav engine + icon registry + OperatorFlavor
|
|
6
|
+
* types + permission-guard seam + the Workspace Framework (the main region's
|
|
7
|
+
* typed workspace seam: registry + host, fail-closed) + the Chief region
|
|
8
|
+
* (panel chrome over
|
|
9
|
+
* @consciousclouds/assistant-surface; transport injected via a TurnAdapter
|
|
10
|
+
* typed against the conductor-sdk event vocabulary). Mechanism only: no BFF
|
|
11
|
+
* route, no gateway URL, no personality default, no credential logic — the
|
|
12
|
+
* product injects meaning through Flavor, Brand, TurnAdapter, and the
|
|
13
|
+
* permission resolver. See docs/design/operator-platform-contracts.md and
|
|
14
|
+
* docs/design/frontend-platform-doctrine.md.
|
|
15
|
+
*/
|
|
16
|
+
export { OperatorShell } from "./frame/OperatorShell.js";
|
|
17
|
+
export type { OperatorShellProps } from "./frame/OperatorShell.js";
|
|
18
|
+
export { OperatorHeader } from "./header/OperatorHeader.js";
|
|
19
|
+
export type { OperatorHeaderProps } from "./header/OperatorHeader.js";
|
|
20
|
+
export { OperatorProfileMenu } from "./header/OperatorProfileMenu.js";
|
|
21
|
+
export { ThemeToggle } from "./header/ThemeToggle.js";
|
|
22
|
+
export { EnvironmentSwitcher } from "./header/EnvironmentSwitcher.js";
|
|
23
|
+
export type { EnvironmentSwitcherProps } from "./header/EnvironmentSwitcher.js";
|
|
24
|
+
export { OperatorSidebar } from "./sidebar/OperatorSidebar.js";
|
|
25
|
+
export type { OperatorSidebarProps } from "./sidebar/OperatorSidebar.js";
|
|
26
|
+
export { deriveGatedNavGroups, flavorRoutes, isNavItemActive, isRouteInConsole, } from "./nav/routes.js";
|
|
27
|
+
export type { GatedNavGroup, GatedNavItem } from "./nav/routes.js";
|
|
28
|
+
export { OPERATOR_ICONS, SHIPPED_ICON_FAMILY, UNKNOWN_ICON, resolveIcon, resolveIconFamily, } from "./icons/registry.js";
|
|
29
|
+
export type { IconRegistry, ShippedIconFamily } from "./icons/registry.js";
|
|
30
|
+
export { CommandPalette } from "./palette/CommandPalette.js";
|
|
31
|
+
export type { CommandPaletteProps } from "./palette/CommandPalette.js";
|
|
32
|
+
export { derivePaletteGroups } from "./palette/commands.js";
|
|
33
|
+
export type { PaletteAction, PaletteCommand, PaletteGroup } from "./palette/commands.js";
|
|
34
|
+
export { isSearchResult, permittedSearchSources, querySearchSources, } from "./palette/search-sources.js";
|
|
35
|
+
export type { SearchResult, SearchResultAction, SearchResultGroup, SearchSource, } from "./palette/search-sources.js";
|
|
36
|
+
export { useSearchResults } from "./palette/use-search-results.js";
|
|
37
|
+
export type { OperatorCommandGroup, OperatorCommandItem, OperatorFlavor, OperatorFlavorChief, OperatorFlavorInspector, OperatorFlavorProduct, OperatorFlavorWorkspace, OperatorNavGroup, OperatorNavItem, } from "./flavor/types.js";
|
|
38
|
+
export { InspectorProvider, useInspector } from "./inspector/InspectorProvider.js";
|
|
39
|
+
export type { InspectorProviderProps } from "./inspector/InspectorProvider.js";
|
|
40
|
+
export { resolveInspectorView } from "./inspector/types.js";
|
|
41
|
+
export type { InspectorApi, InspectorOpenRequest, InspectorView, InspectorViewProps, InspectorViewRegistry, } from "./inspector/types.js";
|
|
42
|
+
export { ChiefRegion } from "./chief/ChiefRegion.js";
|
|
43
|
+
export type { ChiefRegionProps } from "./chief/ChiefRegion.js";
|
|
44
|
+
export { ChiefPanel } from "./chief/ChiefPanel.js";
|
|
45
|
+
export type { ChiefPanelProps } from "./chief/ChiefPanel.js";
|
|
46
|
+
export { ChiefDrawer } from "./chief/ChiefDrawer.js";
|
|
47
|
+
export type { ChiefDrawerProps } from "./chief/ChiefDrawer.js";
|
|
48
|
+
export { ChiefSession } from "./chief/ChiefSession.js";
|
|
49
|
+
export type { ChiefSessionProps } from "./chief/ChiefSession.js";
|
|
50
|
+
export { useChiefTurn } from "./chief/use-chief-turn.js";
|
|
51
|
+
export type { ChiefTurnMeta, ChiefTurnSession, UseChiefTurnOptions, } from "./chief/use-chief-turn.js";
|
|
52
|
+
export { CHIEF_SHORTCUT_KEY, CHIEF_SHORTCUT_LABEL, isChiefShortcut, useChiefShortcut, } from "./chief/use-chief-shortcut.js";
|
|
53
|
+
export { directiveToHref } from "./chief/directive.js";
|
|
54
|
+
export type { TurnAdapter, TurnAdapterHandle, TurnAdapterRequest, } from "./chief/turn-adapter.js";
|
|
55
|
+
export { WorkspaceHost, WorkspaceUnavailable } from "./workspace/WorkspaceHost.js";
|
|
56
|
+
export type { WorkspaceHostProps } from "./workspace/WorkspaceHost.js";
|
|
57
|
+
export { createWorkspaceRegistry } from "./workspace/registry.js";
|
|
58
|
+
export type { WorkspaceRegistry } from "./workspace/registry.js";
|
|
59
|
+
export { WORKSPACE_TYPE_IDS, isWorkspaceTypeId } from "./workspace/types.js";
|
|
60
|
+
export type { AnyWorkspaceType, WorkspaceComponentProps, WorkspaceType, WorkspaceTypeId, } from "./workspace/types.js";
|
|
61
|
+
export { CanvasWorkspace, canvasWorkspaceType } from "./workspace/CanvasWorkspace.js";
|
|
62
|
+
export type { CanvasWorkspaceInput, CanvasWorkspaceSlots, } from "./workspace/CanvasWorkspace.js";
|
|
63
|
+
export { DashboardWorkspace, dashboardWorkspaceType, } from "./workspace/DashboardWorkspace.js";
|
|
64
|
+
export type { DashboardWorkspaceInput, DashboardWorkspaceSection, DashboardWorkspaceSlots, DashboardWorkspaceStat, } from "./workspace/DashboardWorkspace.js";
|
|
65
|
+
export { TableWorkspace, tableWorkspaceType } from "./workspace/TableWorkspace.js";
|
|
66
|
+
export type { TableWorkspaceInput, TableWorkspaceSlots, } from "./workspace/TableWorkspace.js";
|
|
67
|
+
export { FormWorkspace, formWorkspaceType } from "./workspace/FormWorkspace.js";
|
|
68
|
+
export type { FormWorkspaceField, FormWorkspaceInput, FormWorkspaceSection, FormWorkspaceSlots, } from "./workspace/FormWorkspace.js";
|
|
69
|
+
export { GraphWorkspace, graphWorkspaceType } from "./workspace/GraphWorkspace.js";
|
|
70
|
+
export type { GraphWorkspaceEdge, GraphWorkspaceInput, GraphWorkspaceKind, GraphWorkspaceNode, GraphWorkspaceNodeAttribute, GraphWorkspaceSlots, } from "./workspace/GraphWorkspace.js";
|
|
71
|
+
export { allowAllPermissions, collectPermissionRefs, evaluatePermissions, gateStatus, isPermitted, toGateStatus, unknownPermissions, } from "./guard/permissions.js";
|
|
72
|
+
export type { PermissionDecision, PermissionEvaluation, PermissionGateStatus, PermissionResolver, SyncPermissionResolver, } from "./guard/permissions.js";
|
|
73
|
+
export { PermissionProvider, usePermission, usePermissionDecisions, } from "./guard/PermissionProvider.js";
|
|
74
|
+
export type { PermissionProviderProps } from "./guard/PermissionProvider.js";
|
|
75
|
+
export { RouteGuard } from "./guard/RouteGuard.js";
|
|
76
|
+
export type { RouteGuardProps } from "./guard/RouteGuard.js";
|
|
77
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @consciousclouds/operator-shell — the operator-console shell archetype
|
|
3
|
+
* (Layer 4 of the Frontend Platform).
|
|
4
|
+
*
|
|
5
|
+
* Frame + header + sidebar + nav engine + icon registry + OperatorFlavor
|
|
6
|
+
* types + permission-guard seam + the Workspace Framework (the main region's
|
|
7
|
+
* typed workspace seam: registry + host, fail-closed) + the Chief region
|
|
8
|
+
* (panel chrome over
|
|
9
|
+
* @consciousclouds/assistant-surface; transport injected via a TurnAdapter
|
|
10
|
+
* typed against the conductor-sdk event vocabulary). Mechanism only: no BFF
|
|
11
|
+
* route, no gateway URL, no personality default, no credential logic — the
|
|
12
|
+
* product injects meaning through Flavor, Brand, TurnAdapter, and the
|
|
13
|
+
* permission resolver. See docs/design/operator-platform-contracts.md and
|
|
14
|
+
* docs/design/frontend-platform-doctrine.md.
|
|
15
|
+
*/
|
|
16
|
+
// The frame
|
|
17
|
+
export { OperatorShell } from "./frame/OperatorShell.js";
|
|
18
|
+
// Header chrome (exported for composition; the frame mounts them by default)
|
|
19
|
+
export { OperatorHeader } from "./header/OperatorHeader.js";
|
|
20
|
+
export { OperatorProfileMenu } from "./header/OperatorProfileMenu.js";
|
|
21
|
+
export { ThemeToggle } from "./header/ThemeToggle.js";
|
|
22
|
+
// Environment switcher — header chrome over the published
|
|
23
|
+
// @consciousclouds/frontend-runtime context (consumed as-is): the PRODUCT
|
|
24
|
+
// mounts RuntimeProvider with its targets (URLs/transport stay product code —
|
|
25
|
+
// membrane); the shell renders labels + connection state from useRuntime.
|
|
26
|
+
// No provider ⇒ no chrome (fail-closed); one environment ⇒ an honest
|
|
27
|
+
// single-entry indicator; >1 named targets ⇒ a dropdown over switchTo.
|
|
28
|
+
export { EnvironmentSwitcher } from "./header/EnvironmentSwitcher.js";
|
|
29
|
+
// Sidebar / nav engine
|
|
30
|
+
export { OperatorSidebar } from "./sidebar/OperatorSidebar.js";
|
|
31
|
+
export { deriveGatedNavGroups, flavorRoutes, isNavItemActive, isRouteInConsole, } from "./nav/routes.js";
|
|
32
|
+
// Icon Platform — the string-name → icon resolution seam (icons/registry.ts
|
|
33
|
+
// holds the full contract): the Flavor declares inert string names; the
|
|
34
|
+
// product extends the vocabulary via the `icons` shell prop (extensions may
|
|
35
|
+
// override built-ins); unknown names fail closed to the deterministic
|
|
36
|
+
// UNKNOWN_ICON (own-property lookup — prototype names are unknown too). The
|
|
37
|
+
// Brand's inert `iconFamily` declaration is read by the frame and resolved
|
|
38
|
+
// through resolveIconFamily — the shell ships ONE family (lucide, per the
|
|
39
|
+
// license allowlist), so unshipped declarations read-and-default to it.
|
|
40
|
+
export { OPERATOR_ICONS, SHIPPED_ICON_FAMILY, UNKNOWN_ICON, resolveIcon, resolveIconFamily, } from "./icons/registry.js";
|
|
41
|
+
// Command palette — the shell-owned ⌘K palette (registry `command`/cmdk via
|
|
42
|
+
// @consciousclouds/ui): route commands auto-derived from flavor.nav, inert
|
|
43
|
+
// flavor.commands references, product-injected `runCommand` execution, and
|
|
44
|
+
// the SAME fail-closed permission gate as the sidebar (derivePaletteGroups
|
|
45
|
+
// is the pure, provable derivation).
|
|
46
|
+
export { CommandPalette } from "./palette/CommandPalette.js";
|
|
47
|
+
export { derivePaletteGroups } from "./palette/commands.js";
|
|
48
|
+
// Search sources — the doctrine skeleton's Search experience as a typed
|
|
49
|
+
// injection: the product injects `SearchSource` values through the shell's
|
|
50
|
+
// `searchSources` prop (product code — `query` runs the product's own reads;
|
|
51
|
+
// no transport here), the palette renders their results alongside the
|
|
52
|
+
// command groups under the SAME fail-closed permission snapshot, and an
|
|
53
|
+
// erroring/in-flight/absent source contributes NOTHING
|
|
54
|
+
// (querySearchSources + useSearchResults are the provable core; a result's
|
|
55
|
+
// action navigates or opens the inspector by entity kind — which keeps its
|
|
56
|
+
// own fail-closed gate).
|
|
57
|
+
export { isSearchResult, permittedSearchSources, querySearchSources, } from "./palette/search-sources.js";
|
|
58
|
+
export { useSearchResults } from "./palette/use-search-results.js";
|
|
59
|
+
// Inspector — the shell-owned detail panel (open/close/focus over the sheet
|
|
60
|
+
// primitive, keyed by entity kind): the Flavor DECLARES entity-kind
|
|
61
|
+
// references (`flavor.inspector.entityKinds`, inert), the product INJECTS
|
|
62
|
+
// the views (`inspectorViews` shell prop), pages open it via `useInspector`.
|
|
63
|
+
// Undeclared or view-less kinds fail closed — no panel, no crash
|
|
64
|
+
// (resolveInspectorView is the pure, provable gate).
|
|
65
|
+
export { InspectorProvider, useInspector } from "./inspector/InspectorProvider.js";
|
|
66
|
+
export { resolveInspectorView } from "./inspector/types.js";
|
|
67
|
+
// The AI Region — Chief's home in the shell. ChiefRegion resolves
|
|
68
|
+
// `flavor.chief.placement` ('rail' | 'drawer') to a presentation; BOTH
|
|
69
|
+
// presentations run the identical turn flow (useChiefTurn over the injected
|
|
70
|
+
// TurnAdapter — P1-1 — with the conductor event vocabulary and the
|
|
71
|
+
// routed-directive guard) and render the identical body (ChiefSession).
|
|
72
|
+
// Rail = the always-open inflow panel; drawer = the same content behind the
|
|
73
|
+
// sheet primitive with assistant-surface's open/close lifecycle. Below the
|
|
74
|
+
// xl breakpoint the rail placement falls back to the drawer (the rail is
|
|
75
|
+
// CSS-hidden there — Chief stays reachable).
|
|
76
|
+
export { ChiefRegion } from "./chief/ChiefRegion.js";
|
|
77
|
+
export { ChiefPanel } from "./chief/ChiefPanel.js";
|
|
78
|
+
export { ChiefDrawer } from "./chief/ChiefDrawer.js";
|
|
79
|
+
export { ChiefSession } from "./chief/ChiefSession.js";
|
|
80
|
+
export { useChiefTurn } from "./chief/use-chief-turn.js";
|
|
81
|
+
// Chief invocation parity — the shell-owned Chief keybinding (⌘J / Ctrl+J),
|
|
82
|
+
// the AI Region's ⌘K twin: rail focuses the composer, drawer (declared or the
|
|
83
|
+
// below-xl fallback) toggles through assistant-surface's open/close
|
|
84
|
+
// lifecycle; exactly one presentation mounts, so exactly one listener.
|
|
85
|
+
// `isChiefShortcut` is the pure, provable match rule (shift/alt refuse —
|
|
86
|
+
// ⌘⇧J stays the browser's).
|
|
87
|
+
export { CHIEF_SHORTCUT_KEY, CHIEF_SHORTCUT_LABEL, isChiefShortcut, useChiefShortcut, } from "./chief/use-chief-shortcut.js";
|
|
88
|
+
export { directiveToHref } from "./chief/directive.js";
|
|
89
|
+
// Workspace Framework — the main-region seam (frame-free subtree; a typed
|
|
90
|
+
// workspace-type contract + immutable registry + host that fails closed on
|
|
91
|
+
// unknown types). The nine V1 type ids are declared in WORKSPACE_TYPE_IDS.
|
|
92
|
+
export { WorkspaceHost, WorkspaceUnavailable } from "./workspace/WorkspaceHost.js";
|
|
93
|
+
export { createWorkspaceRegistry } from "./workspace/registry.js";
|
|
94
|
+
export { WORKSPACE_TYPE_IDS, isWorkspaceTypeId } from "./workspace/types.js";
|
|
95
|
+
// Canvas workspace type — the first-class canvas workspace: hosting state
|
|
96
|
+
// machine (error → loading → empty → ready) over the published
|
|
97
|
+
// @consciousclouds/canvas-runtime CanvasRenderer (consumed, never rebuilt);
|
|
98
|
+
// the product injects the ComponentMap + loading/error/empty slot content.
|
|
99
|
+
export { CanvasWorkspace, canvasWorkspaceType } from "./workspace/CanvasWorkspace.js";
|
|
100
|
+
// Dashboard workspace type — stat/overview widget-slot composition of the
|
|
101
|
+
// graduated workspace components (StatCard grid + titled ReactNode widget
|
|
102
|
+
// sections); same fail-closed state machine, every value product-supplied.
|
|
103
|
+
export { DashboardWorkspace, dashboardWorkspaceType, } from "./workspace/DashboardWorkspace.js";
|
|
104
|
+
// Table workspace type — tabular exploration hosting the graduated
|
|
105
|
+
// InteractiveDataTable composite (sorting · pagination · loading · empty),
|
|
106
|
+
// with a fail-closed error state layered above it.
|
|
107
|
+
export { TableWorkspace, tableWorkspaceType } from "./workspace/TableWorkspace.js";
|
|
108
|
+
// Form workspace type — structured input over the presentational forms set
|
|
109
|
+
// (Field vocabulary); controls, validation judgment, and submission
|
|
110
|
+
// transport stay product-owned. Ships as mechanism (no CCU write surface yet).
|
|
111
|
+
export { FormWorkspace, formWorkspaceType } from "./workspace/FormWorkspace.js";
|
|
112
|
+
// Graph workspace type — entity-relationship exploration over a typed
|
|
113
|
+
// nodes/edges contract, rendered as adjacency-style traversal composed from
|
|
114
|
+
// registry primitives (no visualization dependency — react-flow/d3 sit
|
|
115
|
+
// outside the license allowlist). Dangling edge endpoints fail closed.
|
|
116
|
+
export { GraphWorkspace, graphWorkspaceType } from "./workspace/GraphWorkspace.js";
|
|
117
|
+
// Permission-guard seam (§5) — the shell owns the fail-closed gating
|
|
118
|
+
// BEHAVIOR (loading / denied / redirect states), the product injects the
|
|
119
|
+
// RESOLUTION (sync or async: `PermissionResolver` may return a
|
|
120
|
+
// Promise<PermissionDecision>; while it's in flight nav shows a skeleton,
|
|
121
|
+
// the palette hides the entry, RouteGuard shows its loading state — and a
|
|
122
|
+
// rejection/throw is DENIED). The frame mounts PermissionProvider with the
|
|
123
|
+
// injected resolver so pages gate through usePermission / RouteGuard without
|
|
124
|
+
// ever holding the resolver themselves. `evaluatePermissions` / `gateStatus`
|
|
125
|
+
// are the pure, provable core.
|
|
126
|
+
export { allowAllPermissions, collectPermissionRefs, evaluatePermissions, gateStatus, isPermitted, toGateStatus, unknownPermissions, } from "./guard/permissions.js";
|
|
127
|
+
export { PermissionProvider, usePermission, usePermissionDecisions, } from "./guard/PermissionProvider.js";
|
|
128
|
+
export { RouteGuard } from "./guard/RouteGuard.js";
|
|
129
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InspectorProvider — the shell-owned detail panel (the Inspector region of
|
|
3
|
+
* the operator experience). Owns the open/close/focus lifecycle over the
|
|
4
|
+
* registry `sheet` primitive (Radix Dialog: focus trap, focus restore,
|
|
5
|
+
* Esc-to-close, overlay dismiss) and mounts the product's registered view
|
|
6
|
+
* for the opened entity kind.
|
|
7
|
+
*
|
|
8
|
+
* The provider is MECHANISM only: it resolves `kind` against the Flavor's
|
|
9
|
+
* declared entity-kind references and the product-injected view registry
|
|
10
|
+
* (see types.ts) and renders the resolved component with the mount contract
|
|
11
|
+
* (`kind` / `entity` / `close`). It interprets nothing about the entity.
|
|
12
|
+
*
|
|
13
|
+
* FAIL-CLOSED twice over:
|
|
14
|
+
* - `open()` on an undeclared or view-less kind returns false and renders
|
|
15
|
+
* nothing — no panel, no crash.
|
|
16
|
+
* - `useInspector()` outside a provider returns an inert API (`open` →
|
|
17
|
+
* false) instead of throwing, so a component composed outside the shell
|
|
18
|
+
* degrades to "no inspector here".
|
|
19
|
+
*/
|
|
20
|
+
import * as React from "react";
|
|
21
|
+
import type { InspectorApi, InspectorViewRegistry } from "./types.js";
|
|
22
|
+
/**
|
|
23
|
+
* The shell-owned inspector handle. Safe anywhere: outside an
|
|
24
|
+
* InspectorProvider it returns the inert fail-closed API.
|
|
25
|
+
*/
|
|
26
|
+
export declare function useInspector(): InspectorApi;
|
|
27
|
+
export interface InspectorProviderProps {
|
|
28
|
+
/**
|
|
29
|
+
* The Flavor's declared entity-kind REFERENCES (inert strings) — the frame
|
|
30
|
+
* passes `flavor.inspector.entityKinds`. Undeclared kinds never open.
|
|
31
|
+
*/
|
|
32
|
+
entityKinds?: readonly string[];
|
|
33
|
+
/**
|
|
34
|
+
* The product-injected view registry keyed by those references (components
|
|
35
|
+
* are product code — they can't live in a Flavor).
|
|
36
|
+
*/
|
|
37
|
+
views?: InspectorViewRegistry;
|
|
38
|
+
children: React.ReactNode;
|
|
39
|
+
}
|
|
40
|
+
export declare function InspectorProvider({ entityKinds, views, children, }: InspectorProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
//# sourceMappingURL=InspectorProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InspectorProvider.d.ts","sourceRoot":"","sources":["../../src/inspector/InspectorProvider.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,OAAO,KAAK,EACV,YAAY,EAEZ,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAapB;;;GAGG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAE3C;AAED,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,KAAK,EACL,QAAQ,GACT,EAAE,sBAAsB,2CA6DxB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* InspectorProvider — the shell-owned detail panel (the Inspector region of
|
|
5
|
+
* the operator experience). Owns the open/close/focus lifecycle over the
|
|
6
|
+
* registry `sheet` primitive (Radix Dialog: focus trap, focus restore,
|
|
7
|
+
* Esc-to-close, overlay dismiss) and mounts the product's registered view
|
|
8
|
+
* for the opened entity kind.
|
|
9
|
+
*
|
|
10
|
+
* The provider is MECHANISM only: it resolves `kind` against the Flavor's
|
|
11
|
+
* declared entity-kind references and the product-injected view registry
|
|
12
|
+
* (see types.ts) and renders the resolved component with the mount contract
|
|
13
|
+
* (`kind` / `entity` / `close`). It interprets nothing about the entity.
|
|
14
|
+
*
|
|
15
|
+
* FAIL-CLOSED twice over:
|
|
16
|
+
* - `open()` on an undeclared or view-less kind returns false and renders
|
|
17
|
+
* nothing — no panel, no crash.
|
|
18
|
+
* - `useInspector()` outside a provider returns an inert API (`open` →
|
|
19
|
+
* false) instead of throwing, so a component composed outside the shell
|
|
20
|
+
* degrades to "no inspector here".
|
|
21
|
+
*/
|
|
22
|
+
import * as React from "react";
|
|
23
|
+
import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from "@consciousclouds/ui";
|
|
24
|
+
import { resolveInspectorView } from "./types.js";
|
|
25
|
+
/** The inert outside-a-provider API: nothing opens, nothing throws. */
|
|
26
|
+
const NO_INSPECTOR = {
|
|
27
|
+
open: () => false,
|
|
28
|
+
close: () => { },
|
|
29
|
+
isOpen: false,
|
|
30
|
+
canInspect: () => false,
|
|
31
|
+
};
|
|
32
|
+
const InspectorContext = React.createContext(NO_INSPECTOR);
|
|
33
|
+
/**
|
|
34
|
+
* The shell-owned inspector handle. Safe anywhere: outside an
|
|
35
|
+
* InspectorProvider it returns the inert fail-closed API.
|
|
36
|
+
*/
|
|
37
|
+
export function useInspector() {
|
|
38
|
+
return React.useContext(InspectorContext);
|
|
39
|
+
}
|
|
40
|
+
export function InspectorProvider({ entityKinds, views, children, }) {
|
|
41
|
+
const [open, setOpen] = React.useState(false);
|
|
42
|
+
// The last accepted request stays mounted through the close animation.
|
|
43
|
+
const [request, setRequest] = React.useState(null);
|
|
44
|
+
const declared = React.useMemo(() => entityKinds ?? [], [entityKinds]);
|
|
45
|
+
const api = React.useMemo(() => ({
|
|
46
|
+
open: (req) => {
|
|
47
|
+
// The one fail-closed gate: Flavor-declared AND product-injected.
|
|
48
|
+
if (resolveInspectorView(req.kind, declared, views) == null)
|
|
49
|
+
return false;
|
|
50
|
+
setRequest(req);
|
|
51
|
+
setOpen(true);
|
|
52
|
+
return true;
|
|
53
|
+
},
|
|
54
|
+
close: () => setOpen(false),
|
|
55
|
+
isOpen: open,
|
|
56
|
+
canInspect: (kind) => resolveInspectorView(kind, declared, views) != null,
|
|
57
|
+
}), [declared, views, open]);
|
|
58
|
+
// Re-resolve at render (never a captured component): pulling a view out of
|
|
59
|
+
// the registry closes an already-open panel's content path too.
|
|
60
|
+
const View = request ? resolveInspectorView(request.kind, declared, views) : null;
|
|
61
|
+
return (_jsxs(InspectorContext.Provider, { value: api, children: [children, _jsx(Sheet, { open: open && View != null, onOpenChange: setOpen, children: _jsx(SheetContent, { side: "right", className: "w-full gap-0 overflow-y-auto sm:max-w-md", "data-inspector-kind": request?.kind, children: request && View ? (_jsxs(_Fragment, { children: [_jsxs(SheetHeader, { className: "border-b", children: [_jsx(SheetTitle, { children: request.title ?? request.kind }), request.description ? (_jsx(SheetDescription, { children: request.description })) : (_jsx(SheetDescription, { className: "sr-only", children: "Detail inspector" }))] }), _jsx("div", { className: "flex-1 p-4", children: _jsx(View, { kind: request.kind, entity: request.entity, close: () => setOpen(false) }) })] })) : null }) })] }));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=InspectorProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InspectorProvider.js","sourceRoot":"","sources":["../../src/inspector/InspectorProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EACL,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,UAAU,GACX,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,uEAAuE;AACvE,MAAM,YAAY,GAAiB;IACjC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;IACjB,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK;CACxB,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAe,YAAY,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAC5C,CAAC;AAgBD,MAAM,UAAU,iBAAiB,CAAC,EAChC,WAAW,EACX,KAAK,EACL,QAAQ,GACe;IACvB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,uEAAuE;IACvE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAA8B,IAAI,CAAC,CAAC;IAEhF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAEvE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CACvB,GAAG,EAAE,CAAC,CAAC;QACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACZ,kEAAkE;YAClE,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC1E,UAAU,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3B,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI;KAC1E,CAAC,EACF,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CACxB,CAAC;IAEF,2EAA2E;IAC3E,gEAAgE;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAElF,OAAO,CACL,MAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,aAClC,QAAQ,EACT,KAAC,KAAK,IAAC,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,YAAY,EAAE,OAAO,YACtD,KAAC,YAAY,IACX,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,0CAA0C,yBAC/B,OAAO,EAAE,IAAI,YAEjC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CACjB,8BACE,MAAC,WAAW,IAAC,SAAS,EAAC,UAAU,aAC/B,KAAC,UAAU,cAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,GAAc,EACvD,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CACrB,KAAC,gBAAgB,cAAE,OAAO,CAAC,WAAW,GAAoB,CAC3D,CAAC,CAAC,CAAC,CACF,KAAC,gBAAgB,IAAC,SAAS,EAAC,SAAS,iCAElB,CACpB,IACW,EACd,cAAK,SAAS,EAAC,YAAY,YACzB,KAAC,IAAI,IACH,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAC3B,GACE,IACL,CACJ,CAAC,CAAC,CAAC,IAAI,GACK,GACT,IACkB,CAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inspector — the type contract (the shell's detail-panel seam), per the
|
|
3
|
+
* Operator Platform contract skeleton (frontend-platform-doctrine.md):
|
|
4
|
+
* "Inspector / detail — the platform owns inspector-panel behavior and
|
|
5
|
+
* open/close; the product fills the detail views registered for its
|
|
6
|
+
* entities."
|
|
7
|
+
*
|
|
8
|
+
* The split, verbatim from the membrane:
|
|
9
|
+
* - The SHELL owns the panel — open/close/focus lifecycle over the sheet
|
|
10
|
+
* primitive, keyed by ENTITY KIND.
|
|
11
|
+
* - The FLAVOR declares inspector REFERENCES — the entity-kind ids this
|
|
12
|
+
* surface may inspect (inert strings; components can't live in a Flavor,
|
|
13
|
+
* Declarative-Flavor law).
|
|
14
|
+
* - The PRODUCT injects the view components through a shell-prop registry
|
|
15
|
+
* keyed by those references (the same injection pattern as icons, the
|
|
16
|
+
* permission resolver, and `runCommand`).
|
|
17
|
+
*
|
|
18
|
+
* FAIL-CLOSED: opening a kind the Flavor never declared, or one no injected
|
|
19
|
+
* view resolves, does nothing — no panel, no crash (the inspector dual of
|
|
20
|
+
* the WorkspaceHost's unavailable state and the palette's hidden
|
|
21
|
+
* runner-less commands).
|
|
22
|
+
*
|
|
23
|
+
* The inspector presents ALREADY-RESOLVED data: the opener hands it the
|
|
24
|
+
* entity (from a read the page already holds). The shell never fetches — a
|
|
25
|
+
* detail view that needs more data fetches on the product's side of the
|
|
26
|
+
* membrane.
|
|
27
|
+
*/
|
|
28
|
+
import type * as React from "react";
|
|
29
|
+
/**
|
|
30
|
+
* The mount contract — what every registered inspector view receives from
|
|
31
|
+
* the shell when its entity kind is opened.
|
|
32
|
+
*/
|
|
33
|
+
export interface InspectorViewProps<TEntity = unknown> {
|
|
34
|
+
/** The entity-kind reference this view was registered under. */
|
|
35
|
+
kind: string;
|
|
36
|
+
/**
|
|
37
|
+
* The already-resolved entity the opener supplied — opaque to the shell,
|
|
38
|
+
* typed by the product's view (meaning belongs to the product).
|
|
39
|
+
*/
|
|
40
|
+
entity: TEntity;
|
|
41
|
+
/** Imperative close handle (the shell also closes on Esc / the ✕ / overlay). */
|
|
42
|
+
close: () => void;
|
|
43
|
+
}
|
|
44
|
+
/** A registered inspector view component (entity typing erased at the registry boundary). */
|
|
45
|
+
export type InspectorView = React.ComponentType<InspectorViewProps<any>>;
|
|
46
|
+
/**
|
|
47
|
+
* The product's view registry, injected as a shell prop and keyed by the
|
|
48
|
+
* Flavor's entity-kind references. Components live HERE (product code) —
|
|
49
|
+
* never in the Flavor.
|
|
50
|
+
*/
|
|
51
|
+
export type InspectorViewRegistry = Record<string, InspectorView>;
|
|
52
|
+
/** What an opener passes to `useInspector().open(…)`. */
|
|
53
|
+
export interface InspectorOpenRequest<TEntity = unknown> {
|
|
54
|
+
/**
|
|
55
|
+
* The entity-kind reference — must be declared by the Flavor AND have an
|
|
56
|
+
* injected view, or the request fails closed (returns false, no panel).
|
|
57
|
+
*/
|
|
58
|
+
kind: string;
|
|
59
|
+
/** The already-resolved entity the view will present. */
|
|
60
|
+
entity: TEntity;
|
|
61
|
+
/** Panel title (a11y-required; defaults to the kind reference). */
|
|
62
|
+
title?: string;
|
|
63
|
+
/** Optional one-line description rendered under the title. */
|
|
64
|
+
description?: string;
|
|
65
|
+
}
|
|
66
|
+
/** The shell-owned inspector API pages reach through `useInspector()`. */
|
|
67
|
+
export interface InspectorApi {
|
|
68
|
+
/**
|
|
69
|
+
* Open the inspector on an entity. Fail-closed: returns `true` and opens
|
|
70
|
+
* only when the kind is Flavor-declared and a view is injected; otherwise
|
|
71
|
+
* returns `false` and nothing renders.
|
|
72
|
+
*/
|
|
73
|
+
open: (request: InspectorOpenRequest) => boolean;
|
|
74
|
+
/** Close the panel (idempotent). */
|
|
75
|
+
close: () => void;
|
|
76
|
+
/** Is the panel currently open? */
|
|
77
|
+
isOpen: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Would `open` succeed for this kind? Lets a page decide whether to draw
|
|
80
|
+
* an inspect affordance at all (same fail-closed derivation as `open`).
|
|
81
|
+
*/
|
|
82
|
+
canInspect: (kind: string) => boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The one fail-closed resolution both `open` and `canInspect` share: a kind
|
|
86
|
+
* inspects only when the Flavor DECLARED it (the inert reference) and the
|
|
87
|
+
* product INJECTED a view for it (the implementation). Pure and exported so
|
|
88
|
+
* the gate is provable without a DOM.
|
|
89
|
+
*/
|
|
90
|
+
export declare function resolveInspectorView(kind: string, declaredKinds: readonly string[], views: InspectorViewRegistry | undefined): InspectorView | null;
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/inspector/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,kBAAkB,CAAC,OAAO,GAAG,OAAO;IACnD,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,6FAA6F;AAE7F,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAElE,yDAAyD;AACzD,MAAM,WAAW,oBAAoB,CAAC,OAAO,GAAG,OAAO;IACrD;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;IACjD,oCAAoC;IACpC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,KAAK,EAAE,qBAAqB,GAAG,SAAS,GACvC,aAAa,GAAG,IAAI,CAItB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inspector — the type contract (the shell's detail-panel seam), per the
|
|
3
|
+
* Operator Platform contract skeleton (frontend-platform-doctrine.md):
|
|
4
|
+
* "Inspector / detail — the platform owns inspector-panel behavior and
|
|
5
|
+
* open/close; the product fills the detail views registered for its
|
|
6
|
+
* entities."
|
|
7
|
+
*
|
|
8
|
+
* The split, verbatim from the membrane:
|
|
9
|
+
* - The SHELL owns the panel — open/close/focus lifecycle over the sheet
|
|
10
|
+
* primitive, keyed by ENTITY KIND.
|
|
11
|
+
* - The FLAVOR declares inspector REFERENCES — the entity-kind ids this
|
|
12
|
+
* surface may inspect (inert strings; components can't live in a Flavor,
|
|
13
|
+
* Declarative-Flavor law).
|
|
14
|
+
* - The PRODUCT injects the view components through a shell-prop registry
|
|
15
|
+
* keyed by those references (the same injection pattern as icons, the
|
|
16
|
+
* permission resolver, and `runCommand`).
|
|
17
|
+
*
|
|
18
|
+
* FAIL-CLOSED: opening a kind the Flavor never declared, or one no injected
|
|
19
|
+
* view resolves, does nothing — no panel, no crash (the inspector dual of
|
|
20
|
+
* the WorkspaceHost's unavailable state and the palette's hidden
|
|
21
|
+
* runner-less commands).
|
|
22
|
+
*
|
|
23
|
+
* The inspector presents ALREADY-RESOLVED data: the opener hands it the
|
|
24
|
+
* entity (from a read the page already holds). The shell never fetches — a
|
|
25
|
+
* detail view that needs more data fetches on the product's side of the
|
|
26
|
+
* membrane.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* The one fail-closed resolution both `open` and `canInspect` share: a kind
|
|
30
|
+
* inspects only when the Flavor DECLARED it (the inert reference) and the
|
|
31
|
+
* product INJECTED a view for it (the implementation). Pure and exported so
|
|
32
|
+
* the gate is provable without a DOM.
|
|
33
|
+
*/
|
|
34
|
+
export function resolveInspectorView(kind, declaredKinds, views) {
|
|
35
|
+
if (!declaredKinds.includes(kind))
|
|
36
|
+
return null;
|
|
37
|
+
const view = views?.[kind];
|
|
38
|
+
return view ?? null;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/inspector/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAiEH;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,aAAgC,EAChC,KAAwC;IAExC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The nav engine's pure route logic. The Flavor declares routes; everything
|
|
3
|
+
* the shell decides about them (active state, the Chief in-console set) is
|
|
4
|
+
* DERIVED here — no hardcoded route lists anywhere in the shell.
|
|
5
|
+
*/
|
|
6
|
+
import type { OperatorNavGroup, OperatorNavItem } from "../flavor/types.js";
|
|
7
|
+
import type { PermissionGateStatus } from "../guard/permissions.js";
|
|
8
|
+
/**
|
|
9
|
+
* The set of console route hrefs derived from the Flavor's nav — the source
|
|
10
|
+
* of truth for what this console serves (replaces the reference shell's
|
|
11
|
+
* hardcoded IN_CONSOLE_ROUTES).
|
|
12
|
+
*/
|
|
13
|
+
export declare function flavorRoutes(nav: OperatorNavGroup[]): Set<string>;
|
|
14
|
+
/** Whether an href (query string ignored) is part of the console's route set. */
|
|
15
|
+
export declare function isRouteInConsole(routes: Set<string>, href: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Active-state rule, carried over from the reference shell verbatim:
|
|
18
|
+
* `/` matches exactly; any other href matches by prefix.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isNavItemActive(href: string, pathname: string): boolean;
|
|
21
|
+
/** A nav item paired with what its gate shows right now (denied never appears). */
|
|
22
|
+
export interface GatedNavItem {
|
|
23
|
+
item: OperatorNavItem;
|
|
24
|
+
status: Extract<PermissionGateStatus, "allowed" | "loading">;
|
|
25
|
+
}
|
|
26
|
+
/** A nav group after gating; groups whose items all vanished are dropped. */
|
|
27
|
+
export interface GatedNavGroup {
|
|
28
|
+
group: OperatorNavGroup;
|
|
29
|
+
items: GatedNavItem[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The sidebar's pure gating derivation (contracts §5), provable without a
|
|
33
|
+
* DOM: each item reads the live decisions map through `gateStatus` —
|
|
34
|
+
* `denied`/unknown items DO NOT EXIST in the output (hidden, never
|
|
35
|
+
* disabled), `loading` items keep their slot (the sidebar renders a
|
|
36
|
+
* skeleton), and a group left with nothing vanishes with its label.
|
|
37
|
+
*/
|
|
38
|
+
export declare function deriveGatedNavGroups(nav: OperatorNavGroup[], decisions: Readonly<Record<string, PermissionGateStatus>>): GatedNavGroup[];
|
|
39
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/nav/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAGpE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAEjE;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;CAC9D;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,gBAAgB,EAAE,EACvB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,GACxD,aAAa,EAAE,CAYjB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The nav engine's pure route logic. The Flavor declares routes; everything
|
|
3
|
+
* the shell decides about them (active state, the Chief in-console set) is
|
|
4
|
+
* DERIVED here — no hardcoded route lists anywhere in the shell.
|
|
5
|
+
*/
|
|
6
|
+
import { gateStatus } from "../guard/permissions.js";
|
|
7
|
+
/**
|
|
8
|
+
* The set of console route hrefs derived from the Flavor's nav — the source
|
|
9
|
+
* of truth for what this console serves (replaces the reference shell's
|
|
10
|
+
* hardcoded IN_CONSOLE_ROUTES).
|
|
11
|
+
*/
|
|
12
|
+
export function flavorRoutes(nav) {
|
|
13
|
+
return new Set(nav.flatMap((group) => group.items.map((item) => item.href)));
|
|
14
|
+
}
|
|
15
|
+
/** Whether an href (query string ignored) is part of the console's route set. */
|
|
16
|
+
export function isRouteInConsole(routes, href) {
|
|
17
|
+
return routes.has(href.split("?")[0] ?? href);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Active-state rule, carried over from the reference shell verbatim:
|
|
21
|
+
* `/` matches exactly; any other href matches by prefix.
|
|
22
|
+
*/
|
|
23
|
+
export function isNavItemActive(href, pathname) {
|
|
24
|
+
return href === "/" ? pathname === "/" : pathname.startsWith(href);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The sidebar's pure gating derivation (contracts §5), provable without a
|
|
28
|
+
* DOM: each item reads the live decisions map through `gateStatus` —
|
|
29
|
+
* `denied`/unknown items DO NOT EXIST in the output (hidden, never
|
|
30
|
+
* disabled), `loading` items keep their slot (the sidebar renders a
|
|
31
|
+
* skeleton), and a group left with nothing vanishes with its label.
|
|
32
|
+
*/
|
|
33
|
+
export function deriveGatedNavGroups(nav, decisions) {
|
|
34
|
+
return nav
|
|
35
|
+
.map((group) => ({
|
|
36
|
+
group,
|
|
37
|
+
items: group.items
|
|
38
|
+
.map((item) => {
|
|
39
|
+
const status = gateStatus(item.requiredPermission, decisions);
|
|
40
|
+
return status === "denied" ? null : { item, status };
|
|
41
|
+
})
|
|
42
|
+
.filter((entry) => entry !== null),
|
|
43
|
+
}))
|
|
44
|
+
.filter(({ items }) => items.length > 0);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/nav/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAuB;IAClD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,IAAY;IAChE,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB;IAC5D,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAcD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAuB,EACvB,SAAyD;IAEzD,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;aACf,GAAG,CAAC,CAAC,IAAI,EAAuB,EAAE;YACjC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YAC9D,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACvD,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAAyB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;KAC5D,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { OperatorFlavor } from "../flavor/types.js";
|
|
2
|
+
import type { PermissionResolver } from "../guard/permissions.js";
|
|
3
|
+
import type { IconRegistry } from "../icons/registry.js";
|
|
4
|
+
import type { SearchSource } from "./search-sources.js";
|
|
5
|
+
export interface CommandPaletteProps {
|
|
6
|
+
/** The surface manifest — nav derives the route commands; `commands` adds references. */
|
|
7
|
+
flavor: OperatorFlavor;
|
|
8
|
+
/**
|
|
9
|
+
* The product's permission resolution (§5), sync or async — the palette
|
|
10
|
+
* gates exactly like the sidebar (an in-flight async decision is DENIED
|
|
11
|
+
* here until it resolves; fail-closed while loading).
|
|
12
|
+
*/
|
|
13
|
+
resolvePermission: PermissionResolver;
|
|
14
|
+
/** Product icon-vocabulary extensions for the registry. */
|
|
15
|
+
icons?: IconRegistry;
|
|
16
|
+
/**
|
|
17
|
+
* The resolved icon family (the frame reads the Brand's inert
|
|
18
|
+
* `iconFamily` declaration and resolves it via `resolveIconFamily`).
|
|
19
|
+
* Absent ⇒ the shipped family — same deterministic default.
|
|
20
|
+
*/
|
|
21
|
+
iconFamily?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Product-injected executor for `command`-reference entries. Without it,
|
|
24
|
+
* those entries are hidden (fail-closed) — `href` entries still navigate.
|
|
25
|
+
*/
|
|
26
|
+
runCommand?: (commandRef: string) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Product-injected searchable sources (search-sources.ts) — the Search
|
|
29
|
+
* experience's injection slot. Absent ⇒ the palette is commands-only.
|
|
30
|
+
* Pass a STABLE array (module const / memo): identity is the re-query key.
|
|
31
|
+
*/
|
|
32
|
+
searchSources?: readonly SearchSource[];
|
|
33
|
+
/** Controlled open state (the frame owns it; ⌘K toggles through onOpenChange). */
|
|
34
|
+
open: boolean;
|
|
35
|
+
onOpenChange: (open: boolean) => void;
|
|
36
|
+
/** Input placeholder copy. */
|
|
37
|
+
placeholder?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function CommandPalette({ flavor, resolvePermission, icons, iconFamily, runCommand, searchSources, open, onOpenChange, placeholder, }: CommandPaletteProps): import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
//# sourceMappingURL=CommandPalette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../src/palette/CommandPalette.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAA0B,MAAM,yBAAyB,CAAC;AAG1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAG5E,MAAM,WAAW,mBAAmB;IAClC,yFAAyF;IACzF,MAAM,EAAE,cAAc,CAAC;IACvB;;;;OAIG;IACH,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,2DAA2D;IAC3D,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,kFAAkF;IAClF,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,YAAY,EACZ,WAAyC,GAC1C,EAAE,mBAAmB,2CAwHrB"}
|