@nanmicoder/dsh-agent-teams 0.1.0
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/LICENSE +21 -0
- package/README.md +72 -0
- package/assets/agent-teams/action-celebrating.png +0 -0
- package/assets/agent-teams/action-reporting.png +0 -0
- package/assets/agent-teams/action-sending.png +0 -0
- package/assets/agent-teams/action-sleeping.png +0 -0
- package/assets/agent-teams/action-thinking.png +0 -0
- package/assets/agent-teams/action-working.png +0 -0
- package/assets/agent-teams/data-analyst.png +0 -0
- package/assets/agent-teams/designer.png +0 -0
- package/assets/agent-teams/docs-coordinator.png +0 -0
- package/assets/agent-teams/engineer.png +0 -0
- package/assets/agent-teams/qa-engineer.png +0 -0
- package/assets/agent-teams/researcher.png +0 -0
- package/assets/agent-teams/security-reviewer.png +0 -0
- package/assets/agent-teams/team-lead.png +0 -0
- package/cordis.patch.yml +21 -0
- package/lib/client/ActivityPanel.js +340 -0
- package/lib/client/AgentTeamsCard.js +74 -0
- package/lib/client/activity-model.js +70 -0
- package/lib/client/agent-teams-card-definition.js +85 -0
- package/lib/client/artwork.js +40 -0
- package/lib/client/index.js +33 -0
- package/lib/client.js +1235 -0
- package/lib/client.js.map +1 -0
- package/lib/event-types.js +12 -0
- package/lib/events.js +60 -0
- package/lib/index.js +172 -0
- package/lib/members.js +168 -0
- package/lib/snapshot.js +155 -0
- package/lib/state.js +461 -0
- package/lib/tools.js +749 -0
- package/lib/types/client/ActivityPanel.d.ts +64 -0
- package/lib/types/client/AgentTeamsCard.d.ts +24 -0
- package/lib/types/client/activity-model.d.ts +31 -0
- package/lib/types/client/agent-teams-card-definition.d.ts +44 -0
- package/lib/types/client/artwork.d.ts +19 -0
- package/lib/types/client/index.d.ts +11 -0
- package/lib/types/event-types.d.ts +103 -0
- package/lib/types/events.d.ts +37 -0
- package/lib/types/index.d.ts +42 -0
- package/lib/types/members.d.ts +86 -0
- package/lib/types/snapshot.d.ts +83 -0
- package/lib/types/state.d.ts +144 -0
- package/lib/types/tools.d.ts +40 -0
- package/lib/types/types.d.ts +73 -0
- package/lib/types.js +11 -0
- package/package.json +108 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team state persistence and pure team-logic rules.
|
|
3
|
+
*
|
|
4
|
+
* State lives on disk under `<workspace>/<stateDir>/<teamId>/`:
|
|
5
|
+
* - `team.json` — the durable {@link TeamState} record
|
|
6
|
+
* - `inbox/<agentKey>.jsonl` — one JSONL mailbox per agent (`captain` or a
|
|
7
|
+
* member name), mirroring the Claude Code AgentTeams mailbox layout
|
|
8
|
+
*
|
|
9
|
+
* All mutations run through an in-process per-team queue so read-modify-write
|
|
10
|
+
* stays serial; `fs/promises` is used directly because the plugin owns this
|
|
11
|
+
* bookkeeping (host-plane state, like session persistence) and the abstract
|
|
12
|
+
* `fs` service offers no directory deletion.
|
|
13
|
+
* @module dsh-agent-teams/state
|
|
14
|
+
*/
|
|
15
|
+
import type { TaskStatus, TeamMessage, TeamState, TeamTask } from './types.ts';
|
|
16
|
+
/** Mailbox key of the captain. */
|
|
17
|
+
export declare const CAPTAIN_KEY = "captain";
|
|
18
|
+
/**
|
|
19
|
+
* Serialize mutations of one team across the whole process.
|
|
20
|
+
* @param key - the team id (or any mutation scope).
|
|
21
|
+
* @param fn - the mutation to run exclusively.
|
|
22
|
+
* @returns the mutation's result.
|
|
23
|
+
*/
|
|
24
|
+
export declare function withTeamLock<T>(key: string, fn: () => Promise<T>): Promise<T>;
|
|
25
|
+
/**
|
|
26
|
+
* Fold a free-form name into a safe path/key segment.
|
|
27
|
+
* @param name - any user-supplied name.
|
|
28
|
+
* @returns lowercase `[a-z0-9-]` key, never empty.
|
|
29
|
+
*/
|
|
30
|
+
export declare function sanitizeKey(name: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Whether `dependencies` are all satisfied (every named task exists and
|
|
33
|
+
* completed) for the given task list.
|
|
34
|
+
* @param tasks - the team's tasks.
|
|
35
|
+
* @param dependencies - task ids the candidate depends on.
|
|
36
|
+
* @returns the ids that are still unsatisfied, empty when claimable.
|
|
37
|
+
*/
|
|
38
|
+
export declare function unsatisfiedDependencies(tasks: TeamTask[], dependencies: string[]): string[];
|
|
39
|
+
/**
|
|
40
|
+
* The allowed task status transitions, keyed by current status.
|
|
41
|
+
* Terminal statuses have no outgoing transitions.
|
|
42
|
+
*/
|
|
43
|
+
export declare const TASK_TRANSITIONS: Readonly<Record<TaskStatus, readonly TaskStatus[]>>;
|
|
44
|
+
/**
|
|
45
|
+
* Validate one task status transition.
|
|
46
|
+
* @param current - the task's current status.
|
|
47
|
+
* @param next - the requested status.
|
|
48
|
+
* @returns the transition error, or undefined when allowed.
|
|
49
|
+
*/
|
|
50
|
+
export declare function transitionError(current: TaskStatus, next: TaskStatus): string | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Create the team directory structure and the initial team record.
|
|
53
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
54
|
+
* @param state - the initial team record.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createTeamDir(stateRoot: string, state: TeamState): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Read one team record; `undefined` when absent.
|
|
59
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
60
|
+
* @param teamId - the team's sanitized id.
|
|
61
|
+
*/
|
|
62
|
+
export declare function readTeam(stateRoot: string, teamId: string): Promise<TeamState | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* Persist one team record (inside the caller's lock).
|
|
65
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
66
|
+
* @param state - the record to persist.
|
|
67
|
+
*/
|
|
68
|
+
export declare function writeTeam(stateRoot: string, state: TeamState): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Find the team owned by one captain session (at most one per captain).
|
|
71
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
72
|
+
* @param captainSessionId - the owning session id.
|
|
73
|
+
* @returns the team record, or undefined when the captain leads no team.
|
|
74
|
+
*/
|
|
75
|
+
export declare function findTeamByCaptain(stateRoot: string, captainSessionId: string): Promise<TeamState | undefined>;
|
|
76
|
+
/**
|
|
77
|
+
* Find the team in which one session is an active participant.
|
|
78
|
+
* Captains match `captainSessionId`; members match their durable child session
|
|
79
|
+
* id. Removed members no longer have access to team-scoped tools.
|
|
80
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
81
|
+
* @param agentSessionId - calling captain/member session id.
|
|
82
|
+
* @returns the team record, or undefined when the caller belongs to no team.
|
|
83
|
+
*/
|
|
84
|
+
export declare function findTeamByParticipant(stateRoot: string, agentSessionId: string): Promise<TeamState | undefined>;
|
|
85
|
+
/** Build a fresh message record. */
|
|
86
|
+
export declare function createMessage(from: string, to: string, content: string): TeamMessage;
|
|
87
|
+
/**
|
|
88
|
+
* Append one message to an agent's mailbox (JSONL).
|
|
89
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
90
|
+
* @param teamId - the team id.
|
|
91
|
+
* @param agentKey - `captain` or a member name.
|
|
92
|
+
* @param message - the message to append.
|
|
93
|
+
*/
|
|
94
|
+
export declare function appendMailbox(stateRoot: string, teamId: string, agentKey: string, message: TeamMessage): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Read one agent's whole mailbox, oldest first.
|
|
97
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
98
|
+
* @param teamId - the team id.
|
|
99
|
+
* @param agentKey - `captain` or a member name.
|
|
100
|
+
* @param onMalformedLine - optional diagnostic hook; malformed records are
|
|
101
|
+
* skipped so one manually damaged line cannot make the whole team unreadable.
|
|
102
|
+
* @returns the messages, empty when the mailbox does not exist yet.
|
|
103
|
+
*/
|
|
104
|
+
export declare function readMailbox(stateRoot: string, teamId: string, agentKey: string, onMalformedLine?: (lineNumber: number, error: unknown) => void): Promise<TeamMessage[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Remove a team's whole directory (members should be interrupted first).
|
|
107
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
108
|
+
* @param teamId - the team id.
|
|
109
|
+
*/
|
|
110
|
+
export declare function removeTeamDir(stateRoot: string, teamId: string): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Archive a team instead of deleting it: the whole directory (team.json with
|
|
113
|
+
* tasks and dependency graph, plus the mailboxes) moves under
|
|
114
|
+
* `<stateRoot>/archive/<teamId>/` so later sessions can review how tasks were
|
|
115
|
+
* planned and rebuild dependency relationships. The archive directory has no
|
|
116
|
+
* team.json of its own, so the live activity scan skips it naturally.
|
|
117
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
118
|
+
* @param teamId - the team id.
|
|
119
|
+
*/
|
|
120
|
+
export declare function archiveTeamDir(stateRoot: string, teamId: string): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Read one archived team (already moved under `archive/`), or undefined when
|
|
123
|
+
* it was never archived.
|
|
124
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
125
|
+
* @param teamId - the team id.
|
|
126
|
+
*/
|
|
127
|
+
export declare function readArchivedTeam(stateRoot: string, teamId: string): Promise<TeamState | undefined>;
|
|
128
|
+
/**
|
|
129
|
+
* List every archived team id under the state root.
|
|
130
|
+
* @param stateRoot - resolved absolute state root directory.
|
|
131
|
+
* @returns the archived team ids, empty when the archive does not exist.
|
|
132
|
+
*/
|
|
133
|
+
export declare function listArchivedTeamIds(stateRoot: string): Promise<string[]>;
|
|
134
|
+
/** Visual task state for the activity panel. */
|
|
135
|
+
export type VisualTaskState = 'blocked' | 'open' | 'running' | 'completed';
|
|
136
|
+
/**
|
|
137
|
+
* The visual state of one task: `running` while in_progress, `completed`
|
|
138
|
+
* when done, `blocked` while any dependency is unfinished, else `open`.
|
|
139
|
+
*/
|
|
140
|
+
export declare function taskVisualState(status: string, dependencies: readonly string[], tasks: readonly TeamTask[]): VisualTaskState;
|
|
141
|
+
/**
|
|
142
|
+
* Longest dependency path depth per task id (each depth = one lane column).
|
|
143
|
+
*/
|
|
144
|
+
export declare function taskDepthsById(tasks: readonly TeamTask[]): Map<string, number>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `agent_teams_*` model-facing tools.
|
|
3
|
+
*
|
|
4
|
+
* The captain (the agent that created the team) orchestrates: members are
|
|
5
|
+
* continuable subagents it spawns and wakes. Members share the same tools and
|
|
6
|
+
* drive their own task state, mirroring the Claude Code AgentTeams flow:
|
|
7
|
+
* create team → add members → create tasks with dependencies → claim/assign →
|
|
8
|
+
* work → report → status → delete.
|
|
9
|
+
* @module dsh-agent-teams/tools
|
|
10
|
+
*/
|
|
11
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
12
|
+
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
13
|
+
/** Resolved plugin config consumed by the tools. */
|
|
14
|
+
export interface ToolsConfig {
|
|
15
|
+
/** State directory name under the captain's workspace. */
|
|
16
|
+
stateDir: string;
|
|
17
|
+
/** Member subagent provider name. */
|
|
18
|
+
memberProvider: string;
|
|
19
|
+
/** Optional member model override. */
|
|
20
|
+
memberModel?: string;
|
|
21
|
+
/** Member delegation depth cap. */
|
|
22
|
+
memberMaxDepth?: number;
|
|
23
|
+
/** Team size cap (members). */
|
|
24
|
+
maxMembers: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Deliver a durable member report at the captain's nearest model boundary.
|
|
28
|
+
*
|
|
29
|
+
* `Agent.steer()` targets the next step while the captain is running, wakes a
|
|
30
|
+
* new turn when it is idle, and lets the Agent runtime reclassify an aborted
|
|
31
|
+
* activity to `next-turn`. This prevents reports from waiting behind the
|
|
32
|
+
* captain's entire orchestration turn.
|
|
33
|
+
*/
|
|
34
|
+
export declare function steerCaptainReport(captain: Pick<Agent, 'steer'>, from: string, content: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Register every `agent_teams_*` tool into the shared tools registry.
|
|
37
|
+
* @param ctx - the plugin context (injects `tools`).
|
|
38
|
+
* @param config - resolved tool config.
|
|
39
|
+
*/
|
|
40
|
+
export declare function registerAgentTeamsTools(ctx: Context, config: ToolsConfig): void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable AgentTeams state types.
|
|
3
|
+
*
|
|
4
|
+
* A team is one directory under the state root holding `team.json` plus an
|
|
5
|
+
* `inbox/` of per-agent JSONL mailboxes. Members are continuable subagents
|
|
6
|
+
* whose durable child session ids are recorded in the team file, so a team
|
|
7
|
+
* survives harness restarts.
|
|
8
|
+
* @module dsh-agent-teams/types
|
|
9
|
+
*/
|
|
10
|
+
/** Task lifecycle statuses in progression order. */
|
|
11
|
+
export type TaskStatus = 'pending' | 'claimed' | 'in_progress' | 'completed' | 'failed' | 'cancelled';
|
|
12
|
+
/** Statuses after which a task can no longer be claimed or worked on. */
|
|
13
|
+
export declare const TERMINAL_TASK_STATUSES: readonly TaskStatus[];
|
|
14
|
+
/** One task of a team's task list. */
|
|
15
|
+
export interface TeamTask {
|
|
16
|
+
/** Stable task id within the team (`t1`, `t2`, …). */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Brief title for the task. */
|
|
19
|
+
subject: string;
|
|
20
|
+
/** What needs to be done. */
|
|
21
|
+
description?: string;
|
|
22
|
+
status: TaskStatus;
|
|
23
|
+
/** Member name the task is assigned to; unassigned tasks await a claim. */
|
|
24
|
+
assignee?: string;
|
|
25
|
+
/** Task ids that must reach `completed` before this task can be claimed. */
|
|
26
|
+
dependencies: string[];
|
|
27
|
+
/** The worker's written result, set when the task completes or fails. */
|
|
28
|
+
output?: string;
|
|
29
|
+
createdAt: number;
|
|
30
|
+
updatedAt: number;
|
|
31
|
+
}
|
|
32
|
+
/** Member lifecycle status. */
|
|
33
|
+
export type MemberStatus = 'idle' | 'working' | 'removed';
|
|
34
|
+
/** One team member: a continuable subagent plus its team-side record. */
|
|
35
|
+
export interface TeamMember {
|
|
36
|
+
/** Durable continuable subagent session id (empty until spawned). */
|
|
37
|
+
id: string;
|
|
38
|
+
/** Unique display name inside the team. */
|
|
39
|
+
name: string;
|
|
40
|
+
/** Role description, e.g. `researcher`, `engineer`, `reviewer`. */
|
|
41
|
+
role?: string;
|
|
42
|
+
/** Optional model override for this member. */
|
|
43
|
+
model?: string;
|
|
44
|
+
joinedAt: number;
|
|
45
|
+
status: MemberStatus;
|
|
46
|
+
}
|
|
47
|
+
/** One mailbox message. */
|
|
48
|
+
export interface TeamMessage {
|
|
49
|
+
id: string;
|
|
50
|
+
/** `captain` or a member name. */
|
|
51
|
+
from: string;
|
|
52
|
+
/** `captain` or a member name. */
|
|
53
|
+
to: string;
|
|
54
|
+
content: string;
|
|
55
|
+
ts: number;
|
|
56
|
+
}
|
|
57
|
+
/** The full durable team record. */
|
|
58
|
+
export interface TeamState {
|
|
59
|
+
/** Original team name. */
|
|
60
|
+
name: string;
|
|
61
|
+
/** Sanitized directory id; the team's stable identity. */
|
|
62
|
+
id: string;
|
|
63
|
+
/** Team purpose/goal. */
|
|
64
|
+
description?: string;
|
|
65
|
+
/** Session id of the captain agent that owns this team. */
|
|
66
|
+
captainSessionId: string;
|
|
67
|
+
createdAt: number;
|
|
68
|
+
/** Teammates only; the captain is implicit (the owning session). */
|
|
69
|
+
members: TeamMember[];
|
|
70
|
+
tasks: TeamTask[];
|
|
71
|
+
/** Monotonic task id counter. */
|
|
72
|
+
taskSeq: number;
|
|
73
|
+
}
|
package/lib/types.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable AgentTeams state types.
|
|
3
|
+
*
|
|
4
|
+
* A team is one directory under the state root holding `team.json` plus an
|
|
5
|
+
* `inbox/` of per-agent JSONL mailboxes. Members are continuable subagents
|
|
6
|
+
* whose durable child session ids are recorded in the team file, so a team
|
|
7
|
+
* survives harness restarts.
|
|
8
|
+
* @module dsh-agent-teams/types
|
|
9
|
+
*/
|
|
10
|
+
/** Statuses after which a task can no longer be claimed or worked on. */
|
|
11
|
+
export const TERMINAL_TASK_STATUSES = ['completed', 'failed', 'cancelled'];
|
package/package.json
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nanmicoder/dsh-agent-teams",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AgentTeams for DeepSeek Harness: multi-agent team collaboration (captain, members, tasks with dependencies, messaging) driven by natural language, with a tree monitor in the web GUI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"default": "./lib/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./client": {
|
|
14
|
+
"types": "./lib/types/client/index.d.ts",
|
|
15
|
+
"default": "./lib/client.js"
|
|
16
|
+
},
|
|
17
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"lib",
|
|
22
|
+
"assets/agent-teams",
|
|
23
|
+
"cordis.patch.yml",
|
|
24
|
+
"README.md"
|
|
25
|
+
],
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"author": "程序员阿江(Relakkes) <relakkes@gmail.com>",
|
|
28
|
+
"homepage": "https://github.com/NanmiCoder/dsh-agent-teams#readme",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/NanmiCoder/dsh-agent-teams.git"
|
|
32
|
+
},
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/NanmiCoder/dsh-agent-teams/issues"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"dsh",
|
|
38
|
+
"dsh-plugin",
|
|
39
|
+
"deepseek-harness",
|
|
40
|
+
"agent-teams",
|
|
41
|
+
"multi-agent",
|
|
42
|
+
"subagent",
|
|
43
|
+
"ai-agent",
|
|
44
|
+
"llm"
|
|
45
|
+
],
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": "^22.19.0 || >=24"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public",
|
|
51
|
+
"registry": "https://registry.npmjs.org/"
|
|
52
|
+
},
|
|
53
|
+
"dsh": {
|
|
54
|
+
"bundle": {
|
|
55
|
+
"patch": "./cordis.patch.yml"
|
|
56
|
+
},
|
|
57
|
+
"client": {
|
|
58
|
+
"inject": [
|
|
59
|
+
"@deepseek-ai/dsh-client-locale",
|
|
60
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
61
|
+
"@deepseek-ai/dsh-client-ui-conversation"
|
|
62
|
+
],
|
|
63
|
+
"platform": "web"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"dshClient": {
|
|
67
|
+
"inject": [
|
|
68
|
+
"@deepseek-ai/dsh-client-locale",
|
|
69
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
70
|
+
"@deepseek-ai/dsh-client-ui-conversation"
|
|
71
|
+
],
|
|
72
|
+
"platform": "web"
|
|
73
|
+
},
|
|
74
|
+
"scripts": {
|
|
75
|
+
"build": "tsc -p tsconfig.json && tsc -p tsconfig.client.json && tsdown",
|
|
76
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
|
|
77
|
+
"sync:skill": "node scripts/sync-skill.mjs",
|
|
78
|
+
"verify:skill": "node scripts/sync-skill.mjs --check",
|
|
79
|
+
"verify": "node scripts/verify.mjs && pnpm verify:skill",
|
|
80
|
+
"prepublishOnly": "pnpm build && pnpm verify"
|
|
81
|
+
},
|
|
82
|
+
"dependencies": {},
|
|
83
|
+
"peerDependencies": {
|
|
84
|
+
"@deepseek-ai/cordis": "^4.0.1-rc.1",
|
|
85
|
+
"@deepseek-ai/dsh-agent": "^0.0.1-rc.1",
|
|
86
|
+
"@deepseek-ai/dsh-client-locale": "^0.0.1-rc.1",
|
|
87
|
+
"@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.1",
|
|
88
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.0.1-rc.1",
|
|
89
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.1",
|
|
90
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.1",
|
|
91
|
+
"@deepseek-ai/dsh-llm": "^0.0.1-rc.1",
|
|
92
|
+
"@deepseek-ai/dsh-session": "^0.0.1-rc.1",
|
|
93
|
+
"@deepseek-ai/dsh-subagent": "^0.0.1-rc.1",
|
|
94
|
+
"@deepseek-ai/dsh-system-prompt": "^0.0.1-rc.1",
|
|
95
|
+
"@deepseek-ai/dsh-tools": "^0.0.1-rc.1",
|
|
96
|
+
"react": "^18.2.0",
|
|
97
|
+
"@deepseek-ai/schemastery": "^3.18.1-rc.1"
|
|
98
|
+
},
|
|
99
|
+
"devDependencies": {
|
|
100
|
+
"@types/react": "~18.3.1",
|
|
101
|
+
"@types/react-dom": "^19.2.4",
|
|
102
|
+
"lightningcss": "^1.33.0",
|
|
103
|
+
"tsdown": "0.22.2",
|
|
104
|
+
"typescript": "^5.9.3",
|
|
105
|
+
"react": "^18.2.0",
|
|
106
|
+
"react-dom": "^18.2.0"
|
|
107
|
+
}
|
|
108
|
+
}
|