@sparkelf/dsh-client-ui-skill-center 0.2.1-rc.2.3 → 0.2.2-alpha.2.2

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.
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The skill center's connector tab: one card per connector, its enable switch,
3
+ * and — while enabled — the capability rows this account may use.
4
+ *
5
+ * @module @sparkelf/dsh-client-ui-skill-center/client/ConnectorsTab
6
+ */
7
+ import type { ReactNode } from 'react';
8
+ import { type Connector, type ConnectorCapability, type ConnectorCatalogue } from './connectors.ts';
9
+ import type { SkillCenterLocaleKey } from './locales.ts';
10
+ /** What the tab currently knows about the catalogue. */
11
+ export type ConnectorLoadState = {
12
+ kind: 'loading';
13
+ } | {
14
+ kind: 'ready';
15
+ catalogue: ConnectorCatalogue;
16
+ } | {
17
+ kind: 'failed';
18
+ message: string;
19
+ };
20
+ /** The tab's render inputs. */
21
+ export interface ConnectorsTabProps {
22
+ state: ConnectorLoadState;
23
+ query: string;
24
+ /** `connectorId` or `connectorId:capabilityId` while a write is in flight. */
25
+ busyId: string | null;
26
+ t(key: SkillCenterLocaleKey): string;
27
+ onRetry(): void;
28
+ onToggleConnector(connector: Connector, enabled: boolean): void;
29
+ onToggleCapability(connector: Connector, capability: ConnectorCapability, enabled: boolean): void;
30
+ }
31
+ /**
32
+ * Render the connector tab body.
33
+ * @param props - catalogue state, search text, and the two write handlers.
34
+ * @returns the connector cards, or the loading/failure/empty status.
35
+ */
36
+ export declare function ConnectorsTab(props: ConnectorsTabProps): ReactNode;
37
+ //# sourceMappingURL=ConnectorsTab.d.ts.map
@@ -60,6 +60,21 @@ export interface ListPayload {
60
60
  groups: GroupPayload[];
61
61
  workspaces?: WorkspaceItem[];
62
62
  }
63
+ /** One plaza record returned by the sharing bridge. */
64
+ export interface PlazaSkill {
65
+ id: number;
66
+ name: string;
67
+ reviewStatus?: 'pending' | 'approved' | 'rejected';
68
+ visibility?: 'global' | 'department' | 'private';
69
+ departmentCode?: string;
70
+ departmentName?: string;
71
+ sharedByMe?: boolean;
72
+ reviewNote?: string;
73
+ updatedAt?: string;
74
+ }
75
+ /** The sharing bridge could not answer (503): show local/disabled, never fake a status. */
76
+ export declare class PlazaUnavailableError extends Error {
77
+ }
63
78
  /** One thrown API error carrying the host's message. */
64
79
  export declare class ApiError extends Error {
65
80
  }
@@ -103,6 +118,43 @@ export declare class SkillApi {
103
118
  * been told where the translations live (the route then answers `{}`).
104
119
  */
105
120
  translationProgress(): Promise<TranslationProgress | undefined>;
121
+ /** The caller's review role and department scope, from the DataOps bridge. */
122
+ reviewContext(): Promise<{
123
+ canReview?: boolean;
124
+ canReviewGlobal?: boolean;
125
+ departmentCode?: string | null;
126
+ departmentPath?: {
127
+ code: string;
128
+ name: string;
129
+ }[];
130
+ roleCodes?: string[];
131
+ primaryRole?: string;
132
+ }>;
133
+ /** The department tree, for administrators publishing to any department. */
134
+ departments(): Promise<{
135
+ code: string;
136
+ name: string;
137
+ parentCode?: string | null;
138
+ }[]>;
139
+ /**
140
+ * The plaza records this workspace holds (`mine=1`). A 503 means the
141
+ * sharing service is not active yet; the panel then renders every local
142
+ * skill as local with 上架 disabled.
143
+ */
144
+ plazaMine(): Promise<PlazaSkill[]>;
145
+ /** Publish one local skill. The name is the DataOps identity; no path/level leaves the workspace. */
146
+ plazaSubmit(payload: {
147
+ name: string;
148
+ description?: string;
149
+ instruction: string;
150
+ tags?: string[];
151
+ visibility?: 'global' | 'department' | 'private';
152
+ departmentCode?: string;
153
+ }): Promise<PlazaSkill>;
154
+ /** Stop sharing one plaza entry owned by this workspace. */
155
+ plazaUnshare(id: number): Promise<void>;
156
+ private readBody;
157
+ private errorOf;
106
158
  private request;
107
159
  }
108
160
  //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Connector catalogue for the skill center's fourth tab.
3
+ *
4
+ * A connector is a client-side description of one external system the profile
5
+ * can talk to: whether it is enabled, and which capabilities that account may
6
+ * use. The backend owns the authoritative list; this module only parses it and
7
+ * keeps a demo catalogue for profiles whose bridge has not shipped the route
8
+ * yet. Capability rows the account may not use are absent from the answer, so
9
+ * the UI never renders a disabled placeholder for a permission it lacks.
10
+ *
11
+ * @module @sparkelf/dsh-client-ui-skill-center/client/connectors
12
+ */
13
+ /** Same-origin route the host/DataOps bridge may serve the catalogue from. */
14
+ export declare const CONNECTORS_ROUTE = "/api/dsh-skill-center/connectors";
15
+ /** One capability a connector exposes to this account. */
16
+ export interface ConnectorCapability {
17
+ /** Stable id the backend uses, e.g. `approval.read`. */
18
+ id: string;
19
+ /** Name shown on the capability row. */
20
+ name: string;
21
+ /** One line explaining what the capability does. */
22
+ description?: string;
23
+ /** Whether the capability is currently on for this connector. */
24
+ enabled: boolean;
25
+ /**
26
+ * Whether this account may use the capability at all. A row with `false`
27
+ * is not rendered: hiding it is the product rule, not a disabled placeholder.
28
+ */
29
+ permitted: boolean;
30
+ /** Why the capability cannot be used right now (missing credential, no route). */
31
+ unavailableReason?: string;
32
+ }
33
+ /** One connector as the catalogue serves it. */
34
+ export interface Connector {
35
+ id: string;
36
+ name: string;
37
+ /** Vendor or system the connector talks to. */
38
+ vendor?: string;
39
+ description?: string;
40
+ enabled: boolean;
41
+ /** Whether the last connection attempt succeeded; absent means unknown. */
42
+ connected?: boolean;
43
+ /** Failure detail when the connector is enabled but not connected. */
44
+ error?: string;
45
+ capabilities: readonly ConnectorCapability[];
46
+ }
47
+ /** The catalogue plus whether it came from the demo fallback. */
48
+ export interface ConnectorCatalogue {
49
+ connectors: readonly Connector[];
50
+ demo: boolean;
51
+ }
52
+ /** The bridge does not serve the connector route (404/405/501/503). */
53
+ export declare class ConnectorUnavailableError extends Error {
54
+ }
55
+ /** The bridge answered but the request failed for another reason. */
56
+ export declare class ConnectorRequestError extends Error {
57
+ }
58
+ /** Write operations the tab performs. */
59
+ export interface ConnectorSource {
60
+ /** Read the whole catalogue. */
61
+ list(): Promise<readonly Connector[]>;
62
+ /** Enable or disable one connector, returning the refreshed catalogue. */
63
+ setEnabled(connectorId: string, enabled: boolean): Promise<readonly Connector[]>;
64
+ /** Toggle one capability, returning the refreshed catalogue. */
65
+ setCapability(connectorId: string, capabilityId: string, enabled: boolean): Promise<readonly Connector[]>;
66
+ }
67
+ /** Same-origin HTTP source for a backend that supplies the catalogue. */
68
+ export declare class HttpConnectorSource implements ConnectorSource {
69
+ private readonly route;
70
+ /**
71
+ * @param route - same-origin connector route; overridable for tests.
72
+ */
73
+ constructor(route?: string);
74
+ /** Read the catalogue. */
75
+ list(): Promise<readonly Connector[]>;
76
+ /** Enable or disable one connector. */
77
+ setEnabled(connectorId: string, enabled: boolean): Promise<readonly Connector[]>;
78
+ /** Toggle one capability. */
79
+ setCapability(connectorId: string, capabilityId: string, enabled: boolean): Promise<readonly Connector[]>;
80
+ private request;
81
+ private read;
82
+ }
83
+ /**
84
+ * Parse a catalogue answer. Both a bare array and `{ connectors: [...] }` are
85
+ * accepted, because a bridge may grow the wrapper for counts without breaking
86
+ * the older shape.
87
+ * @param value - decoded JSON body.
88
+ * @returns the connectors the body carries; empty when it carries none.
89
+ */
90
+ export declare function parseConnectorList(value: unknown): Connector[];
91
+ /** Capabilities this account may see; a `permitted: false` row never renders. */
92
+ export declare function visibleCapabilities(connector: Connector): readonly ConnectorCapability[];
93
+ /** How a connector card labels its current state. */
94
+ export type ConnectorState = 'disabled' | 'connected' | 'error';
95
+ /**
96
+ * Derive the card state from the catalogue row.
97
+ * @param connector - one catalogue row.
98
+ * @returns `disabled`, `connected`, or `error`.
99
+ */
100
+ export declare function connectorState(connector: Connector): ConnectorState;
101
+ /**
102
+ * The demo catalogue used when no bridge serves the route.
103
+ *
104
+ * It describes the connector this profile ships and one generic third-party
105
+ * connector, so the tab still demonstrates enable/disable, per-capability
106
+ * switches, a hidden no-permission capability, and an unavailable reason.
107
+ * @returns a fresh mutable copy on every call.
108
+ */
109
+ export declare function demoConnectors(): Connector[];
110
+ /**
111
+ * Read the catalogue, falling back to the demo rows when the bridge has no
112
+ * route. Any other failure propagates: a broken bridge is not "no connectors".
113
+ * @param source - the deployed source.
114
+ * @param demo - demo factory (tests pass a fixed list).
115
+ * @returns the catalogue and whether it is the demo fallback.
116
+ */
117
+ export declare function readConnectorCatalogue(source: ConnectorSource, demo?: () => Connector[]): Promise<ConnectorCatalogue>;
118
+ //# sourceMappingURL=connectors.d.ts.map
@@ -7,8 +7,15 @@
7
7
  /** Every string this plugin renders. */
8
8
  export interface SkillCenterLocale {
9
9
  'panel': string;
10
+ 'tab.label': string;
11
+ 'tab.builtin': string;
12
+ 'tab.personal': string;
13
+ 'tab.plaza': string;
14
+ 'tab.connectors': string;
10
15
  'search.placeholder': string;
16
+ 'search.connectorPlaceholder': string;
11
17
  'search.noMatches': string;
18
+ 'search.clear': string;
12
19
  'action.refresh': string;
13
20
  'action.create': string;
14
21
  'action.delete': string;
@@ -41,6 +48,50 @@ export interface SkillCenterLocale {
41
48
  'create.rootUser': string;
42
49
  'create.rootProject': string;
43
50
  'delete.confirm': string;
51
+ 'plaza.statusLocal': string;
52
+ 'plaza.statusPending': string;
53
+ 'plaza.statusApproved': string;
54
+ 'plaza.statusRejected': string;
55
+ 'plaza.sharedTag': string;
56
+ 'plaza.share': string;
57
+ 'plaza.resubmit': string;
58
+ 'plaza.unshare': string;
59
+ 'plaza.unavailable': string;
60
+ 'plaza.failed': string;
61
+ 'plaza.dialogTitle': string;
62
+ 'plaza.tags': string;
63
+ 'plaza.tagsPlaceholder': string;
64
+ 'plaza.instruction': string;
65
+ 'plaza.submit': string;
66
+ 'plaza.unshareConfirm': string;
67
+ 'plaza.reason': string;
68
+ 'plaza.contentLoading': string;
69
+ 'plaza.visibility': string;
70
+ 'plaza.visibilityGlobal': string;
71
+ 'plaza.visibilityDepartment': string;
72
+ 'plaza.visibilityPrivate': string;
73
+ 'plaza.department': string;
74
+ 'plaza.scopeForbidden': string;
75
+ 'plaza.scopeHintAdmin': string;
76
+ 'plaza.scopeHintUser': string;
77
+ 'plaza.sectionFallback': string;
78
+ 'connector.loading': string;
79
+ 'connector.failed': string;
80
+ 'connector.retry': string;
81
+ 'connector.demo': string;
82
+ 'connector.demoTag': string;
83
+ 'connector.enabled': string;
84
+ 'connector.disabled': string;
85
+ 'connector.connected': string;
86
+ 'connector.error': string;
87
+ 'connector.enable': string;
88
+ 'connector.disable': string;
89
+ 'connector.capabilities': string;
90
+ 'connector.noCapabilities': string;
91
+ 'connector.empty': string;
92
+ 'connector.noMatches': string;
93
+ 'connector.unavailable': string;
94
+ 'connector.busy': string;
44
95
  }
45
96
  /** Locale keys, for callers that resolve them dynamically. */
46
97
  export type SkillCenterLocaleKey = keyof SkillCenterLocale;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Skill-plaza sharing state shown on a local skill card.
3
+ *
4
+ * Sharing is owned by DataOps: the same-origin `dataops-managed` bridge talks
5
+ * to the backend with the workspace credential, and the backend enforces
6
+ * ownership/review. This module only maps a local skill name to the record the
7
+ * bridge reports, so the card can show 未共享 / 待审核 / 已上架 / 已驳回.
8
+ *
9
+ * @module @sparkelf/dsh-client-ui-skill-center/client/plaza
10
+ */
11
+ /** Review/publish state of one local skill in the plaza. */
12
+ export type PlazaStatus = 'local' | 'pending' | 'approved' | 'rejected';
13
+ /** One plaza record, as `GET /integrations/dataops/skill-plaza?mine=1` reports it. */
14
+ export interface PlazaSkill {
15
+ id: number;
16
+ name: string;
17
+ reviewStatus?: 'pending' | 'approved' | 'rejected';
18
+ visibility?: 'global' | 'department' | 'private';
19
+ departmentCode?: string;
20
+ departmentName?: string;
21
+ sharedByMe?: boolean;
22
+ reviewNote?: string;
23
+ updatedAt?: string;
24
+ }
25
+ /** The share state one local card should render. */
26
+ export interface PlazaShare {
27
+ status: PlazaStatus;
28
+ /** The plaza row, when one exists (needed for unshare and the review note). */
29
+ record?: PlazaSkill;
30
+ /** True when the record is shared by this workspace (shows 取消共享). */
31
+ sharedByMe: boolean;
32
+ }
33
+ /** Map one local skill name to its share state. */
34
+ export declare function shareOf(name: string, records: ReadonlyMap<string, PlazaSkill>): PlazaShare;
35
+ /** Whether a share state offers the 上架 / 重新提交 action. */
36
+ export declare function canSubmit(status: PlazaStatus): boolean;
37
+ //# sourceMappingURL=plaza.d.ts.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Review-filter and DataOps-identity helpers for the skill center.
3
+ *
4
+ * The host owns the persisted status; this module only decides how the panel
5
+ * shows it. Keeping the rules pure makes the default filter, the counts and
6
+ * the administrator gate unit-testable without React.
7
+ *
8
+ * @module @sparkelf/dsh-client-ui-skill-center/client/review
9
+ */
10
+ import type { SkillEntry, SkillReviewView } from './api.ts';
11
+ /** The three list filters. */
12
+ export type ReviewFilter = 'approved' | 'pending' | 'all';
13
+ /** Presentation-only identity the DataOps portal posts into the DSH iframe. */
14
+ export interface DataOpsIdentity {
15
+ username?: string;
16
+ displayName?: string;
17
+ }
18
+ /** Whether this identity may review skills (administrator / super administrator). */
19
+ export declare function isReviewAdmin(identity: DataOpsIdentity | undefined): boolean;
20
+ /**
21
+ * Read the identity the DataOps account plugin publishes.
22
+ *
23
+ * The plugin's documented diagnostic surface is `window.__DATAOPS_USER__`
24
+ * plus the `data-dataops-account-*` dataset attributes; the dataset is the
25
+ * fallback for the moment before the store's first paint.
26
+ */
27
+ export declare function readDataOpsIdentity(): DataOpsIdentity | undefined;
28
+ /** A row's review status, with the pre-review `pending` fallback. */
29
+ export declare function reviewStatusOf(skill: SkillEntry): NonNullable<SkillReviewView['status']>;
30
+ /** Whether one row belongs in a filter. */
31
+ export declare function matchesReviewFilter(skill: SkillEntry, filter: ReviewFilter): boolean;
32
+ /** Count rows per filter, for the tab labels. */
33
+ export declare function reviewCounts(groups: readonly {
34
+ skills: readonly SkillEntry[];
35
+ }[]): Record<ReviewFilter, number>;
36
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Visibility choices for publishing a skill to the plaza.
3
+ *
4
+ * DataOps owns roles and department membership; this module only maps the
5
+ * review-context answer to the options a given account may pick, and remembers
6
+ * the last choice per user. The backend still enforces every rule.
7
+ *
8
+ * @module @sparkelf/dsh-client-ui-skill-center/client/scope
9
+ */
10
+ /** Plaza visibility. */
11
+ export type PlazaVisibility = 'global' | 'department' | 'private';
12
+ /** Presentation-only DataOps identity used for the per-user memory key. */
13
+ export interface AccountIdentity {
14
+ id?: string;
15
+ username?: string;
16
+ displayName?: string;
17
+ }
18
+ /** Read the identity the dataops-account plugin publishes. */
19
+ export declare function readAccountIdentity(): AccountIdentity | undefined;
20
+ /** One department node. */
21
+ export interface Department {
22
+ code: string;
23
+ name: string;
24
+ parentCode?: string | null;
25
+ }
26
+ /** The subset of `/api/ai/review/context` this panel reads. */
27
+ export interface ReviewScope {
28
+ canReview?: boolean;
29
+ canReviewGlobal?: boolean;
30
+ departmentCode?: string | null;
31
+ departmentPath?: readonly Department[];
32
+ roleCodes?: readonly string[];
33
+ primaryRole?: string;
34
+ }
35
+ /** Who is publishing, from the backend's point of view. */
36
+ export type ScopeRole = 'admin' | 'dept-admin' | 'user';
37
+ /** The remembered visibility choice. */
38
+ export interface SavedScope {
39
+ visibility: PlazaVisibility;
40
+ departmentCode?: string;
41
+ }
42
+ /** Classify the caller: global review means super admin/admin; review means department admin. */
43
+ export declare function scopeRole(scope: ReviewScope | undefined): ScopeRole;
44
+ /** Visibilities this caller may select. */
45
+ export declare function allowedVisibilities(scope: ReviewScope | undefined): PlazaVisibility[];
46
+ /** Whether the caller belongs to a department (needed for department visibility). */
47
+ export declare function hasDepartment(scope: ReviewScope | undefined): boolean;
48
+ /** First-run default: admins publish globally, everyone else to their department, else private. */
49
+ export declare function defaultVisibility(scope: ReviewScope | undefined): PlazaVisibility;
50
+ /** The caller's own department code. */
51
+ export declare function ownDepartment(scope: ReviewScope | undefined): string | undefined;
52
+ /**
53
+ * Coerce a remembered choice into one this caller may still make.
54
+ *
55
+ * A saved global choice is dropped for a non-admin; a saved department code is
56
+ * kept only when it is the caller's own department (department admins/users)
57
+ * or still present in the admin's fetched department list.
58
+ */
59
+ export declare function sanitizeChoice(saved: SavedScope | undefined, scope: ReviewScope | undefined, departments?: readonly Department[]): SavedScope;
60
+ /** localStorage key, per DataOps user. */
61
+ export declare function scopeStorageKey(identity: {
62
+ id?: string;
63
+ username?: string;
64
+ } | undefined): string;
65
+ /** Read a remembered choice (invalid JSON is treated as no choice). */
66
+ export declare function readSavedScope(storage: Pick<Storage, 'getItem'>, key: string): SavedScope | undefined;
67
+ /** Persist one choice. */
68
+ export declare function writeSavedScope(storage: Pick<Storage, 'setItem'>, key: string, choice: SavedScope): void;
69
+ //# sourceMappingURL=scope.d.ts.map
package/package.json CHANGED
@@ -1,20 +1,28 @@
1
1
  {
2
+ "name": "@sparkelf/dsh-client-ui-skill-center",
3
+ "version": "0.2.2-alpha.2.2",
2
4
  "description": "Skill center for the dsh web client: browses loaded skills grouped by source, enables or disables model invocation, creates skills, and deletes them into a recoverable trash",
3
- "devDependencies": {
4
- "@deepseek-ai/cordis": "^4.0.2",
5
- "@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.1",
6
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.6-alpha.1",
7
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.1",
8
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.1",
9
- "@deepseek-ai/dsh-client-ui-sidebar": "^0.1.6-alpha.1",
10
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.1",
11
- "@deepseek-ai/dsh-host-webserver": "^0.1.6-alpha.1",
12
- "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
13
- "@deepseek-ai/dsh-skill": "^0.1.6-alpha.1",
14
- "@types/react": "~18.3.1",
15
- "@types/react-dom": "~18.3.0",
16
- "react": "^18.2.0",
17
- "react-dom": "^18.2.0"
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
11
+ "directory": "packages/plus/ui-skill-center"
12
+ },
13
+ "type": "module",
14
+ "main": "lib/index.js",
15
+ "types": "lib/types/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./lib/types/index.d.ts",
19
+ "default": "./lib/index.js"
20
+ },
21
+ "./client": {
22
+ "types": "./lib/types/client/index.d.ts",
23
+ "default": "./lib/client.js"
24
+ },
25
+ "./package.json": "./package.json"
18
26
  },
19
27
  "dsh": {
20
28
  "client": {
@@ -25,16 +33,9 @@
25
33
  "platform": "web"
26
34
  }
27
35
  },
28
- "exports": {
29
- ".": {
30
- "default": "./lib/index.js",
31
- "types": "./lib/types/index.d.ts"
32
- },
33
- "./client": {
34
- "default": "./lib/client.js",
35
- "types": "./lib/types/client/index.d.ts"
36
- },
37
- "./package.json": "./package.json"
36
+ "scripts": {
37
+ "bundle": "tsdown",
38
+ "watch": "tsdown --watch"
38
39
  },
39
40
  "files": [
40
41
  "lib/index.js",
@@ -42,24 +43,23 @@
42
43
  "lib/types/**/*.d.ts"
43
44
  ],
44
45
  "license": "MIT",
45
- "main": "lib/index.js",
46
- "name": "@sparkelf/dsh-client-ui-skill-center",
47
46
  "peerDependencies": {
48
47
  "@deepseek-ai/cordis": ">=4.0.1"
49
48
  },
50
- "publishConfig": {
51
- "access": "public"
52
- },
53
- "repository": {
54
- "directory": "packages/plus/ui-skill-center",
55
- "type": "git",
56
- "url": "git+https://github.com/deepseek-ai/deepseek-harness.git"
57
- },
58
- "scripts": {
59
- "bundle": "tsdown",
60
- "watch": "tsdown --watch"
61
- },
62
- "type": "module",
63
- "types": "lib/types/index.d.ts",
64
- "version": "0.2.1-rc.2.3"
49
+ "devDependencies": {
50
+ "@deepseek-ai/cordis": "workspace:^",
51
+ "@deepseek-ai/dsh-client-locale": "workspace:^",
52
+ "@deepseek-ai/dsh-client-ui-layout": "workspace:^",
53
+ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
54
+ "@deepseek-ai/dsh-client-ui-renderer": "workspace:^",
55
+ "@deepseek-ai/dsh-client-ui-sidebar": "workspace:^",
56
+ "@deepseek-ai/dsh-client-ui-slots": "workspace:^",
57
+ "@deepseek-ai/dsh-host-webserver": "workspace:^",
58
+ "@deepseek-ai/dsh-session": "workspace:^",
59
+ "@deepseek-ai/dsh-skill": "workspace:^",
60
+ "@types/react": "~18.3.1",
61
+ "@types/react-dom": "~18.3.0",
62
+ "react": "^18.2.0",
63
+ "react-dom": "^18.2.0"
64
+ }
65
65
  }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 DeepSeek
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.