@dsh-workbench/core 0.2.9 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/client.js +942 -211
  2. package/dist/board.css +0 -12
  3. package/dist/client/client.body.js +942 -211
  4. package/dist/client/index.js +943 -212
  5. package/dist/host/index.js +2904 -861
  6. package/dist/types/app/client.d.ts +42 -6
  7. package/dist/types/app/layouts/rightbar/board-plan.d.ts +2 -0
  8. package/dist/types/app/layouts/rightbar/kit-preview-controls.d.ts +10 -0
  9. package/dist/types/app/layouts/rightbar/kit-preview-frame.d.ts +14 -0
  10. package/dist/types/app/layouts/rightbar/kit-preview-rows.d.ts +5 -0
  11. package/dist/types/app/layouts/rightbar/kit-preview.d.ts +3 -0
  12. package/dist/types/app/layouts/rightbar/market-row-icon.d.ts +1 -1
  13. package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +1 -1
  14. package/dist/types/app/layouts/sidebar/workspace-groups.d.ts +0 -1
  15. package/dist/types/app/layouts/sidebar/workspace-items.d.ts +2 -3
  16. package/dist/types/modules/panels/__tests__/diy-harness.d.ts +32 -0
  17. package/dist/types/modules/panels/__tests__/market-tools-harness.d.ts +1 -1
  18. package/dist/types/modules/panels/__tests__/scope-support.d.ts +1 -1
  19. package/dist/types/modules/panels/model/diy-act.d.ts +4 -0
  20. package/dist/types/modules/panels/model/diy-act.test.d.ts +1 -0
  21. package/dist/types/modules/panels/model/diy-browser-act.d.ts +47 -0
  22. package/dist/types/modules/panels/model/diy-browser.d.ts +47 -0
  23. package/dist/types/modules/panels/model/diy-browser.test.d.ts +1 -0
  24. package/dist/types/modules/panels/model/diy-context.d.ts +102 -0
  25. package/dist/types/modules/panels/model/diy-context.test.d.ts +1 -0
  26. package/dist/types/modules/panels/model/diy-logs.d.ts +18 -0
  27. package/dist/types/modules/panels/model/diy-logs.test.d.ts +1 -0
  28. package/dist/types/modules/panels/model/diy-look.d.ts +14 -0
  29. package/dist/types/modules/panels/model/diy-look.test.d.ts +1 -0
  30. package/dist/types/modules/panels/model/diy-net.d.ts +3 -0
  31. package/dist/types/modules/panels/model/diy-net.test.d.ts +1 -0
  32. package/dist/types/modules/panels/model/diy-page.d.ts +15 -0
  33. package/dist/types/modules/panels/model/diy-page.test.d.ts +1 -0
  34. package/dist/types/modules/panels/model/diy-schema.d.ts +9 -0
  35. package/dist/types/modules/panels/model/diy-schema.test.d.ts +1 -0
  36. package/dist/types/modules/panels/model/diy-scripts.d.ts +64 -0
  37. package/dist/types/modules/panels/unit.d.ts +43 -3
  38. package/dist/types/shared/api/diy.d.ts +4 -0
  39. package/dist/types/shared/api/host/__tests__/png-fixtures.d.ts +17 -0
  40. package/dist/types/shared/api/host/mount-units.d.ts +6 -0
  41. package/dist/types/shared/api/host/png-crop.d.ts +21 -0
  42. package/dist/types/shared/api/host/png-crop.test.d.ts +1 -0
  43. package/package.json +2 -2
  44. package/skills/workbench-module-diy/BUILD.md +4 -3
  45. package/skills/workbench-module-diy/DATASOURCE.md +4 -4
  46. package/skills/workbench-module-diy/DESIGN.md +1 -1
  47. package/skills/workbench-module-diy/KIT.md +121 -0
  48. package/skills/workbench-module-diy/PANEL.md +12 -2
  49. package/skills/workbench-module-diy/REVIEW.md +12 -6
  50. package/skills/workbench-module-diy/SKILL.md +7 -6
  51. package/skills/workbench-module-diy/TOOLING.md +5 -4
  52. package/skills/workbench-module-diy/TOOLS.md +3 -3
  53. package/skills/workbench-module-diy/WIRING.md +6 -6
  54. package/dist/types/app/layouts/sidebar/WorkspaceSearchField.d.ts +0 -9
@@ -107,6 +107,8 @@ export declare const kit: {
107
107
  ApprovalDetail(props: apiModule.ApprovalDetailProps): JSX.Element | null;
108
108
  ApprovalPlan({ rows, hint, warn, children }: apiModule.ApprovalPlanProps): JSX.Element;
109
109
  Card({ t, title, refreshing, onRefresh, meta, head, children }: apiModule.CardProps): JSX.Element;
110
+ cardIdOf(unit: string | null): string | undefined;
111
+ CardAnchor({ unit, children }: apiModule.CardAnchorProps): JSX.Element;
110
112
  errorReasonOf(error: unknown): string;
111
113
  CardBoundary: typeof apiModule.CardBoundary;
112
114
  CardHead({ t, title, meta, refreshing, onRefresh, gear, gearOpen, onToggleGear, platformHref, platform, platformTitle, }: apiModule.CardHeadProps): JSX.Element;
@@ -140,6 +142,13 @@ export declare const kit: {
140
142
  Row({ label, value }: apiModule.RowProps): JSX.Element;
141
143
  SaveBar({ busy, disabled, labels, onCancel, onSave }: apiModule.SaveBarProps): JSX.Element;
142
144
  SettingsSection({ label, title, action, children }: apiModule.SettingsSectionProps): JSX.Element;
145
+ searchTextOf(option: apiModule.SelectFieldOption): string;
146
+ defaultSelectFilter(option: apiModule.SelectFieldOption, query: string): boolean;
147
+ filterSelectOptions(options: readonly apiModule.SelectFieldOption[], query: string, filter?: (option: apiModule.SelectFieldOption, query: string) => boolean): readonly apiModule.SelectFieldOption[];
148
+ selectCursorValue(shown: readonly apiModule.SelectFieldOption[], cursor: number | null): string | null;
149
+ stepSelectCursor(shown: readonly apiModule.SelectFieldOption[], cursor: number | null, step: 1 | -1): number | null;
150
+ selectEntries(shown: readonly apiModule.SelectFieldOption[], emptyText: string | undefined): readonly import("@deepseek-ai/dsh-client-ui-primitives").MenuEntry[];
151
+ SelectField(props: apiModule.SelectFieldProps): apiModule.ReactNode;
143
152
  Stack({ children }: apiModule.StackProps): JSX.Element;
144
153
  StateBlock({ title, dot, hint, actions, resolving, children }: apiModule.StateBlockProps): JSX.Element;
145
154
  TextField({ invalid, className, ...rest }: apiModule.TextFieldProps): JSX.Element;
@@ -150,6 +159,7 @@ export declare const kit: {
150
159
  IconOpencli({ size }: apiModule.IconProps): JSX.Element;
151
160
  IconNpm({ size }: apiModule.IconProps): JSX.Element;
152
161
  IconModules({ size }: apiModule.IconProps): JSX.Element;
162
+ IconModuleMark({ size }: apiModule.IconProps): JSX.Element;
153
163
  IconPanelScreen({ size }: apiModule.IconProps): JSX.Element;
154
164
  PLUGIN_ID: "@dsh-workbench/core";
155
165
  RELEASE_SIBLINGS: readonly ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
@@ -329,7 +339,7 @@ export declare const kit: {
329
339
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
330
340
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
331
341
  readonly "panels.market.pluginKeptUnnamed": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u770B\u4E0D\u51FA\u8FD9\u662F\u54EA\u4E2A\u63D2\u4EF6\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
332
- readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules \u7684 install-bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
342
+ readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules_install_bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
333
343
  readonly "panels.market.restartNeeded": "\u65B0\u7248\u88C5\u597D\u4E86\uFF0C\u91CD\u542F\u4E00\u6B21\u624D\u751F\u6548\u3002";
334
344
  readonly "panels.market.foot": "\u88C5\u597D\u540E\u5230\u90A3\u4E2A\u9879\u76EE\u7684\u9762\u677F\u9875\u52FE\u9009\u5B83\uFF0C\u6A21\u5757\u624D\u4F1A\u51FA\u73B0\u3002";
335
345
  readonly "panels.market.recheck": "\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0";
@@ -733,7 +743,7 @@ export declare const kit: {
733
743
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
734
744
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
735
745
  readonly "panels.market.pluginKeptUnnamed": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u770B\u4E0D\u51FA\u8FD9\u662F\u54EA\u4E2A\u63D2\u4EF6\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
736
- readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules \u7684 install-bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
746
+ readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules_install_bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
737
747
  readonly "panels.market.restartNeeded": "\u65B0\u7248\u88C5\u597D\u4E86\uFF0C\u91CD\u542F\u4E00\u6B21\u624D\u751F\u6548\u3002";
738
748
  readonly "panels.market.foot": "\u88C5\u597D\u540E\u5230\u90A3\u4E2A\u9879\u76EE\u7684\u9762\u677F\u9875\u52FE\u9009\u5B83\uFF0C\u6A21\u5757\u624D\u4F1A\u51FA\u73B0\u3002";
739
749
  readonly "panels.market.recheck": "\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0";
@@ -1008,6 +1018,8 @@ export declare const kit: {
1008
1018
  h: typeof import("react").createElement;
1009
1019
  Fragment: import("react").ExoticComponent<import("react").FragmentProps>;
1010
1020
  Component: typeof import("react").Component;
1021
+ createContext: typeof import("react").createContext;
1022
+ useContext: typeof import("react").useContext;
1011
1023
  useState: typeof import("react").useState;
1012
1024
  useEffect: typeof import("react").useEffect;
1013
1025
  useLayoutEffect: typeof import("react").useLayoutEffect;
@@ -1082,6 +1094,8 @@ export declare const kit: {
1082
1094
  ApprovalDetail(props: apiModule.ApprovalDetailProps): JSX.Element | null;
1083
1095
  ApprovalPlan({ rows, hint, warn, children }: apiModule.ApprovalPlanProps): JSX.Element;
1084
1096
  Card({ t, title, refreshing, onRefresh, meta, head, children }: apiModule.CardProps): JSX.Element;
1097
+ cardIdOf(unit: string | null): string | undefined;
1098
+ CardAnchor({ unit, children }: apiModule.CardAnchorProps): JSX.Element;
1085
1099
  errorReasonOf(error: unknown): string;
1086
1100
  CardBoundary: typeof apiModule.CardBoundary;
1087
1101
  CardHead({ t, title, meta, refreshing, onRefresh, gear, gearOpen, onToggleGear, platformHref, platform, platformTitle, }: apiModule.CardHeadProps): JSX.Element;
@@ -1115,6 +1129,13 @@ export declare const kit: {
1115
1129
  Row({ label, value }: apiModule.RowProps): JSX.Element;
1116
1130
  SaveBar({ busy, disabled, labels, onCancel, onSave }: apiModule.SaveBarProps): JSX.Element;
1117
1131
  SettingsSection({ label, title, action, children }: apiModule.SettingsSectionProps): JSX.Element;
1132
+ searchTextOf(option: apiModule.SelectFieldOption): string;
1133
+ defaultSelectFilter(option: apiModule.SelectFieldOption, query: string): boolean;
1134
+ filterSelectOptions(options: readonly apiModule.SelectFieldOption[], query: string, filter?: (option: apiModule.SelectFieldOption, query: string) => boolean): readonly apiModule.SelectFieldOption[];
1135
+ selectCursorValue(shown: readonly apiModule.SelectFieldOption[], cursor: number | null): string | null;
1136
+ stepSelectCursor(shown: readonly apiModule.SelectFieldOption[], cursor: number | null, step: 1 | -1): number | null;
1137
+ selectEntries(shown: readonly apiModule.SelectFieldOption[], emptyText: string | undefined): readonly import("@deepseek-ai/dsh-client-ui-primitives").MenuEntry[];
1138
+ SelectField(props: apiModule.SelectFieldProps): apiModule.ReactNode;
1118
1139
  Stack({ children }: apiModule.StackProps): JSX.Element;
1119
1140
  StateBlock({ title, dot, hint, actions, resolving, children }: apiModule.StateBlockProps): JSX.Element;
1120
1141
  TextField({ invalid, className, ...rest }: apiModule.TextFieldProps): JSX.Element;
@@ -1125,6 +1146,7 @@ export declare const kit: {
1125
1146
  IconOpencli({ size }: apiModule.IconProps): JSX.Element;
1126
1147
  IconNpm({ size }: apiModule.IconProps): JSX.Element;
1127
1148
  IconModules({ size }: apiModule.IconProps): JSX.Element;
1149
+ IconModuleMark({ size }: apiModule.IconProps): JSX.Element;
1128
1150
  IconPanelScreen({ size }: apiModule.IconProps): JSX.Element;
1129
1151
  PLUGIN_ID: "@dsh-workbench/core";
1130
1152
  RELEASE_SIBLINGS: readonly ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
@@ -1304,7 +1326,7 @@ export declare const kit: {
1304
1326
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
1305
1327
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
1306
1328
  readonly "panels.market.pluginKeptUnnamed": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u770B\u4E0D\u51FA\u8FD9\u662F\u54EA\u4E2A\u63D2\u4EF6\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
1307
- readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules \u7684 install-bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
1329
+ readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules_install_bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
1308
1330
  readonly "panels.market.restartNeeded": "\u65B0\u7248\u88C5\u597D\u4E86\uFF0C\u91CD\u542F\u4E00\u6B21\u624D\u751F\u6548\u3002";
1309
1331
  readonly "panels.market.foot": "\u88C5\u597D\u540E\u5230\u90A3\u4E2A\u9879\u76EE\u7684\u9762\u677F\u9875\u52FE\u9009\u5B83\uFF0C\u6A21\u5757\u624D\u4F1A\u51FA\u73B0\u3002";
1310
1332
  readonly "panels.market.recheck": "\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0";
@@ -1708,7 +1730,7 @@ export declare const kit: {
1708
1730
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
1709
1731
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
1710
1732
  readonly "panels.market.pluginKeptUnnamed": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u770B\u4E0D\u51FA\u8FD9\u662F\u54EA\u4E2A\u63D2\u4EF6\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
1711
- readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules \u7684 install-bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
1733
+ readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules_install_bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
1712
1734
  readonly "panels.market.restartNeeded": "\u65B0\u7248\u88C5\u597D\u4E86\uFF0C\u91CD\u542F\u4E00\u6B21\u624D\u751F\u6548\u3002";
1713
1735
  readonly "panels.market.foot": "\u88C5\u597D\u540E\u5230\u90A3\u4E2A\u9879\u76EE\u7684\u9762\u677F\u9875\u52FE\u9009\u5B83\uFF0C\u6A21\u5757\u624D\u4F1A\u51FA\u73B0\u3002";
1714
1736
  readonly "panels.market.recheck": "\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0";
@@ -1983,6 +2005,8 @@ export declare const kit: {
1983
2005
  h: typeof import("react").createElement;
1984
2006
  Fragment: import("react").ExoticComponent<import("react").FragmentProps>;
1985
2007
  Component: typeof import("react").Component;
2008
+ createContext: typeof import("react").createContext;
2009
+ useContext: typeof import("react").useContext;
1986
2010
  useState: typeof import("react").useState;
1987
2011
  useEffect: typeof import("react").useEffect;
1988
2012
  useLayoutEffect: typeof import("react").useLayoutEffect;
@@ -2052,6 +2076,8 @@ export declare const kit: {
2052
2076
  ApprovalDetail(props: apiModule.ApprovalDetailProps): JSX.Element | null;
2053
2077
  ApprovalPlan({ rows, hint, warn, children }: apiModule.ApprovalPlanProps): JSX.Element;
2054
2078
  Card({ t, title, refreshing, onRefresh, meta, head, children }: apiModule.CardProps): JSX.Element;
2079
+ cardIdOf(unit: string | null): string | undefined;
2080
+ CardAnchor({ unit, children }: apiModule.CardAnchorProps): JSX.Element;
2055
2081
  errorReasonOf(error: unknown): string;
2056
2082
  CardBoundary: typeof apiModule.CardBoundary;
2057
2083
  CardHead({ t, title, meta, refreshing, onRefresh, gear, gearOpen, onToggleGear, platformHref, platform, platformTitle, }: apiModule.CardHeadProps): JSX.Element;
@@ -2085,6 +2111,13 @@ export declare const kit: {
2085
2111
  Row({ label, value }: apiModule.RowProps): JSX.Element;
2086
2112
  SaveBar({ busy, disabled, labels, onCancel, onSave }: apiModule.SaveBarProps): JSX.Element;
2087
2113
  SettingsSection({ label, title, action, children }: apiModule.SettingsSectionProps): JSX.Element;
2114
+ searchTextOf(option: apiModule.SelectFieldOption): string;
2115
+ defaultSelectFilter(option: apiModule.SelectFieldOption, query: string): boolean;
2116
+ filterSelectOptions(options: readonly apiModule.SelectFieldOption[], query: string, filter?: (option: apiModule.SelectFieldOption, query: string) => boolean): readonly apiModule.SelectFieldOption[];
2117
+ selectCursorValue(shown: readonly apiModule.SelectFieldOption[], cursor: number | null): string | null;
2118
+ stepSelectCursor(shown: readonly apiModule.SelectFieldOption[], cursor: number | null, step: 1 | -1): number | null;
2119
+ selectEntries(shown: readonly apiModule.SelectFieldOption[], emptyText: string | undefined): readonly import("@deepseek-ai/dsh-client-ui-primitives").MenuEntry[];
2120
+ SelectField(props: apiModule.SelectFieldProps): apiModule.ReactNode;
2088
2121
  Stack({ children }: apiModule.StackProps): JSX.Element;
2089
2122
  StateBlock({ title, dot, hint, actions, resolving, children }: apiModule.StateBlockProps): JSX.Element;
2090
2123
  TextField({ invalid, className, ...rest }: apiModule.TextFieldProps): JSX.Element;
@@ -2095,6 +2128,7 @@ export declare const kit: {
2095
2128
  IconOpencli({ size }: apiModule.IconProps): JSX.Element;
2096
2129
  IconNpm({ size }: apiModule.IconProps): JSX.Element;
2097
2130
  IconModules({ size }: apiModule.IconProps): JSX.Element;
2131
+ IconModuleMark({ size }: apiModule.IconProps): JSX.Element;
2098
2132
  IconPanelScreen({ size }: apiModule.IconProps): JSX.Element;
2099
2133
  PLUGIN_ID: "@dsh-workbench/core";
2100
2134
  RELEASE_SIBLINGS: readonly ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
@@ -2274,7 +2308,7 @@ export declare const kit: {
2274
2308
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
2275
2309
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
2276
2310
  readonly "panels.market.pluginKeptUnnamed": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u770B\u4E0D\u51FA\u8FD9\u662F\u54EA\u4E2A\u63D2\u4EF6\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
2277
- readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules \u7684 install-bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
2311
+ readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules_install_bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
2278
2312
  readonly "panels.market.restartNeeded": "\u65B0\u7248\u88C5\u597D\u4E86\uFF0C\u91CD\u542F\u4E00\u6B21\u624D\u751F\u6548\u3002";
2279
2313
  readonly "panels.market.foot": "\u88C5\u597D\u540E\u5230\u90A3\u4E2A\u9879\u76EE\u7684\u9762\u677F\u9875\u52FE\u9009\u5B83\uFF0C\u6A21\u5757\u624D\u4F1A\u51FA\u73B0\u3002";
2280
2314
  readonly "panels.market.recheck": "\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0";
@@ -2678,7 +2712,7 @@ export declare const kit: {
2678
2712
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
2679
2713
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
2680
2714
  readonly "panels.market.pluginKeptUnnamed": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u770B\u4E0D\u51FA\u8FD9\u662F\u54EA\u4E2A\u63D2\u4EF6\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
2681
- readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules \u7684 install-bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
2715
+ readonly "panels.market.pluginBroken": "\u8FD9\u4EFD\u88C5\u574F\u4E86\uFF1A\u770B\u4E0D\u51FA\u5B83\u662F\u4E2A\u63D2\u4EF6\u3002\u53EF\u4EE5\u5378\u8F7D\uFF0C\u6216\u8005\u76F4\u63A5\u8DDF agent \u8BF4\uFF1A\u7528 workbench_modules_install_bundle \u6309\u5305\u540D\u518D\u88C5\u4E00\u6B21\u3002";
2682
2716
  readonly "panels.market.restartNeeded": "\u65B0\u7248\u88C5\u597D\u4E86\uFF0C\u91CD\u542F\u4E00\u6B21\u624D\u751F\u6548\u3002";
2683
2717
  readonly "panels.market.foot": "\u88C5\u597D\u540E\u5230\u90A3\u4E2A\u9879\u76EE\u7684\u9762\u677F\u9875\u52FE\u9009\u5B83\uFF0C\u6A21\u5757\u624D\u4F1A\u51FA\u73B0\u3002";
2684
2718
  readonly "panels.market.recheck": "\u91CD\u65B0\u68C0\u67E5\u66F4\u65B0";
@@ -2953,6 +2987,8 @@ export declare const kit: {
2953
2987
  h: typeof import("react").createElement;
2954
2988
  Fragment: import("react").ExoticComponent<import("react").FragmentProps>;
2955
2989
  Component: typeof import("react").Component;
2990
+ createContext: typeof import("react").createContext;
2991
+ useContext: typeof import("react").useContext;
2956
2992
  useState: typeof import("react").useState;
2957
2993
  useEffect: typeof import("react").useEffect;
2958
2994
  useLayoutEffect: typeof import("react").useLayoutEffect;
@@ -5,6 +5,8 @@ export type BoardShape = {
5
5
  readonly kind: 'empty';
6
6
  } | {
7
7
  readonly kind: 'unread';
8
+ } | {
9
+ readonly kind: 'kit';
8
10
  } | {
9
11
  readonly kind: 'all';
10
12
  } | {
@@ -0,0 +1,10 @@
1
+ export declare function TextFieldDemo(): JSX.Element;
2
+ export declare function SelectDemo({ variant }: {
3
+ readonly variant?: 'boxed' | 'ghost';
4
+ }): JSX.Element;
5
+ export declare function SelectRichDemo(): JSX.Element;
6
+ export declare function SelectStateDemo(): JSX.Element;
7
+ export declare function AppearanceDemo(): JSX.Element;
8
+ export declare function ChoiceDemo(): JSX.Element;
9
+ export declare function SaveBarDemo(): JSX.Element;
10
+ export declare function LinkDemo(): JSX.Element;
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from '@dsh-workbench/shared';
2
+ export declare function Section({ title, note, children, }: {
3
+ readonly title: string;
4
+ readonly note?: string;
5
+ readonly children?: ReactNode;
6
+ }): JSX.Element;
7
+ export declare function Grid({ children }: {
8
+ readonly children?: ReactNode;
9
+ }): JSX.Element;
10
+ export declare function Cell({ label, wide, children, }: {
11
+ readonly label: string;
12
+ readonly wide?: boolean;
13
+ readonly children?: ReactNode;
14
+ }): JSX.Element;
@@ -0,0 +1,5 @@
1
+ export declare function RowsSection(): JSX.Element;
2
+ export declare function ActivitySection(): JSX.Element;
3
+ export declare function LongTaskSection(): JSX.Element;
4
+ export declare function IconSection(): JSX.Element;
5
+ export declare function StripSection(): JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { BoardModule, BoardModuleProps } from '@dsh-workbench/shared';
2
+ export declare function KitPreview({ t }: BoardModuleProps): JSX.Element;
3
+ export declare const KIT_PREVIEW_MODULE: BoardModule;
@@ -1,7 +1,7 @@
1
1
  import type { MarketRow } from './market-row-types';
2
2
  import type { SharedRow } from './market-rows';
3
3
  export type PackageKind = 'module' | 'plugin' | 'lib' | 'workbench';
4
- export declare function packageIcon(kind: PackageKind): import("react").FunctionComponentElement<import("@deepseek-ai/dsh-client-ui-primitives").IconProps> | import("react").FunctionComponentElement<import("@dsh-workbench/shared").IconProps>;
4
+ export declare function packageIcon(kind: PackageKind): import("react").FunctionComponentElement<import("@dsh-workbench/shared").IconProps>;
5
5
  export declare function marketRowKind(row: MarketRow): PackageKind;
6
6
  export declare function sharedRowKind(row: SharedRow): PackageKind;
7
7
  export type PackageIcon = ReturnType<typeof packageIcon>;
@@ -1,3 +1,3 @@
1
1
  export type MarketSectionKind = 'installed' | 'pending' | 'plugins' | 'shared';
2
- export declare function marketSectionIcon(kind: MarketSectionKind): import("react").FunctionComponentElement<import("@deepseek-ai/dsh-client-ui-primitives").IconProps> | import("react").FunctionComponentElement<import("@dsh-workbench/shared").IconProps>;
2
+ export declare function marketSectionIcon(kind: MarketSectionKind): import("react").FunctionComponentElement<import("@dsh-workbench/shared").IconProps> | import("react").FunctionComponentElement<import("@deepseek-ai/dsh-client-ui-primitives").IconProps>;
3
3
  export type MarketSectionIcon = ReturnType<typeof marketSectionIcon>;
@@ -13,4 +13,3 @@ export declare function workspaceSections<T extends {
13
13
  readonly path: string;
14
14
  readonly title: string;
15
15
  }>(items: readonly T[], headings: WorkspaceHeadings): readonly WorkspaceSectionPlan<T>[];
16
- export declare function flattenSections<T>(sections: readonly WorkspaceSectionPlan<T>[]): readonly T[];
@@ -1,5 +1,4 @@
1
- import type { Translate, WorkspaceView } from '@dsh-workbench/shared';
2
- import type { MenuEntry } from '@deepseek-ai/dsh-client-ui-primitives';
1
+ import type { SelectFieldOption, Translate, WorkspaceView } from '@dsh-workbench/shared';
3
2
  import type { WorkspaceSectionPlan } from './workspace-groups';
4
3
  export interface WorkspaceItemsOptions {
5
4
  readonly sections: readonly WorkspaceSectionPlan<WorkspaceView>[];
@@ -9,4 +8,4 @@ export interface WorkspaceItemsOptions {
9
8
  readonly onHover: (workspaceId: string | null) => void;
10
9
  readonly onEdit: (workspace: WorkspaceView) => void;
11
10
  }
12
- export declare function workspaceMenuItems(options: WorkspaceItemsOptions): MenuEntry[];
11
+ export declare function workspaceOptions(options: WorkspaceItemsOptions): SelectFieldOption[];
@@ -50,8 +50,40 @@ export declare function createDiyRig(): {
50
50
  specs: string[];
51
51
  registered: {
52
52
  name: string;
53
+ parameters?: Record<string, unknown>;
53
54
  execute: (args: unknown, exec?: unknown) => Promise<unknown>;
54
55
  }[];
56
+ tool: (name: string) => {
57
+ name: string;
58
+ parameters?: Record<string, unknown>;
59
+ execute: (args: unknown, exec?: unknown) => Promise<unknown>;
60
+ };
61
+ ctx: {
62
+ get: (key: string) => PanelStateStore | {
63
+ all: () => {
64
+ unit: string;
65
+ }[];
66
+ refusals: () => readonly {
67
+ unit: string;
68
+ reasons: readonly string[];
69
+ }[];
70
+ failureOf: (unit: string) => string | undefined;
71
+ } | ((relative: string) => string) | {
72
+ register(definition: {
73
+ name: string;
74
+ parameters?: Record<string, unknown>;
75
+ execute: (args: unknown, exec?: unknown) => Promise<unknown>;
76
+ }): () => void;
77
+ dir?: undefined;
78
+ } | {
79
+ dir: string;
80
+ register?: undefined;
81
+ } | undefined;
82
+ logger: {
83
+ info: () => void;
84
+ warn: () => void;
85
+ };
86
+ };
55
87
  panels: import("../model/service").PanelsService;
56
88
  panelState: PanelStateStore;
57
89
  registry: {
@@ -42,4 +42,4 @@ export declare function harness(options: {
42
42
  selfUpdates: SelfUpdateRequest[];
43
43
  };
44
44
  export declare function fakeBundles(over?: Partial<BundleManager>): BundleManager;
45
- export declare function call(h: ReturnType<typeof harness>, args: unknown): Promise<Record<string, unknown>>;
45
+ export declare function call(h: ReturnType<typeof harness>, name: string, args?: unknown): Promise<Record<string, unknown>>;
@@ -43,7 +43,7 @@ interface RanTool {
43
43
  }
44
44
  export declare function toolHarness(manifests?: readonly UnitManifest[], owned?: readonly string[]): {
45
45
  panels: PanelsService;
46
- run: (args: Record<string, unknown>, exec?: unknown) => Promise<RanTool>;
46
+ run: (name: string, args: Record<string, unknown>, exec?: unknown) => Promise<RanTool>;
47
47
  };
48
48
  export declare function machineConfig(): string;
49
49
  export declare function workspaceConfig(workspace: string): string;
@@ -0,0 +1,4 @@
1
+ import type { DshHostContext, DshToolRegistry } from '@dsh-workbench/shared';
2
+ import { type ActStep, type ActTarget } from './diy-browser-act';
3
+ export declare function renderAct(verb: string, target: ActTarget, selector: string, step: ActStep): string;
4
+ export declare function registerActTools(ctx: DshHostContext, tools: DshToolRegistry): readonly (() => void)[];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import type { DshShell } from '@dsh-workbench/shared';
2
+ import { type BrowserStep } from './diy-browser';
3
+ export declare const ACT_TIMEOUT_MS = 15000;
4
+ export interface ActTarget {
5
+ readonly selector: string;
6
+ readonly role: string;
7
+ readonly name: string;
8
+ readonly testid: string;
9
+ readonly nth: number | null;
10
+ readonly page: boolean;
11
+ }
12
+ export declare function actTargetOf(raw: Record<string, unknown>): ActTarget;
13
+ export declare function scopedSelectorOf(unit: string, target: ActTarget): string;
14
+ export declare const SCOPE_ATTR = "data-diy-scope";
15
+ export declare function semanticOptionsOf(target: ActTarget): readonly string[];
16
+ export declare function targetOptionsOf(target: ActTarget): readonly string[];
17
+ export declare function refsOf(payload: Record<string, unknown> | undefined): readonly number[];
18
+ export declare function totalMatchesOf(payload: Record<string, unknown> | undefined): number;
19
+ export declare function scopeMarkScriptOf(unit: string, refs: readonly number[], nth: number, token: string): string;
20
+ export declare function scopeClearScriptOf(token: string): string;
21
+ export declare function scopedMarkerSelectorOf(unit: string, token: string): string;
22
+ export interface ActStep extends BrowserStep {
23
+ readonly payload: Record<string, unknown> | undefined;
24
+ }
25
+ export declare function actBrowser(shell: DshShell, command: string, session: string, argv: readonly string[], timeoutMs?: number): Promise<ActStep>;
26
+ export declare function actErrorOf(step: ActStep): string;
27
+ export declare function matchesOf(step: ActStep): number;
28
+ export declare function scrollIntoView(shell: DshShell, command: string, session: string, unit: string, selector: string): Promise<ActStep>;
29
+ export declare function reloadPage(shell: DshShell, command: string, session: string): Promise<ActStep>;
30
+ export interface WidthShot {
31
+ readonly ok: boolean;
32
+ readonly file: string;
33
+ readonly width: number;
34
+ readonly height: number;
35
+ readonly reason: string;
36
+ }
37
+ export declare function shootAtWidth(shell: DshShell, command: string, session: string, file: string, width: number, height: number): Promise<WidthShot>;
38
+ export interface NetworkArm {
39
+ readonly ok: boolean;
40
+ readonly pid: string;
41
+ readonly reason: string;
42
+ }
43
+ export declare const NET_CAP_LINES = 2000;
44
+ export declare const NET_CAP_SECONDS = 900;
45
+ export declare function armNetwork(shell: DshShell, command: string, session: string, file: string): Promise<NetworkArm>;
46
+ export declare function stopNetwork(shell: DshShell, session: string, file: string): Promise<boolean>;
47
+ export declare function readNetwork(shell: DshShell, file: string, lines: number): Promise<readonly Record<string, unknown>[]>;
@@ -0,0 +1,47 @@
1
+ import type { DshShell } from '@dsh-workbench/shared';
2
+ import { type PngRect } from '../../../shared/api/host/png-crop';
3
+ import { type CardView, type PickRequest } from './diy-scripts';
4
+ export declare const LOOK_TIMEOUT_MS = 30000;
5
+ export interface BrowserStep {
6
+ readonly ok: boolean;
7
+ readonly stdout: string;
8
+ readonly stderr: string;
9
+ readonly exitCode: number | null;
10
+ readonly timedOut: boolean;
11
+ }
12
+ export declare function runBrowserStep(shell: DshShell, command: string, argv: readonly string[], timeoutMs?: number): Promise<BrowserStep>;
13
+ export declare function jsonOf(raw: string): Record<string, unknown> | undefined;
14
+ export declare function textOf(value: unknown): string;
15
+ export interface BoundTab {
16
+ readonly ok: boolean;
17
+ readonly url: string;
18
+ readonly title: string;
19
+ readonly reason: string;
20
+ }
21
+ export declare function bindCurrentTab(shell: DshShell, command: string, session: string): Promise<BoundTab>;
22
+ export interface WorkbenchPage {
23
+ readonly ok: boolean;
24
+ readonly url: string;
25
+ readonly title: string;
26
+ }
27
+ export declare function workbenchPageOf(shell: DshShell, command: string, session: string): Promise<WorkbenchPage>;
28
+ export declare function writeShotsDir(shell: DshShell, dir: string): Promise<boolean>;
29
+ export interface PageHandshake {
30
+ readonly ok: boolean;
31
+ readonly bound: boolean;
32
+ readonly page: WorkbenchPage;
33
+ readonly reason: string;
34
+ }
35
+ export declare function readyPageOf(shell: DshShell, command: string, session: string): Promise<PageHandshake>;
36
+ export declare function measureCard(shell: DshShell, command: string, session: string, unit: string, pick: PickRequest): Promise<CardView>;
37
+ export interface Shot {
38
+ readonly ok: boolean;
39
+ readonly file: string;
40
+ readonly width: number;
41
+ readonly height: number;
42
+ readonly cropped: boolean;
43
+ readonly reason: string;
44
+ }
45
+ export declare function insideViewportOf(view: CardView): boolean;
46
+ export declare function deviceRectOf(view: CardView): PngRect;
47
+ export declare function shootCard(shell: DshShell, command: string, session: string, unit: string, file: string, view: CardView): Promise<Shot>;
@@ -0,0 +1,102 @@
1
+ import type { DshHostContext, DshToolRunContext } from '@dsh-workbench/shared';
2
+ import { type BrowserFindResult, type BrowserReadResult } from '@dsh-workbench/shared/host';
3
+ import type { BundleChange } from '../../../shared/api/bundle-install';
4
+ import type { PanelsService } from './service';
5
+ export declare const OUTPUT_SCHEMA: {
6
+ type: string;
7
+ properties: {
8
+ text: {
9
+ type: string;
10
+ };
11
+ workshop: {
12
+ type: string;
13
+ };
14
+ modules: {
15
+ type: string;
16
+ items: {
17
+ type: string;
18
+ additionalProperties: boolean;
19
+ };
20
+ };
21
+ unit: {
22
+ type: string;
23
+ };
24
+ path: {
25
+ type: string;
26
+ };
27
+ install: {
28
+ type: string;
29
+ additionalProperties: boolean;
30
+ };
31
+ alreadyInstalled: {
32
+ type: string;
33
+ };
34
+ panel: {
35
+ type: string;
36
+ additionalProperties: boolean;
37
+ };
38
+ };
39
+ additionalProperties: boolean;
40
+ };
41
+ export declare const OUTPUT: {
42
+ schema: {
43
+ type: string;
44
+ properties: {
45
+ text: {
46
+ type: string;
47
+ };
48
+ workshop: {
49
+ type: string;
50
+ };
51
+ modules: {
52
+ type: string;
53
+ items: {
54
+ type: string;
55
+ additionalProperties: boolean;
56
+ };
57
+ };
58
+ unit: {
59
+ type: string;
60
+ };
61
+ path: {
62
+ type: string;
63
+ };
64
+ install: {
65
+ type: string;
66
+ additionalProperties: boolean;
67
+ };
68
+ alreadyInstalled: {
69
+ type: string;
70
+ };
71
+ panel: {
72
+ type: string;
73
+ additionalProperties: boolean;
74
+ };
75
+ };
76
+ additionalProperties: boolean;
77
+ };
78
+ render: (_args: unknown, value: unknown) => {
79
+ type: string;
80
+ text: string;
81
+ }[];
82
+ };
83
+ export declare function asRecord(value: unknown): Record<string, unknown>;
84
+ export declare function asNumber(value: unknown): number | undefined;
85
+ export declare function asText(value: unknown): string;
86
+ export declare function plainJson<T>(value: T): T;
87
+ export declare function verdictOf(change: BundleChange): string;
88
+ export declare function renderProbe(out: BrowserReadResult): string;
89
+ export declare function renderFind(out: BrowserFindResult): string;
90
+ export declare function showOrReason(panels: PanelsService, unit: string, workspace: string | null): {
91
+ readonly ok: boolean;
92
+ readonly reason?: string;
93
+ };
94
+ export declare function workshopOf(ctx: DshHostContext, exec: DshToolRunContext): {
95
+ readonly packagesDir: string;
96
+ readonly workspace: string | null;
97
+ };
98
+ export declare function modulesOf(ctx: DshHostContext, packagesDir: string): {
99
+ installed: string[];
100
+ modules: readonly import("@/shared/api/host/diy-workshop").WorkshopModule[];
101
+ };
102
+ export declare function panelEntriesOf(panels: PanelsService, workspace: string | null): import("./config").PanelEntry[];
@@ -0,0 +1,18 @@
1
+ import type { DshHostContext, DshToolRegistry } from '@dsh-workbench/shared';
2
+ export declare const LOGS_ARM_SCRIPT: string;
3
+ export declare const LOGS_READ_SCRIPT: string;
4
+ export declare const LOGS_STOP_SCRIPT: string;
5
+ export interface LogLine {
6
+ readonly level: string;
7
+ readonly text: string;
8
+ readonly at: number;
9
+ }
10
+ export interface LogsRead {
11
+ readonly ok: boolean;
12
+ readonly code: string;
13
+ readonly seen: number;
14
+ readonly lines: readonly LogLine[];
15
+ }
16
+ export declare function logsReadOf(payload: Record<string, unknown> | undefined): LogsRead;
17
+ export declare function renderLogs(read: LogsRead): string;
18
+ export declare function registerLogTools(ctx: DshHostContext, tools: DshToolRegistry): readonly (() => void)[];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ import type { DshHostContext, DshToolRegistry } from '@dsh-workbench/shared';
2
+ import { type Shot } from './diy-browser';
3
+ import { type CardView, type PickRequest, type SlotFacts } from './diy-scripts';
4
+ export declare function registerLookTools(ctx: DshHostContext, tools: DshToolRegistry): readonly (() => void)[];
5
+ export declare function rgbOf(value: string): readonly [number, number, number] | undefined;
6
+ export declare function contrastOf(foreground: string, background: string): number | undefined;
7
+ export declare function styleLineOf(view: CardView, pick: PickRequest): string;
8
+ export declare function partsLineOf(view: CardView, pick: PickRequest): string;
9
+ export declare function slotText(slot: SlotFacts, width: number): string;
10
+ export declare function slotLineOf(view: CardView): string;
11
+ export declare function outlineText(view: CardView): string;
12
+ export declare function contrastLineOf(view: CardView): string;
13
+ export declare function renderLook(unit: string, view: CardView, shot: Shot, pick: PickRequest): string;
14
+ export declare function renderMissingCard(unit: string, cards: number, anchored: boolean): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { DshHostContext, DshToolRegistry } from '@dsh-workbench/shared';
2
+ export declare function nearestKeyOf(payload: Record<string, unknown> | undefined, key: string): string;
3
+ export declare function registerNetTools(ctx: DshHostContext, tools: DshToolRegistry): readonly (() => void)[];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { DshHostContext, DshShell, DshToolRunContext } from '@dsh-workbench/shared';
2
+ export interface PageHandle {
3
+ readonly packagesDir: string;
4
+ readonly unit: string;
5
+ readonly args: Record<string, unknown>;
6
+ readonly shell: DshShell;
7
+ readonly command: string;
8
+ readonly session: string;
9
+ readonly bound: boolean;
10
+ }
11
+ export interface PageOptions {
12
+ readonly requireWorkbench?: boolean | undefined;
13
+ readonly requireUnit?: boolean | undefined;
14
+ }
15
+ export declare function pageAt(ctx: DshHostContext, exec: DshToolRunContext, raw: unknown, options?: PageOptions): Promise<PageHandle>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ export declare const UNIT_PROP: {
2
+ type: string;
3
+ description: string;
4
+ };
5
+ export declare const SESSION_PROP: {
6
+ type: string;
7
+ description: string;
8
+ };
9
+ export declare function pageSchema(extra?: Record<string, unknown>, required?: readonly string[]): Record<string, unknown>;