@hachej/boring-workspace 0.1.64 → 0.1.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/FileTree-B_fRS4Om.js +230 -0
  2. package/dist/MarkdownEditor-C55gVDyW.js +743 -0
  3. package/dist/WorkspaceLoadingState-D3i4X-eH.js +847 -0
  4. package/dist/WorkspaceProvider-Ddx7GByq.js +8770 -0
  5. package/dist/app-front.d.ts +79 -2
  6. package/dist/app-front.js +3110 -2467
  7. package/dist/app-server.d.ts +2 -2
  8. package/dist/app-server.js +6 -4
  9. package/dist/boring-workspace.css +2 -1
  10. package/dist/charts.d.ts +6 -1
  11. package/dist/charts.js +131 -138
  12. package/dist/plugin.d.ts +64 -1
  13. package/dist/plugin.js +32 -0
  14. package/dist/rolldown-runtime-Dqa2HsxW.js +20 -0
  15. package/dist/{runtimeEnv-HolIkcoB.d.ts → runtimeEnv-CU-c4kaV.d.ts} +7 -0
  16. package/dist/server.d.ts +2 -2
  17. package/dist/server.js +4 -3
  18. package/dist/testing-e2e.d.ts +5 -0
  19. package/dist/testing-e2e.js +33 -42
  20. package/dist/testing.d.ts +6 -1
  21. package/dist/testing.js +9474 -10814
  22. package/dist/utils-BRcxFdrz.js +8 -0
  23. package/dist/workspace.css +2756 -290
  24. package/dist/workspace.d.ts +132 -15
  25. package/dist/workspace.js +568 -734
  26. package/docs/plans/archive/CODE_OWNERSHIP_CLEANUP_PLAN.md +1 -1
  27. package/docs/plans/archive/DECLARATIVE_LAYOUT_MIGRATION.md +4 -4
  28. package/docs/plans/archive/GENERIC_EXPLORER_PLUGIN_PLAN.md +10 -10
  29. package/docs/plans/archive/PLUGIN_MODEL.md +37 -37
  30. package/docs/plans/archive/WORKSPACE_V2_PLAN.md +2 -2
  31. package/package.json +50 -50
  32. package/dist/FileTree-DjhAzlg3.js +0 -315
  33. package/dist/MarkdownEditor-CeN7n6mw.js +0 -610
  34. package/dist/WorkspaceLoadingState-D4SB2awA.js +0 -867
  35. package/dist/WorkspaceProvider-CEZUOy1M.js +0 -8725
  36. package/dist/utils-B6yFEsav.js +0 -8
@@ -1,8 +1,8 @@
1
1
  import { PiPackageSource, PiExtensionFactory, CreateAgentAppOptions, ProvisionWorkspaceRuntimeOptions } from '@hachej/boring-agent/server';
2
2
  export { PiPackageSource as WorkspacePiPackageSource } from '@hachej/boring-agent/server';
3
3
  import { FastifyInstance } from 'fastify';
4
- import { W as WorkspaceServerPlugin, S as ServerBootstrapOptions, a as WorkspaceBridgeRegistry, B as BridgeAuthPolicy, b as WorkspaceBridgeHandler, c as WorkspaceBridgeRuntimeEnvOptions, d as BoringPluginSourceInput, e as BoringPluginFrontTargetResolver, f as createInMemoryBridge, g as WorkspaceProvisioningContribution, h as WorkspaceRouteContribution } from './runtimeEnv-HolIkcoB.js';
5
- export { i as ServerWorkspaceRuntimeProvisioningInput } from './runtimeEnv-HolIkcoB.js';
4
+ import { W as WorkspaceServerPlugin, S as ServerBootstrapOptions, a as WorkspaceBridgeRegistry, B as BridgeAuthPolicy, b as WorkspaceBridgeHandler, c as WorkspaceBridgeRuntimeEnvOptions, d as BoringPluginSourceInput, e as BoringPluginFrontTargetResolver, f as createInMemoryBridge, g as WorkspaceProvisioningContribution, h as WorkspaceRouteContribution } from './runtimeEnv-CU-c4kaV.js';
5
+ export { i as ServerWorkspaceRuntimeProvisioningInput } from './runtimeEnv-CU-c4kaV.js';
6
6
  import { W as WorkspaceBridgeOperationDefinition } from './workspace-bridge-rpc-A98RA5o6.js';
7
7
  import './manifest-C2vVgH_e.js';
8
8
  import './agent-tool-CB0RQyx9.js';
@@ -3089,17 +3089,18 @@ function createLocalCliBridgeAuthPolicy(options) {
3089
3089
  );
3090
3090
  }
3091
3091
  ensureCallerAllowed(input.definition, "browser");
3092
- if (input.workspaceId !== options.workspaceId) {
3092
+ if (!options.forceOwnerWorkspaceId && input.workspaceId !== options.workspaceId) {
3093
3093
  throw createWorkspaceBridgeError(
3094
3094
  "BRIDGE_RESOURCE_SCOPE_DENIED" /* ResourceScopeDenied */,
3095
3095
  "Local CLI bridge caller is not authorized for workspace"
3096
3096
  );
3097
3097
  }
3098
+ const workspaceId = options.forceOwnerWorkspaceId ? options.workspaceId : input.workspaceId;
3098
3099
  const capabilities = options.capabilities ?? input.definition.requiredCapabilities;
3099
3100
  ensureCapabilities(capabilities, input.requiredCapabilities ?? input.definition.requiredCapabilities);
3100
3101
  const context = makeContext({
3101
3102
  callerClass: "browser",
3102
- workspaceId: input.workspaceId,
3103
+ workspaceId,
3103
3104
  sessionId: input.sessionId,
3104
3105
  pluginId: input.pluginId,
3105
3106
  capabilities,
@@ -3109,7 +3110,7 @@ function createLocalCliBridgeAuthPolicy(options) {
3109
3110
  context,
3110
3111
  effectiveCapabilities: capabilities,
3111
3112
  principal: { userId: "local-cli" },
3112
- resourceScope: { workspaceId: input.workspaceId, sessionId: input.sessionId }
3113
+ resourceScope: { workspaceId, sessionId: input.sessionId }
3113
3114
  };
3114
3115
  }
3115
3116
  };
@@ -4141,7 +4142,8 @@ function resolveWorkspaceBridgeBrowserAuthPolicy(opts, registry) {
4141
4142
  emitLocalCliBridgeAuthWarning();
4142
4143
  return createLocalCliBridgeAuthPolicy({
4143
4144
  workspaceId: "default",
4144
- capabilities: registry.listDefinitions().flatMap((definition) => [...definition.requiredCapabilities])
4145
+ capabilities: registry.listDefinitions().flatMap((definition) => [...definition.requiredCapabilities]),
4146
+ forceOwnerWorkspaceId: true
4145
4147
  });
4146
4148
  }
4147
4149
  function emitLocalCliBridgeAuthWarning() {
@@ -1 +1,2 @@
1
- .dv-shell{--dv-background-color: var(--background);--dv-paneview-header-border-color: var(--border);--dv-tabs-and-actions-container-font-size: .8125rem;--dv-tabs-and-actions-container-height: 52px;--dv-tab-close-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E");--dv-group-view-background-color: var(--background);--dv-tabs-and-actions-container-background-color: var(--background);--dv-activegroup-visiblepanel-tab-background-color: var(--background);--dv-activegroup-hiddenpanel-tab-background-color: var(--muted);--dv-inactivegroup-visiblepanel-tab-background-color: var(--background);--dv-inactivegroup-hiddenpanel-tab-background-color: var(--muted);--dv-activegroup-visiblepanel-tab-color: var(--foreground);--dv-activegroup-hiddenpanel-tab-color: var(--muted-foreground);--dv-inactivegroup-visiblepanel-tab-color: var(--foreground);--dv-inactivegroup-hiddenpanel-tab-color: var(--muted-foreground);--dv-tab-divider-color: transparent;--dv-drag-over-background-color: oklch(from var(--accent) l c h / .3);--dv-drag-over-border-color: var(--accent);--dv-separator-border: var(--border);color:var(--foreground);background-color:var(--background)}.dv-shell .dv-tabs-and-actions-container,.dv-shell .tabs-and-actions-container{background-color:var(--background)!important;border-bottom:1px solid oklch(from var(--border) l c h / .4);padding:6px 8px 0;gap:4px;align-items:flex-end}.dv-shell .dv-tabs-container,.dv-shell .tab-container{background-color:transparent!important;gap:4px;align-self:stretch;display:flex;align-items:flex-end}.workbench-dockview .dv-shell .dv-tabs-and-actions-container,.workbench-dockview .dv-shell .tabs-and-actions-container,.workbench-dockview .dv-tabs-and-actions-container,.workbench-dockview .tabs-and-actions-container{height:44px!important}.workbench-dockview[data-left-block-collapsed=true] .dv-tabs-and-actions-container,.workbench-dockview[data-left-block-collapsed=true] .tabs-and-actions-container{padding-left:44px!important}[data-boring-workspace-part=plugin-tabs-shell][data-boring-state=collapsed] .dv-chat-stage .dv-tabs-and-actions-container,[data-boring-workspace-part=plugin-tabs-shell][data-boring-state=collapsed] .dv-chat-stage .tabs-and-actions-container{padding-left:48px!important}.workbench-dockview .dv-tabs-and-actions-container,.workbench-dockview .tabs-and-actions-container{padding-right:72px!important}.dv-shell .dv-tab,.dv-shell .tab{color:var(--muted-foreground)!important;background-color:transparent!important;border:1px solid transparent;border-top-left-radius:8px;border-top-right-radius:8px;transition:color .18s cubic-bezier(.22,1,.36,1),background-color .18s cubic-bezier(.22,1,.36,1),border-color .18s cubic-bezier(.22,1,.36,1);min-width:120px;max-width:220px;padding:0;height:34px;align-self:end;font-size:12.5px;letter-spacing:-.01em}.dv-shell .dv-tab:hover,.dv-shell .tab:hover{color:var(--foreground)!important;background-color:oklch(from var(--foreground) l c h / .04)!important}.dv-shell .dv-tab>*,.dv-shell .tab>*{width:100%;height:100%}.dv-shell .dv-tab.dv-active-tab,.dv-shell .tab.active-tab{color:var(--foreground)!important;background-color:var(--background)!important;border-color:oklch(from var(--border) l c h / .5);border-bottom-color:var(--background);margin-bottom:-1px;position:relative;z-index:1;font-weight:500}.dv-shell .dv-tab.dv-active-tab:before,.dv-shell .tab.active-tab:before{content:"";position:absolute;left:10px;right:10px;top:-1px;height:2px;background:var(--accent);border-radius:0 0 2px 2px;opacity:0;transition:opacity .2s cubic-bezier(.22,1,.36,1)}.dv-shell .dv-tab.dv-active-tab:hover:before,.dv-shell .tab.active-tab:hover:before{opacity:.7}.dv-shell{--dv-sash-color: transparent;--dv-active-sash-color: transparent;--dv-active-sash-transition-delay: 0s}.dv-shell .sash-container .sash,.dv-shell .dv-sash-container .dv-sash{transition:box-shadow .16s cubic-bezier(.22,1,.36,1),background-color .16s cubic-bezier(.22,1,.36,1)}.dv-shell .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash{width:12px;margin-left:-4px}.dv-shell .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash{height:12px;margin-top:-4px}.dv-shell .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash:hover,.dv-shell .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash:active{box-shadow:inset 0 0 0 1px oklch(from var(--primary) l c h / .45),inset 5px 0 oklch(from var(--primary) l c h / .35),inset 6px 0 oklch(from var(--primary) l c h / .35)}.dv-shell .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash:hover,.dv-shell .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash:active{box-shadow:inset 0 0 0 1px oklch(from var(--primary) l c h / .45),inset 0 5px oklch(from var(--primary) l c h / .35),inset 0 6px oklch(from var(--primary) l c h / .35)}.dv-shell .drop-target-dropzone>.drop-target-selection,.dv-shell .dv-drop-target-dropzone>.dv-drop-target-selection{background-color:oklch(from var(--primary) l c h / .15);border:2px dashed var(--primary);border-radius:calc(var(--radius) - 2px)}.dv-shell .watermark,.dv-shell .dv-watermark{color:var(--muted-foreground)}.dv-shell,.dv-shell .dv-dockview,.dv-shell .dv-groupview,.dv-shell .groupview,.dv-shell .groupview>.content-container,.dv-shell .dv-view-container,.dv-shell .view-container{background-color:var(--background)}.dv-shell .dv-groupview,.dv-shell .groupview{color:var(--foreground)}.dv-shell .right-actions-container,.dv-shell .left-actions-container,.dv-shell .dv-right-actions-container,.dv-shell .dv-left-actions-container{color:var(--muted-foreground);display:flex;align-items:center;align-self:stretch}.dv-shell .right-actions-container:hover,.dv-shell .left-actions-container:hover,.dv-shell .dv-right-actions-container:hover,.dv-shell .dv-left-actions-container:hover{color:var(--foreground)}.dv-shell .dv-drag-image{opacity:.85;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);box-shadow:0 4px 12px #00000026}.dv-chat-stage{--dv-tabs-and-actions-container-height: 32px;--dv-tabs-and-actions-container-font-size: .75rem;--dv-activegroup-visiblepanel-tab-background-color: transparent;--dv-activegroup-hiddenpanel-tab-background-color: transparent;--dv-inactivegroup-visiblepanel-tab-background-color: transparent;--dv-inactivegroup-hiddenpanel-tab-background-color: transparent}.dv-shell.dv-chat-stage .dv-tabs-and-actions-container{height:var(--dv-tabs-and-actions-container-height);box-sizing:border-box;flex-shrink:0;border-bottom:none;padding:0;gap:0;align-items:stretch}.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-scrollable,.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-tabs-container,.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-react-part{height:100%}.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-tabs-container{width:100%;align-items:stretch}.dv-shell.dv-chat-stage .dv-tab,.dv-shell.dv-chat-stage .dv-tab.dv-active-tab{width:100%;height:100%;min-width:0;max-width:none;flex:1 1 auto;align-self:stretch;margin-bottom:0;padding:0;border:none;border-radius:0;background-color:transparent!important}.dv-shell.dv-chat-stage .dv-tab.dv-active-tab:before{content:none}.dv-chat-stage .dv-default-tab-action{display:none}.dv-chat-stage .dv-groupview{position:relative}.dv-chat-stage .dv-groupview:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:40;pointer-events:none;background:transparent;transition:background-color .22s cubic-bezier(.22,1,.36,1),box-shadow .22s cubic-bezier(.22,1,.36,1)}[data-boring-workspace-part=chat-pane-stage][data-multi-pane=true] .dv-groupview:not(.dv-active-group):after{background:oklch(from var(--foreground) l c h / .035)}
1
+ .dv-shell{--dv-background-color:var(--background);--dv-paneview-header-border-color:var(--border);--dv-tabs-and-actions-container-font-size:.8125rem;--dv-tabs-and-actions-container-height:52px;--dv-tab-close-icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E");--dv-group-view-background-color:var(--background);--dv-tabs-and-actions-container-background-color:var(--background);--dv-activegroup-visiblepanel-tab-background-color:var(--background);--dv-activegroup-hiddenpanel-tab-background-color:var(--muted);--dv-inactivegroup-visiblepanel-tab-background-color:var(--background);--dv-inactivegroup-hiddenpanel-tab-background-color:var(--muted);--dv-activegroup-visiblepanel-tab-color:var(--foreground);--dv-activegroup-hiddenpanel-tab-color:var(--muted-foreground);--dv-inactivegroup-visiblepanel-tab-color:var(--foreground);--dv-inactivegroup-hiddenpanel-tab-color:var(--muted-foreground);--dv-tab-divider-color:transparent;--dv-drag-over-background-color:oklch(from var(--accent) l c h / .3);--dv-drag-over-border-color:var(--accent);--dv-separator-border:var(--border);color:var(--foreground);background-color:var(--background)}.dv-shell .dv-tabs-and-actions-container,.dv-shell .tabs-and-actions-container{border-bottom:1px solid oklch(from var(--border) l c h / .4);align-items:flex-end;gap:4px;padding:6px 8px 0;background-color:var(--background)!important}.dv-shell .dv-tabs-container,.dv-shell .tab-container{align-self:stretch;align-items:flex-end;gap:4px;display:flex;background-color:#0000!important}.workbench-dockview .dv-shell .dv-tabs-and-actions-container,.workbench-dockview .dv-shell .tabs-and-actions-container,.workbench-dockview .dv-tabs-and-actions-container,.workbench-dockview .tabs-and-actions-container{height:44px!important}.workbench-dockview[data-left-block-collapsed=true] .dv-tabs-and-actions-container,.workbench-dockview[data-left-block-collapsed=true] .tabs-and-actions-container{padding-left:44px!important}[data-boring-workspace-part=plugin-tabs-shell][data-boring-state=collapsed] .dv-chat-stage .dv-tabs-and-actions-container,[data-boring-workspace-part=plugin-tabs-shell][data-boring-state=collapsed] .dv-chat-stage .tabs-and-actions-container{padding-left:48px!important}.workbench-dockview .dv-tabs-and-actions-container,.workbench-dockview .tabs-and-actions-container{padding-right:72px!important}.dv-shell .dv-tab,.dv-shell .tab{letter-spacing:-.01em;border:1px solid #0000;border-top-left-radius:8px;border-top-right-radius:8px;align-self:end;min-width:120px;max-width:220px;height:34px;padding:0;font-size:12.5px;transition:color .18s cubic-bezier(.22,1,.36,1),background-color .18s cubic-bezier(.22,1,.36,1),border-color .18s cubic-bezier(.22,1,.36,1);color:var(--muted-foreground)!important;background-color:#0000!important}.dv-shell .dv-tab:hover,.dv-shell .tab:hover{color:var(--foreground)!important;background-color:oklch(from var(--foreground) l c h / .04)!important}.dv-shell .dv-tab>*,.dv-shell .tab>*{width:100%;height:100%}.dv-shell .dv-tab.dv-active-tab,.dv-shell .tab.active-tab{border-color:oklch(from var(--border) l c h / .5);border-bottom-color:var(--background);z-index:1;margin-bottom:-1px;font-weight:500;position:relative;color:var(--foreground)!important;background-color:var(--background)!important}.dv-shell .dv-tab.dv-active-tab:before,.dv-shell .tab.active-tab:before{content:"";background:var(--accent);opacity:0;border-radius:0 0 2px 2px;height:2px;transition:opacity .2s cubic-bezier(.22,1,.36,1);position:absolute;top:-1px;left:10px;right:10px}.dv-shell .dv-tab.dv-active-tab:hover:before,.dv-shell .tab.active-tab:hover:before{opacity:.7}.dv-shell{--dv-sash-color:transparent;--dv-active-sash-color:transparent;--dv-active-sash-transition-delay:0s}.dv-shell .sash-container .sash,.dv-shell .dv-sash-container .dv-sash{transition:box-shadow .16s cubic-bezier(.22,1,.36,1),background-color .16s cubic-bezier(.22,1,.36,1)}.dv-shell .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash{width:12px;margin-left:-4px}.dv-shell .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash{height:12px;margin-top:-4px}.dv-shell .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash:hover,.dv-shell .dv-split-view-container.dv-horizontal>.dv-sash-container>.dv-sash:active{box-shadow:inset 0 0 0 1px oklch(from var(--primary) l c h / .45), inset 5px 0 0 oklch(from var(--primary) l c h / .35), inset 6px 0 0 oklch(from var(--primary) l c h / .35)}.dv-shell .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash:hover,.dv-shell .dv-split-view-container.dv-vertical>.dv-sash-container>.dv-sash:active{box-shadow:inset 0 0 0 1px oklch(from var(--primary) l c h / .45), inset 0 5px 0 oklch(from var(--primary) l c h / .35), inset 0 6px 0 oklch(from var(--primary) l c h / .35)}.dv-shell .drop-target-dropzone>.drop-target-selection,.dv-shell .dv-drop-target-dropzone>.dv-drop-target-selection{background-color:oklch(from var(--primary) l c h / .15);border:2px dashed var(--primary);border-radius:calc(var(--radius) - 2px)}.dv-shell .watermark,.dv-shell .dv-watermark{color:var(--muted-foreground)}.dv-shell,.dv-shell .dv-dockview,.dv-shell .dv-groupview,.dv-shell .groupview,.dv-shell .groupview>.content-container,.dv-shell .dv-view-container,.dv-shell .view-container{background-color:var(--background)}.dv-shell .dv-groupview,.dv-shell .groupview{color:var(--foreground)}.dv-shell .right-actions-container,.dv-shell .left-actions-container,.dv-shell .dv-right-actions-container,.dv-shell .dv-left-actions-container{color:var(--muted-foreground);align-self:stretch;align-items:center;display:flex}.dv-shell .right-actions-container:hover,.dv-shell .left-actions-container:hover,.dv-shell .dv-right-actions-container:hover,.dv-shell .dv-left-actions-container:hover{color:var(--foreground)}.dv-shell .dv-drag-image{opacity:.85;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);box-shadow:0 4px 12px oklch(0% 0 0/.15)}.dv-chat-stage{--dv-tabs-and-actions-container-height:32px;--dv-tabs-and-actions-container-font-size:.75rem;--dv-activegroup-visiblepanel-tab-background-color:transparent;--dv-activegroup-hiddenpanel-tab-background-color:transparent;--dv-inactivegroup-visiblepanel-tab-background-color:transparent;--dv-inactivegroup-hiddenpanel-tab-background-color:transparent}.dv-shell.dv-chat-stage .dv-tabs-and-actions-container{height:var(--dv-tabs-and-actions-container-height);box-sizing:border-box;border-bottom:none;flex-shrink:0;align-items:stretch;gap:0;padding:0}.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-scrollable,.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-tabs-container,.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-react-part{height:100%}.dv-shell.dv-chat-stage .dv-tabs-and-actions-container.dv-single-tab .dv-tabs-container{align-items:stretch;width:100%}.dv-shell.dv-chat-stage .dv-tab,.dv-shell.dv-chat-stage .dv-tab.dv-active-tab{border:none;border-radius:0;flex:auto;align-self:stretch;width:100%;min-width:0;max-width:none;height:100%;margin-bottom:0;padding:0;background-color:#0000!important}.dv-shell.dv-chat-stage .dv-tab.dv-active-tab:before{content:none}.dv-chat-stage .dv-default-tab-action{display:none}.dv-chat-stage .dv-groupview{position:relative}.dv-chat-stage .dv-groupview:after{content:"";z-index:40;pointer-events:none;background:0 0;transition:background-color .22s cubic-bezier(.22,1,.36,1),box-shadow .22s cubic-bezier(.22,1,.36,1);position:absolute;inset:0}[data-boring-workspace-part=chat-pane-stage][data-multi-pane=true] .dv-groupview:not(.dv-active-group):after{background:oklch(from var(--foreground) l c h / .035)}
2
+ /*$vite$:1*/
package/dist/charts.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { JSX } from 'react/jsx-runtime';
1
+ import { JSX } from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
4
  export declare const boringAreaProps: {
@@ -112,3 +112,8 @@ export declare function defaultBoringChartValueFormatter(value: unknown): string
112
112
  export declare function getBoringChartColor(index: number, theme?: BoringChartTheme): string;
113
113
 
114
114
  export { }
115
+
116
+
117
+ declare global {
118
+ var __BORING_RUNTIME_SINGLETONS__: Record<string, unknown> | undefined;
119
+ }
package/dist/charts.js CHANGED
@@ -1,143 +1,136 @@
1
- import { jsxs as l, jsx as n } from "react/jsx-runtime";
2
- import { c as d } from "./utils-B6yFEsav.js";
3
- const c = [
4
- "var(--chart-1, var(--accent))",
5
- "var(--chart-2, #60a5fa)",
6
- "var(--chart-3, #34d399)",
7
- "var(--chart-4, #f59e0b)",
8
- "var(--chart-5, #f472b6)",
9
- "var(--chart-6, #a78bfa)",
10
- "var(--chart-7, #22d3ee)",
11
- "var(--chart-8, #fb7185)"
12
- ], r = {
13
- background: "var(--background)",
14
- foreground: "var(--foreground)",
15
- mutedForeground: "var(--muted-foreground)",
16
- border: "var(--border)",
17
- grid: "oklch(from var(--border) l c h / 0.48)",
18
- tooltipBackground: "var(--popover, var(--background))",
19
- tooltipBorder: "var(--border)",
20
- tooltipForeground: "var(--popover-foreground, var(--foreground))",
21
- palette: c
1
+ import { t as e } from "./utils-BRcxFdrz.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/front/charts/index.tsx
4
+ var r = [
5
+ "var(--chart-1, var(--accent))",
6
+ "var(--chart-2, #60a5fa)",
7
+ "var(--chart-3, #34d399)",
8
+ "var(--chart-4, #f59e0b)",
9
+ "var(--chart-5, #f472b6)",
10
+ "var(--chart-6, #a78bfa)",
11
+ "var(--chart-7, #22d3ee)",
12
+ "var(--chart-8, #fb7185)"
13
+ ], i = {
14
+ background: "var(--background)",
15
+ foreground: "var(--foreground)",
16
+ mutedForeground: "var(--muted-foreground)",
17
+ border: "var(--border)",
18
+ grid: "oklch(from var(--border) l c h / 0.48)",
19
+ tooltipBackground: "var(--popover, var(--background))",
20
+ tooltipBorder: "var(--border)",
21
+ tooltipForeground: "var(--popover-foreground, var(--foreground))",
22
+ palette: r
22
23
  };
23
- function u(o, e = r) {
24
- if (e.palette.length === 0) return "var(--accent)";
25
- const i = ((Number.isFinite(o) ? Math.trunc(o) : 0) % e.palette.length + e.palette.length) % e.palette.length;
26
- return e.palette[i] ?? e.palette[0] ?? "var(--accent)";
24
+ function a(e, t = i) {
25
+ if (t.palette.length === 0) return "var(--accent)";
26
+ let n = ((Number.isFinite(e) ? Math.trunc(e) : 0) % t.palette.length + t.palette.length) % t.palette.length;
27
+ return t.palette[n] ?? t.palette[0] ?? "var(--accent)";
27
28
  }
28
- function g(o) {
29
- return typeof o == "number" ? new Intl.NumberFormat(void 0, { maximumFractionDigits: 2 }).format(o) : o == null ? "—" : String(o);
29
+ function o(e) {
30
+ return typeof e == "number" ? new Intl.NumberFormat(void 0, { maximumFractionDigits: 2 }).format(e) : e == null ? "—" : String(e);
30
31
  }
31
- function m({
32
- active: o,
33
- payload: e,
34
- label: a,
35
- valueFormatter: i = g
36
- }) {
37
- return !o || !e || e.length === 0 ? null : /* @__PURE__ */ l(
38
- "div",
39
- {
40
- className: "min-w-32 rounded-md border px-2.5 py-2 text-xs shadow-xl",
41
- style: {
42
- background: r.tooltipBackground,
43
- borderColor: r.tooltipBorder,
44
- color: r.tooltipForeground
45
- },
46
- children: [
47
- a != null && /* @__PURE__ */ n("div", { className: "mb-1.5 font-medium", style: { color: r.foreground }, children: String(a) }),
48
- /* @__PURE__ */ n("div", { className: "space-y-1", children: e.map((t, s) => /* @__PURE__ */ l("div", { className: "flex items-center justify-between gap-4", children: [
49
- /* @__PURE__ */ l("span", { className: "inline-flex items-center gap-1.5", style: { color: r.mutedForeground }, children: [
50
- /* @__PURE__ */ n(
51
- "span",
52
- {
53
- "aria-hidden": "true",
54
- className: "size-2 rounded-full",
55
- style: { background: t.color ?? u(s) }
56
- }
57
- ),
58
- String(t.name ?? t.dataKey ?? "Series")
59
- ] }),
60
- /* @__PURE__ */ n("span", { className: "font-mono tabular-nums", style: { color: r.foreground }, children: i(t.value) })
61
- ] }, `${t.dataKey ?? t.name ?? "series"}:${s}`)) })
62
- ]
63
- }
64
- );
32
+ function s({ active: e, payload: r, label: s, valueFormatter: c = o }) {
33
+ return !e || !r || r.length === 0 ? null : /* @__PURE__ */ n("div", {
34
+ className: "min-w-32 rounded-md border px-2.5 py-2 text-xs shadow-xl",
35
+ style: {
36
+ background: i.tooltipBackground,
37
+ borderColor: i.tooltipBorder,
38
+ color: i.tooltipForeground
39
+ },
40
+ children: [s != null && /* @__PURE__ */ t("div", {
41
+ className: "mb-1.5 font-medium",
42
+ style: { color: i.foreground },
43
+ children: String(s)
44
+ }), /* @__PURE__ */ t("div", {
45
+ className: "space-y-1",
46
+ children: r.map((e, r) => /* @__PURE__ */ n("div", {
47
+ className: "flex items-center justify-between gap-4",
48
+ children: [/* @__PURE__ */ n("span", {
49
+ className: "inline-flex items-center gap-1.5",
50
+ style: { color: i.mutedForeground },
51
+ children: [/* @__PURE__ */ t("span", {
52
+ "aria-hidden": "true",
53
+ className: "size-2 rounded-full",
54
+ style: { background: e.color ?? a(r) }
55
+ }), String(e.name ?? e.dataKey ?? "Series")]
56
+ }), /* @__PURE__ */ t("span", {
57
+ className: "font-mono tabular-nums",
58
+ style: { color: i.foreground },
59
+ children: c(e.value)
60
+ })]
61
+ }, `${e.dataKey ?? e.name ?? "series"}:${r}`))
62
+ })]
63
+ });
65
64
  }
66
- function b({
67
- title: o,
68
- subtitle: e,
69
- source: a,
70
- height: i = 320,
71
- className: t,
72
- children: s
73
- }) {
74
- return /* @__PURE__ */ l(
75
- "figure",
76
- {
77
- className: d(
78
- "flex min-h-0 w-full flex-col rounded-xl border bg-card/60 text-card-foreground",
79
- "shadow-[0_1px_2px_-1px_oklch(0_0_0/0.08),0_12px_32px_-22px_oklch(0_0_0/0.28)]",
80
- t
81
- ),
82
- style: { borderColor: r.border },
83
- children: [
84
- (o || e) && /* @__PURE__ */ l("figcaption", { className: "border-b px-3 py-2", style: { borderColor: r.border }, children: [
85
- o && /* @__PURE__ */ n("div", { className: "text-sm font-semibold tracking-[-0.01em]", children: o }),
86
- e && /* @__PURE__ */ n("div", { className: "mt-0.5 text-xs text-muted-foreground", children: e })
87
- ] }),
88
- /* @__PURE__ */ n("div", { className: "min-h-0 flex-1 p-3", style: { height: i }, children: s }),
89
- a && /* @__PURE__ */ n("div", { className: "border-t px-3 py-1.5 text-[11px] text-muted-foreground", style: { borderColor: r.border }, children: a })
90
- ]
91
- }
92
- );
65
+ function c({ title: r, subtitle: a, source: o, height: s = 320, className: c, children: l }) {
66
+ return /* @__PURE__ */ n("figure", {
67
+ className: e("flex min-h-0 w-full flex-col rounded-xl border bg-card/60 text-card-foreground", "shadow-[0_1px_2px_-1px_oklch(0_0_0/0.08),0_12px_32px_-22px_oklch(0_0_0/0.28)]", c),
68
+ style: { borderColor: i.border },
69
+ children: [
70
+ (r || a) && /* @__PURE__ */ n("figcaption", {
71
+ className: "border-b px-3 py-2",
72
+ style: { borderColor: i.border },
73
+ children: [r && /* @__PURE__ */ t("div", {
74
+ className: "text-sm font-semibold tracking-[-0.01em]",
75
+ children: r
76
+ }), a && /* @__PURE__ */ t("div", {
77
+ className: "mt-0.5 text-xs text-muted-foreground",
78
+ children: a
79
+ })]
80
+ }),
81
+ /* @__PURE__ */ t("div", {
82
+ className: "min-h-0 flex-1 p-3",
83
+ style: { height: s },
84
+ children: l
85
+ }),
86
+ o && /* @__PURE__ */ t("div", {
87
+ className: "border-t px-3 py-1.5 text-[11px] text-muted-foreground",
88
+ style: { borderColor: i.border },
89
+ children: o
90
+ })
91
+ ]
92
+ });
93
93
  }
94
- const h = {
95
- tick: { fill: r.mutedForeground, fontSize: 11 },
96
- axisLine: { stroke: r.border },
97
- tickLine: { stroke: r.border }
98
- }, v = {
99
- stroke: r.grid,
100
- strokeDasharray: "3 3",
101
- vertical: !1
102
- }, x = {
103
- wrapperStyle: { color: r.mutedForeground, fontSize: 12 }
104
- }, k = {
105
- type: "monotone",
106
- strokeWidth: 2,
107
- dot: !1,
108
- activeDot: { r: 4 },
109
- connectNulls: !0,
110
- isAnimationActive: !1
111
- }, y = {
112
- type: "monotone",
113
- strokeWidth: 2,
114
- dot: !1,
115
- connectNulls: !0,
116
- isAnimationActive: !1
117
- }, N = {
118
- radius: [6, 6, 2, 2],
119
- isAnimationActive: !1
120
- }, A = {
121
- innerRadius: "58%",
122
- outerRadius: "82%",
123
- paddingAngle: 2,
124
- isAnimationActive: !1
125
- }, C = {
126
- fill: "oklch(from var(--accent) l c h / 0.20)"
127
- };
128
- export {
129
- b as BoringChartFrame,
130
- m as BoringTooltip,
131
- y as boringAreaProps,
132
- N as boringBarProps,
133
- h as boringCartesianAxisProps,
134
- v as boringCartesianGridProps,
135
- c as boringChartPalette,
136
- r as boringChartTheme,
137
- x as boringLegendProps,
138
- k as boringLineProps,
139
- A as boringPieProps,
140
- C as boringReferenceAreaProps,
141
- g as defaultBoringChartValueFormatter,
142
- u as getBoringChartColor
143
- };
94
+ var l = {
95
+ tick: {
96
+ fill: i.mutedForeground,
97
+ fontSize: 11
98
+ },
99
+ axisLine: { stroke: i.border },
100
+ tickLine: { stroke: i.border }
101
+ }, u = {
102
+ stroke: i.grid,
103
+ strokeDasharray: "3 3",
104
+ vertical: !1
105
+ }, d = { wrapperStyle: {
106
+ color: i.mutedForeground,
107
+ fontSize: 12
108
+ } }, f = {
109
+ type: "monotone",
110
+ strokeWidth: 2,
111
+ dot: !1,
112
+ activeDot: { r: 4 },
113
+ connectNulls: !0,
114
+ isAnimationActive: !1
115
+ }, p = {
116
+ type: "monotone",
117
+ strokeWidth: 2,
118
+ dot: !1,
119
+ connectNulls: !0,
120
+ isAnimationActive: !1
121
+ }, m = {
122
+ radius: [
123
+ 6,
124
+ 6,
125
+ 2,
126
+ 2
127
+ ],
128
+ isAnimationActive: !1
129
+ }, h = {
130
+ innerRadius: "58%",
131
+ outerRadius: "82%",
132
+ paddingAngle: 2,
133
+ isAnimationActive: !1
134
+ }, g = { fill: "oklch(from var(--accent) l c h / 0.20)" };
135
+ //#endregion
136
+ export { c as BoringChartFrame, s as BoringTooltip, p as boringAreaProps, m as boringBarProps, l as boringCartesianAxisProps, u as boringCartesianGridProps, r as boringChartPalette, i as boringChartTheme, d as boringLegendProps, f as boringLineProps, h as boringPieProps, g as boringReferenceAreaProps, o as defaultBoringChartValueFormatter, a as getBoringChartColor };
package/dist/plugin.d.ts CHANGED
@@ -117,6 +117,20 @@ interface BoringFrontBindingRegistration {
117
117
  id: string;
118
118
  component: PluginBinding;
119
119
  }
120
+ interface BoringFrontAppLeftOverlayProps {
121
+ onClose: () => void;
122
+ }
123
+ interface BoringFrontAppLeftActionRegistration {
124
+ id: string;
125
+ label: string;
126
+ icon?: ComponentType<{
127
+ className?: string;
128
+ }>;
129
+ trailing?: ComponentType;
130
+ overlay: ComponentType<BoringFrontAppLeftOverlayProps>;
131
+ order?: number;
132
+ emphasis?: boolean;
133
+ }
120
134
  interface BoringFrontSurfaceResolverRegistration {
121
135
  id?: string;
122
136
  kind: string;
@@ -140,6 +154,7 @@ interface BoringFrontAPI {
140
154
  registerPanel<T = unknown>(registration: BoringFrontPanelRegistration<T>): void;
141
155
  registerWorkspaceSource<T = unknown>(registration: BoringFrontWorkspaceSourceRegistration<T>): void;
142
156
  registerPanelCommand(registration: BoringFrontPanelCommandRegistration): void;
157
+ registerAppLeftAction(registration: BoringFrontAppLeftActionRegistration): void;
143
158
  registerSurfaceResolver(registration: BoringFrontSurfaceResolverRegistration): void;
144
159
  registerToolRenderer(registration: BoringFrontToolRendererRegistration): void;
145
160
  }
@@ -166,6 +181,7 @@ interface DefinePluginConfig {
166
181
  panels?: ReadonlyArray<BoringFrontPanelRegistration<any>>;
167
182
  workspaceSources?: ReadonlyArray<BoringFrontWorkspaceSourceRegistration<any>>;
168
183
  commands?: ReadonlyArray<BoringFrontPanelCommandRegistration>;
184
+ appLeftActions?: ReadonlyArray<BoringFrontAppLeftActionRegistration>;
169
185
  surfaceResolvers?: ReadonlyArray<BoringFrontSurfaceResolverRegistration>;
170
186
  providers?: ReadonlyArray<BoringFrontProviderRegistration>;
171
187
  bindings?: ReadonlyArray<BoringFrontBindingRegistration>;
@@ -193,6 +209,7 @@ interface CapturedBoringFrontRegistrations {
193
209
  panels: BoringFrontPanelRegistration<any>[];
194
210
  workspaceSources: BoringFrontWorkspaceSourceRegistration<any>[];
195
211
  panelCommands: BoringFrontPanelCommandRegistration[];
212
+ appLeftActions: BoringFrontAppLeftActionRegistration[];
196
213
  surfaceResolvers: BoringFrontSurfaceResolverRegistration[];
197
214
  toolRenderers: BoringFrontToolRendererRegistration[];
198
215
  }
@@ -209,6 +226,52 @@ declare function createCapturingBoringFrontAPI(options?: {
209
226
  }): CapturingBoringFrontAPIHandle;
210
227
  declare function captureFrontPlugin(plugin: BoringFrontFactoryWithId): CapturedFrontPlugin;
211
228
 
229
+ interface AppLeftOverlayChromeValue {
230
+ headerInsetStart: boolean;
231
+ headerInsetEnd: boolean;
232
+ }
233
+ declare function useAppLeftOverlayChrome(): AppLeftOverlayChromeValue;
234
+
235
+ type WorkspaceShellArtifactTarget = {
236
+ type: "surface";
237
+ surfaceKind: string;
238
+ target?: string;
239
+ params?: Record<string, unknown>;
240
+ } | {
241
+ type: "panel";
242
+ panelComponentId: string;
243
+ params?: Record<string, unknown>;
244
+ };
245
+ type WorkspaceShellCapabilityResult = {
246
+ success: true;
247
+ } | {
248
+ success: false;
249
+ reason: "no-artifact" | "open-failed" | "invalid-session" | "placement-failed";
250
+ message: string;
251
+ };
252
+ interface WorkspaceShellAnchorRect {
253
+ x: number;
254
+ y: number;
255
+ width: number;
256
+ height: number;
257
+ top: number;
258
+ right: number;
259
+ bottom: number;
260
+ left: number;
261
+ }
262
+ interface WorkspaceShellCapabilities {
263
+ openArtifact(target: WorkspaceShellArtifactTarget | null, options?: {
264
+ sessionId?: string | null;
265
+ title?: string;
266
+ instanceId?: string;
267
+ }): WorkspaceShellCapabilityResult;
268
+ openDetachedChat(sessionId: string, options?: {
269
+ anchor?: WorkspaceShellAnchorRect;
270
+ title?: string;
271
+ }): WorkspaceShellCapabilityResult;
272
+ }
273
+ declare function useWorkspaceShellCapabilities(): WorkspaceShellCapabilities;
274
+
212
275
  /**
213
276
  * In-process registry that lets a plugin's Pi slash command reach the live
214
277
  * workspace `UiBridge` WITHOUT an HTTP round-trip or a `BORING_UI_URL` env var.
@@ -272,4 +335,4 @@ declare function openPanel(args: OpenPanelArgs): Promise<CommandResult>;
272
335
  */
273
336
  declare function notify(msg: string, level?: "info" | "warn" | "error"): Promise<CommandResult>;
274
337
 
275
- export { type BoringFrontAPI, type BoringFrontBindingRegistration, type BoringFrontFactory, type BoringFrontFactoryWithId, type BoringFrontPanelCommandRegistration, type BoringFrontPanelRegistration, type BoringFrontProviderRegistration, type BoringFrontSetup, type BoringFrontSurfaceResolverRegistration, type BoringFrontWorkspaceSourceRegistration, type CapturedBoringFrontRegistrations, type CapturedFrontPlugin, type CapturingBoringFrontAPIHandle, type DefinePluginConfig, NoWorkspaceUiBridgeError, type OpenPanelArgs, PaneProps, WorkspaceSourceProps, captureFrontPlugin, createCapturingBoringFrontAPI, definePlugin, execWorkspaceUi, getWorkspaceUiBridge, notify, openPanel };
338
+ export { type AppLeftOverlayChromeValue, type BoringFrontAPI, type BoringFrontAppLeftActionRegistration, type BoringFrontAppLeftOverlayProps, type BoringFrontBindingRegistration, type BoringFrontFactory, type BoringFrontFactoryWithId, type BoringFrontPanelCommandRegistration, type BoringFrontPanelRegistration, type BoringFrontProviderRegistration, type BoringFrontSetup, type BoringFrontSurfaceResolverRegistration, type BoringFrontWorkspaceSourceRegistration, type CapturedBoringFrontRegistrations, type CapturedFrontPlugin, type CapturingBoringFrontAPIHandle, type DefinePluginConfig, NoWorkspaceUiBridgeError, type OpenPanelArgs, PaneProps, type WorkspaceShellAnchorRect, type WorkspaceShellArtifactTarget, type WorkspaceShellCapabilities, type WorkspaceShellCapabilityResult, WorkspaceSourceProps, captureFrontPlugin, createCapturingBoringFrontAPI, definePlugin, execWorkspaceUi, getWorkspaceUiBridge, notify, openPanel, useAppLeftOverlayChrome, useWorkspaceShellCapabilities };
package/dist/plugin.js CHANGED
@@ -25,6 +25,7 @@ function definePlugin(config) {
25
25
  for (const panel of config.panels ?? []) api.registerPanel(panel);
26
26
  for (const source of config.workspaceSources ?? []) api.registerWorkspaceSource(source);
27
27
  for (const command of config.commands ?? []) api.registerPanelCommand(command);
28
+ for (const action of config.appLeftActions ?? []) api.registerAppLeftAction(action);
28
29
  for (const resolver of config.surfaceResolvers ?? []) api.registerSurfaceResolver(resolver);
29
30
  for (const provider of config.providers ?? []) api.registerProvider(provider);
30
31
  for (const binding of config.bindings ?? []) api.registerBinding(binding);
@@ -57,6 +58,7 @@ function createCapturingBoringFrontAPI(options = {}) {
57
58
  const panels = [];
58
59
  const workspaceSources = [];
59
60
  const panelCommands = [];
61
+ const appLeftActions = [];
60
62
  const surfaceResolvers = [];
61
63
  const toolRenderers = [];
62
64
  const seen = /* @__PURE__ */ new Map();
@@ -103,6 +105,10 @@ function createCapturingBoringFrontAPI(options = {}) {
103
105
  claim("command", registration.id);
104
106
  panelCommands.push(registration);
105
107
  },
108
+ registerAppLeftAction(registration) {
109
+ claim("app-left-action", registration.id);
110
+ appLeftActions.push(registration);
111
+ },
106
112
  registerSurfaceResolver(registration) {
107
113
  const id = registration.id ?? `${options.pluginId ?? "anon"}:${registration.kind}`;
108
114
  claim("surface-resolver", id);
@@ -120,6 +126,7 @@ function createCapturingBoringFrontAPI(options = {}) {
120
126
  panels: clone(panels),
121
127
  workspaceSources: clone(workspaceSources),
122
128
  panelCommands: clone(panelCommands),
129
+ appLeftActions: clone(appLeftActions),
123
130
  surfaceResolvers: clone(surfaceResolvers),
124
131
  toolRenderers: clone(toolRenderers)
125
132
  };
@@ -300,6 +307,29 @@ function validateBoringPluginManifest(raw) {
300
307
  // src/shared/types/surface.ts
301
308
  var WORKSPACE_OPEN_PATH_SURFACE_KIND = "workspace.open.path";
302
309
 
310
+ // src/shared/plugins/appLeftOverlayChrome.ts
311
+ import { createContext, createElement, useContext } from "react";
312
+ var defaultValue = {
313
+ headerInsetStart: false,
314
+ headerInsetEnd: false
315
+ };
316
+ var AppLeftOverlayChromeContext = createContext(defaultValue);
317
+ function useAppLeftOverlayChrome() {
318
+ return useContext(AppLeftOverlayChromeContext);
319
+ }
320
+
321
+ // src/shared/plugins/workspaceShellCapabilities.ts
322
+ import { createContext as createContext2, createElement as createElement2, useContext as useContext2 } from "react";
323
+ var failed = (message) => ({ success: false, reason: "open-failed", message });
324
+ var noopShellCapabilities = {
325
+ openArtifact: () => ({ success: false, reason: "no-artifact", message: "No artifact is available." }),
326
+ openDetachedChat: () => failed("Workspace shell capabilities are not available.")
327
+ };
328
+ var WorkspaceShellCapabilitiesContext = createContext2(noopShellCapabilities);
329
+ function useWorkspaceShellCapabilities() {
330
+ return useContext2(WorkspaceShellCapabilitiesContext);
331
+ }
332
+
303
333
  // src/shared/plugins/uiBridgeRegistry.ts
304
334
  var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("@hachej/boring-workspace:active-ui-bridge");
305
335
  function slot() {
@@ -345,5 +375,7 @@ export {
345
375
  isValidBoringPluginId,
346
376
  notify,
347
377
  openPanel,
378
+ useAppLeftOverlayChrome,
379
+ useWorkspaceShellCapabilities,
348
380
  validateBoringPluginManifest
349
381
  };
@@ -0,0 +1,20 @@
1
+ //#region \0rolldown/runtime.js
2
+ var e = Object.create, t = Object.defineProperty, n = Object.getOwnPropertyDescriptor, r = Object.getOwnPropertyNames, i = Object.getPrototypeOf, a = Object.prototype.hasOwnProperty, o = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), s = (e, n) => {
3
+ let r = {};
4
+ for (var i in e) t(r, i, {
5
+ get: e[i],
6
+ enumerable: !0
7
+ });
8
+ return n || t(r, Symbol.toStringTag, { value: "Module" }), r;
9
+ }, c = (e, i, o, s) => {
10
+ if (i && typeof i == "object" || typeof i == "function") for (var c = r(i), l = 0, u = c.length, d; l < u; l++) d = c[l], !a.call(e, d) && d !== o && t(e, d, {
11
+ get: ((e) => i[e]).bind(null, d),
12
+ enumerable: !(s = n(i, d)) || s.enumerable
13
+ });
14
+ return e;
15
+ }, l = (n, r, a) => (a = n == null ? {} : e(i(n)), c(r || !n || !n.__esModule ? t(a, "default", {
16
+ value: n,
17
+ enumerable: !0
18
+ }) : a, n));
19
+ //#endregion
20
+ export { s as n, l as r, o as t };
@@ -304,6 +304,13 @@ interface BrowserBridgeAuthPolicyOptions {
304
304
  interface LocalCliBridgeAuthPolicyOptions {
305
305
  workspaceId: string;
306
306
  capabilities?: readonly string[];
307
+ /**
308
+ * Single-tenant/dev hosts may still pass a cosmetic x-boring-workspace-id
309
+ * header from the front shell. When true, authenticate all browser bridge
310
+ * calls as the configured owner workspace instead of rejecting that alias.
311
+ * Multi-workspace CLI mode must leave this false.
312
+ */
313
+ forceOwnerWorkspaceId?: boolean;
307
314
  }
308
315
  declare function createBrowserBridgeAuthPolicy(options: BrowserBridgeAuthPolicyOptions): BridgeAuthPolicy;
309
316
  /**
package/dist/server.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { j as WorkspaceServerPluginAsset, a as WorkspaceBridgeRegistry, B as BridgeAuthPolicy, b as WorkspaceBridgeHandler, k as BoringServerPluginManifest, d as BoringPluginSourceInput, e as BoringPluginFrontTargetResolver, l as BoringPluginListEntry, m as BoringPluginFrontTarget, n as BoringPluginSource, o as BoringPluginEvent, P as PluginRestartSurface } from './runtimeEnv-HolIkcoB.js';
2
- export { p as BoringPluginFrontTargetResolverContext, q as BoringPluginNativeFrontTarget, r as BoringPluginNativeFrontTargetTrust, s as BoringPluginSourceKind, t as BridgeAuthPolicyInput, u as BridgeAuthPolicyRequestLike, v as BridgeAuthResolution, w as BridgePrincipal, x as BridgeWorkspaceGrant, y as BrowserBridgeAuthPolicyOptions, C as CreateWorkspaceBridgeRuntimeEnvContributionOptions, L as LocalCliBridgeAuthPolicyOptions, R as RegisterWorkspaceBridgeHandlerOptions, S as ServerBootstrapOptions, z as ServerBootstrapResult, A as WorkspaceBridgeCallContext, D as WorkspaceBridgeHandlerArgs, E as WorkspaceBridgeHandlerContribution, F as WorkspaceBridgeRegistryCallOptions, G as WorkspaceBridgeRegistryLogger, H as WorkspaceBridgeRegistryOptions, I as WorkspaceBridgeRuntimeEnvDisabledReason, c as WorkspaceBridgeRuntimeEnvOptions, J as WorkspaceBridgeRuntimePlacement, g as WorkspaceProvisioningContribution, h as WorkspaceRouteContribution, W as WorkspaceServerPlugin, K as bootstrapServer, M as createBrowserBridgeAuthPolicy, f as createInMemoryBridge, N as createLocalCliBridgeAuthPolicy, O as createWorkspaceBridgeRegistry, Q as createWorkspaceBridgeRuntimeEnvContribution, T as defineServerPlugin, U as resolveBridgeCallUrl, V as resolveBridgeTokenUrl, X as validateServerPlugin, Y as validateWorkspaceBridgeOperationDefinition } from './runtimeEnv-HolIkcoB.js';
1
+ import { j as WorkspaceServerPluginAsset, a as WorkspaceBridgeRegistry, B as BridgeAuthPolicy, b as WorkspaceBridgeHandler, k as BoringServerPluginManifest, d as BoringPluginSourceInput, e as BoringPluginFrontTargetResolver, l as BoringPluginListEntry, m as BoringPluginFrontTarget, n as BoringPluginSource, o as BoringPluginEvent, P as PluginRestartSurface } from './runtimeEnv-CU-c4kaV.js';
2
+ export { p as BoringPluginFrontTargetResolverContext, q as BoringPluginNativeFrontTarget, r as BoringPluginNativeFrontTargetTrust, s as BoringPluginSourceKind, t as BridgeAuthPolicyInput, u as BridgeAuthPolicyRequestLike, v as BridgeAuthResolution, w as BridgePrincipal, x as BridgeWorkspaceGrant, y as BrowserBridgeAuthPolicyOptions, C as CreateWorkspaceBridgeRuntimeEnvContributionOptions, L as LocalCliBridgeAuthPolicyOptions, R as RegisterWorkspaceBridgeHandlerOptions, S as ServerBootstrapOptions, z as ServerBootstrapResult, A as WorkspaceBridgeCallContext, D as WorkspaceBridgeHandlerArgs, E as WorkspaceBridgeHandlerContribution, F as WorkspaceBridgeRegistryCallOptions, G as WorkspaceBridgeRegistryLogger, H as WorkspaceBridgeRegistryOptions, I as WorkspaceBridgeRuntimeEnvDisabledReason, c as WorkspaceBridgeRuntimeEnvOptions, J as WorkspaceBridgeRuntimePlacement, g as WorkspaceProvisioningContribution, h as WorkspaceRouteContribution, W as WorkspaceServerPlugin, K as bootstrapServer, M as createBrowserBridgeAuthPolicy, f as createInMemoryBridge, N as createLocalCliBridgeAuthPolicy, O as createWorkspaceBridgeRegistry, Q as createWorkspaceBridgeRuntimeEnvContribution, T as defineServerPlugin, U as resolveBridgeCallUrl, V as resolveBridgeTokenUrl, X as validateServerPlugin, Y as validateWorkspaceBridgeOperationDefinition } from './runtimeEnv-CU-c4kaV.js';
3
3
  import { FastifyRequest, FastifyInstance } from 'fastify';
4
4
  import { U as UiBridge, W as WorkspaceBridge } from './ui-bridge-D2eO3epD.js';
5
5
  export { C as CommandResult, a as UiCommand, b as UiState } from './ui-bridge-D2eO3epD.js';