@huanlin/dsh-plugin-aigc-canvas 0.1.0 → 0.1.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.
- package/README.md +54 -111
- package/lib/canvas-registry.d.ts +142 -0
- package/lib/client.js +49 -1674
- package/lib/client.js.map +1 -1
- package/lib/config.d.ts +77 -0
- package/lib/context-types.d.ts +120 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.js +832 -5917
- package/lib/invariant.d.ts +15 -0
- package/lib/invariant.js +2 -2
- package/lib/media-edit.d.ts +38 -0
- package/lib/provider-http.d.ts +81 -0
- package/lib/provider-store.d.ts +50 -0
- package/lib/tools.d.ts +47 -0
- package/lib/trust-fence.d.ts +25 -0
- package/lib/wire.d.ts +41 -0
- package/package.json +24 -29
- package/LICENSE +0 -664
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package-owned invariant companion for `@dsh-external/dsh-aigc-canvas`.
|
|
3
|
+
* @module @dsh-external/dsh-aigc-canvas/invariant
|
|
4
|
+
*/
|
|
5
|
+
import type { Context } from './context-types.js';
|
|
6
|
+
/** Cordis companion plugin name. */
|
|
7
|
+
export declare const name = "dsh-aigc-canvas-invariant";
|
|
8
|
+
/** Service required before the companion can reserve package ownership. */
|
|
9
|
+
export declare const inject: string[];
|
|
10
|
+
/**
|
|
11
|
+
* Register this package's invariant companion.
|
|
12
|
+
* @param ctx - Cordis context carrying the invariant service.
|
|
13
|
+
* @returns the installed registration's disposer after setup succeeds.
|
|
14
|
+
*/
|
|
15
|
+
export declare const apply: (ctx: Context) => Promise<() => void>;
|
package/lib/invariant.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/invariant.ts
|
|
2
|
-
const PACKAGE_NAME = "@
|
|
2
|
+
const PACKAGE_NAME = "@dsh-external/dsh-aigc-canvas";
|
|
3
3
|
/** Cordis companion plugin name. */
|
|
4
4
|
const name = "dsh-aigc-canvas-invariant";
|
|
5
5
|
/** Service required before the companion can reserve package ownership. */
|
|
@@ -7,7 +7,7 @@ const inject = ["invariants"];
|
|
|
7
7
|
/**
|
|
8
8
|
* No runtime invariant: the canvas owns no service state or event protocol
|
|
9
9
|
* of its own beyond the registry's own assertions (uuid existence, kind
|
|
10
|
-
* checks) — every route is mounted under the host's
|
|
10
|
+
* checks) — every route is mounted under the host's httpServer fence, the
|
|
11
11
|
* element table is exercised by the smoke spec, and the client view is a
|
|
12
12
|
* pure projection of the host state.
|
|
13
13
|
*/
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** The operations the tool supports. */
|
|
2
|
+
export type MediaEditOperation = 'concat' | 'clip' | 'extract_audio' | 'extract_frame' | 'speed' | 'resize' | 'reverse' | 'add_audio' | 'images_to_video';
|
|
3
|
+
/** All operations as a readonly array (for schema enum + validation). */
|
|
4
|
+
export declare const MEDIA_EDIT_OPERATIONS: readonly MediaEditOperation[];
|
|
5
|
+
/** One operation request (already validated by the tool layer). */
|
|
6
|
+
export interface MediaEditRequest {
|
|
7
|
+
operation: MediaEditOperation;
|
|
8
|
+
inputs: string[];
|
|
9
|
+
outputExt: string;
|
|
10
|
+
start?: number;
|
|
11
|
+
end?: number;
|
|
12
|
+
duration?: number;
|
|
13
|
+
speed?: number;
|
|
14
|
+
width?: number;
|
|
15
|
+
height?: number;
|
|
16
|
+
fps?: number;
|
|
17
|
+
timestamp?: number;
|
|
18
|
+
}
|
|
19
|
+
/** Result of a successful media edit. */
|
|
20
|
+
export interface MediaEditResult {
|
|
21
|
+
outputPath: string;
|
|
22
|
+
operation: MediaEditOperation;
|
|
23
|
+
durationMs: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Execute one media edit operation. Builds the ffmpeg argv, runs it, and
|
|
27
|
+
* writes the output to the canvas directory.
|
|
28
|
+
*
|
|
29
|
+
* @param request - the validated operation request.
|
|
30
|
+
* @param cwd - the session cwd (canvas dir = cwd/.dsh-aigc-canvas/sessionId/).
|
|
31
|
+
* @param sessionId - the session id (for the canvas dir path).
|
|
32
|
+
* @param opts - timeout + abort signal.
|
|
33
|
+
* @returns the output file path and timing info.
|
|
34
|
+
*/
|
|
35
|
+
export declare function executeMediaEdit(request: MediaEditRequest, cwd: string, sessionId: string, opts: {
|
|
36
|
+
timeoutMs: number;
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}): Promise<MediaEditResult>;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic HTTP executor for one provider: the `aigc_http_request` tool's
|
|
3
|
+
* engine. Builds the request URL from the provider endpoint + a relative
|
|
4
|
+
* path, attaches the apiKey per the provider's `auth` config (default
|
|
5
|
+
* `Authorization: Bearer <key>`), and runs it with a bounded timeout.
|
|
6
|
+
*
|
|
7
|
+
* Security boundary:
|
|
8
|
+
* - Only relative request paths are allowed (`/foo/bar`), never absolute
|
|
9
|
+
* URLs — every request stays on the provider's configured endpoint.
|
|
10
|
+
* - The apiKey never enters the tool output; only the response does.
|
|
11
|
+
*
|
|
12
|
+
* Stub mode: when the endpoint is `stub://aigc-backend` (or empty), the
|
|
13
|
+
* executor returns synthetic media so the whole flow (http → file → place)
|
|
14
|
+
* can be exercised without a real API. The stub media kind is inferred from
|
|
15
|
+
* the request path / body (image/video/audio), defaulting to JSON text.
|
|
16
|
+
*/
|
|
17
|
+
import type { ResolvedAigcProvider } from './config.js';
|
|
18
|
+
/** Binary kinds the executor can hand back (for canvas placement). */
|
|
19
|
+
export type ProviderBinaryKind = 'image' | 'video' | 'audio' | 'other';
|
|
20
|
+
/** Text response kinds (inline for the model). */
|
|
21
|
+
export type ProviderTextKind = 'json' | 'text';
|
|
22
|
+
/** One raw request the model wants to send to the provider API. */
|
|
23
|
+
export interface ProviderHttpRequest {
|
|
24
|
+
/** HTTP method (default GET). */
|
|
25
|
+
method?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Path relative to the provider endpoint, e.g. `/v1/images/generations`.
|
|
28
|
+
* Must start with `/`.
|
|
29
|
+
*
|
|
30
|
+
* Absolute URLs are also accepted, but only when same-origin with the
|
|
31
|
+
* provider's configured endpoint (same protocol + host + port). This lets
|
|
32
|
+
* the model fetch provider-returned download URLs (e.g. video result URLs)
|
|
33
|
+
* that require the provider's auth, without opening an SSRF surface.
|
|
34
|
+
*/
|
|
35
|
+
path: string;
|
|
36
|
+
/** Extra request headers (may not override the auth header). */
|
|
37
|
+
headers?: Record<string, string>;
|
|
38
|
+
/** Raw request body (string, typically JSON). */
|
|
39
|
+
body?: string;
|
|
40
|
+
/** URL query params to append (merged with any auth query param). */
|
|
41
|
+
query?: Record<string, string>;
|
|
42
|
+
}
|
|
43
|
+
/** A successful binary response (persisted by the caller). */
|
|
44
|
+
export interface ProviderHttpBinary {
|
|
45
|
+
ok: true;
|
|
46
|
+
status: number;
|
|
47
|
+
kind: ProviderBinaryKind;
|
|
48
|
+
contentType: string;
|
|
49
|
+
bytes: Buffer;
|
|
50
|
+
/** Bytes length (the caller's file size). */
|
|
51
|
+
size: number;
|
|
52
|
+
}
|
|
53
|
+
/** A successful text response (embedded inline for the model). */
|
|
54
|
+
export interface ProviderHttpText {
|
|
55
|
+
ok: true;
|
|
56
|
+
status: number;
|
|
57
|
+
kind: ProviderTextKind;
|
|
58
|
+
contentType: string;
|
|
59
|
+
text: string;
|
|
60
|
+
}
|
|
61
|
+
/** A failed response (non-2xx): the body is surfaced so the model can adapt. */
|
|
62
|
+
export interface ProviderHttpFailure {
|
|
63
|
+
ok: false;
|
|
64
|
+
status: number;
|
|
65
|
+
contentType: string;
|
|
66
|
+
/** Truncated response body (UTF-8) for the model to read. */
|
|
67
|
+
text: string;
|
|
68
|
+
}
|
|
69
|
+
export type ProviderHttpResult = ProviderHttpBinary | ProviderHttpText | ProviderHttpFailure;
|
|
70
|
+
/**
|
|
71
|
+
* Cap on inline text responses. The model-facing tool result is size-
|
|
72
|
+
* limited by the host framework (very small — a few hundred chars), so
|
|
73
|
+
* anything larger is saved to disk and the model gets a file_path with a
|
|
74
|
+
* short preview instead.
|
|
75
|
+
*/
|
|
76
|
+
export declare const INLINE_TEXT_CAP = 2000;
|
|
77
|
+
/** Execute one request against the provider (or the built-in stub). */
|
|
78
|
+
export declare function executeProviderRequest(provider: ResolvedAigcProvider, request: ProviderHttpRequest, opts: {
|
|
79
|
+
timeoutMs: number;
|
|
80
|
+
signal?: AbortSignal;
|
|
81
|
+
}): Promise<ProviderHttpResult>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AigcProvider, ResolvedAigcProvider } from './config.js';
|
|
2
|
+
/** CRUD result: the success branch carries the latest list. */
|
|
3
|
+
export type ProviderMutationResult = {
|
|
4
|
+
readonly ok: true;
|
|
5
|
+
readonly providers: readonly ResolvedAigcProvider[];
|
|
6
|
+
} | {
|
|
7
|
+
readonly ok: false;
|
|
8
|
+
readonly error: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Mutable provider store. Owns the canonical provider list; the backend
|
|
12
|
+
* client map and RPC handlers share one instance per plugin fiber.
|
|
13
|
+
*
|
|
14
|
+
* Persistence: on construction the store loads `~/.dsh/aigc-canvas/
|
|
15
|
+
* providers.json` (if present) and merges it over the cordis.yml seed —
|
|
16
|
+
* persisted providers win, so user edits and deletions survive restarts.
|
|
17
|
+
* Every mutation writes the list back to disk (fire-and-forget).
|
|
18
|
+
*/
|
|
19
|
+
export declare class ProviderStore {
|
|
20
|
+
private readonly providers;
|
|
21
|
+
private readonly dataPath;
|
|
22
|
+
/** Serializes disk writes so rapid mutations can't interleave. */
|
|
23
|
+
private persistChain;
|
|
24
|
+
constructor(seed: readonly AigcProvider[], dataPath?: string);
|
|
25
|
+
/** Snapshot of all providers, in insertion order. */
|
|
26
|
+
list(): readonly ResolvedAigcProvider[];
|
|
27
|
+
/** Look up one provider by id. */
|
|
28
|
+
get(id: string): ResolvedAigcProvider | undefined;
|
|
29
|
+
/** The default provider (first in insertion order); undefined if empty. */
|
|
30
|
+
defaultProvider(): ResolvedAigcProvider | undefined;
|
|
31
|
+
/** Add a new provider. Returns failure for duplicate id or invalid shape. */
|
|
32
|
+
add(provider: AigcProvider): ProviderMutationResult;
|
|
33
|
+
/** Update an existing provider. Returns failure if the id is unknown. */
|
|
34
|
+
update(provider: AigcProvider): ProviderMutationResult;
|
|
35
|
+
/**
|
|
36
|
+
* Replace a provider's usage instructions (called by the model's
|
|
37
|
+
* aigc_provider_set_instructions tool after it probes the API).
|
|
38
|
+
*/
|
|
39
|
+
setInstructions(id: string, instructions: string): ProviderMutationResult;
|
|
40
|
+
/** Remove a provider. Returns failure for unknown id. */
|
|
41
|
+
remove(id: string): ProviderMutationResult;
|
|
42
|
+
/**
|
|
43
|
+
* Persist the current provider list to disk (fire-and-forget, serialized).
|
|
44
|
+
* Only the user-editable fields are written; `builtin` is re-derived from
|
|
45
|
+
* the seed on load. Failures are swallowed — the in-memory state stays
|
|
46
|
+
* canonical. Each call snapshots the CURRENT list, so a burst of mutations
|
|
47
|
+
* ends with the latest state on disk.
|
|
48
|
+
*/
|
|
49
|
+
private persist;
|
|
50
|
+
}
|
package/lib/tools.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Context } from './context-types.js';
|
|
2
|
+
import type { ResolvedAigcProvider } from './config.js';
|
|
3
|
+
import type { AigcElement, AigcCanvasService } from './canvas-registry.js';
|
|
4
|
+
/** Truncate a prompt to a short title (first line, capped). */
|
|
5
|
+
declare function titleOf(prompt: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* The model-facing shape of one element (no internal uuid, no media bytes).
|
|
8
|
+
* The `filePath` is the primary identifier the agent uses to reference
|
|
9
|
+
* the element in subsequent tool calls; `x`/`y` are the canvas position.
|
|
10
|
+
*/
|
|
11
|
+
declare function elementProjection(el: AigcElement): Record<string, unknown>;
|
|
12
|
+
/** Edge projection: resolve uuids to filePaths so the agent can read the graph. */
|
|
13
|
+
declare function edgeProjection(edge: {
|
|
14
|
+
source: string;
|
|
15
|
+
target: string;
|
|
16
|
+
}, lookup: (uuid: string) => AigcElement): {
|
|
17
|
+
source: string;
|
|
18
|
+
target: string;
|
|
19
|
+
};
|
|
20
|
+
/** Info about one provider (for the aigc_get_provider_info tool output). */
|
|
21
|
+
export interface ProviderInfo {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
endpoint: string;
|
|
25
|
+
instructions: string;
|
|
26
|
+
isStub: boolean;
|
|
27
|
+
isDefault: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Register the seven tools against the host tool registry.
|
|
31
|
+
*
|
|
32
|
+
* @param ctx - host plugin context (carries the tools service).
|
|
33
|
+
* @param getProvider - live provider getter (takes optional provider id).
|
|
34
|
+
* @param setInstructions - persists usage instructions for one provider (the host's ProviderStore).
|
|
35
|
+
* @param listProviders - returns info for all providers (for aigc_get_provider_info).
|
|
36
|
+
* @param canvas - the canvas registry service (host-owned state).
|
|
37
|
+
* @param resolveCwd - live cwd resolver for one session id.
|
|
38
|
+
* @param getTimeoutMs - live per-request timeout for aigc_http_request.
|
|
39
|
+
* @param getMediaLimit - live cap on bytes the http tool may write to disk.
|
|
40
|
+
* @returns a disposer that unregisters all tools.
|
|
41
|
+
*/
|
|
42
|
+
export declare function registerTools(ctx: Context, getProvider: (providerId?: string) => ResolvedAigcProvider, setInstructions: (id: string, instructions: string) => {
|
|
43
|
+
ok: boolean;
|
|
44
|
+
error?: string;
|
|
45
|
+
}, listProviders: () => readonly ProviderInfo[], canvas: AigcCanvasService, resolveCwd: (sessionId: string) => string, getTimeoutMs: () => number, getMediaLimit?: () => number): () => void;
|
|
46
|
+
/** Re-export the projection helpers for the unit tests. */
|
|
47
|
+
export { elementProjection, edgeProjection, titleOf };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-trust fence for the aigc-canvas routes, behaviorally identical to
|
|
3
|
+
* the /api gateway's fence in @deepseek-ai/dsh-client-connection
|
|
4
|
+
* (src/api-request-trust.ts + src/loopback-hostname.ts, BSD-3-Clause,
|
|
5
|
+
* copied verbatim from dsh-better-sidebar's src/trust-fence.ts because the
|
|
6
|
+
* package does not export these helpers and the plugin must not depend on
|
|
7
|
+
* its internals). Host-header loopback or a configured trusted authority
|
|
8
|
+
* passes; cross-site browser markers refuse. This is a DNS-rebinding /
|
|
9
|
+
* cross-site defense, not authentication.
|
|
10
|
+
*/
|
|
11
|
+
import type { IncomingHttpHeaders } from 'node:http';
|
|
12
|
+
/** The request facts the fence reads (structural subset of IncomingMessage). */
|
|
13
|
+
interface ApiTrustRequest {
|
|
14
|
+
headers: IncomingHttpHeaders;
|
|
15
|
+
}
|
|
16
|
+
/** Whether a normalized URL hostname names the local loopback authority. */
|
|
17
|
+
export declare function isLoopbackHostname(hostname: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Decide whether one aigc-canvas request may reach the plugin routes.
|
|
20
|
+
* @param request - node HTTP request facts (headers).
|
|
21
|
+
* @param trustedHosts - non-loopback authorities this deployment serves.
|
|
22
|
+
* @returns true when the Host is ours (loopback or trusted) and browser markers are same-origin.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isTrustedApiRequest(request: ApiTrustRequest, trustedHosts: readonly string[]): boolean;
|
|
25
|
+
export {};
|
package/lib/wire.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire helpers for the /aigc-canvas JSON API: bounded body reading, response
|
|
3
|
+
* writing, and the shared error envelope. Every API method returns
|
|
4
|
+
* `{ ok: true, value }` on success and `{ ok: false, error: { code, message } }`
|
|
5
|
+
* (HTTP 4xx/5xx matching the code) on failure — mirrors better-sidebar's
|
|
6
|
+
* `/sidebar/api/*` envelope so the client-side fetch helper is identical.
|
|
7
|
+
*/
|
|
8
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
9
|
+
/** Machine-readable error codes of the canvas API. */
|
|
10
|
+
export type AigcErrorCode = 'bad-request' | 'not-found' | 'forbidden' | 'method-error' | 'fs-error' | 'backend-error' | 'internal';
|
|
11
|
+
/** One API failure with its wire code and HTTP status. */
|
|
12
|
+
export declare class AigcError extends Error {
|
|
13
|
+
readonly code: AigcErrorCode;
|
|
14
|
+
readonly status: number;
|
|
15
|
+
constructor(code: AigcErrorCode, message: string, status?: number);
|
|
16
|
+
}
|
|
17
|
+
/** Success envelope of one API method. */
|
|
18
|
+
export interface AigcOk<T> {
|
|
19
|
+
ok: true;
|
|
20
|
+
value: T;
|
|
21
|
+
}
|
|
22
|
+
/** Failure envelope of one API method. */
|
|
23
|
+
export interface AigcErr {
|
|
24
|
+
ok: false;
|
|
25
|
+
error: {
|
|
26
|
+
code: AigcErrorCode;
|
|
27
|
+
message: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Read and parse the JSON request body (bounded; malformed → bad-request). */
|
|
31
|
+
export declare function readJsonBody(req: IncomingMessage): Promise<unknown>;
|
|
32
|
+
/** Write a JSON response with the given status. */
|
|
33
|
+
export declare function writeJson(res: ServerResponse, status: number, body: unknown): void;
|
|
34
|
+
/** Write the success envelope. */
|
|
35
|
+
export declare function writeOk(res: ServerResponse, value: unknown): void;
|
|
36
|
+
/** Write the failure envelope for any thrown value (unknown → internal 500). */
|
|
37
|
+
export declare function writeError(res: ServerResponse, error: unknown): void;
|
|
38
|
+
/** Narrow an unknown payload value to a string, else throw bad-request. */
|
|
39
|
+
export declare function requireString(payload: unknown, key: string): string;
|
|
40
|
+
/** Narrow an unknown payload value to an array of strings (default [] when absent). */
|
|
41
|
+
export declare function optionalStringArray(payload: unknown, key: string): string[];
|
package/package.json
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@huanlin/dsh-plugin-aigc-canvas",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"
|
|
5
|
-
"access": "public"
|
|
6
|
-
},
|
|
7
|
-
"keywords": ["dsh-plugin"],
|
|
8
|
-
"description": "DSH plugin: provider-agnostic AIGC HTTP bridge + free canvas + ffmpeg post-processing. Exposes aigc_get_provider_info / aigc_http_request (endpoint + apiKey auto-attached) / aigc_provider_set_instructions / aigc_provider_get_instructions / aigc_canvas_place / aigc_canvas_link / aigc_canvas_unlink / aigc_canvas_list_elements / aigc_media_edit tools; generated files are placed at arbitrary canvas positions and can be double-clicked for prompt + params.",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "DSH plugin: an infinite free canvas for the better-sidebar plus provider-agnostic generation. Exposes aigc_get_provider_info / aigc_http_request (endpoint + apiKey auto-attached) / aigc_provider_set_instructions / aigc_canvas_place / aigc_canvas_link / aigc_canvas_unlink / aigc_canvas_list_elements tools; generated files are placed at arbitrary canvas positions and can be double-clicked for prompt + params.",
|
|
9
5
|
"type": "module",
|
|
10
|
-
"license": "
|
|
6
|
+
"license": "MIT",
|
|
11
7
|
"main": "./lib/index.js",
|
|
12
8
|
"types": "./lib/index.d.ts",
|
|
13
9
|
"exports": {
|
|
@@ -59,24 +55,23 @@
|
|
|
59
55
|
"test:watch": "vitest",
|
|
60
56
|
"build": "tsdown --config tsdown.config.ts && tsc -p tsconfig.build.json",
|
|
61
57
|
"bundle:client": "tsdown --config tsdown.config.ts",
|
|
62
|
-
"watch": "tsdown --config tsdown.config.ts --watch"
|
|
63
|
-
"prepare": "tsdown --config tsdown.prepare.config.ts"
|
|
58
|
+
"watch": "tsdown --config tsdown.config.ts --watch"
|
|
64
59
|
},
|
|
65
60
|
"dependencies": {
|
|
66
61
|
"schemastery": "^3.18.0",
|
|
67
62
|
"ws": "^8.18.0"
|
|
68
63
|
},
|
|
69
64
|
"peerDependencies": {
|
|
70
|
-
"@deepseek-ai/dsh-client-locale": "^0.0.1
|
|
71
|
-
"@deepseek-ai/dsh-client-runtime": "^0.0.1
|
|
72
|
-
"@deepseek-ai/dsh-client-ui-primitives": "^0.0.1
|
|
73
|
-
"@deepseek-ai/dsh-client-ui-settings": "^0.0.1
|
|
74
|
-
"@deepseek-ai/dsh-client-ui-conversation": "^0.0.1
|
|
75
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.0.1
|
|
76
|
-
"@deepseek-ai/dsh-host-webserver": "^0.0.1
|
|
77
|
-
"@deepseek-ai/dsh-invariants": "^0.0.1
|
|
78
|
-
"@deepseek-ai/dsh-session": "^0.0.1
|
|
79
|
-
"@deepseek-ai/dsh-tools": "^0.0.1
|
|
65
|
+
"@deepseek-ai/dsh-client-locale": "^0.0.1",
|
|
66
|
+
"@deepseek-ai/dsh-client-runtime": "^0.0.1",
|
|
67
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.0.1",
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.0.1",
|
|
69
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.0.1",
|
|
70
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.0.1",
|
|
71
|
+
"@deepseek-ai/dsh-host-webserver": "^0.0.1",
|
|
72
|
+
"@deepseek-ai/dsh-invariants": "^0.0.1",
|
|
73
|
+
"@deepseek-ai/dsh-session": "^0.0.1",
|
|
74
|
+
"@deepseek-ai/dsh-tools": "^0.0.1",
|
|
80
75
|
"cordis": "^4.0.0-rc.7",
|
|
81
76
|
"dsh-better-sidebar": "^0.4.0",
|
|
82
77
|
"react": "^18.2.0",
|
|
@@ -99,16 +94,16 @@
|
|
|
99
94
|
"react-dom": { "optional": true }
|
|
100
95
|
},
|
|
101
96
|
"devDependencies": {
|
|
102
|
-
"@deepseek-ai/dsh-client-locale": "
|
|
103
|
-
"@deepseek-ai/dsh-client-runtime": "
|
|
104
|
-
"@deepseek-ai/dsh-client-ui-primitives": "
|
|
105
|
-
"@deepseek-ai/dsh-client-ui-settings": "
|
|
106
|
-
"@deepseek-ai/dsh-client-ui-conversation": "
|
|
107
|
-
"@deepseek-ai/dsh-client-ui-slots": "
|
|
108
|
-
"@deepseek-ai/dsh-host-webserver": "
|
|
109
|
-
"@deepseek-ai/dsh-invariants": "
|
|
110
|
-
"@deepseek-ai/dsh-session": "
|
|
111
|
-
"@deepseek-ai/dsh-tools": "
|
|
97
|
+
"@deepseek-ai/dsh-client-locale": "link:C:/Users/Administrator/.dsh/source/current/packages/client/locale",
|
|
98
|
+
"@deepseek-ai/dsh-client-runtime": "link:C:/Users/Administrator/.dsh/source/current/packages/client/runtime",
|
|
99
|
+
"@deepseek-ai/dsh-client-ui-primitives": "link:C:/Users/Administrator/.dsh/source/current/packages/client/ui-primitives",
|
|
100
|
+
"@deepseek-ai/dsh-client-ui-settings": "link:C:/Users/Administrator/.dsh/source/current/packages/client/ui-settings",
|
|
101
|
+
"@deepseek-ai/dsh-client-ui-conversation": "link:C:/Users/Administrator/.dsh/source/current/packages/client/ui-conversation",
|
|
102
|
+
"@deepseek-ai/dsh-client-ui-slots": "link:C:/Users/Administrator/.dsh/source/current/packages/client/ui-slots",
|
|
103
|
+
"@deepseek-ai/dsh-host-webserver": "link:C:/Users/Administrator/.dsh/source/current/packages/host/webserver",
|
|
104
|
+
"@deepseek-ai/dsh-invariants": "link:C:/Users/Administrator/.dsh/source/current/packages/support/invariants",
|
|
105
|
+
"@deepseek-ai/dsh-session": "link:C:/Users/Administrator/.dsh/source/current/packages/core/session",
|
|
106
|
+
"@deepseek-ai/dsh-tools": "link:C:/Users/Administrator/.dsh/source/current/packages/core/tools",
|
|
112
107
|
"@types/node": "^24.0.0",
|
|
113
108
|
"@types/react": "~18.3.1",
|
|
114
109
|
"@types/react-dom": "~18.3.1",
|