@hachej/boring-workspace 0.1.35 → 0.1.36
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/dist/{FileTree-CkCxHBDu.js → FileTree-GkaIEJ9n.js} +1 -1
- package/dist/{MarkdownEditor-CtPphEVP.js → MarkdownEditor-DjZZnHcU.js} +1 -1
- package/dist/{WorkspaceLoadingState-Bl-92Dly.js → WorkspaceLoadingState-C664sU-y.js} +12 -13
- package/dist/{WorkspaceProvider-BhRPFy5R.js → WorkspaceProvider-CpK401MG.js} +1847 -1961
- package/dist/agent-tool-CB0RQyx9.d.ts +32 -0
- package/dist/app-front.d.ts +1 -20
- package/dist/app-front.js +396 -388
- package/dist/app-server.d.ts +4 -3
- package/dist/app-server.js +26 -0
- package/dist/{createInMemoryBridge-zb8MpO60.d.ts → createInMemoryBridge-e7QdNLSA.d.ts} +2 -1
- package/dist/plugin.d.ts +65 -1
- package/dist/plugin.js +39 -0
- package/dist/server.d.ts +14 -5
- package/dist/server.js +10 -0
- package/dist/shared.d.ts +2 -1
- package/dist/testing.js +1 -1
- package/dist/{ui-bridge-DFNem0df.d.ts → ui-bridge-LeBuZqfA.d.ts} +1 -32
- package/dist/workspace.css +0 -33
- package/dist/workspace.d.ts +0 -19
- package/dist/workspace.js +5 -5
- package/package.json +4 -4
package/dist/app-server.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
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, B as BoringPluginSourceInput, a as BoringPluginFrontTargetResolver, b as WorkspaceProvisioningContribution, c as WorkspaceRouteContribution, d as createInMemoryBridge } from './createInMemoryBridge-
|
|
5
|
-
export { e as ServerWorkspaceRuntimeProvisioningInput } from './createInMemoryBridge-
|
|
4
|
+
import { W as WorkspaceServerPlugin, S as ServerBootstrapOptions, B as BoringPluginSourceInput, a as BoringPluginFrontTargetResolver, b as WorkspaceProvisioningContribution, c as WorkspaceRouteContribution, d as createInMemoryBridge } from './createInMemoryBridge-e7QdNLSA.js';
|
|
5
|
+
export { e as ServerWorkspaceRuntimeProvisioningInput } from './createInMemoryBridge-e7QdNLSA.js';
|
|
6
6
|
import './manifest-C2vVgH_e.js';
|
|
7
|
-
import './
|
|
7
|
+
import './agent-tool-CB0RQyx9.js';
|
|
8
|
+
import './ui-bridge-LeBuZqfA.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Directory-source entry: `{ dir, options?, hotReload? }`. Resolved via
|
package/dist/app-server.js
CHANGED
|
@@ -1000,6 +1000,16 @@ var BoringPluginAssetManager = class {
|
|
|
1000
1000
|
this.frontTargetResolver = options.frontTargetResolver;
|
|
1001
1001
|
this.includeLegacyFrontUrl = options.includeLegacyFrontUrl ?? true;
|
|
1002
1002
|
}
|
|
1003
|
+
/**
|
|
1004
|
+
* Replace the scanned source roots. Lets hosts re-resolve discovery inputs
|
|
1005
|
+
* (e.g. workspace `.pi/settings.json` package sources, which can gain
|
|
1006
|
+
* entries after `boring-ui-plugin install`) before the next load() so
|
|
1007
|
+
* `/reload` picks up newly installed plugin sources without a process
|
|
1008
|
+
* restart.
|
|
1009
|
+
*/
|
|
1010
|
+
setPluginDirs(pluginDirs) {
|
|
1011
|
+
this.pluginDirs = pluginDirs;
|
|
1012
|
+
}
|
|
1003
1013
|
preflight() {
|
|
1004
1014
|
return preflightBoringPlugins(this.pluginDirs);
|
|
1005
1015
|
}
|
|
@@ -1979,6 +1989,20 @@ function createInMemoryBridge() {
|
|
|
1979
1989
|
};
|
|
1980
1990
|
}
|
|
1981
1991
|
|
|
1992
|
+
// src/shared/plugins/uiBridgeRegistry.ts
|
|
1993
|
+
var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("@hachej/boring-workspace:active-ui-bridge");
|
|
1994
|
+
function slot() {
|
|
1995
|
+
return globalThis;
|
|
1996
|
+
}
|
|
1997
|
+
function registerWorkspaceUiBridge(bridge) {
|
|
1998
|
+
slot()[REGISTRY_KEY] = bridge;
|
|
1999
|
+
return () => {
|
|
2000
|
+
if (slot()[REGISTRY_KEY] === bridge) {
|
|
2001
|
+
slot()[REGISTRY_KEY] = void 0;
|
|
2002
|
+
}
|
|
2003
|
+
};
|
|
2004
|
+
}
|
|
2005
|
+
|
|
1982
2006
|
// src/server/ui-control/tools/uiTools.ts
|
|
1983
2007
|
import { stat } from "fs/promises";
|
|
1984
2008
|
import { resolve as resolve6, isAbsolute as isAbsolute4, relative as relative3, win32 } from "path";
|
|
@@ -2885,6 +2909,7 @@ function readWorkspacePluginPackagePiSnapshot(pluginDirs) {
|
|
|
2885
2909
|
async function createWorkspaceAgentServer(opts = {}) {
|
|
2886
2910
|
const workspaceRoot = opts.workspaceRoot ?? process.cwd();
|
|
2887
2911
|
const bridge = createInMemoryBridge();
|
|
2912
|
+
const unregisterUiBridge = registerWorkspaceUiBridge(bridge);
|
|
2888
2913
|
const resolvedMode = opts.runtimeModeAdapter?.id ?? opts.mode ?? autoDetectMode();
|
|
2889
2914
|
const modeAdapter = opts.runtimeModeAdapter ?? resolveMode(resolvedMode);
|
|
2890
2915
|
const workspaceFsCapability = modeAdapter.workspaceFsCapability ?? "best-effort";
|
|
@@ -3062,6 +3087,7 @@ async function createWorkspaceAgentServer(opts = {}) {
|
|
|
3062
3087
|
if (typeof app.addHook === "function") {
|
|
3063
3088
|
app.addHook("onClose", async () => {
|
|
3064
3089
|
await runtimeBackendRegistry.close();
|
|
3090
|
+
unregisterUiBridge();
|
|
3065
3091
|
});
|
|
3066
3092
|
}
|
|
3067
3093
|
await app.register(uiRoutes, { bridge, preserveStateKeys: pluginCollection.preservedUiStateKeys });
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { B as BoringPackageBoringField, a as BoringPackagePiField } from './manifest-C2vVgH_e.js';
|
|
2
2
|
import { PiPackageSource, PluginSkillSource, ProvisionWorkspaceRuntimeOptions } from '@hachej/boring-agent/server';
|
|
3
3
|
import { FastifyPluginAsync } from 'fastify';
|
|
4
|
-
import { A as AgentTool
|
|
4
|
+
import { A as AgentTool } from './agent-tool-CB0RQyx9.js';
|
|
5
|
+
import { U as UiBridge } from './ui-bridge-LeBuZqfA.js';
|
|
5
6
|
|
|
6
7
|
type BoringPluginNativeFrontTargetTrust$1 = "local-trusted-native";
|
|
7
8
|
/**
|
package/dist/plugin.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { ComponentType, ReactNode } from 'react';
|
|
|
2
2
|
import { P as PaneProps, a as PanelConfig, S as SurfaceOpenRequest, c as SurfacePanelResolution } from './surface-obE7YwJk.js';
|
|
3
3
|
export { W as WORKSPACE_OPEN_PATH_SURFACE_KIND } from './surface-obE7YwJk.js';
|
|
4
4
|
export { B as BoringPackageBoringField, a as BoringPackagePiField, b as BoringPackagePiSource, c as BoringPackagePiSourceObject, d as BoringPluginManifestErrorCode, e as BoringPluginManifestIssue, f as BoringPluginManifestValidationResult, g as BoringPluginPackageJson, i as isSafePluginRelativePath, h as isValidBoringPluginId, v as validateBoringPluginManifest } from './manifest-C2vVgH_e.js';
|
|
5
|
+
import { a as UiCommand, C as CommandResult, U as UiBridge } from './ui-bridge-LeBuZqfA.js';
|
|
5
6
|
import 'dockview-react';
|
|
6
7
|
|
|
7
8
|
type CatalogBadge = {
|
|
@@ -209,4 +210,67 @@ declare function createCapturingBoringFrontAPI(options?: {
|
|
|
209
210
|
}): CapturingBoringFrontAPIHandle;
|
|
210
211
|
declare function captureFrontPlugin(plugin: BoringFrontFactoryWithId): CapturedFrontPlugin;
|
|
211
212
|
|
|
212
|
-
|
|
213
|
+
/**
|
|
214
|
+
* In-process registry that lets a plugin's Pi slash command reach the live
|
|
215
|
+
* workspace `UiBridge` WITHOUT an HTTP round-trip or a `BORING_UI_URL` env var.
|
|
216
|
+
*
|
|
217
|
+
* Why this exists
|
|
218
|
+
* ---------------
|
|
219
|
+
* A Pi extension slash-command handler only receives Pi's terminal-oriented
|
|
220
|
+
* `ctx.ui` (notify/select/confirm). It has no concept of the boring-ui
|
|
221
|
+
* workspace UI bridge, so the old canonical template resorted to
|
|
222
|
+
* `fetch(BORING_UI_URL + "/api/v1/ui/commands")` — fragile, and it silently
|
|
223
|
+
* no-op'd whenever the env var was unset (which is the common case). The bridge
|
|
224
|
+
* is already an in-process object owned by the agent server, so the right thing
|
|
225
|
+
* is to call `bridge.postCommand(...)` directly — the exact same path the
|
|
226
|
+
* agent's `exec_ui` tool uses.
|
|
227
|
+
*
|
|
228
|
+
* Why globalThis
|
|
229
|
+
* --------------
|
|
230
|
+
* Hot-reloadable plugins are loaded by Pi through jiti, which keeps its own
|
|
231
|
+
* module cache. A plain module-level singleton populated by the server is NOT
|
|
232
|
+
* guaranteed to be the same instance the plugin imports. `globalThis` is shared
|
|
233
|
+
* across every module realm in the process, so a `Symbol.for`-keyed slot is the
|
|
234
|
+
* one storage that both the server and a jiti-loaded plugin observe identically.
|
|
235
|
+
*
|
|
236
|
+
* This module is browser-safe (only `globalThis` + types), so it can live on
|
|
237
|
+
* the `@hachej/boring-workspace/plugin` authoring surface.
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
/** The active workspace `UiBridge`, or `undefined` when none is registered. */
|
|
241
|
+
declare function getWorkspaceUiBridge(): UiBridge | undefined;
|
|
242
|
+
/**
|
|
243
|
+
* Thrown by the plugin-facing helpers when no workspace bridge is active — for
|
|
244
|
+
* example when plugin code runs under a bare Pi CLI with no workspace UI
|
|
245
|
+
* attached. The message is deliberately actionable.
|
|
246
|
+
*/
|
|
247
|
+
declare class NoWorkspaceUiBridgeError extends Error {
|
|
248
|
+
constructor();
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Dispatch an arbitrary UI command through the active workspace bridge. This is
|
|
252
|
+
* the same call the agent's `exec_ui` tool makes; the connected browser drains
|
|
253
|
+
* the command. Prefer the named helpers below for common actions.
|
|
254
|
+
*/
|
|
255
|
+
declare function execWorkspaceUi(command: UiCommand): Promise<CommandResult>;
|
|
256
|
+
interface OpenPanelArgs {
|
|
257
|
+
/** Tab instance id. Reuse the same id to re-activate an existing tab. */
|
|
258
|
+
id: string;
|
|
259
|
+
/** Panel component id (one of the workspace's registered panels). */
|
|
260
|
+
component: string;
|
|
261
|
+
/** Optional params forwarded to the panel component. */
|
|
262
|
+
params?: Record<string, unknown>;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Open an app/plugin panel in the workspace from a plugin slash command.
|
|
266
|
+
* In-process — no URL, no env. Throws `NoWorkspaceUiBridgeError` if no bridge.
|
|
267
|
+
*/
|
|
268
|
+
declare function openPanel(args: OpenPanelArgs): Promise<CommandResult>;
|
|
269
|
+
/**
|
|
270
|
+
* Show a workspace notification (toast) from a plugin slash command. Unlike
|
|
271
|
+
* Pi's `ctx.ui.notify` (a terminal notification that is swallowed in
|
|
272
|
+
* server/headless mode), this surfaces in the browser via the UI bridge.
|
|
273
|
+
*/
|
|
274
|
+
declare function notify(msg: string, level?: "info" | "warn" | "error"): Promise<CommandResult>;
|
|
275
|
+
|
|
276
|
+
export { type BoringFrontAPI, type BoringFrontBindingRegistration, type BoringFrontFactory, type BoringFrontFactoryWithId, type BoringFrontLeftTabRegistration, type BoringFrontPanelCommandRegistration, type BoringFrontPanelRegistration, type BoringFrontProviderRegistration, type BoringFrontSetup, type BoringFrontSurfaceResolverRegistration, type CapturedBoringFrontRegistrations, type CapturedFrontPlugin, type CapturingBoringFrontAPIHandle, type DefinePluginConfig, NoWorkspaceUiBridgeError, type OpenPanelArgs, PaneProps, captureFrontPlugin, createCapturingBoringFrontAPI, definePlugin, execWorkspaceUi, getWorkspaceUiBridge, notify, openPanel };
|
package/dist/plugin.js
CHANGED
|
@@ -297,12 +297,51 @@ function validateBoringPluginManifest(raw) {
|
|
|
297
297
|
|
|
298
298
|
// src/shared/types/surface.ts
|
|
299
299
|
var WORKSPACE_OPEN_PATH_SURFACE_KIND = "workspace.open.path";
|
|
300
|
+
|
|
301
|
+
// src/shared/plugins/uiBridgeRegistry.ts
|
|
302
|
+
var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("@hachej/boring-workspace:active-ui-bridge");
|
|
303
|
+
function slot() {
|
|
304
|
+
return globalThis;
|
|
305
|
+
}
|
|
306
|
+
function getWorkspaceUiBridge() {
|
|
307
|
+
return slot()[REGISTRY_KEY];
|
|
308
|
+
}
|
|
309
|
+
var NoWorkspaceUiBridgeError = class extends Error {
|
|
310
|
+
constructor() {
|
|
311
|
+
super(
|
|
312
|
+
"No workspace UI bridge is active. This plugin command must run inside a boring-ui workspace agent (it cannot open panels from a bare Pi CLI)."
|
|
313
|
+
);
|
|
314
|
+
this.name = "NoWorkspaceUiBridgeError";
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
function requireBridge() {
|
|
318
|
+
const bridge = getWorkspaceUiBridge();
|
|
319
|
+
if (!bridge) throw new NoWorkspaceUiBridgeError();
|
|
320
|
+
return bridge;
|
|
321
|
+
}
|
|
322
|
+
async function execWorkspaceUi(command) {
|
|
323
|
+
return requireBridge().postCommand(command);
|
|
324
|
+
}
|
|
325
|
+
async function openPanel(args) {
|
|
326
|
+
return execWorkspaceUi({
|
|
327
|
+
kind: "openPanel",
|
|
328
|
+
params: { id: args.id, component: args.component, params: args.params }
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
async function notify(msg, level = "info") {
|
|
332
|
+
return execWorkspaceUi({ kind: "showNotification", params: { msg, level } });
|
|
333
|
+
}
|
|
300
334
|
export {
|
|
335
|
+
NoWorkspaceUiBridgeError,
|
|
301
336
|
WORKSPACE_OPEN_PATH_SURFACE_KIND,
|
|
302
337
|
captureFrontPlugin,
|
|
303
338
|
createCapturingBoringFrontAPI,
|
|
304
339
|
definePlugin,
|
|
340
|
+
execWorkspaceUi,
|
|
341
|
+
getWorkspaceUiBridge,
|
|
305
342
|
isSafePluginRelativePath,
|
|
306
343
|
isValidBoringPluginId,
|
|
344
|
+
notify,
|
|
345
|
+
openPanel,
|
|
307
346
|
validateBoringPluginManifest
|
|
308
347
|
};
|
package/dist/server.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { f as WorkspaceServerPluginAsset, g as BoringServerPluginManifest, B as BoringPluginSourceInput, a as BoringPluginFrontTargetResolver, h as BoringPluginListEntry, i as BoringPluginFrontTarget, j as BoringPluginSource, k as BoringPluginEvent, P as PluginRestartSurface } from './createInMemoryBridge-
|
|
2
|
-
export { l as BoringPluginFrontTargetResolverContext, m as BoringPluginNativeFrontTarget, n as BoringPluginNativeFrontTargetTrust, o as BoringPluginSourceKind, S as ServerBootstrapOptions, p as ServerBootstrapResult, b as WorkspaceProvisioningContribution, c as WorkspaceRouteContribution, W as WorkspaceServerPlugin, q as bootstrapServer, d as createInMemoryBridge, r as defineServerPlugin, v as validateServerPlugin } from './createInMemoryBridge-
|
|
1
|
+
import { f as WorkspaceServerPluginAsset, g as BoringServerPluginManifest, B as BoringPluginSourceInput, a as BoringPluginFrontTargetResolver, h as BoringPluginListEntry, i as BoringPluginFrontTarget, j as BoringPluginSource, k as BoringPluginEvent, P as PluginRestartSurface } from './createInMemoryBridge-e7QdNLSA.js';
|
|
2
|
+
export { l as BoringPluginFrontTargetResolverContext, m as BoringPluginNativeFrontTarget, n as BoringPluginNativeFrontTargetTrust, o as BoringPluginSourceKind, S as ServerBootstrapOptions, p as ServerBootstrapResult, b as WorkspaceProvisioningContribution, c as WorkspaceRouteContribution, W as WorkspaceServerPlugin, q as bootstrapServer, d as createInMemoryBridge, r as defineServerPlugin, v as validateServerPlugin } from './createInMemoryBridge-e7QdNLSA.js';
|
|
3
3
|
import { FastifyRequest, FastifyInstance } from 'fastify';
|
|
4
|
-
import { U as UiBridge
|
|
5
|
-
export { C as CommandResult, a as UiCommand, b as UiState } from './ui-bridge-
|
|
4
|
+
import { U as UiBridge } from './ui-bridge-LeBuZqfA.js';
|
|
5
|
+
export { C as CommandResult, a as UiCommand, b as UiState } from './ui-bridge-LeBuZqfA.js';
|
|
6
|
+
import { A as AgentTool } from './agent-tool-CB0RQyx9.js';
|
|
6
7
|
import { PiPackageSource } from '@hachej/boring-agent/server';
|
|
7
8
|
export { PiPackageSource as WorkspacePiPackageSource } from '@hachej/boring-agent/server';
|
|
8
9
|
import { PluginLogger } from './runtime-server.js';
|
|
@@ -226,7 +227,7 @@ interface LoadedBoringPluginPiSnapshot {
|
|
|
226
227
|
}
|
|
227
228
|
type Listener = (event: BoringPluginEvent) => void;
|
|
228
229
|
declare class BoringPluginAssetManager {
|
|
229
|
-
private
|
|
230
|
+
private pluginDirs;
|
|
230
231
|
private readonly errorRoot;
|
|
231
232
|
private readonly frontTargetResolver?;
|
|
232
233
|
private readonly includeLegacyFrontUrl;
|
|
@@ -237,6 +238,14 @@ declare class BoringPluginAssetManager {
|
|
|
237
238
|
private loading;
|
|
238
239
|
private reloadQueued;
|
|
239
240
|
constructor(options: BoringPluginAssetManagerOptions);
|
|
241
|
+
/**
|
|
242
|
+
* Replace the scanned source roots. Lets hosts re-resolve discovery inputs
|
|
243
|
+
* (e.g. workspace `.pi/settings.json` package sources, which can gain
|
|
244
|
+
* entries after `boring-ui-plugin install`) before the next load() so
|
|
245
|
+
* `/reload` picks up newly installed plugin sources without a process
|
|
246
|
+
* restart.
|
|
247
|
+
*/
|
|
248
|
+
setPluginDirs(pluginDirs: BoringPluginSourceInput[]): void;
|
|
240
249
|
preflight(): BoringPluginPreflightResult;
|
|
241
250
|
list(): BoringPluginListEntry[];
|
|
242
251
|
getError(pluginId: string): string | null;
|
package/dist/server.js
CHANGED
|
@@ -1630,6 +1630,16 @@ var BoringPluginAssetManager = class {
|
|
|
1630
1630
|
this.frontTargetResolver = options.frontTargetResolver;
|
|
1631
1631
|
this.includeLegacyFrontUrl = options.includeLegacyFrontUrl ?? true;
|
|
1632
1632
|
}
|
|
1633
|
+
/**
|
|
1634
|
+
* Replace the scanned source roots. Lets hosts re-resolve discovery inputs
|
|
1635
|
+
* (e.g. workspace `.pi/settings.json` package sources, which can gain
|
|
1636
|
+
* entries after `boring-ui-plugin install`) before the next load() so
|
|
1637
|
+
* `/reload` picks up newly installed plugin sources without a process
|
|
1638
|
+
* restart.
|
|
1639
|
+
*/
|
|
1640
|
+
setPluginDirs(pluginDirs) {
|
|
1641
|
+
this.pluginDirs = pluginDirs;
|
|
1642
|
+
}
|
|
1633
1643
|
preflight() {
|
|
1634
1644
|
return preflightBoringPlugins(this.pluginDirs);
|
|
1635
1645
|
}
|
package/dist/shared.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { C as CommandResult, U as UiBridge, a as UiCommand, b as UiState } from './ui-bridge-LeBuZqfA.js';
|
|
2
2
|
export { C as CommandConfig, P as PaneProps, a as PanelConfig, b as PanelRegistration, S as SurfaceOpenRequest, c as SurfacePanelResolution, d as SurfaceResolverConfig, e as SurfaceResolverRegistration, W as WORKSPACE_OPEN_PATH_SURFACE_KIND, f as definePanel } from './surface-obE7YwJk.js';
|
|
3
|
+
export { A as AgentTool, J as JSONSchema, T as ToolExecContext, a as ToolResult } from './agent-tool-CB0RQyx9.js';
|
|
3
4
|
import 'react';
|
|
4
5
|
import 'dockview-react';
|
|
5
6
|
|
package/dist/testing.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as Ba } from "react/jsx-runtime";
|
|
2
2
|
import * as Pa from "react";
|
|
3
3
|
import { createElement as is, useMemo as wn, useLayoutEffect as us, isValidElement as ss, cloneElement as ds, useSyncExternalStore as Gi } from "react";
|
|
4
|
-
import { h as cs, q as fs, o as ps } from "./WorkspaceProvider-
|
|
4
|
+
import { h as cs, q as fs, o as ps } from "./WorkspaceProvider-CpK401MG.js";
|
|
5
5
|
import { d as ms } from "./panel-DnvDNQac.js";
|
|
6
6
|
import * as bs from "react-dom/test-utils";
|
|
7
7
|
import ka from "react-dom";
|
|
@@ -1,34 +1,3 @@
|
|
|
1
|
-
type JSONSchema = Record<string, unknown>;
|
|
2
|
-
type ToolReadinessRequirement = 'workspace-fs' | 'sandbox-exec' | 'ui-bridge' | 'runtime-dependencies' | `runtime:${string}`;
|
|
3
|
-
interface ToolExecContext {
|
|
4
|
-
abortSignal: AbortSignal;
|
|
5
|
-
toolCallId: string;
|
|
6
|
-
onUpdate?: (partial: string) => void;
|
|
7
|
-
/** Agent chat/session id executing this tool, when known. */
|
|
8
|
-
sessionId?: string;
|
|
9
|
-
}
|
|
10
|
-
interface ToolResult {
|
|
11
|
-
content: Array<{
|
|
12
|
-
type: "text";
|
|
13
|
-
text: string;
|
|
14
|
-
}>;
|
|
15
|
-
isError?: boolean;
|
|
16
|
-
details?: unknown;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Structural tool contract accepted from workspace plugins and UI tool
|
|
20
|
-
* factories. Kept agent-runtime-neutral so only the app integration layer
|
|
21
|
-
* needs to import @hachej/boring-agent.
|
|
22
|
-
*/
|
|
23
|
-
interface AgentTool {
|
|
24
|
-
name: string;
|
|
25
|
-
description: string;
|
|
26
|
-
promptSnippet?: string;
|
|
27
|
-
readinessRequirements?: ToolReadinessRequirement[];
|
|
28
|
-
parameters: JSONSchema;
|
|
29
|
-
execute(params: Record<string, unknown>, ctx: ToolExecContext): Promise<ToolResult>;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
1
|
interface UiBridge {
|
|
33
2
|
getState(): Promise<UiState | null>;
|
|
34
3
|
setState(state: UiState): Promise<void>;
|
|
@@ -99,4 +68,4 @@ interface CommandResult {
|
|
|
99
68
|
};
|
|
100
69
|
}
|
|
101
70
|
|
|
102
|
-
export type {
|
|
71
|
+
export type { CommandResult as C, UiBridge as U, UiCommand as a, UiState as b };
|
package/dist/workspace.css
CHANGED
|
@@ -1817,18 +1817,12 @@
|
|
|
1817
1817
|
.min-w-\[10rem\] {
|
|
1818
1818
|
min-width: 10rem;
|
|
1819
1819
|
}
|
|
1820
|
-
.min-w-\[350px\] {
|
|
1821
|
-
min-width: 350px;
|
|
1822
|
-
}
|
|
1823
1820
|
.flex-1 {
|
|
1824
1821
|
flex: 1;
|
|
1825
1822
|
}
|
|
1826
1823
|
.flex-\[0_0_0px\] {
|
|
1827
1824
|
flex: 0 0 0px;
|
|
1828
1825
|
}
|
|
1829
|
-
.flex-\[1_0_350px\] {
|
|
1830
|
-
flex: 1 0 350px;
|
|
1831
|
-
}
|
|
1832
1826
|
.shrink-0 {
|
|
1833
1827
|
flex-shrink: 0;
|
|
1834
1828
|
}
|
|
@@ -1960,9 +1954,6 @@
|
|
|
1960
1954
|
.self-center {
|
|
1961
1955
|
align-self: center;
|
|
1962
1956
|
}
|
|
1963
|
-
.self-stretch {
|
|
1964
|
-
align-self: stretch;
|
|
1965
|
-
}
|
|
1966
1957
|
.truncate {
|
|
1967
1958
|
overflow: hidden;
|
|
1968
1959
|
text-overflow: ellipsis;
|
|
@@ -1974,15 +1965,9 @@
|
|
|
1974
1965
|
.overflow-hidden {
|
|
1975
1966
|
overflow: hidden;
|
|
1976
1967
|
}
|
|
1977
|
-
.overflow-x-auto {
|
|
1978
|
-
overflow-x: auto;
|
|
1979
|
-
}
|
|
1980
1968
|
.overflow-y-auto {
|
|
1981
1969
|
overflow-y: auto;
|
|
1982
1970
|
}
|
|
1983
|
-
.overflow-y-hidden {
|
|
1984
|
-
overflow-y: hidden;
|
|
1985
|
-
}
|
|
1986
1971
|
.rounded {
|
|
1987
1972
|
border-radius: 0.25rem;
|
|
1988
1973
|
}
|
|
@@ -2098,9 +2083,6 @@
|
|
|
2098
2083
|
.bg-\[color\:oklch\(from_var\(--background\)_calc\(l-0\.01\)_c_h\)\] {
|
|
2099
2084
|
background-color: oklch(from var(--background) calc(l - 0.01) c h);
|
|
2100
2085
|
}
|
|
2101
|
-
.bg-\[color\:oklch\(from_var\(--border\)_l_c_h\/0\.7\)\] {
|
|
2102
|
-
background-color: oklch(from var(--border) l c h/0.7);
|
|
2103
|
-
}
|
|
2104
2086
|
.bg-\[color\:oklch\(from_var\(--foreground\)_l_c_h\/0\.035\)\] {
|
|
2105
2087
|
background-color: oklch(from var(--foreground) l c h/0.035);
|
|
2106
2088
|
}
|
|
@@ -2496,12 +2478,6 @@
|
|
|
2496
2478
|
.text-foreground {
|
|
2497
2479
|
color: var(--boring-foreground);
|
|
2498
2480
|
}
|
|
2499
|
-
.text-foreground\/40 {
|
|
2500
|
-
color: var(--boring-foreground);
|
|
2501
|
-
@supports (color: color-mix(in lab, red, red)) {
|
|
2502
|
-
color: color-mix(in oklab, var(--boring-foreground) 40%, transparent);
|
|
2503
|
-
}
|
|
2504
|
-
}
|
|
2505
2481
|
.text-foreground\/65 {
|
|
2506
2482
|
color: var(--boring-foreground);
|
|
2507
2483
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -2693,11 +2669,6 @@
|
|
|
2693
2669
|
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
|
2694
2670
|
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
|
2695
2671
|
}
|
|
2696
|
-
.transition-\[flex-grow\,flex-basis\,min-width\] {
|
|
2697
|
-
transition-property: flex-grow,flex-basis,min-width;
|
|
2698
|
-
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
|
2699
|
-
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
|
2700
|
-
}
|
|
2701
2672
|
.transition-\[flex-grow\,flex-basis\,width\,min-width\,max-width\] {
|
|
2702
2673
|
transition-property: flex-grow,flex-basis,width,min-width,max-width;
|
|
2703
2674
|
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
|
@@ -2740,10 +2711,6 @@
|
|
|
2740
2711
|
--tw-duration: 200ms;
|
|
2741
2712
|
transition-duration: 200ms;
|
|
2742
2713
|
}
|
|
2743
|
-
.duration-\[240ms\] {
|
|
2744
|
-
--tw-duration: 240ms;
|
|
2745
|
-
transition-duration: 240ms;
|
|
2746
|
-
}
|
|
2747
2714
|
.duration-\[280ms\] {
|
|
2748
2715
|
--tw-duration: 280ms;
|
|
2749
2716
|
transition-duration: 280ms;
|
package/dist/workspace.d.ts
CHANGED
|
@@ -383,13 +383,6 @@ export declare interface ChatLayoutProps {
|
|
|
383
383
|
onCreateChatPaneAfter?: (id: string) => void;
|
|
384
384
|
onDropChatSession?: (sessionId: string) => void;
|
|
385
385
|
flashChatPaneId?: string | null;
|
|
386
|
-
/**
|
|
387
|
-
* Chat stage layout engine. `dock` enables the dockview-backed stage
|
|
388
|
-
* (drag headers to split in any direction); defaults to the flex row.
|
|
389
|
-
* The `boring-workspace:chat-pane-engine` localStorage key overrides
|
|
390
|
-
* when no explicit value is passed.
|
|
391
|
-
*/
|
|
392
|
-
chatPaneEngine?: ChatPaneEngine | null;
|
|
393
386
|
surface?: string | null;
|
|
394
387
|
surfaceParams?: Record<string, unknown>;
|
|
395
388
|
surfaceOverlay?: ReactNode;
|
|
@@ -410,18 +403,6 @@ declare interface ChatPaneDescriptor {
|
|
|
410
403
|
params?: Record<string, unknown>;
|
|
411
404
|
}
|
|
412
405
|
|
|
413
|
-
/**
|
|
414
|
-
* Layout engine for the chat pane stage.
|
|
415
|
-
*
|
|
416
|
-
* - `flex` (default): panes lay out as a single row of vertical splits.
|
|
417
|
-
* - `dock`: dockview-backed stage — drag pane headers to split in any
|
|
418
|
-
* direction and resize; geometry persists per workspace.
|
|
419
|
-
*
|
|
420
|
-
* Resolution order: explicit prop, then the
|
|
421
|
-
* `boring-workspace:chat-pane-engine` localStorage override, then `flex`.
|
|
422
|
-
*/
|
|
423
|
-
declare type ChatPaneEngine = "flex" | "dock";
|
|
424
|
-
|
|
425
406
|
export declare const closePanelSchema: z.ZodObject<{
|
|
426
407
|
id: z.ZodString;
|
|
427
408
|
}, "strip", z.ZodTypeAny, {
|
package/dist/workspace.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
var V = Object.defineProperty;
|
|
2
2
|
var X = (e, t, a) => t in e ? V(e, t, { enumerable: !0, configurable: !0, writable: !0, value: a }) : e[t] = a;
|
|
3
3
|
var T = (e, t, a) => X(e, typeof t != "symbol" ? t + "" : t, a);
|
|
4
|
-
import { u as K, p as Q, a as Y, b as Z, D as ee } from "./WorkspaceProvider-
|
|
5
|
-
import { A as Je, C as Ge, c as Ve, d as Xe, e as Qe, F as Ye, f as Ze, M as et, g as tt, P as at, h as rt, i as nt, j as st, k as ot, R as it, S as lt, l as ct, m as dt, T as ut, U as pt, W as ft, n as mt, o as ht, q as gt, r as bt, s as yt, t as vt, v as xt, w as kt, x as wt, y as Pt, z as St, B as Ct, E as Nt, G as Et, H as Rt, I as Tt, J as It, K as Ot, L as Ft, N as Lt, O as Mt, Q as Bt, V as Wt, X as Dt, Y as Kt, Z as $t, _ as jt, $ as zt, a0 as Ht, a1 as Ut, a2 as _t, a3 as qt, a4 as At, a5 as Jt, a6 as Gt, a7 as Vt, a8 as Xt, a9 as Qt, aa as Yt, ab as Zt, ac as ea, ad as ta, ae as aa, af as ra, ag as na, ah as sa, ai as oa, aj as ia, ak as la, al as ca, am as da, an as ua, ao as pa, ap as fa, aq as ma, ar as ha, as as ga } from "./WorkspaceProvider-
|
|
4
|
+
import { u as K, p as Q, a as Y, b as Z, D as ee } from "./WorkspaceProvider-CpK401MG.js";
|
|
5
|
+
import { A as Je, C as Ge, c as Ve, d as Xe, e as Qe, F as Ye, f as Ze, M as et, g as tt, P as at, h as rt, i as nt, j as st, k as ot, R as it, S as lt, l as ct, m as dt, T as ut, U as pt, W as ft, n as mt, o as ht, q as gt, r as bt, s as yt, t as vt, v as xt, w as kt, x as wt, y as Pt, z as St, B as Ct, E as Nt, G as Et, H as Rt, I as Tt, J as It, K as Ot, L as Ft, N as Lt, O as Mt, Q as Bt, V as Wt, X as Dt, Y as Kt, Z as $t, _ as jt, $ as zt, a0 as Ht, a1 as Ut, a2 as _t, a3 as qt, a4 as At, a5 as Jt, a6 as Gt, a7 as Vt, a8 as Xt, a9 as Qt, aa as Yt, ab as Zt, ac as ea, ad as ta, ae as aa, af as ra, ag as na, ah as sa, ai as oa, aj as ia, ak as la, al as ca, am as da, an as ua, ao as pa, ap as fa, aq as ma, ar as ha, as as ga } from "./WorkspaceProvider-CpK401MG.js";
|
|
6
6
|
import { c as C } from "./utils-B6yFEsav.js";
|
|
7
|
-
import { C as ya, T as va, W as xa, b as ka } from "./WorkspaceLoadingState-
|
|
7
|
+
import { C as ya, T as va, W as xa, b as ka } from "./WorkspaceLoadingState-C664sU-y.js";
|
|
8
8
|
import { jsx as r, jsxs as g, Fragment as te } from "react/jsx-runtime";
|
|
9
9
|
import { Button as P, Sheet as ae, SheetContent as re, SheetHeader as ne, SheetTitle as se, SheetDescription as oe, EmptyState as ie, Kbd as I, ErrorState as le, IconButton as O } from "@hachej/boring-ui-kit";
|
|
10
10
|
import { Toaster as Pa, dismissToast as Sa, toast as Ca } from "@hachej/boring-ui-kit";
|
|
11
11
|
import { useSyncExternalStore as $, useState as N, useEffect as k, useRef as S, useCallback as b, useMemo as w, Suspense as ce, Component as de } from "react";
|
|
12
12
|
import { C as Ea, c as Ra } from "./CodeEditor-DQqOn4xz.js";
|
|
13
|
-
import { FileTree as Ia } from "./FileTree-
|
|
14
|
-
import { MarkdownEditor as Fa } from "./MarkdownEditor-
|
|
13
|
+
import { FileTree as Ia } from "./FileTree-GkaIEJ9n.js";
|
|
14
|
+
import { MarkdownEditor as Fa } from "./MarkdownEditor-DjZZnHcU.js";
|
|
15
15
|
import { MenuIcon as ue, PanelLeftOpenIcon as pe, PanelLeftCloseIcon as fe, PinIcon as me, CheckIcon as he, CopyIcon as ge } from "lucide-react";
|
|
16
16
|
import { d as Ma } from "./panel-DnvDNQac.js";
|
|
17
17
|
function We() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hachej/boring-workspace",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Workspace UI, plugin, and bridge package for composing chat, files, catalogs, editors, and app-specific panes.",
|
|
@@ -135,9 +135,9 @@
|
|
|
135
135
|
"tailwind-merge": "^2.0.0",
|
|
136
136
|
"zod": "^3.23.0",
|
|
137
137
|
"zustand": "^5.0.0",
|
|
138
|
-
"@hachej/boring-agent": "0.1.
|
|
139
|
-
"@hachej/boring-ui-
|
|
140
|
-
"@hachej/boring-ui-
|
|
138
|
+
"@hachej/boring-agent": "0.1.36",
|
|
139
|
+
"@hachej/boring-ui-kit": "0.1.36",
|
|
140
|
+
"@hachej/boring-ui-plugin-cli": "0.1.36"
|
|
141
141
|
},
|
|
142
142
|
"devDependencies": {
|
|
143
143
|
"@tailwindcss/postcss": "^4.0.0",
|