@agimon-ai/doompi-ui 0.0.1-alpha.2 → 0.0.1-alpha.21
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/README.md +21 -18
- package/dist/_virtual/_rolldown/runtime.cjs +1 -1
- package/dist/adapters/pi/extension.cjs +2 -0
- package/dist/adapters/pi/extension.cjs.map +1 -0
- package/dist/adapters/pi/extension.d.cts +7 -0
- package/dist/adapters/pi/extension.d.cts.map +1 -0
- package/dist/adapters/pi/extension.d.mts +7 -0
- package/dist/adapters/pi/extension.d.mts.map +1 -0
- package/dist/adapters/pi/extension.mjs +2 -0
- package/dist/adapters/pi/extension.mjs.map +1 -0
- package/dist/adapters/pi/extensionName.cjs +2 -0
- package/dist/adapters/pi/extensionName.cjs.map +1 -0
- package/dist/adapters/pi/extensionName.d.cts +16 -0
- package/dist/adapters/pi/extensionName.d.cts.map +1 -0
- package/dist/adapters/pi/extensionName.d.mts +16 -0
- package/dist/adapters/pi/extensionName.d.mts.map +1 -0
- package/dist/adapters/pi/extensionName.mjs +2 -0
- package/dist/adapters/pi/extensionName.mjs.map +1 -0
- package/dist/adapters/pi/toolOverrides.cjs +2 -0
- package/dist/adapters/pi/toolOverrides.cjs.map +1 -0
- package/dist/adapters/pi/toolOverrides.mjs +2 -0
- package/dist/adapters/pi/toolOverrides.mjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts +29 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts +29 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
- package/dist/components/configOverlay.cjs +0 -0
- package/dist/components/configOverlay.d.cts +0 -0
- package/dist/components/configOverlay.d.mts +0 -0
- package/dist/components/configOverlay.mjs +0 -0
- package/dist/components/doomEditor.cjs +1 -2
- package/dist/components/doomEditor.d.cts +2 -59
- package/dist/components/doomEditor.d.mts +2 -59
- package/dist/components/doomEditor.mjs +1 -2
- package/dist/components/doomFooter.cjs +1 -2
- package/dist/components/doomFooter.d.cts +2 -32
- package/dist/components/doomFooter.d.mts +2 -32
- package/dist/components/doomFooter.mjs +1 -2
- package/dist/components/doomHeader.cjs +1 -2
- package/dist/components/doomHeader.d.cts +2 -34
- package/dist/components/doomHeader.d.mts +2 -34
- package/dist/components/doomHeader.mjs +1 -2
- package/dist/components/doomOverlay.cjs +1 -2
- package/dist/components/doomOverlay.d.cts +2 -79
- package/dist/components/doomOverlay.d.mts +2 -79
- package/dist/components/doomOverlay.mjs +1 -2
- package/dist/components/leaderHints.cjs +1 -2
- package/dist/components/leaderHints.d.cts +2 -37
- package/dist/components/leaderHints.d.mts +2 -37
- package/dist/components/leaderHints.mjs +1 -2
- package/dist/components/toolsOverlay.cjs +1 -2
- package/dist/components/toolsOverlay.d.cts +2 -29
- package/dist/components/toolsOverlay.d.mts +2 -29
- package/dist/components/toolsOverlay.mjs +1 -2
- package/dist/config.cjs +1 -2
- package/dist/config.d.cts +2 -5
- package/dist/config.d.mts +2 -5
- package/dist/config.mjs +1 -2
- package/dist/extension.cjs +1 -2
- package/dist/extension.d.cts +2 -7
- package/dist/extension.d.mts +2 -7
- package/dist/extension.mjs +1 -2
- package/dist/extensionName.cjs +1 -2
- package/dist/extensionName.d.cts +2 -5
- package/dist/extensionName.d.mts +2 -5
- package/dist/extensionName.mjs +1 -2
- package/dist/extensions/pi.cjs +1 -1
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.cts +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.mjs +1 -1
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/footer.cjs +1 -2
- package/dist/footer.d.cts +2 -5
- package/dist/footer.d.mts +2 -5
- package/dist/footer.mjs +1 -2
- package/dist/harnessMetadata.cjs +1 -2
- package/dist/harnessMetadata.d.cts +2 -21
- package/dist/harnessMetadata.d.mts +2 -21
- package/dist/harnessMetadata.mjs +1 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +14 -25
- package/dist/index.d.mts +14 -25
- package/dist/index.mjs +1 -1
- package/dist/leaderRegistry.cjs +1 -2
- package/dist/leaderRegistry.d.cts +2 -58
- package/dist/leaderRegistry.d.mts +2 -58
- package/dist/leaderRegistry.mjs +1 -2
- package/dist/logSinkTelemetry.cjs +1 -2
- package/dist/logSinkTelemetry.d.cts +2 -29
- package/dist/logSinkTelemetry.d.mts +2 -29
- package/dist/logSinkTelemetry.mjs +1 -2
- package/dist/rendering.cjs +1 -2
- package/dist/rendering.d.cts +2 -11
- package/dist/rendering.d.mts +2 -11
- package/dist/rendering.mjs +1 -2
- package/dist/services/leader/leaderRegistry.cjs +2 -0
- package/dist/services/leader/leaderRegistry.cjs.map +1 -0
- package/dist/services/leader/leaderRegistry.d.cts +58 -0
- package/dist/services/leader/leaderRegistry.d.cts.map +1 -0
- package/dist/services/leader/leaderRegistry.d.mts +58 -0
- package/dist/services/leader/leaderRegistry.d.mts.map +1 -0
- package/dist/services/leader/leaderRegistry.mjs +2 -0
- package/dist/services/leader/leaderRegistry.mjs.map +1 -0
- package/dist/services/state/uiState.cjs +2 -0
- package/dist/services/state/uiState.cjs.map +1 -0
- package/dist/services/state/uiState.d.cts +38 -0
- package/dist/services/state/uiState.d.cts.map +1 -0
- package/dist/services/state/uiState.d.mts +38 -0
- package/dist/services/state/uiState.d.mts.map +1 -0
- package/dist/services/state/uiState.mjs +2 -0
- package/dist/services/state/uiState.mjs.map +1 -0
- package/dist/services/tools/toolInventory.cjs +2 -0
- package/dist/services/tools/toolInventory.cjs.map +1 -0
- package/dist/services/tools/toolInventory.d.cts +51 -0
- package/dist/services/tools/toolInventory.d.cts.map +1 -0
- package/dist/services/tools/toolInventory.d.mts +51 -0
- package/dist/services/tools/toolInventory.d.mts.map +1 -0
- package/dist/services/tools/toolInventory.mjs +2 -0
- package/dist/services/tools/toolInventory.mjs.map +1 -0
- package/dist/skills.cjs +1 -1
- package/dist/skills.d.cts +2 -1
- package/dist/skills.d.mts +2 -1
- package/dist/skills.mjs +1 -1
- package/dist/theme.cjs +1 -2
- package/dist/theme.d.cts +2 -95
- package/dist/theme.d.mts +2 -95
- package/dist/theme.mjs +1 -2
- package/dist/toolChrome.cjs +1 -0
- package/dist/toolChrome.d.cts +2 -0
- package/dist/toolChrome.d.mts +2 -0
- package/dist/toolChrome.mjs +1 -0
- package/dist/toolInventory.cjs +1 -2
- package/dist/toolInventory.d.cts +2 -40
- package/dist/toolInventory.d.mts +2 -40
- package/dist/toolInventory.mjs +1 -2
- package/dist/tui/builtinToolRender.cjs +14 -0
- package/dist/tui/builtinToolRender.cjs.map +1 -0
- package/dist/tui/builtinToolRender.mjs +14 -0
- package/dist/tui/builtinToolRender.mjs.map +1 -0
- package/dist/tui/codeGutter.cjs +2 -0
- package/dist/tui/codeGutter.cjs.map +1 -0
- package/dist/tui/codeGutter.mjs +2 -0
- package/dist/tui/codeGutter.mjs.map +1 -0
- package/dist/tui/configOverlay.cjs +0 -0
- package/dist/tui/configOverlay.cjs.map +1 -0
- package/dist/tui/configOverlay.d.cts +0 -0
- package/dist/tui/configOverlay.d.cts.map +1 -0
- package/dist/tui/configOverlay.d.mts +0 -0
- package/dist/tui/configOverlay.d.mts.map +1 -0
- package/dist/tui/configOverlay.mjs +0 -0
- package/dist/tui/configOverlay.mjs.map +1 -0
- package/dist/tui/diffRender.cjs +4 -0
- package/dist/tui/diffRender.cjs.map +1 -0
- package/dist/tui/diffRender.mjs +4 -0
- package/dist/tui/diffRender.mjs.map +1 -0
- package/dist/tui/doomEditor.cjs +2 -0
- package/dist/tui/doomEditor.cjs.map +1 -0
- package/dist/tui/doomEditor.d.cts +63 -0
- package/dist/tui/doomEditor.d.cts.map +1 -0
- package/dist/tui/doomEditor.d.mts +63 -0
- package/dist/tui/doomEditor.d.mts.map +1 -0
- package/dist/tui/doomEditor.mjs +2 -0
- package/dist/tui/doomEditor.mjs.map +1 -0
- package/dist/tui/doomFooter.cjs +2 -0
- package/dist/tui/doomFooter.cjs.map +1 -0
- package/dist/tui/doomFooter.d.cts +32 -0
- package/dist/tui/doomFooter.d.cts.map +1 -0
- package/dist/tui/doomFooter.d.mts +32 -0
- package/dist/tui/doomFooter.d.mts.map +1 -0
- package/dist/tui/doomFooter.mjs +2 -0
- package/dist/tui/doomFooter.mjs.map +1 -0
- package/dist/tui/doomHeader.cjs +2 -0
- package/dist/tui/doomHeader.cjs.map +1 -0
- package/dist/tui/doomHeader.d.cts +34 -0
- package/dist/tui/doomHeader.d.cts.map +1 -0
- package/dist/tui/doomHeader.d.mts +34 -0
- package/dist/tui/doomHeader.d.mts.map +1 -0
- package/dist/tui/doomHeader.mjs +2 -0
- package/dist/tui/doomHeader.mjs.map +1 -0
- package/dist/tui/doomOverlay.cjs +2 -0
- package/dist/tui/doomOverlay.cjs.map +1 -0
- package/dist/tui/doomOverlay.d.cts +84 -0
- package/dist/tui/doomOverlay.d.cts.map +1 -0
- package/dist/tui/doomOverlay.d.mts +84 -0
- package/dist/tui/doomOverlay.d.mts.map +1 -0
- package/dist/tui/doomOverlay.mjs +2 -0
- package/dist/tui/doomOverlay.mjs.map +1 -0
- package/dist/tui/leaderHints.cjs +2 -0
- package/dist/tui/leaderHints.cjs.map +1 -0
- package/dist/tui/leaderHints.d.cts +36 -0
- package/dist/tui/leaderHints.d.cts.map +1 -0
- package/dist/tui/leaderHints.d.mts +36 -0
- package/dist/tui/leaderHints.d.mts.map +1 -0
- package/dist/tui/leaderHints.mjs +2 -0
- package/dist/tui/leaderHints.mjs.map +1 -0
- package/dist/tui/rendering.cjs +2 -0
- package/dist/tui/rendering.cjs.map +1 -0
- package/dist/tui/rendering.d.cts +16 -0
- package/dist/tui/rendering.d.cts.map +1 -0
- package/dist/tui/rendering.d.mts +16 -0
- package/dist/tui/rendering.d.mts.map +1 -0
- package/dist/tui/rendering.mjs +2 -0
- package/dist/tui/rendering.mjs.map +1 -0
- package/dist/tui/theme.cjs +2 -0
- package/dist/tui/theme.cjs.map +1 -0
- package/dist/tui/theme.d.cts +103 -0
- package/dist/tui/theme.d.cts.map +1 -0
- package/dist/tui/theme.d.mts +103 -0
- package/dist/tui/theme.d.mts.map +1 -0
- package/dist/tui/theme.mjs +2 -0
- package/dist/tui/theme.mjs.map +1 -0
- package/dist/tui/toolChrome.cjs +2 -0
- package/dist/tui/toolChrome.cjs.map +1 -0
- package/dist/tui/toolChrome.d.cts +30 -0
- package/dist/tui/toolChrome.d.cts.map +1 -0
- package/dist/tui/toolChrome.d.mts +30 -0
- package/dist/tui/toolChrome.d.mts.map +1 -0
- package/dist/tui/toolChrome.mjs +2 -0
- package/dist/tui/toolChrome.mjs.map +1 -0
- package/dist/tui/toolsOverlay.cjs +2 -0
- package/dist/tui/toolsOverlay.cjs.map +1 -0
- package/dist/tui/toolsOverlay.d.cts +29 -0
- package/dist/tui/toolsOverlay.d.cts.map +1 -0
- package/dist/tui/toolsOverlay.d.mts +29 -0
- package/dist/tui/toolsOverlay.d.mts.map +1 -0
- package/dist/tui/toolsOverlay.mjs +2 -0
- package/dist/tui/toolsOverlay.mjs.map +1 -0
- package/dist/types/harnessMetadata.cjs +2 -0
- package/dist/types/harnessMetadata.cjs.map +1 -0
- package/dist/types/harnessMetadata.d.cts +21 -0
- package/dist/types/harnessMetadata.d.cts.map +1 -0
- package/dist/types/harnessMetadata.d.mts +21 -0
- package/dist/types/harnessMetadata.d.mts.map +1 -0
- package/dist/types/harnessMetadata.mjs +2 -0
- package/dist/types/harnessMetadata.mjs.map +1 -0
- package/dist/uiState.cjs +1 -2
- package/dist/uiState.d.cts +2 -37
- package/dist/uiState.d.mts +2 -37
- package/dist/uiState.mjs +1 -2
- package/package.json +19 -12
- package/themes/doom-pi-dark.json +32 -30
- package/dist/_virtual/_rolldown/runtime.mjs +0 -1
- package/dist/components/configOverlay.cjs.map +0 -1
- package/dist/components/configOverlay.d.cts.map +0 -1
- package/dist/components/configOverlay.d.mts.map +0 -1
- package/dist/components/configOverlay.mjs.map +0 -1
- package/dist/components/doomEditor.cjs.map +0 -1
- package/dist/components/doomEditor.d.cts.map +0 -1
- package/dist/components/doomEditor.d.mts.map +0 -1
- package/dist/components/doomEditor.mjs.map +0 -1
- package/dist/components/doomFooter.cjs.map +0 -1
- package/dist/components/doomFooter.d.cts.map +0 -1
- package/dist/components/doomFooter.d.mts.map +0 -1
- package/dist/components/doomFooter.mjs.map +0 -1
- package/dist/components/doomHeader.cjs.map +0 -1
- package/dist/components/doomHeader.d.cts.map +0 -1
- package/dist/components/doomHeader.d.mts.map +0 -1
- package/dist/components/doomHeader.mjs.map +0 -1
- package/dist/components/doomOverlay.cjs.map +0 -1
- package/dist/components/doomOverlay.d.cts.map +0 -1
- package/dist/components/doomOverlay.d.mts.map +0 -1
- package/dist/components/doomOverlay.mjs.map +0 -1
- package/dist/components/leaderHints.cjs.map +0 -1
- package/dist/components/leaderHints.d.cts.map +0 -1
- package/dist/components/leaderHints.d.mts.map +0 -1
- package/dist/components/leaderHints.mjs.map +0 -1
- package/dist/components/toolsOverlay.cjs.map +0 -1
- package/dist/components/toolsOverlay.d.cts.map +0 -1
- package/dist/components/toolsOverlay.d.mts.map +0 -1
- package/dist/components/toolsOverlay.mjs.map +0 -1
- package/dist/config.cjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/config.mjs.map +0 -1
- package/dist/extension.cjs.map +0 -1
- package/dist/extension.d.cts.map +0 -1
- package/dist/extension.d.mts.map +0 -1
- package/dist/extension.mjs.map +0 -1
- package/dist/extensionName.cjs.map +0 -1
- package/dist/extensionName.d.cts.map +0 -1
- package/dist/extensionName.d.mts.map +0 -1
- package/dist/extensionName.mjs.map +0 -1
- package/dist/footer.cjs.map +0 -1
- package/dist/footer.d.cts.map +0 -1
- package/dist/footer.d.mts.map +0 -1
- package/dist/footer.mjs.map +0 -1
- package/dist/harnessMetadata.cjs.map +0 -1
- package/dist/harnessMetadata.d.cts.map +0 -1
- package/dist/harnessMetadata.d.mts.map +0 -1
- package/dist/harnessMetadata.mjs.map +0 -1
- package/dist/leaderRegistry.cjs.map +0 -1
- package/dist/leaderRegistry.d.cts.map +0 -1
- package/dist/leaderRegistry.d.mts.map +0 -1
- package/dist/leaderRegistry.mjs.map +0 -1
- package/dist/logSinkTelemetry.cjs.map +0 -1
- package/dist/logSinkTelemetry.d.cts.map +0 -1
- package/dist/logSinkTelemetry.d.mts.map +0 -1
- package/dist/logSinkTelemetry.mjs.map +0 -1
- package/dist/mode.cjs +0 -2
- package/dist/mode.cjs.map +0 -1
- package/dist/mode.d.cts +0 -5
- package/dist/mode.d.cts.map +0 -1
- package/dist/mode.d.mts +0 -5
- package/dist/mode.d.mts.map +0 -1
- package/dist/mode.mjs +0 -2
- package/dist/mode.mjs.map +0 -1
- package/dist/rendering.cjs.map +0 -1
- package/dist/rendering.d.cts.map +0 -1
- package/dist/rendering.d.mts.map +0 -1
- package/dist/rendering.mjs.map +0 -1
- package/dist/theme.cjs.map +0 -1
- package/dist/theme.d.cts.map +0 -1
- package/dist/theme.d.mts.map +0 -1
- package/dist/theme.mjs.map +0 -1
- package/dist/toolInventory.cjs.map +0 -1
- package/dist/toolInventory.d.cts.map +0 -1
- package/dist/toolInventory.d.mts.map +0 -1
- package/dist/toolInventory.mjs.map +0 -1
- package/dist/uiState.cjs.map +0 -1
- package/dist/uiState.d.cts.map +0 -1
- package/dist/uiState.d.mts.map +0 -1
- package/dist/uiState.mjs.map +0 -1
package/dist/leaderRegistry.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=leaderRegistry.mjs.map
|
|
1
|
+
import{DoomLeaderRegistry as e}from"./services/leader/leaderRegistry.mjs";export{e as DoomLeaderRegistry};
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});
|
|
2
|
-
//# sourceMappingURL=logSinkTelemetry.cjs.map
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/telemetry/logSinkTelemetry.cjs");exports.UI_EVENT=e.UI_EVENT,exports.createUiTelemetry=e.createUiTelemetry;
|
|
@@ -1,29 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
declare const UI_EVENT: {
|
|
4
|
-
readonly leaderContributionRejected: "doom_pi_ui.leader_contribution_rejected";
|
|
5
|
-
readonly leaderCommandUnavailable: "doom_pi_ui.leader_command_unavailable";
|
|
6
|
-
readonly leaderActionUnavailable: "doom_pi_ui.leader_action_unavailable";
|
|
7
|
-
readonly themeApplyFailed: "doom_pi_ui.theme_apply_failed";
|
|
8
|
-
readonly shellInstalled: "doom_pi_ui.shell_installed";
|
|
9
|
-
};
|
|
10
|
-
type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];
|
|
11
|
-
type UiEventAttributes = Record<string, string | number | boolean>;
|
|
12
|
-
interface UiTelemetryOptions {
|
|
13
|
-
cwd?: string;
|
|
14
|
-
workspaceRoot?: string;
|
|
15
|
-
env?: NodeJS.ProcessEnv;
|
|
16
|
-
telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;
|
|
17
|
-
warn?: (message: string) => void;
|
|
18
|
-
}
|
|
19
|
-
interface UiTelemetry {
|
|
20
|
-
recordError(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
|
|
21
|
-
recordWarning(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
|
|
22
|
-
recordEvent(event: UiEventName, attributes?: UiEventAttributes): Promise<void>;
|
|
23
|
-
flush(): Promise<void>;
|
|
24
|
-
shutdown(): Promise<void>;
|
|
25
|
-
}
|
|
26
|
-
declare function createUiTelemetry(options?: UiTelemetryOptions): UiTelemetry;
|
|
27
|
-
//#endregion
|
|
28
|
-
export { UI_EVENT, UiEventAttributes, UiEventName, UiTelemetry, UiTelemetryOptions, createUiTelemetry };
|
|
29
|
-
//# sourceMappingURL=logSinkTelemetry.d.cts.map
|
|
1
|
+
import { UI_EVENT, UiEventAttributes, UiEventName, UiTelemetry, UiTelemetryOptions, createUiTelemetry } from "./adapters/telemetry/logSinkTelemetry.cjs";
|
|
2
|
+
export { UI_EVENT, type UiEventAttributes, type UiEventName, type UiTelemetry, type UiTelemetryOptions, createUiTelemetry };
|
|
@@ -1,29 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
declare const UI_EVENT: {
|
|
4
|
-
readonly leaderContributionRejected: "doom_pi_ui.leader_contribution_rejected";
|
|
5
|
-
readonly leaderCommandUnavailable: "doom_pi_ui.leader_command_unavailable";
|
|
6
|
-
readonly leaderActionUnavailable: "doom_pi_ui.leader_action_unavailable";
|
|
7
|
-
readonly themeApplyFailed: "doom_pi_ui.theme_apply_failed";
|
|
8
|
-
readonly shellInstalled: "doom_pi_ui.shell_installed";
|
|
9
|
-
};
|
|
10
|
-
type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];
|
|
11
|
-
type UiEventAttributes = Record<string, string | number | boolean>;
|
|
12
|
-
interface UiTelemetryOptions {
|
|
13
|
-
cwd?: string;
|
|
14
|
-
workspaceRoot?: string;
|
|
15
|
-
env?: NodeJS.ProcessEnv;
|
|
16
|
-
telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;
|
|
17
|
-
warn?: (message: string) => void;
|
|
18
|
-
}
|
|
19
|
-
interface UiTelemetry {
|
|
20
|
-
recordError(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
|
|
21
|
-
recordWarning(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
|
|
22
|
-
recordEvent(event: UiEventName, attributes?: UiEventAttributes): Promise<void>;
|
|
23
|
-
flush(): Promise<void>;
|
|
24
|
-
shutdown(): Promise<void>;
|
|
25
|
-
}
|
|
26
|
-
declare function createUiTelemetry(options?: UiTelemetryOptions): UiTelemetry;
|
|
27
|
-
//#endregion
|
|
28
|
-
export { UI_EVENT, UiEventAttributes, UiEventName, UiTelemetry, UiTelemetryOptions, createUiTelemetry };
|
|
29
|
-
//# sourceMappingURL=logSinkTelemetry.d.mts.map
|
|
1
|
+
import { UI_EVENT, UiEventAttributes, UiEventName, UiTelemetry, UiTelemetryOptions, createUiTelemetry } from "./adapters/telemetry/logSinkTelemetry.mjs";
|
|
2
|
+
export { UI_EVENT, type UiEventAttributes, type UiEventName, type UiTelemetry, type UiTelemetryOptions, createUiTelemetry };
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=logSinkTelemetry.mjs.map
|
|
1
|
+
import{UI_EVENT as e,createUiTelemetry as t}from"./adapters/telemetry/logSinkTelemetry.mjs";export{e as UI_EVENT,t as createUiTelemetry};
|
package/dist/rendering.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});
|
|
2
|
-
//# sourceMappingURL=rendering.cjs.map
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/rendering.cjs");exports.alignLine=e.alignLine,exports.fitLine=e.fitLine,exports.fitStyledLine=e.fitStyledLine,exports.formatTokens=e.formatTokens,exports.frameLine=e.frameLine,exports.packSegments=e.packSegments,exports.padLine=e.padLine;
|
package/dist/rendering.d.cts
CHANGED
|
@@ -1,11 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare function formatTokens(value: number): string;
|
|
4
|
-
declare function fitLine(text: string, width: number): string;
|
|
5
|
-
declare function padLine(text: string, width: number): string;
|
|
6
|
-
declare function alignLine(left: string, right: string, width: number): string;
|
|
7
|
-
declare function frameLine(content: string, width: number, left?: string, right?: string): string;
|
|
8
|
-
declare function packSegments(segments: string[], width: number, separator?: string): string[];
|
|
9
|
-
//#endregion
|
|
10
|
-
export { alignLine, fitLine, formatTokens, frameLine, packSegments, padLine };
|
|
11
|
-
//# sourceMappingURL=rendering.d.cts.map
|
|
1
|
+
import { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine } from "./tui/rendering.cjs";
|
|
2
|
+
export { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine };
|
package/dist/rendering.d.mts
CHANGED
|
@@ -1,11 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare function formatTokens(value: number): string;
|
|
4
|
-
declare function fitLine(text: string, width: number): string;
|
|
5
|
-
declare function padLine(text: string, width: number): string;
|
|
6
|
-
declare function alignLine(left: string, right: string, width: number): string;
|
|
7
|
-
declare function frameLine(content: string, width: number, left?: string, right?: string): string;
|
|
8
|
-
declare function packSegments(segments: string[], width: number, separator?: string): string[];
|
|
9
|
-
//#endregion
|
|
10
|
-
export { alignLine, fitLine, formatTokens, frameLine, packSegments, padLine };
|
|
11
|
-
//# sourceMappingURL=rendering.d.mts.map
|
|
1
|
+
import { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine } from "./tui/rendering.mjs";
|
|
2
|
+
export { alignLine, fitLine, fitStyledLine, formatTokens, frameLine, packSegments, padLine };
|
package/dist/rendering.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=rendering.mjs.map
|
|
1
|
+
import{alignLine as e,fitLine as t,fitStyledLine as n,formatTokens as r,frameLine as i,packSegments as a,padLine as o}from"./tui/rendering.mjs";export{e as alignLine,t as fitLine,n as fitStyledLine,r as formatTokens,i as frameLine,a as packSegments,o as padLine};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`@agimon-ai/doompi-ui`,t=`unknown`,n=1e3,r=/^[a-z0-9]$/,i=/^[a-z0-9][a-z0-9._:-]*$/,a=/^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/,o=/^[a-z0-9][a-z0-9:_-]*$/,s={key:`m`,label:`models`,order:10},c={key:`s`,label:`sessions`,order:30},l={key:`e`,label:`extension`,order:50},u={key:`h`,label:`help`,order:70},d={key:`q`,label:`quit`,order:90};function f(t,n,r){return{id:t,source:e,path:n,action:r}}const p=[f(`model.select`,[s,{key:`m`,label:`select`,detail:`choose model`,order:10}],{type:`app`,action:`app.model.select`}),f(`model.next`,[s,{key:`n`,label:`next`,detail:`cycle model`,order:20}],{type:`app`,action:`app.model.cycleForward`}),f(`thinking.cycle`,[s,{key:`t`,label:`thinking`,detail:`cycle level`,order:30}],{type:`app`,action:`app.thinking.cycle`}),f(`tools.open`,[l,{key:`t`,label:`tools`,detail:`browse tools`,order:20}],{type:`command`,command:{name:`tools`}}),f(`config.open`,[l,{key:`c`,label:`config`,detail:`settings`,order:30}],{type:`command`,command:{name:`config`}}),f(`session.new`,[c,{key:`n`,label:`new`,detail:`fresh session`,order:10}],{type:`app`,action:`app.session.new`}),f(`session.resume`,[c,{key:`r`,label:`resume`,detail:`open history`,order:20}],{type:`app`,action:`app.session.resume`}),f(`session.tree`,[c,{key:`t`,label:`tree`,detail:`branch view`,order:30}],{type:`app`,action:`app.session.tree`}),f(`session.fork`,[c,{key:`f`,label:`fork`,detail:`from selection`,order:40}],{type:`app`,action:`app.session.fork`}),f(`editor.external`,[l,{key:`e`,label:`external`,detail:`open editor`,order:10}],{type:`app`,action:`app.editor.external`}),f(`help.hotkeys`,[u,{key:`h`,label:`hotkeys`,detail:`show bindings`}],{type:`command`,command:{name:`hotkeys`}}),f(`app.exit`,[d,{key:`q`,label:`quit`,detail:`exit Pi`}],{type:`app`,action:`app.exit`})];function m(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function h(e,t,n){return{source:e,message:t,...n?{bindingId:n}:{}}}function g(e){for(let t=0;t<e.length;t+=1){let n=e.charCodeAt(t);if(n<=31||n===127)return!0}return!1}function _(e,t,n,r,i,a){if(typeof e!=`string`||!e.trim()){i.push(h(r,`${t} must be a non-empty string.`,a));return}let o=e.trim();if(o.length>n||g(o)){i.push(h(r,`${t} must be at most ${n} characters and contain no control characters.`,a));return}return o}function v(e,t,n,r,i,a){if(e!==void 0)return _(e,t,n,r,i,a)}function y(e,t,i,a,o){if(!m(e)){o.push(h(t,`bindings[].path[${a}] must be an object.`,i));return}let s=_(e.key,`bindings[].path[${a}].key`,1,t,o,i),c=_(e.label,`bindings[].path[${a}].label`,32,t,o,i),l=v(e.detail,`bindings[].path[${a}].detail`,80,t,o,i),u;if(e.order!==void 0&&(!Number.isInteger(e.order)||e.order<0||e.order>n?o.push(h(t,`bindings[].path[${a}].order must be an integer from 0 to ${n}.`,i)):u=e.order),!s||!c||!r.test(s)){s&&!r.test(s)&&o.push(h(t,`bindings[].path[${a}].key must match ${r}.`,i));return}return{key:s,label:c,...l?{detail:l}:{},...u===void 0?{}:{order:u}}}function b(e,t,n,r){if(!m(e)){r.push(h(t,`bindings[].command must be an object.`,n));return}let i=_(e.name,`bindings[].command.name`,64,t,r,n),a=v(e.args,`bindings[].command.args`,256,t,r,n);if(!i||!o.test(i)){i&&!o.test(i)&&r.push(h(t,`bindings[].command.name must match ${o}.`,n));return}return{name:i,...a?{args:a}:{}}}function x(e,t,n,r){if(!m(e)){r.push(h(t,`bindings[].action must be an object.`,n));return}let a=_(e.name,`bindings[].action.name`,128,t,r,n);if(!a||!i.test(a)){a&&!i.test(a)&&r.push(h(t,`bindings[].action.name must match ${i}.`,n));return}return{name:a}}function S(e,t,n){if(!m(e)){n.push(h(t,`bindings[] must be an object.`));return}let r=_(e.id,`bindings[].id`,128,t,n);if(!r)return;if(!i.test(r)){n.push(h(t,`bindings[].id must match ${i}.`,r));return}if(!Array.isArray(e.path)||e.path.length===0||e.path.length>4){n.push(h(t,`bindings[].path must contain between 1 and 4 segments.`,r));return}let a=e.path.map((e,i)=>y(e,t,r,i,n)),o=Object.hasOwn(e,`command`);if(o===Object.hasOwn(e,`action`)){n.push(h(t,`bindings[] must contain exactly one of command or action.`,r));return}let s=o?{command:b(e.command,t,r,n)}:{action:x(e.action,t,r,n)};if(!a.some(e=>e===void 0)){if(`command`in s)return s.command?{id:r,path:a,command:s.command}:void 0;if(s.action)return{id:r,path:a,action:s.action}}}function C(e){let n=[];if(!m(e))return{diagnostics:[h(t,`Leader contribution must be an object.`)]};let r=_(e.source,`source`,128,t,n);if(!r)return{diagnostics:n};if(!a.test(r))return n.push(h(r,`source must match ${a}.`)),{diagnostics:n};if(!Array.isArray(e.bindings))return{diagnostics:[h(r,`bindings must be an array.`)]};let i=e.bindings.map(e=>S(e,r,n)),o=i.flatMap(e=>e?[e.id]:[]).filter((e,t,n)=>n.indexOf(e)!==t);for(let e of new Set(o))n.push(h(r,`Binding id '${e}' is duplicated.`,e));return n.length>0||i.some(e=>e===void 0)?{diagnostics:n}:{contribution:{source:r,bindings:i},diagnostics:n}}function w(e){return e.order??500}function T(e){return e.type===`command`?{type:`command`,command:{...e.command}}:e.type===`app`?{type:`app`,action:e.action}:{type:`extension`,source:e.source,action:{...e.action}}}function E(){return{key:``,label:`leader`,order:0,owner:e,children:new Map}}function D(e){return`SPC ${e.map(e=>e.key).join(` `)}`}function O(e,t){return e.label===t.label&&e.detail===t.detail&&e.order===w(t)}function k(e,t){let n=e,r=-1;for(let[e,i]of t.path.entries()){let a=n.children.get(i.key);if(!a){r=e;break}if(!O(a,i))return h(t.source,`${D(t.path.slice(0,e+1))} conflicts with metadata from ${a.owner}.`,t.id);let o=e===t.path.length-1;if(!o&&a.action||o&&(a.action||a.children.size>0))return h(t.source,`${D(t.path)} conflicts with an existing binding from ${a.owner}.`,t.id);n=a}let i=r===-1?t.path.length:r;for(let e=i;e<t.path.length;e+=1){let r=t.path[e],i={key:r.key,label:r.label,...r.detail?{detail:r.detail}:{},order:w(r),owner:t.source,children:new Map};n.children.set(r.key,i),n=i}n.action=T(t.action),n.bindingId=t.id}var A=class{root=E();contributions=new Map;listeners=new Set;diagnostics=[];dirty=!1;constructor(){this.rebuild()}register(e){let t=this.apply(e);return t.accepted?(this.rebuild(),{accepted:!0,diagnostics:this.getDiagnostics()}):t}registerDeferred(e){return this.apply(e)}apply(e){let t=C(e);return t.contribution?(t.contribution.bindings.length===0?this.contributions.delete(t.contribution.source):this.contributions.set(t.contribution.source,t.contribution.bindings),this.dirty=!0,{accepted:!0,diagnostics:t.diagnostics}):{accepted:!1,diagnostics:t.diagnostics}}flush(){return this.dirty&&this.rebuild(),this.diagnostics.map(e=>({...e}))}getGroup(e){this.flush();let t=this.root;for(let n of e){let e=t.children.get(n);if(!e||e.action)return;t=e}let n=[...t.children.values()].sort((e,t)=>e.key.localeCompare(t.key)).map(e=>({key:e.key,label:e.label,...e.detail?{detail:e.detail}:{},hasChildren:e.children.size>0,...e.action?{action:T(e.action)}:{}}));return{label:t.label,options:n}}getDiagnostics(){return this.flush()}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}rebuild(){let e=E(),t=[];for(let t of p){let n=k(e,t);if(n)throw Error(`Invalid core leader binding: ${n.message}`)}for(let[n,r]of[...this.contributions.entries()].sort(([e],[t])=>e.localeCompare(t)))for(let i of[...r].sort((e,t)=>e.id.localeCompare(t.id))){let r=k(e,{id:i.id,source:n,path:i.path,action:`command`in i?{type:`command`,command:i.command}:{type:`extension`,source:n,action:i.action}});r&&t.push(r)}this.root=e,this.diagnostics=t,this.dirty=!1;for(let e of this.listeners)e()}};exports.DoomLeaderRegistry=A;
|
|
2
|
+
//# sourceMappingURL=leaderRegistry.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderRegistry.cjs","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"sourcesContent":["type AppKeybinding =\n | 'app.model.select'\n | 'app.model.cycleForward'\n | 'app.thinking.cycle'\n | 'app.session.new'\n | 'app.session.resume'\n | 'app.session.tree'\n | 'app.session.fork'\n | 'app.editor.external'\n | 'app.exit';\n\nimport type {\n LeaderBinding as DoomLeaderBinding,\n LeaderCommand as DoomLeaderCommand,\n LeaderContribution as DoomLeaderContribution,\n LeaderAction as DoomLeaderExtensionAction,\n LeaderSegment as DoomLeaderSegment,\n} from '@agimon-ai/doompi-extension-contracts/leader';\n\ninterface AppLeaderAction {\n type: 'app';\n action: AppKeybinding;\n}\n\ninterface CommandLeaderAction {\n type: 'command';\n command: DoomLeaderCommand;\n}\n\ninterface ExtensionLeaderAction {\n type: 'extension';\n source: string;\n action: DoomLeaderExtensionAction;\n}\n\nexport type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;\n\nexport interface DoomLeaderResolvedOption {\n key: string;\n label: string;\n detail?: string;\n hasChildren: boolean;\n action?: DoomLeaderAction;\n}\n\nexport interface DoomLeaderGroup {\n label: string;\n options: readonly DoomLeaderResolvedOption[];\n}\n\nexport interface DoomLeaderDiagnostic {\n source: string;\n bindingId?: string;\n message: string;\n}\n\nexport interface DoomLeaderRegistrationResult {\n accepted: boolean;\n diagnostics: readonly DoomLeaderDiagnostic[];\n}\n\ninterface InternalLeaderBinding {\n id: string;\n source: string;\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]];\n action: DoomLeaderAction;\n}\n\ninterface LeaderNode {\n key: string;\n label: string;\n detail?: string;\n order: number;\n owner: string;\n bindingId?: string;\n children: Map<string, LeaderNode>;\n action?: DoomLeaderAction;\n}\n\ninterface ParsedContribution {\n contribution?: DoomLeaderContribution;\n diagnostics: DoomLeaderDiagnostic[];\n}\n\nconst CORE_SOURCE = '@agimon-ai/doompi-ui';\nconst UNKNOWN_SOURCE = 'unknown';\nconst ROOT_LABEL = 'leader';\nconst DEFAULT_OPTION_ORDER = 500;\nconst MAX_OPTION_ORDER = 1000;\nconst MAX_PATH_LENGTH = 4;\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_BINDING_ID_LENGTH = 128;\nconst MAX_LABEL_LENGTH = 32;\nconst MAX_DETAIL_LENGTH = 80;\nconst MAX_COMMAND_NAME_LENGTH = 64;\nconst MAX_COMMAND_ARGUMENT_LENGTH = 256;\nconst MAX_ACTION_NAME_LENGTH = 128;\nconst SAFE_KEY = /^[a-z0-9]$/;\nconst SAFE_IDENTIFIER = /^[a-z0-9][a-z0-9._:-]*$/;\nconst SAFE_SOURCE = /^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/;\nconst SAFE_COMMAND_NAME = /^[a-z0-9][a-z0-9:_-]*$/;\nconst C0_CONTROL_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MODEL_GROUP = { key: 'm', label: 'models', order: 10 } as const;\nconst SESSION_GROUP = { key: 's', label: 'sessions', order: 30 } as const;\nconst EXTENSION_GROUP = { key: 'e', label: 'extension', order: 50 } as const;\nconst HELP_GROUP = { key: 'h', label: 'help', order: 70 } as const;\nconst QUIT_GROUP = { key: 'q', label: 'quit', order: 90 } as const;\n\nfunction coreBinding(\n id: string,\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: DoomLeaderAction,\n): InternalLeaderBinding {\n return { id, source: CORE_SOURCE, path, action };\n}\n\nconst CORE_BINDINGS: readonly InternalLeaderBinding[] = [\n coreBinding('model.select', [MODEL_GROUP, { key: 'm', label: 'select', detail: 'choose model', order: 10 }], {\n type: 'app',\n action: 'app.model.select',\n }),\n coreBinding('model.next', [MODEL_GROUP, { key: 'n', label: 'next', detail: 'cycle model', order: 20 }], {\n type: 'app',\n action: 'app.model.cycleForward',\n }),\n coreBinding('thinking.cycle', [MODEL_GROUP, { key: 't', label: 'thinking', detail: 'cycle level', order: 30 }], {\n type: 'app',\n action: 'app.thinking.cycle',\n }),\n coreBinding('tools.open', [EXTENSION_GROUP, { key: 't', label: 'tools', detail: 'browse tools', order: 20 }], {\n type: 'command',\n command: { name: 'tools' },\n }),\n // Core rather than contributed, so no extension owns the key and the panel is\n // reachable even when nothing has contributed a section to it yet.\n coreBinding('config.open', [EXTENSION_GROUP, { key: 'c', label: 'config', detail: 'settings', order: 30 }], {\n type: 'command',\n command: { name: 'config' },\n }),\n coreBinding('session.new', [SESSION_GROUP, { key: 'n', label: 'new', detail: 'fresh session', order: 10 }], {\n type: 'app',\n action: 'app.session.new',\n }),\n coreBinding('session.resume', [SESSION_GROUP, { key: 'r', label: 'resume', detail: 'open history', order: 20 }], {\n type: 'app',\n action: 'app.session.resume',\n }),\n coreBinding('session.tree', [SESSION_GROUP, { key: 't', label: 'tree', detail: 'branch view', order: 30 }], {\n type: 'app',\n action: 'app.session.tree',\n }),\n coreBinding('session.fork', [SESSION_GROUP, { key: 'f', label: 'fork', detail: 'from selection', order: 40 }], {\n type: 'app',\n action: 'app.session.fork',\n }),\n coreBinding('editor.external', [EXTENSION_GROUP, { key: 'e', label: 'external', detail: 'open editor', order: 10 }], {\n type: 'app',\n action: 'app.editor.external',\n }),\n coreBinding('help.hotkeys', [HELP_GROUP, { key: 'h', label: 'hotkeys', detail: 'show bindings' }], {\n type: 'command',\n command: { name: 'hotkeys' },\n }),\n coreBinding('app.exit', [QUIT_GROUP, { key: 'q', label: 'quit', detail: 'exit Pi' }], {\n type: 'app',\n action: 'app.exit',\n }),\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction diagnostic(source: string, message: string, bindingId?: string): DoomLeaderDiagnostic {\n return { source, message, ...(bindingId ? { bindingId } : {}) };\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= C0_CONTROL_MAX || codeUnit === DELETE_CHARACTER) return true;\n }\n return false;\n}\n\nfunction readRequiredText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId?: string,\n): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n diagnostics.push(diagnostic(source, `${field} must be a non-empty string.`, bindingId));\n return undefined;\n }\n const text = value.trim();\n if (text.length > maximumLength || containsControlCharacter(text)) {\n diagnostics.push(\n diagnostic(\n source,\n `${field} must be at most ${maximumLength} characters and contain no control characters.`,\n bindingId,\n ),\n );\n return undefined;\n }\n return text;\n}\n\nfunction readOptionalText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return readRequiredText(value, field, maximumLength, source, diagnostics, bindingId);\n}\n\nfunction parseSegment(\n value: unknown,\n source: string,\n bindingId: string,\n index: number,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderSegment | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}] must be an object.`, bindingId));\n return undefined;\n }\n\n const key = readRequiredText(value.key, `bindings[].path[${index}].key`, 1, source, diagnostics, bindingId);\n const label = readRequiredText(\n value.label,\n `bindings[].path[${index}].label`,\n MAX_LABEL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const detail = readOptionalText(\n value.detail,\n `bindings[].path[${index}].detail`,\n MAX_DETAIL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n let order: number | undefined;\n if (value.order !== undefined) {\n if (!Number.isInteger(value.order) || (value.order as number) < 0 || (value.order as number) > MAX_OPTION_ORDER) {\n diagnostics.push(\n diagnostic(\n source,\n `bindings[].path[${index}].order must be an integer from 0 to ${MAX_OPTION_ORDER}.`,\n bindingId,\n ),\n );\n } else {\n order = value.order as number;\n }\n }\n if (!key || !label || !SAFE_KEY.test(key)) {\n if (key && !SAFE_KEY.test(key)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}].key must match ${SAFE_KEY}.`, bindingId));\n }\n return undefined;\n }\n return { key, label, ...(detail ? { detail } : {}), ...(order === undefined ? {} : { order }) };\n}\n\nfunction parseCommand(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderCommand | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].command must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].command.name',\n MAX_COMMAND_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const args = readOptionalText(\n value.args,\n 'bindings[].command.args',\n MAX_COMMAND_ARGUMENT_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_COMMAND_NAME.test(name)) {\n if (name && !SAFE_COMMAND_NAME.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].command.name must match ${SAFE_COMMAND_NAME}.`, bindingId));\n }\n return undefined;\n }\n return { name, ...(args ? { args } : {}) };\n}\n\nfunction parseExtensionAction(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderExtensionAction | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].action must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].action.name',\n MAX_ACTION_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_IDENTIFIER.test(name)) {\n if (name && !SAFE_IDENTIFIER.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].action.name must match ${SAFE_IDENTIFIER}.`, bindingId));\n }\n return undefined;\n }\n return { name };\n}\n\nfunction parseBinding(\n value: unknown,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderBinding | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[] must be an object.'));\n return undefined;\n }\n const bindingId = readRequiredText(value.id, 'bindings[].id', MAX_BINDING_ID_LENGTH, source, diagnostics);\n if (!bindingId) return undefined;\n if (!SAFE_IDENTIFIER.test(bindingId)) {\n diagnostics.push(diagnostic(source, `bindings[].id must match ${SAFE_IDENTIFIER}.`, bindingId));\n return undefined;\n }\n if (!Array.isArray(value.path) || value.path.length === 0 || value.path.length > MAX_PATH_LENGTH) {\n diagnostics.push(\n diagnostic(source, `bindings[].path must contain between 1 and ${MAX_PATH_LENGTH} segments.`, bindingId),\n );\n return undefined;\n }\n\n const path = value.path.map((segment, index) => parseSegment(segment, source, bindingId, index, diagnostics));\n const hasCommand = Object.hasOwn(value, 'command');\n const hasAction = Object.hasOwn(value, 'action');\n if (hasCommand === hasAction) {\n diagnostics.push(diagnostic(source, 'bindings[] must contain exactly one of command or action.', bindingId));\n return undefined;\n }\n const target = hasCommand\n ? { command: parseCommand(value.command, source, bindingId, diagnostics) }\n : { action: parseExtensionAction(value.action, source, bindingId, diagnostics) };\n if (path.some((segment) => segment === undefined)) return undefined;\n if ('command' in target) {\n if (!target.command) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n command: target.command,\n };\n }\n if (!target.action) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: target.action,\n };\n}\n\nfunction parseContribution(value: unknown): ParsedContribution {\n const diagnostics: DoomLeaderDiagnostic[] = [];\n if (!isRecord(value)) {\n return { diagnostics: [diagnostic(UNKNOWN_SOURCE, 'Leader contribution must be an object.')] };\n }\n const source = readRequiredText(value.source, 'source', MAX_SOURCE_LENGTH, UNKNOWN_SOURCE, diagnostics);\n if (!source) return { diagnostics };\n if (!SAFE_SOURCE.test(source)) {\n diagnostics.push(diagnostic(source, `source must match ${SAFE_SOURCE}.`));\n return { diagnostics };\n }\n if (!Array.isArray(value.bindings)) {\n return { diagnostics: [diagnostic(source, 'bindings must be an array.')] };\n }\n\n const bindings = value.bindings.map((binding) => parseBinding(binding, source, diagnostics));\n const duplicateIds = bindings\n .flatMap((binding) => (binding ? [binding.id] : []))\n .filter((id, index, ids) => ids.indexOf(id) !== index);\n for (const id of new Set(duplicateIds)) {\n diagnostics.push(diagnostic(source, `Binding id '${id}' is duplicated.`, id));\n }\n if (diagnostics.length > 0 || bindings.some((binding) => binding === undefined)) return { diagnostics };\n\n return {\n contribution: {\n source,\n bindings: bindings as DoomLeaderBinding[],\n },\n diagnostics,\n };\n}\n\nfunction optionOrder(segment: DoomLeaderSegment): number {\n return segment.order ?? DEFAULT_OPTION_ORDER;\n}\n\nfunction cloneAction(action: DoomLeaderAction): DoomLeaderAction {\n if (action.type === 'command') return { type: 'command', command: { ...action.command } };\n if (action.type === 'app') return { type: 'app', action: action.action };\n return { type: 'extension', source: action.source, action: { ...action.action } };\n}\n\nfunction createRootNode(): LeaderNode {\n return {\n key: '',\n label: ROOT_LABEL,\n order: 0,\n owner: CORE_SOURCE,\n children: new Map(),\n };\n}\n\nfunction pathLabel(path: readonly DoomLeaderSegment[]): string {\n return `SPC ${path.map((segment) => segment.key).join(' ')}`;\n}\n\nfunction metadataMatches(node: LeaderNode, segment: DoomLeaderSegment): boolean {\n return node.label === segment.label && node.detail === segment.detail && node.order === optionOrder(segment);\n}\n\nfunction insertBinding(root: LeaderNode, binding: InternalLeaderBinding): DoomLeaderDiagnostic | undefined {\n let current = root;\n let firstMissing = -1;\n\n for (const [index, segment] of binding.path.entries()) {\n const existing = current.children.get(segment.key);\n if (!existing) {\n firstMissing = index;\n break;\n }\n if (!metadataMatches(existing, segment)) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path.slice(0, index + 1))} conflicts with metadata from ${existing.owner}.`,\n binding.id,\n );\n }\n const isLeaf = index === binding.path.length - 1;\n if ((!isLeaf && existing.action) || (isLeaf && (existing.action || existing.children.size > 0))) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path)} conflicts with an existing binding from ${existing.owner}.`,\n binding.id,\n );\n }\n current = existing;\n }\n\n const start = firstMissing === -1 ? binding.path.length : firstMissing;\n for (let index = start; index < binding.path.length; index += 1) {\n const segment = binding.path[index] as DoomLeaderSegment;\n const node: LeaderNode = {\n key: segment.key,\n label: segment.label,\n ...(segment.detail ? { detail: segment.detail } : {}),\n order: optionOrder(segment),\n owner: binding.source,\n children: new Map(),\n };\n current.children.set(segment.key, node);\n current = node;\n }\n\n current.action = cloneAction(binding.action);\n current.bindingId = binding.id;\n return undefined;\n}\n\nexport class DoomLeaderRegistry {\n private root = createRootNode();\n private readonly contributions = new Map<string, readonly DoomLeaderBinding[]>();\n private readonly listeners = new Set<() => void>();\n private diagnostics: DoomLeaderDiagnostic[] = [];\n private dirty = false;\n\n constructor() {\n this.rebuild();\n }\n\n register(value: unknown): DoomLeaderRegistrationResult {\n const result = this.apply(value);\n if (!result.accepted) return result;\n this.rebuild();\n return { accepted: true, diagnostics: this.getDiagnostics() };\n }\n\n /** Records a contribution without rebuilding the whole tree immediately. */\n registerDeferred(value: unknown): DoomLeaderRegistrationResult {\n return this.apply(value);\n }\n\n private apply(value: unknown): DoomLeaderRegistrationResult {\n const parsed = parseContribution(value);\n if (!parsed.contribution) return { accepted: false, diagnostics: parsed.diagnostics };\n\n if (parsed.contribution.bindings.length === 0) this.contributions.delete(parsed.contribution.source);\n else this.contributions.set(parsed.contribution.source, parsed.contribution.bindings);\n this.dirty = true;\n return { accepted: true, diagnostics: parsed.diagnostics };\n }\n\n /** Rebuilds one batch and returns its deterministic conflict diagnostics. */\n flush(): DoomLeaderDiagnostic[] {\n if (this.dirty) this.rebuild();\n return this.diagnostics.map((item) => ({ ...item }));\n }\n\n getGroup(path: readonly string[]): DoomLeaderGroup | undefined {\n this.flush();\n let current = this.root;\n for (const key of path) {\n const next = current.children.get(key);\n if (!next || next.action) return undefined;\n current = next;\n }\n\n // The key is the sort, at every level. A reader looking for a chord knows the\n // key, not the number some contributor picked for it, and those numbers live\n // across nine packages so no one of them can see the sequence they produce.\n // `order` survives only as group identity: co-contributors to a shared prefix\n // must still agree on it, which is what `metadataMatches` checks.\n const options = [...current.children.values()]\n .sort((left, right) => left.key.localeCompare(right.key))\n .map(\n (node): DoomLeaderResolvedOption => ({\n key: node.key,\n label: node.label,\n ...(node.detail ? { detail: node.detail } : {}),\n hasChildren: node.children.size > 0,\n ...(node.action ? { action: cloneAction(node.action) } : {}),\n }),\n );\n return { label: current.label, options };\n }\n\n getDiagnostics(): DoomLeaderDiagnostic[] {\n return this.flush();\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private rebuild(): void {\n const nextRoot = createRootNode();\n const diagnostics: DoomLeaderDiagnostic[] = [];\n for (const binding of CORE_BINDINGS) {\n const issue = insertBinding(nextRoot, binding);\n if (issue) throw new Error(`Invalid core leader binding: ${issue.message}`);\n }\n\n for (const [source, bindings] of [...this.contributions.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n for (const binding of [...bindings].sort((left, right) => left.id.localeCompare(right.id))) {\n const issue = insertBinding(nextRoot, {\n id: binding.id,\n source,\n path: binding.path,\n action:\n 'command' in binding\n ? { type: 'command', command: binding.command }\n : { type: 'extension', source, action: binding.action },\n });\n if (issue) diagnostics.push(issue);\n }\n }\n\n this.root = nextRoot;\n this.diagnostics = diagnostics;\n this.dirty = false;\n for (const listener of this.listeners) listener();\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { LeaderAction, LeaderCommand } from "@agimon-ai/doompi-extension-contracts/leader";
|
|
2
|
+
//#region src/services/leader/leaderRegistry.d.ts
|
|
3
|
+
type AppKeybinding = 'app.model.select' | 'app.model.cycleForward' | 'app.thinking.cycle' | 'app.session.new' | 'app.session.resume' | 'app.session.tree' | 'app.session.fork' | 'app.editor.external' | 'app.exit';
|
|
4
|
+
interface AppLeaderAction {
|
|
5
|
+
type: 'app';
|
|
6
|
+
action: AppKeybinding;
|
|
7
|
+
}
|
|
8
|
+
interface CommandLeaderAction {
|
|
9
|
+
type: 'command';
|
|
10
|
+
command: LeaderCommand;
|
|
11
|
+
}
|
|
12
|
+
interface ExtensionLeaderAction {
|
|
13
|
+
type: 'extension';
|
|
14
|
+
source: string;
|
|
15
|
+
action: LeaderAction;
|
|
16
|
+
}
|
|
17
|
+
type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;
|
|
18
|
+
interface DoomLeaderResolvedOption {
|
|
19
|
+
key: string;
|
|
20
|
+
label: string;
|
|
21
|
+
detail?: string;
|
|
22
|
+
hasChildren: boolean;
|
|
23
|
+
action?: DoomLeaderAction;
|
|
24
|
+
}
|
|
25
|
+
interface DoomLeaderGroup {
|
|
26
|
+
label: string;
|
|
27
|
+
options: readonly DoomLeaderResolvedOption[];
|
|
28
|
+
}
|
|
29
|
+
interface DoomLeaderDiagnostic {
|
|
30
|
+
source: string;
|
|
31
|
+
bindingId?: string;
|
|
32
|
+
message: string;
|
|
33
|
+
}
|
|
34
|
+
interface DoomLeaderRegistrationResult {
|
|
35
|
+
accepted: boolean;
|
|
36
|
+
diagnostics: readonly DoomLeaderDiagnostic[];
|
|
37
|
+
}
|
|
38
|
+
declare class DoomLeaderRegistry {
|
|
39
|
+
private root;
|
|
40
|
+
private readonly contributions;
|
|
41
|
+
private readonly listeners;
|
|
42
|
+
private diagnostics;
|
|
43
|
+
private dirty;
|
|
44
|
+
constructor();
|
|
45
|
+
register(value: unknown): DoomLeaderRegistrationResult;
|
|
46
|
+
/** Records a contribution without rebuilding the whole tree immediately. */
|
|
47
|
+
registerDeferred(value: unknown): DoomLeaderRegistrationResult;
|
|
48
|
+
private apply;
|
|
49
|
+
/** Rebuilds one batch and returns its deterministic conflict diagnostics. */
|
|
50
|
+
flush(): DoomLeaderDiagnostic[];
|
|
51
|
+
getGroup(path: readonly string[]): DoomLeaderGroup | undefined;
|
|
52
|
+
getDiagnostics(): DoomLeaderDiagnostic[];
|
|
53
|
+
subscribe(listener: () => void): () => void;
|
|
54
|
+
private rebuild;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { DoomLeaderAction, DoomLeaderDiagnostic, DoomLeaderGroup, DoomLeaderRegistrationResult, DoomLeaderRegistry, DoomLeaderResolvedOption };
|
|
58
|
+
//# sourceMappingURL=leaderRegistry.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderRegistry.d.cts","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"mappings":";;KAAK;UAmBK;EACR;EACA,QAAQ;;UAGA;EACR;EACA,SAAS;;UAGD;EACR;EACA;EACA,QAAQ;;KAGE,mBAAmB,kBAAkB,sBAAsB;UAEtD;EACf;EACA;EACA;EACA;EACA,SAAS;;UAGM;EACf;EACA,kBAAkB;;UAGH;EACf;EACA;EACA;;UAGe;EACf;EACA,sBAAsB;;cAsbX;UACH;mBACS;mBACA;UACT;UACA;;EAMR,SAAS,iBAAiB;;EAQ1B,iBAAiB,iBAAiB;UAI1B;;EAWR,SAAS;EAKT,SAAS,0BAA0B;EA4BnC,kBAAkB;EAIlB,UAAU;UAKF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { LeaderAction, LeaderCommand } from "@agimon-ai/doompi-extension-contracts/leader";
|
|
2
|
+
//#region src/services/leader/leaderRegistry.d.ts
|
|
3
|
+
type AppKeybinding = 'app.model.select' | 'app.model.cycleForward' | 'app.thinking.cycle' | 'app.session.new' | 'app.session.resume' | 'app.session.tree' | 'app.session.fork' | 'app.editor.external' | 'app.exit';
|
|
4
|
+
interface AppLeaderAction {
|
|
5
|
+
type: 'app';
|
|
6
|
+
action: AppKeybinding;
|
|
7
|
+
}
|
|
8
|
+
interface CommandLeaderAction {
|
|
9
|
+
type: 'command';
|
|
10
|
+
command: LeaderCommand;
|
|
11
|
+
}
|
|
12
|
+
interface ExtensionLeaderAction {
|
|
13
|
+
type: 'extension';
|
|
14
|
+
source: string;
|
|
15
|
+
action: LeaderAction;
|
|
16
|
+
}
|
|
17
|
+
type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;
|
|
18
|
+
interface DoomLeaderResolvedOption {
|
|
19
|
+
key: string;
|
|
20
|
+
label: string;
|
|
21
|
+
detail?: string;
|
|
22
|
+
hasChildren: boolean;
|
|
23
|
+
action?: DoomLeaderAction;
|
|
24
|
+
}
|
|
25
|
+
interface DoomLeaderGroup {
|
|
26
|
+
label: string;
|
|
27
|
+
options: readonly DoomLeaderResolvedOption[];
|
|
28
|
+
}
|
|
29
|
+
interface DoomLeaderDiagnostic {
|
|
30
|
+
source: string;
|
|
31
|
+
bindingId?: string;
|
|
32
|
+
message: string;
|
|
33
|
+
}
|
|
34
|
+
interface DoomLeaderRegistrationResult {
|
|
35
|
+
accepted: boolean;
|
|
36
|
+
diagnostics: readonly DoomLeaderDiagnostic[];
|
|
37
|
+
}
|
|
38
|
+
declare class DoomLeaderRegistry {
|
|
39
|
+
private root;
|
|
40
|
+
private readonly contributions;
|
|
41
|
+
private readonly listeners;
|
|
42
|
+
private diagnostics;
|
|
43
|
+
private dirty;
|
|
44
|
+
constructor();
|
|
45
|
+
register(value: unknown): DoomLeaderRegistrationResult;
|
|
46
|
+
/** Records a contribution without rebuilding the whole tree immediately. */
|
|
47
|
+
registerDeferred(value: unknown): DoomLeaderRegistrationResult;
|
|
48
|
+
private apply;
|
|
49
|
+
/** Rebuilds one batch and returns its deterministic conflict diagnostics. */
|
|
50
|
+
flush(): DoomLeaderDiagnostic[];
|
|
51
|
+
getGroup(path: readonly string[]): DoomLeaderGroup | undefined;
|
|
52
|
+
getDiagnostics(): DoomLeaderDiagnostic[];
|
|
53
|
+
subscribe(listener: () => void): () => void;
|
|
54
|
+
private rebuild;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { DoomLeaderAction, DoomLeaderDiagnostic, DoomLeaderGroup, DoomLeaderRegistrationResult, DoomLeaderRegistry, DoomLeaderResolvedOption };
|
|
58
|
+
//# sourceMappingURL=leaderRegistry.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderRegistry.d.mts","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"mappings":";;KAAK;UAmBK;EACR;EACA,QAAQ;;UAGA;EACR;EACA,SAAS;;UAGD;EACR;EACA;EACA,QAAQ;;KAGE,mBAAmB,kBAAkB,sBAAsB;UAEtD;EACf;EACA;EACA;EACA;EACA,SAAS;;UAGM;EACf;EACA,kBAAkB;;UAGH;EACf;EACA;EACA;;UAGe;EACf;EACA,sBAAsB;;cAsbX;UACH;mBACS;mBACA;UACT;UACA;;EAMR,SAAS,iBAAiB;;EAQ1B,iBAAiB,iBAAiB;UAI1B;;EAWR,SAAS;EAKT,SAAS,0BAA0B;EA4BnC,kBAAkB;EAIlB,UAAU;UAKF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`@agimon-ai/doompi-ui`,t=`unknown`,n=1e3,r=/^[a-z0-9]$/,i=/^[a-z0-9][a-z0-9._:-]*$/,a=/^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/,o=/^[a-z0-9][a-z0-9:_-]*$/,s={key:`m`,label:`models`,order:10},c={key:`s`,label:`sessions`,order:30},l={key:`e`,label:`extension`,order:50},u={key:`h`,label:`help`,order:70},d={key:`q`,label:`quit`,order:90};function f(t,n,r){return{id:t,source:e,path:n,action:r}}const p=[f(`model.select`,[s,{key:`m`,label:`select`,detail:`choose model`,order:10}],{type:`app`,action:`app.model.select`}),f(`model.next`,[s,{key:`n`,label:`next`,detail:`cycle model`,order:20}],{type:`app`,action:`app.model.cycleForward`}),f(`thinking.cycle`,[s,{key:`t`,label:`thinking`,detail:`cycle level`,order:30}],{type:`app`,action:`app.thinking.cycle`}),f(`tools.open`,[l,{key:`t`,label:`tools`,detail:`browse tools`,order:20}],{type:`command`,command:{name:`tools`}}),f(`config.open`,[l,{key:`c`,label:`config`,detail:`settings`,order:30}],{type:`command`,command:{name:`config`}}),f(`session.new`,[c,{key:`n`,label:`new`,detail:`fresh session`,order:10}],{type:`app`,action:`app.session.new`}),f(`session.resume`,[c,{key:`r`,label:`resume`,detail:`open history`,order:20}],{type:`app`,action:`app.session.resume`}),f(`session.tree`,[c,{key:`t`,label:`tree`,detail:`branch view`,order:30}],{type:`app`,action:`app.session.tree`}),f(`session.fork`,[c,{key:`f`,label:`fork`,detail:`from selection`,order:40}],{type:`app`,action:`app.session.fork`}),f(`editor.external`,[l,{key:`e`,label:`external`,detail:`open editor`,order:10}],{type:`app`,action:`app.editor.external`}),f(`help.hotkeys`,[u,{key:`h`,label:`hotkeys`,detail:`show bindings`}],{type:`command`,command:{name:`hotkeys`}}),f(`app.exit`,[d,{key:`q`,label:`quit`,detail:`exit Pi`}],{type:`app`,action:`app.exit`})];function m(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function h(e,t,n){return{source:e,message:t,...n?{bindingId:n}:{}}}function g(e){for(let t=0;t<e.length;t+=1){let n=e.charCodeAt(t);if(n<=31||n===127)return!0}return!1}function _(e,t,n,r,i,a){if(typeof e!=`string`||!e.trim()){i.push(h(r,`${t} must be a non-empty string.`,a));return}let o=e.trim();if(o.length>n||g(o)){i.push(h(r,`${t} must be at most ${n} characters and contain no control characters.`,a));return}return o}function v(e,t,n,r,i,a){if(e!==void 0)return _(e,t,n,r,i,a)}function y(e,t,i,a,o){if(!m(e)){o.push(h(t,`bindings[].path[${a}] must be an object.`,i));return}let s=_(e.key,`bindings[].path[${a}].key`,1,t,o,i),c=_(e.label,`bindings[].path[${a}].label`,32,t,o,i),l=v(e.detail,`bindings[].path[${a}].detail`,80,t,o,i),u;if(e.order!==void 0&&(!Number.isInteger(e.order)||e.order<0||e.order>n?o.push(h(t,`bindings[].path[${a}].order must be an integer from 0 to ${n}.`,i)):u=e.order),!s||!c||!r.test(s)){s&&!r.test(s)&&o.push(h(t,`bindings[].path[${a}].key must match ${r}.`,i));return}return{key:s,label:c,...l?{detail:l}:{},...u===void 0?{}:{order:u}}}function b(e,t,n,r){if(!m(e)){r.push(h(t,`bindings[].command must be an object.`,n));return}let i=_(e.name,`bindings[].command.name`,64,t,r,n),a=v(e.args,`bindings[].command.args`,256,t,r,n);if(!i||!o.test(i)){i&&!o.test(i)&&r.push(h(t,`bindings[].command.name must match ${o}.`,n));return}return{name:i,...a?{args:a}:{}}}function x(e,t,n,r){if(!m(e)){r.push(h(t,`bindings[].action must be an object.`,n));return}let a=_(e.name,`bindings[].action.name`,128,t,r,n);if(!a||!i.test(a)){a&&!i.test(a)&&r.push(h(t,`bindings[].action.name must match ${i}.`,n));return}return{name:a}}function S(e,t,n){if(!m(e)){n.push(h(t,`bindings[] must be an object.`));return}let r=_(e.id,`bindings[].id`,128,t,n);if(!r)return;if(!i.test(r)){n.push(h(t,`bindings[].id must match ${i}.`,r));return}if(!Array.isArray(e.path)||e.path.length===0||e.path.length>4){n.push(h(t,`bindings[].path must contain between 1 and 4 segments.`,r));return}let a=e.path.map((e,i)=>y(e,t,r,i,n)),o=Object.hasOwn(e,`command`);if(o===Object.hasOwn(e,`action`)){n.push(h(t,`bindings[] must contain exactly one of command or action.`,r));return}let s=o?{command:b(e.command,t,r,n)}:{action:x(e.action,t,r,n)};if(!a.some(e=>e===void 0)){if(`command`in s)return s.command?{id:r,path:a,command:s.command}:void 0;if(s.action)return{id:r,path:a,action:s.action}}}function C(e){let n=[];if(!m(e))return{diagnostics:[h(t,`Leader contribution must be an object.`)]};let r=_(e.source,`source`,128,t,n);if(!r)return{diagnostics:n};if(!a.test(r))return n.push(h(r,`source must match ${a}.`)),{diagnostics:n};if(!Array.isArray(e.bindings))return{diagnostics:[h(r,`bindings must be an array.`)]};let i=e.bindings.map(e=>S(e,r,n)),o=i.flatMap(e=>e?[e.id]:[]).filter((e,t,n)=>n.indexOf(e)!==t);for(let e of new Set(o))n.push(h(r,`Binding id '${e}' is duplicated.`,e));return n.length>0||i.some(e=>e===void 0)?{diagnostics:n}:{contribution:{source:r,bindings:i},diagnostics:n}}function w(e){return e.order??500}function T(e){return e.type===`command`?{type:`command`,command:{...e.command}}:e.type===`app`?{type:`app`,action:e.action}:{type:`extension`,source:e.source,action:{...e.action}}}function E(){return{key:``,label:`leader`,order:0,owner:e,children:new Map}}function D(e){return`SPC ${e.map(e=>e.key).join(` `)}`}function O(e,t){return e.label===t.label&&e.detail===t.detail&&e.order===w(t)}function k(e,t){let n=e,r=-1;for(let[e,i]of t.path.entries()){let a=n.children.get(i.key);if(!a){r=e;break}if(!O(a,i))return h(t.source,`${D(t.path.slice(0,e+1))} conflicts with metadata from ${a.owner}.`,t.id);let o=e===t.path.length-1;if(!o&&a.action||o&&(a.action||a.children.size>0))return h(t.source,`${D(t.path)} conflicts with an existing binding from ${a.owner}.`,t.id);n=a}let i=r===-1?t.path.length:r;for(let e=i;e<t.path.length;e+=1){let r=t.path[e],i={key:r.key,label:r.label,...r.detail?{detail:r.detail}:{},order:w(r),owner:t.source,children:new Map};n.children.set(r.key,i),n=i}n.action=T(t.action),n.bindingId=t.id}var A=class{root=E();contributions=new Map;listeners=new Set;diagnostics=[];dirty=!1;constructor(){this.rebuild()}register(e){let t=this.apply(e);return t.accepted?(this.rebuild(),{accepted:!0,diagnostics:this.getDiagnostics()}):t}registerDeferred(e){return this.apply(e)}apply(e){let t=C(e);return t.contribution?(t.contribution.bindings.length===0?this.contributions.delete(t.contribution.source):this.contributions.set(t.contribution.source,t.contribution.bindings),this.dirty=!0,{accepted:!0,diagnostics:t.diagnostics}):{accepted:!1,diagnostics:t.diagnostics}}flush(){return this.dirty&&this.rebuild(),this.diagnostics.map(e=>({...e}))}getGroup(e){this.flush();let t=this.root;for(let n of e){let e=t.children.get(n);if(!e||e.action)return;t=e}let n=[...t.children.values()].sort((e,t)=>e.key.localeCompare(t.key)).map(e=>({key:e.key,label:e.label,...e.detail?{detail:e.detail}:{},hasChildren:e.children.size>0,...e.action?{action:T(e.action)}:{}}));return{label:t.label,options:n}}getDiagnostics(){return this.flush()}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}rebuild(){let e=E(),t=[];for(let t of p){let n=k(e,t);if(n)throw Error(`Invalid core leader binding: ${n.message}`)}for(let[n,r]of[...this.contributions.entries()].sort(([e],[t])=>e.localeCompare(t)))for(let i of[...r].sort((e,t)=>e.id.localeCompare(t.id))){let r=k(e,{id:i.id,source:n,path:i.path,action:`command`in i?{type:`command`,command:i.command}:{type:`extension`,source:n,action:i.action}});r&&t.push(r)}this.root=e,this.diagnostics=t,this.dirty=!1;for(let e of this.listeners)e()}};export{A as DoomLeaderRegistry};
|
|
2
|
+
//# sourceMappingURL=leaderRegistry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderRegistry.mjs","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"sourcesContent":["type AppKeybinding =\n | 'app.model.select'\n | 'app.model.cycleForward'\n | 'app.thinking.cycle'\n | 'app.session.new'\n | 'app.session.resume'\n | 'app.session.tree'\n | 'app.session.fork'\n | 'app.editor.external'\n | 'app.exit';\n\nimport type {\n LeaderBinding as DoomLeaderBinding,\n LeaderCommand as DoomLeaderCommand,\n LeaderContribution as DoomLeaderContribution,\n LeaderAction as DoomLeaderExtensionAction,\n LeaderSegment as DoomLeaderSegment,\n} from '@agimon-ai/doompi-extension-contracts/leader';\n\ninterface AppLeaderAction {\n type: 'app';\n action: AppKeybinding;\n}\n\ninterface CommandLeaderAction {\n type: 'command';\n command: DoomLeaderCommand;\n}\n\ninterface ExtensionLeaderAction {\n type: 'extension';\n source: string;\n action: DoomLeaderExtensionAction;\n}\n\nexport type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;\n\nexport interface DoomLeaderResolvedOption {\n key: string;\n label: string;\n detail?: string;\n hasChildren: boolean;\n action?: DoomLeaderAction;\n}\n\nexport interface DoomLeaderGroup {\n label: string;\n options: readonly DoomLeaderResolvedOption[];\n}\n\nexport interface DoomLeaderDiagnostic {\n source: string;\n bindingId?: string;\n message: string;\n}\n\nexport interface DoomLeaderRegistrationResult {\n accepted: boolean;\n diagnostics: readonly DoomLeaderDiagnostic[];\n}\n\ninterface InternalLeaderBinding {\n id: string;\n source: string;\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]];\n action: DoomLeaderAction;\n}\n\ninterface LeaderNode {\n key: string;\n label: string;\n detail?: string;\n order: number;\n owner: string;\n bindingId?: string;\n children: Map<string, LeaderNode>;\n action?: DoomLeaderAction;\n}\n\ninterface ParsedContribution {\n contribution?: DoomLeaderContribution;\n diagnostics: DoomLeaderDiagnostic[];\n}\n\nconst CORE_SOURCE = '@agimon-ai/doompi-ui';\nconst UNKNOWN_SOURCE = 'unknown';\nconst ROOT_LABEL = 'leader';\nconst DEFAULT_OPTION_ORDER = 500;\nconst MAX_OPTION_ORDER = 1000;\nconst MAX_PATH_LENGTH = 4;\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_BINDING_ID_LENGTH = 128;\nconst MAX_LABEL_LENGTH = 32;\nconst MAX_DETAIL_LENGTH = 80;\nconst MAX_COMMAND_NAME_LENGTH = 64;\nconst MAX_COMMAND_ARGUMENT_LENGTH = 256;\nconst MAX_ACTION_NAME_LENGTH = 128;\nconst SAFE_KEY = /^[a-z0-9]$/;\nconst SAFE_IDENTIFIER = /^[a-z0-9][a-z0-9._:-]*$/;\nconst SAFE_SOURCE = /^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/;\nconst SAFE_COMMAND_NAME = /^[a-z0-9][a-z0-9:_-]*$/;\nconst C0_CONTROL_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MODEL_GROUP = { key: 'm', label: 'models', order: 10 } as const;\nconst SESSION_GROUP = { key: 's', label: 'sessions', order: 30 } as const;\nconst EXTENSION_GROUP = { key: 'e', label: 'extension', order: 50 } as const;\nconst HELP_GROUP = { key: 'h', label: 'help', order: 70 } as const;\nconst QUIT_GROUP = { key: 'q', label: 'quit', order: 90 } as const;\n\nfunction coreBinding(\n id: string,\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: DoomLeaderAction,\n): InternalLeaderBinding {\n return { id, source: CORE_SOURCE, path, action };\n}\n\nconst CORE_BINDINGS: readonly InternalLeaderBinding[] = [\n coreBinding('model.select', [MODEL_GROUP, { key: 'm', label: 'select', detail: 'choose model', order: 10 }], {\n type: 'app',\n action: 'app.model.select',\n }),\n coreBinding('model.next', [MODEL_GROUP, { key: 'n', label: 'next', detail: 'cycle model', order: 20 }], {\n type: 'app',\n action: 'app.model.cycleForward',\n }),\n coreBinding('thinking.cycle', [MODEL_GROUP, { key: 't', label: 'thinking', detail: 'cycle level', order: 30 }], {\n type: 'app',\n action: 'app.thinking.cycle',\n }),\n coreBinding('tools.open', [EXTENSION_GROUP, { key: 't', label: 'tools', detail: 'browse tools', order: 20 }], {\n type: 'command',\n command: { name: 'tools' },\n }),\n // Core rather than contributed, so no extension owns the key and the panel is\n // reachable even when nothing has contributed a section to it yet.\n coreBinding('config.open', [EXTENSION_GROUP, { key: 'c', label: 'config', detail: 'settings', order: 30 }], {\n type: 'command',\n command: { name: 'config' },\n }),\n coreBinding('session.new', [SESSION_GROUP, { key: 'n', label: 'new', detail: 'fresh session', order: 10 }], {\n type: 'app',\n action: 'app.session.new',\n }),\n coreBinding('session.resume', [SESSION_GROUP, { key: 'r', label: 'resume', detail: 'open history', order: 20 }], {\n type: 'app',\n action: 'app.session.resume',\n }),\n coreBinding('session.tree', [SESSION_GROUP, { key: 't', label: 'tree', detail: 'branch view', order: 30 }], {\n type: 'app',\n action: 'app.session.tree',\n }),\n coreBinding('session.fork', [SESSION_GROUP, { key: 'f', label: 'fork', detail: 'from selection', order: 40 }], {\n type: 'app',\n action: 'app.session.fork',\n }),\n coreBinding('editor.external', [EXTENSION_GROUP, { key: 'e', label: 'external', detail: 'open editor', order: 10 }], {\n type: 'app',\n action: 'app.editor.external',\n }),\n coreBinding('help.hotkeys', [HELP_GROUP, { key: 'h', label: 'hotkeys', detail: 'show bindings' }], {\n type: 'command',\n command: { name: 'hotkeys' },\n }),\n coreBinding('app.exit', [QUIT_GROUP, { key: 'q', label: 'quit', detail: 'exit Pi' }], {\n type: 'app',\n action: 'app.exit',\n }),\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction diagnostic(source: string, message: string, bindingId?: string): DoomLeaderDiagnostic {\n return { source, message, ...(bindingId ? { bindingId } : {}) };\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= C0_CONTROL_MAX || codeUnit === DELETE_CHARACTER) return true;\n }\n return false;\n}\n\nfunction readRequiredText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId?: string,\n): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n diagnostics.push(diagnostic(source, `${field} must be a non-empty string.`, bindingId));\n return undefined;\n }\n const text = value.trim();\n if (text.length > maximumLength || containsControlCharacter(text)) {\n diagnostics.push(\n diagnostic(\n source,\n `${field} must be at most ${maximumLength} characters and contain no control characters.`,\n bindingId,\n ),\n );\n return undefined;\n }\n return text;\n}\n\nfunction readOptionalText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return readRequiredText(value, field, maximumLength, source, diagnostics, bindingId);\n}\n\nfunction parseSegment(\n value: unknown,\n source: string,\n bindingId: string,\n index: number,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderSegment | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}] must be an object.`, bindingId));\n return undefined;\n }\n\n const key = readRequiredText(value.key, `bindings[].path[${index}].key`, 1, source, diagnostics, bindingId);\n const label = readRequiredText(\n value.label,\n `bindings[].path[${index}].label`,\n MAX_LABEL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const detail = readOptionalText(\n value.detail,\n `bindings[].path[${index}].detail`,\n MAX_DETAIL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n let order: number | undefined;\n if (value.order !== undefined) {\n if (!Number.isInteger(value.order) || (value.order as number) < 0 || (value.order as number) > MAX_OPTION_ORDER) {\n diagnostics.push(\n diagnostic(\n source,\n `bindings[].path[${index}].order must be an integer from 0 to ${MAX_OPTION_ORDER}.`,\n bindingId,\n ),\n );\n } else {\n order = value.order as number;\n }\n }\n if (!key || !label || !SAFE_KEY.test(key)) {\n if (key && !SAFE_KEY.test(key)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}].key must match ${SAFE_KEY}.`, bindingId));\n }\n return undefined;\n }\n return { key, label, ...(detail ? { detail } : {}), ...(order === undefined ? {} : { order }) };\n}\n\nfunction parseCommand(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderCommand | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].command must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].command.name',\n MAX_COMMAND_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const args = readOptionalText(\n value.args,\n 'bindings[].command.args',\n MAX_COMMAND_ARGUMENT_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_COMMAND_NAME.test(name)) {\n if (name && !SAFE_COMMAND_NAME.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].command.name must match ${SAFE_COMMAND_NAME}.`, bindingId));\n }\n return undefined;\n }\n return { name, ...(args ? { args } : {}) };\n}\n\nfunction parseExtensionAction(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderExtensionAction | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].action must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].action.name',\n MAX_ACTION_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_IDENTIFIER.test(name)) {\n if (name && !SAFE_IDENTIFIER.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].action.name must match ${SAFE_IDENTIFIER}.`, bindingId));\n }\n return undefined;\n }\n return { name };\n}\n\nfunction parseBinding(\n value: unknown,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderBinding | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[] must be an object.'));\n return undefined;\n }\n const bindingId = readRequiredText(value.id, 'bindings[].id', MAX_BINDING_ID_LENGTH, source, diagnostics);\n if (!bindingId) return undefined;\n if (!SAFE_IDENTIFIER.test(bindingId)) {\n diagnostics.push(diagnostic(source, `bindings[].id must match ${SAFE_IDENTIFIER}.`, bindingId));\n return undefined;\n }\n if (!Array.isArray(value.path) || value.path.length === 0 || value.path.length > MAX_PATH_LENGTH) {\n diagnostics.push(\n diagnostic(source, `bindings[].path must contain between 1 and ${MAX_PATH_LENGTH} segments.`, bindingId),\n );\n return undefined;\n }\n\n const path = value.path.map((segment, index) => parseSegment(segment, source, bindingId, index, diagnostics));\n const hasCommand = Object.hasOwn(value, 'command');\n const hasAction = Object.hasOwn(value, 'action');\n if (hasCommand === hasAction) {\n diagnostics.push(diagnostic(source, 'bindings[] must contain exactly one of command or action.', bindingId));\n return undefined;\n }\n const target = hasCommand\n ? { command: parseCommand(value.command, source, bindingId, diagnostics) }\n : { action: parseExtensionAction(value.action, source, bindingId, diagnostics) };\n if (path.some((segment) => segment === undefined)) return undefined;\n if ('command' in target) {\n if (!target.command) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n command: target.command,\n };\n }\n if (!target.action) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: target.action,\n };\n}\n\nfunction parseContribution(value: unknown): ParsedContribution {\n const diagnostics: DoomLeaderDiagnostic[] = [];\n if (!isRecord(value)) {\n return { diagnostics: [diagnostic(UNKNOWN_SOURCE, 'Leader contribution must be an object.')] };\n }\n const source = readRequiredText(value.source, 'source', MAX_SOURCE_LENGTH, UNKNOWN_SOURCE, diagnostics);\n if (!source) return { diagnostics };\n if (!SAFE_SOURCE.test(source)) {\n diagnostics.push(diagnostic(source, `source must match ${SAFE_SOURCE}.`));\n return { diagnostics };\n }\n if (!Array.isArray(value.bindings)) {\n return { diagnostics: [diagnostic(source, 'bindings must be an array.')] };\n }\n\n const bindings = value.bindings.map((binding) => parseBinding(binding, source, diagnostics));\n const duplicateIds = bindings\n .flatMap((binding) => (binding ? [binding.id] : []))\n .filter((id, index, ids) => ids.indexOf(id) !== index);\n for (const id of new Set(duplicateIds)) {\n diagnostics.push(diagnostic(source, `Binding id '${id}' is duplicated.`, id));\n }\n if (diagnostics.length > 0 || bindings.some((binding) => binding === undefined)) return { diagnostics };\n\n return {\n contribution: {\n source,\n bindings: bindings as DoomLeaderBinding[],\n },\n diagnostics,\n };\n}\n\nfunction optionOrder(segment: DoomLeaderSegment): number {\n return segment.order ?? DEFAULT_OPTION_ORDER;\n}\n\nfunction cloneAction(action: DoomLeaderAction): DoomLeaderAction {\n if (action.type === 'command') return { type: 'command', command: { ...action.command } };\n if (action.type === 'app') return { type: 'app', action: action.action };\n return { type: 'extension', source: action.source, action: { ...action.action } };\n}\n\nfunction createRootNode(): LeaderNode {\n return {\n key: '',\n label: ROOT_LABEL,\n order: 0,\n owner: CORE_SOURCE,\n children: new Map(),\n };\n}\n\nfunction pathLabel(path: readonly DoomLeaderSegment[]): string {\n return `SPC ${path.map((segment) => segment.key).join(' ')}`;\n}\n\nfunction metadataMatches(node: LeaderNode, segment: DoomLeaderSegment): boolean {\n return node.label === segment.label && node.detail === segment.detail && node.order === optionOrder(segment);\n}\n\nfunction insertBinding(root: LeaderNode, binding: InternalLeaderBinding): DoomLeaderDiagnostic | undefined {\n let current = root;\n let firstMissing = -1;\n\n for (const [index, segment] of binding.path.entries()) {\n const existing = current.children.get(segment.key);\n if (!existing) {\n firstMissing = index;\n break;\n }\n if (!metadataMatches(existing, segment)) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path.slice(0, index + 1))} conflicts with metadata from ${existing.owner}.`,\n binding.id,\n );\n }\n const isLeaf = index === binding.path.length - 1;\n if ((!isLeaf && existing.action) || (isLeaf && (existing.action || existing.children.size > 0))) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path)} conflicts with an existing binding from ${existing.owner}.`,\n binding.id,\n );\n }\n current = existing;\n }\n\n const start = firstMissing === -1 ? binding.path.length : firstMissing;\n for (let index = start; index < binding.path.length; index += 1) {\n const segment = binding.path[index] as DoomLeaderSegment;\n const node: LeaderNode = {\n key: segment.key,\n label: segment.label,\n ...(segment.detail ? { detail: segment.detail } : {}),\n order: optionOrder(segment),\n owner: binding.source,\n children: new Map(),\n };\n current.children.set(segment.key, node);\n current = node;\n }\n\n current.action = cloneAction(binding.action);\n current.bindingId = binding.id;\n return undefined;\n}\n\nexport class DoomLeaderRegistry {\n private root = createRootNode();\n private readonly contributions = new Map<string, readonly DoomLeaderBinding[]>();\n private readonly listeners = new Set<() => void>();\n private diagnostics: DoomLeaderDiagnostic[] = [];\n private dirty = false;\n\n constructor() {\n this.rebuild();\n }\n\n register(value: unknown): DoomLeaderRegistrationResult {\n const result = this.apply(value);\n if (!result.accepted) return result;\n this.rebuild();\n return { accepted: true, diagnostics: this.getDiagnostics() };\n }\n\n /** Records a contribution without rebuilding the whole tree immediately. */\n registerDeferred(value: unknown): DoomLeaderRegistrationResult {\n return this.apply(value);\n }\n\n private apply(value: unknown): DoomLeaderRegistrationResult {\n const parsed = parseContribution(value);\n if (!parsed.contribution) return { accepted: false, diagnostics: parsed.diagnostics };\n\n if (parsed.contribution.bindings.length === 0) this.contributions.delete(parsed.contribution.source);\n else this.contributions.set(parsed.contribution.source, parsed.contribution.bindings);\n this.dirty = true;\n return { accepted: true, diagnostics: parsed.diagnostics };\n }\n\n /** Rebuilds one batch and returns its deterministic conflict diagnostics. */\n flush(): DoomLeaderDiagnostic[] {\n if (this.dirty) this.rebuild();\n return this.diagnostics.map((item) => ({ ...item }));\n }\n\n getGroup(path: readonly string[]): DoomLeaderGroup | undefined {\n this.flush();\n let current = this.root;\n for (const key of path) {\n const next = current.children.get(key);\n if (!next || next.action) return undefined;\n current = next;\n }\n\n // The key is the sort, at every level. A reader looking for a chord knows the\n // key, not the number some contributor picked for it, and those numbers live\n // across nine packages so no one of them can see the sequence they produce.\n // `order` survives only as group identity: co-contributors to a shared prefix\n // must still agree on it, which is what `metadataMatches` checks.\n const options = [...current.children.values()]\n .sort((left, right) => left.key.localeCompare(right.key))\n .map(\n (node): DoomLeaderResolvedOption => ({\n key: node.key,\n label: node.label,\n ...(node.detail ? { detail: node.detail } : {}),\n hasChildren: node.children.size > 0,\n ...(node.action ? { action: cloneAction(node.action) } : {}),\n }),\n );\n return { label: current.label, options };\n }\n\n getDiagnostics(): DoomLeaderDiagnostic[] {\n return this.flush();\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private rebuild(): void {\n const nextRoot = createRootNode();\n const diagnostics: DoomLeaderDiagnostic[] = [];\n for (const binding of CORE_BINDINGS) {\n const issue = insertBinding(nextRoot, binding);\n if (issue) throw new Error(`Invalid core leader binding: ${issue.message}`);\n }\n\n for (const [source, bindings] of [...this.contributions.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n for (const binding of [...bindings].sort((left, right) => left.id.localeCompare(right.id))) {\n const issue = insertBinding(nextRoot, {\n id: binding.id,\n source,\n path: binding.path,\n action:\n 'command' in binding\n ? { type: 'command', command: binding.command }\n : { type: 'extension', source, action: binding.action },\n });\n if (issue) diagnostics.push(issue);\n }\n }\n\n this.root = nextRoot;\n this.diagnostics = diagnostics;\n this.dirty = false;\n for (const listener of this.listeners) listener();\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={active:!1,prefix:[],label:``,options:[]};function t(e){return{active:e.active,prefix:[...e.prefix],label:e.label,options:e.options.map(e=>({...e})),...e.rootOptions?{rootOptions:e.rootOptions.map(e=>({...e}))}:{}}}function n(e){return e.filter(({state:e})=>e.activation!==`inactive`).map(({descriptor:e,state:t})=>({source:e.source,id:e.id,label:e.label,order:e.order,...t.detail?{detail:t.detail}:{},...t.color?{color:t.color}:{}})).sort((e,t)=>e.order-t.order||e.source.localeCompare(t.source)||e.id.localeCompare(t.id))}var r=class{snapshot=e;modes=[];listeners=new Set;getSnapshot(){return t(this.snapshot)}getModes(){return this.modes}setModes(e){this.modes=e.map(e=>({...e}));for(let e of this.listeners)e(this.getSnapshot())}setLeader(e){this.snapshot=t(e);for(let e of this.listeners)e(this.getSnapshot())}reset(){this.modes=[],this.setLeader(e)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}};exports.DoomUiState=r,exports.projectMinorModeRecords=n;
|
|
2
|
+
//# sourceMappingURL=uiState.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiState.cjs","names":[],"sources":["../../../src/services/state/uiState.ts"],"sourcesContent":["import type { MinorModeRecord, ModeTextColor } from '@agimon-ai/doompi-extension-contracts/mode';\n\nexport interface LeaderOption {\n key: string;\n label: string;\n detail?: string;\n}\n\nexport interface LeaderSnapshot {\n active: boolean;\n prefix: string[];\n label: string;\n options: LeaderOption[];\n rootOptions?: LeaderOption[];\n}\n\nexport interface UiMinorModeStatus {\n source: string;\n id: string;\n label: string;\n detail?: string;\n color?: ModeTextColor;\n order: number;\n}\n\ntype StateListener = (snapshot: LeaderSnapshot) => void;\n\nconst INACTIVE_SNAPSHOT: LeaderSnapshot = {\n active: false,\n prefix: [],\n label: '',\n options: [],\n};\n\nfunction cloneSnapshot(snapshot: LeaderSnapshot): LeaderSnapshot {\n return {\n active: snapshot.active,\n prefix: [...snapshot.prefix],\n label: snapshot.label,\n options: snapshot.options.map((option) => ({ ...option })),\n ...(snapshot.rootOptions ? { rootOptions: snapshot.rootOptions.map((option) => ({ ...option })) } : {}),\n };\n}\n\nexport function projectMinorModeRecords(records: readonly MinorModeRecord[]): UiMinorModeStatus[] {\n return records\n .filter(({ state }) => state.activation !== 'inactive')\n .map(({ descriptor, state }) => ({\n source: descriptor.source,\n id: descriptor.id,\n label: descriptor.label,\n order: descriptor.order,\n ...(state.detail ? { detail: state.detail } : {}),\n ...(state.color ? { color: state.color } : {}),\n }))\n .sort(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n}\n\nexport class DoomUiState {\n private snapshot = INACTIVE_SNAPSHOT;\n private modes: readonly UiMinorModeStatus[] = [];\n private readonly listeners = new Set<StateListener>();\n\n getSnapshot(): LeaderSnapshot {\n return cloneSnapshot(this.snapshot);\n }\n\n getModes(): readonly UiMinorModeStatus[] {\n return this.modes;\n }\n\n setModes(modes: readonly UiMinorModeStatus[]): void {\n this.modes = modes.map((mode) => ({ ...mode }));\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n setLeader(snapshot: LeaderSnapshot): void {\n this.snapshot = cloneSnapshot(snapshot);\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n reset(): void {\n this.modes = [];\n this.setLeader(INACTIVE_SNAPSHOT);\n }\n\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n}\n"],"mappings":"AA2BA,MAAM,EAAoC,CACxC,OAAQ,GACR,OAAQ,CAAC,EACT,MAAO,GACP,QAAS,CAAC,CACZ,EAEA,SAAS,EAAc,EAA0C,CAC/D,MAAO,CACL,OAAQ,EAAS,OACjB,OAAQ,CAAC,GAAG,EAAS,MAAM,EAC3B,MAAO,EAAS,MAChB,QAAS,EAAS,QAAQ,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,EACzD,GAAI,EAAS,YAAc,CAAE,YAAa,EAAS,YAAY,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,CAAE,EAAI,CAAC,CACvG,CACF,CAEA,SAAgB,EAAwB,EAA0D,CAChG,OAAO,EACJ,QAAQ,CAAE,WAAY,EAAM,aAAe,UAAU,CAAC,CACtD,KAAK,CAAE,aAAY,YAAa,CAC/B,OAAQ,EAAW,OACnB,GAAI,EAAW,GACf,MAAO,EAAW,MAClB,MAAO,EAAW,MAClB,GAAI,EAAM,OAAS,CAAE,OAAQ,EAAM,MAAO,EAAI,CAAC,EAC/C,GAAI,EAAM,MAAQ,CAAE,MAAO,EAAM,KAAM,EAAI,CAAC,CAC9C,EAAE,CAAC,CACF,MACE,EAAM,IACL,EAAK,MAAQ,EAAM,OAAS,EAAK,OAAO,cAAc,EAAM,MAAM,GAAK,EAAK,GAAG,cAAc,EAAM,EAAE,CACzG,CACJ,CAEA,IAAa,EAAb,KAAyB,CACvB,SAAmB,EACnB,MAA8C,CAAC,EAC/C,UAA6B,IAAI,IAEjC,aAA8B,CAC5B,OAAO,EAAc,KAAK,QAAQ,CACpC,CAEA,UAAyC,CACvC,OAAO,KAAK,KACd,CAEA,SAAS,EAA2C,CAClD,KAAK,MAAQ,EAAM,IAAK,IAAU,CAAE,GAAG,CAAK,EAAE,EAC9C,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,UAAU,EAAgC,CACxC,KAAK,SAAW,EAAc,CAAQ,EACtC,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,OAAc,CACZ,KAAK,MAAQ,CAAC,EACd,KAAK,UAAU,CAAiB,CAClC,CAEA,UAAU,EAAqC,CAE7C,OADA,KAAK,UAAU,IAAI,CAAQ,MACd,KAAK,UAAU,OAAO,CAAQ,CAC7C,CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MinorModeRecord, ModeTextColor } from "@agimon-ai/doompi-extension-contracts/mode";
|
|
2
|
+
//#region src/services/state/uiState.d.ts
|
|
3
|
+
interface LeaderOption {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
detail?: string;
|
|
7
|
+
}
|
|
8
|
+
interface LeaderSnapshot {
|
|
9
|
+
active: boolean;
|
|
10
|
+
prefix: string[];
|
|
11
|
+
label: string;
|
|
12
|
+
options: LeaderOption[];
|
|
13
|
+
rootOptions?: LeaderOption[];
|
|
14
|
+
}
|
|
15
|
+
interface UiMinorModeStatus {
|
|
16
|
+
source: string;
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
detail?: string;
|
|
20
|
+
color?: ModeTextColor;
|
|
21
|
+
order: number;
|
|
22
|
+
}
|
|
23
|
+
type StateListener = (snapshot: LeaderSnapshot) => void;
|
|
24
|
+
declare function projectMinorModeRecords(records: readonly MinorModeRecord[]): UiMinorModeStatus[];
|
|
25
|
+
declare class DoomUiState {
|
|
26
|
+
private snapshot;
|
|
27
|
+
private modes;
|
|
28
|
+
private readonly listeners;
|
|
29
|
+
getSnapshot(): LeaderSnapshot;
|
|
30
|
+
getModes(): readonly UiMinorModeStatus[];
|
|
31
|
+
setModes(modes: readonly UiMinorModeStatus[]): void;
|
|
32
|
+
setLeader(snapshot: LeaderSnapshot): void;
|
|
33
|
+
reset(): void;
|
|
34
|
+
subscribe(listener: StateListener): () => void;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { DoomUiState, LeaderOption, LeaderSnapshot, UiMinorModeStatus, projectMinorModeRecords };
|
|
38
|
+
//# sourceMappingURL=uiState.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiState.d.cts","names":[],"sources":["../../../src/services/state/uiState.ts"],"mappings":";;UAEiB;EACf;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,SAAS;EACT,cAAc;;UAGC;EACf;EACA;EACA;EACA;EACA,QAAQ;EACR;;KAGG,iBAAiB,UAAU;iBAmBhB,wBAAwB,kBAAkB,oBAAoB;cAiBjE;UACH;UACA;mBACS;EAEjB,eAAe;EAIf,qBAAqB;EAIrB,SAAS,gBAAgB;EAKzB,UAAU,UAAU;EAKpB;EAKA,UAAU,UAAU"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MinorModeRecord, ModeTextColor } from "@agimon-ai/doompi-extension-contracts/mode";
|
|
2
|
+
//#region src/services/state/uiState.d.ts
|
|
3
|
+
interface LeaderOption {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
detail?: string;
|
|
7
|
+
}
|
|
8
|
+
interface LeaderSnapshot {
|
|
9
|
+
active: boolean;
|
|
10
|
+
prefix: string[];
|
|
11
|
+
label: string;
|
|
12
|
+
options: LeaderOption[];
|
|
13
|
+
rootOptions?: LeaderOption[];
|
|
14
|
+
}
|
|
15
|
+
interface UiMinorModeStatus {
|
|
16
|
+
source: string;
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
detail?: string;
|
|
20
|
+
color?: ModeTextColor;
|
|
21
|
+
order: number;
|
|
22
|
+
}
|
|
23
|
+
type StateListener = (snapshot: LeaderSnapshot) => void;
|
|
24
|
+
declare function projectMinorModeRecords(records: readonly MinorModeRecord[]): UiMinorModeStatus[];
|
|
25
|
+
declare class DoomUiState {
|
|
26
|
+
private snapshot;
|
|
27
|
+
private modes;
|
|
28
|
+
private readonly listeners;
|
|
29
|
+
getSnapshot(): LeaderSnapshot;
|
|
30
|
+
getModes(): readonly UiMinorModeStatus[];
|
|
31
|
+
setModes(modes: readonly UiMinorModeStatus[]): void;
|
|
32
|
+
setLeader(snapshot: LeaderSnapshot): void;
|
|
33
|
+
reset(): void;
|
|
34
|
+
subscribe(listener: StateListener): () => void;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { DoomUiState, LeaderOption, LeaderSnapshot, UiMinorModeStatus, projectMinorModeRecords };
|
|
38
|
+
//# sourceMappingURL=uiState.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiState.d.mts","names":[],"sources":["../../../src/services/state/uiState.ts"],"mappings":";;UAEiB;EACf;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,SAAS;EACT,cAAc;;UAGC;EACf;EACA;EACA;EACA;EACA,QAAQ;EACR;;KAGG,iBAAiB,UAAU;iBAmBhB,wBAAwB,kBAAkB,oBAAoB;cAiBjE;UACH;UACA;mBACS;EAEjB,eAAe;EAIf,qBAAqB;EAIrB,SAAS,gBAAgB;EAKzB,UAAU,UAAU;EAKpB;EAKA,UAAU,UAAU"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={active:!1,prefix:[],label:``,options:[]};function t(e){return{active:e.active,prefix:[...e.prefix],label:e.label,options:e.options.map(e=>({...e})),...e.rootOptions?{rootOptions:e.rootOptions.map(e=>({...e}))}:{}}}function n(e){return e.filter(({state:e})=>e.activation!==`inactive`).map(({descriptor:e,state:t})=>({source:e.source,id:e.id,label:e.label,order:e.order,...t.detail?{detail:t.detail}:{},...t.color?{color:t.color}:{}})).sort((e,t)=>e.order-t.order||e.source.localeCompare(t.source)||e.id.localeCompare(t.id))}var r=class{snapshot=e;modes=[];listeners=new Set;getSnapshot(){return t(this.snapshot)}getModes(){return this.modes}setModes(e){this.modes=e.map(e=>({...e}));for(let e of this.listeners)e(this.getSnapshot())}setLeader(e){this.snapshot=t(e);for(let e of this.listeners)e(this.getSnapshot())}reset(){this.modes=[],this.setLeader(e)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}};export{r as DoomUiState,n as projectMinorModeRecords};
|
|
2
|
+
//# sourceMappingURL=uiState.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiState.mjs","names":[],"sources":["../../../src/services/state/uiState.ts"],"sourcesContent":["import type { MinorModeRecord, ModeTextColor } from '@agimon-ai/doompi-extension-contracts/mode';\n\nexport interface LeaderOption {\n key: string;\n label: string;\n detail?: string;\n}\n\nexport interface LeaderSnapshot {\n active: boolean;\n prefix: string[];\n label: string;\n options: LeaderOption[];\n rootOptions?: LeaderOption[];\n}\n\nexport interface UiMinorModeStatus {\n source: string;\n id: string;\n label: string;\n detail?: string;\n color?: ModeTextColor;\n order: number;\n}\n\ntype StateListener = (snapshot: LeaderSnapshot) => void;\n\nconst INACTIVE_SNAPSHOT: LeaderSnapshot = {\n active: false,\n prefix: [],\n label: '',\n options: [],\n};\n\nfunction cloneSnapshot(snapshot: LeaderSnapshot): LeaderSnapshot {\n return {\n active: snapshot.active,\n prefix: [...snapshot.prefix],\n label: snapshot.label,\n options: snapshot.options.map((option) => ({ ...option })),\n ...(snapshot.rootOptions ? { rootOptions: snapshot.rootOptions.map((option) => ({ ...option })) } : {}),\n };\n}\n\nexport function projectMinorModeRecords(records: readonly MinorModeRecord[]): UiMinorModeStatus[] {\n return records\n .filter(({ state }) => state.activation !== 'inactive')\n .map(({ descriptor, state }) => ({\n source: descriptor.source,\n id: descriptor.id,\n label: descriptor.label,\n order: descriptor.order,\n ...(state.detail ? { detail: state.detail } : {}),\n ...(state.color ? { color: state.color } : {}),\n }))\n .sort(\n (left, right) =>\n left.order - right.order || left.source.localeCompare(right.source) || left.id.localeCompare(right.id),\n );\n}\n\nexport class DoomUiState {\n private snapshot = INACTIVE_SNAPSHOT;\n private modes: readonly UiMinorModeStatus[] = [];\n private readonly listeners = new Set<StateListener>();\n\n getSnapshot(): LeaderSnapshot {\n return cloneSnapshot(this.snapshot);\n }\n\n getModes(): readonly UiMinorModeStatus[] {\n return this.modes;\n }\n\n setModes(modes: readonly UiMinorModeStatus[]): void {\n this.modes = modes.map((mode) => ({ ...mode }));\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n setLeader(snapshot: LeaderSnapshot): void {\n this.snapshot = cloneSnapshot(snapshot);\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n reset(): void {\n this.modes = [];\n this.setLeader(INACTIVE_SNAPSHOT);\n }\n\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n}\n"],"mappings":"AA2BA,MAAM,EAAoC,CACxC,OAAQ,GACR,OAAQ,CAAC,EACT,MAAO,GACP,QAAS,CAAC,CACZ,EAEA,SAAS,EAAc,EAA0C,CAC/D,MAAO,CACL,OAAQ,EAAS,OACjB,OAAQ,CAAC,GAAG,EAAS,MAAM,EAC3B,MAAO,EAAS,MAChB,QAAS,EAAS,QAAQ,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,EACzD,GAAI,EAAS,YAAc,CAAE,YAAa,EAAS,YAAY,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,CAAE,EAAI,CAAC,CACvG,CACF,CAEA,SAAgB,EAAwB,EAA0D,CAChG,OAAO,EACJ,QAAQ,CAAE,WAAY,EAAM,aAAe,UAAU,CAAC,CACtD,KAAK,CAAE,aAAY,YAAa,CAC/B,OAAQ,EAAW,OACnB,GAAI,EAAW,GACf,MAAO,EAAW,MAClB,MAAO,EAAW,MAClB,GAAI,EAAM,OAAS,CAAE,OAAQ,EAAM,MAAO,EAAI,CAAC,EAC/C,GAAI,EAAM,MAAQ,CAAE,MAAO,EAAM,KAAM,EAAI,CAAC,CAC9C,EAAE,CAAC,CACF,MACE,EAAM,IACL,EAAK,MAAQ,EAAM,OAAS,EAAK,OAAO,cAAc,EAAM,MAAM,GAAK,EAAK,GAAG,cAAc,EAAM,EAAE,CACzG,CACJ,CAEA,IAAa,EAAb,KAAyB,CACvB,SAAmB,EACnB,MAA8C,CAAC,EAC/C,UAA6B,IAAI,IAEjC,aAA8B,CAC5B,OAAO,EAAc,KAAK,QAAQ,CACpC,CAEA,UAAyC,CACvC,OAAO,KAAK,KACd,CAEA,SAAS,EAA2C,CAClD,KAAK,MAAQ,EAAM,IAAK,IAAU,CAAE,GAAG,CAAK,EAAE,EAC9C,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,UAAU,EAAgC,CACxC,KAAK,SAAW,EAAc,CAAQ,EACtC,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,OAAc,CACZ,KAAK,MAAQ,CAAC,EACd,KAAK,UAAU,CAAiB,CAClC,CAEA,UAAU,EAAqC,CAE7C,OADA,KAAK,UAAU,IAAI,CAAQ,MACd,KAAK,UAAU,OAAO,CAAQ,CAC7C,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`core`,t={core:`core`,mcp:`mcp`,extension:`extension`},n={core:0,mcp:1,extension:2};function r(e){return e.state===`connected`?void 0:e.state.replace(/-/g,` `)}function i(e,t){return{name:e.name,...e.description?{description:e.description}:{},...e.parameters===void 0?{}:{parameters:e.parameters},...e.promptGuidelines?.length?{promptGuidelines:e.promptGuidelines}:{},active:t.has(e.name)}}function a(e,t){return e.name.localeCompare(t.name)}function o(e,n){return`${e} · ${t[n]}`}function s(e){let t=new Map;for(let n of e)for(let e of n.tools)t.set(e,n);return t}function c(t){let c=new Set(t.activeTools),l=t.mcpServers??[],u=s(l),d=[],f=new Map,p=new Map;for(let e of t.tools){let n=i(e,c),r=u.get(e.name);if(r){let e=f.get(r.name);e?e.push(n):f.set(r.name,[n]);continue}if(e.sourceInfo.source===`builtin`){d.push(n);continue}let a=t.resolveExtensionToolSource?.(e.name),s=a??e.sourceInfo.path,l=p.get(s);if(l)l.tools.push(n);else{let r=a!==void 0||e.sourceInfo.source===`cli`||e.sourceInfo.source===`local`||!e.sourceInfo.source?t.resolveExtensionName?.(s)??e.sourceInfo.source??s:e.sourceInfo.source??s;p.set(s,{label:o(r,`extension`),detail:s,tools:[n]})}}let m=[];d.length>0&&m.push({key:e,label:o(`pi`,e),kind:e,tools:d.sort(a)});for(let e of l){let t=f.get(e.name)??[],n=r(e);m.push({key:`mcp:${e.name}`,label:o(e.name,`mcp`),kind:`mcp`,...n?{status:n}:{},tools:t.sort(a)})}for(let[e,t]of p)m.push({key:e,label:t.label,kind:`extension`,detail:t.detail,tools:t.tools.sort(a)});return m.sort((e,t)=>n[e.kind]-n[t.kind]||e.label.localeCompare(t.label))}exports.buildToolSources=c;
|
|
2
|
+
//# sourceMappingURL=toolInventory.cjs.map
|