personal-bot 0.2.6 → 0.2.9
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/CONTEXT.md +40 -59
- package/README.md +65 -91
- package/README.zh-CN.md +69 -89
- package/docs/README.md +21 -17
- package/docs/agent-collaboration.md +11 -13
- package/docs/architecture-guidelines.md +2 -2
- package/docs/capability-design.md +8 -10
- package/docs/dsh.en.md +339 -0
- package/docs/dsh.md +284 -48
- package/docs/file-storage.md +3 -3
- package/docs/history.md +6 -4
- package/docs/installation-design.md +55 -197
- package/docs/model-context.md +46 -0
- package/docs/model-instruction-guidelines.md +51 -0
- package/docs/release.md +10 -6
- package/docs/technical-design.md +24 -16
- package/lib/common/typebox.LICENSE +23 -0
- package/lib/common/typebox.js +4740 -0
- package/lib/dsh.js +4 -0
- package/lib/extension/dsh/agent-events.js +1 -1
- package/lib/extension/dsh/agent-runtime.js +8 -5
- package/lib/extension/dsh/command.js +1 -1
- package/lib/extension/dsh/management.js +1 -1
- package/lib/integrations/dsh/resources.d.ts +1 -1
- package/lib/integrations/dsh/resources.js +14 -14
- package/lib/integrations/dsh/session.js +1 -0
- package/lib/integrations/installation/pi-bridge.js +9 -9
- package/lib/integrations/team-context.js +7 -3
- package/lib/services/agents/agent-notices.js +2 -2
- package/lib/services/agents/team-service.js +1 -1
- package/lib/tools/agents/contract.d.ts +1 -1
- package/lib/tools/agents/contract.js +8 -8
- package/lib/tools/agents/dsh-contract.js +5 -5
- package/lib/tools/history/contract.d.ts +1 -1
- package/lib/tools/history/contract.js +3 -3
- package/lib/tools/teams/contract.d.ts +2 -2
- package/lib/tools/teams/contract.js +12 -12
- package/npm-shrinkwrap.json +33 -25
- package/package.json +124 -53
- package/python/README.md +5 -5
- package/resources/agents/coordinator.md +5 -33
- package/resources/agents/general-purpose.md +3 -15
- package/resources/prompts/history-summary.md +1 -1
- package/resources/prompts/team-member.md +7 -0
- package/resources/prompts/workspace.md +13 -24
- package/resources/references/compute-finance.md +22 -0
- package/resources/references/compute.md +11 -88
- package/resources/references/task-conductor.md +20 -15
- package/resources/skills/project-maintenance/SKILL.md +9 -11
- package/resources/skills/provider-connections/SKILL.md +7 -7
- package/scripts/README.md +16 -15
- package/src/dsh.ts +4 -0
- package/src/extension/agent-events.ts +17 -4
- package/src/extension/command.ts +1 -1
- package/src/extension/dsh/agent-events.ts +1 -1
- package/src/extension/dsh/agent-runtime.ts +7 -6
- package/src/extension/events.ts +14 -9
- package/src/extension/subagent-entry.ts +24 -16
- package/src/integrations/dsh/resources.ts +17 -14
- package/src/integrations/dsh/session.ts +2 -0
- package/src/integrations/installation/pi-bridge.ts +9 -7
- package/src/integrations/pi/agent-context.ts +1 -1
- package/src/integrations/team-context.ts +7 -3
- package/src/services/agents/agent-notices.ts +2 -2
- package/src/services/agents/team-service.ts +1 -1
- package/src/tools/agents/contract.ts +7 -7
- package/src/tools/agents/dsh-contract.ts +4 -4
- package/src/tools/history/contract.ts +2 -2
- package/src/tools/register.ts +1 -7
- package/src/tools/teams/contract.ts +11 -11
- package/docs/dsh-implementation-plan.md +0 -158
- package/docs/dsh-support-proposal.md +0 -314
- package/docs/subagent-upgrade-proposal.md +0 -357
- package/docs/validation.md +0 -132
- package/resources/prompts/tool-guidelines.md +0 -3
package/lib/dsh.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import * as SkillFilesystem from "@deepseek-ai/dsh-skill-filesystem";
|
|
3
|
+
import { resourceRoot } from "./common/paths.js";
|
|
1
4
|
import { registerDshCommand } from "./extension/dsh/command.js";
|
|
2
5
|
import { registerDshManagement } from "./extension/dsh/management.js";
|
|
3
6
|
import { DshWorkspaces, dshDependencies } from "./extension/dsh/workspace.js";
|
|
@@ -7,6 +10,7 @@ export const inject = ["commands", "typert", ...dshDependencies];
|
|
|
7
10
|
export async function apply(ctx) {
|
|
8
11
|
const [major, minor] = process.versions.node.split(".").map(Number);
|
|
9
12
|
requireThat(major > 24 || (major === 24 && minor >= 9), "dsh 接入需要 Node.js 24.9.0 或更新版本。");
|
|
13
|
+
await ctx.plugin(SkillFilesystem, { providerName: "pbot", includeDefaultRoots: false, bundledSkillDir: join(resourceRoot, "skills") });
|
|
10
14
|
const workspaces = new DshWorkspaces(ctx);
|
|
11
15
|
ctx.effect(() => () => workspaces.close());
|
|
12
16
|
const management = registerDshManagement(ctx, workspaces);
|
|
@@ -144,7 +144,7 @@ export class DshAgentEvents {
|
|
|
144
144
|
if (this.#error && this.#errorKey) {
|
|
145
145
|
if (!known.has(this.#errorKey))
|
|
146
146
|
value = { keys: [this.#errorKey], content: "# 协作扫描故障\n\n" + this.#error +
|
|
147
|
-
"\n\n
|
|
147
|
+
"\n\n先查看控制记录和原生报告,再决定是否重试,避免重复执行。" +
|
|
148
148
|
(this.#recovery === "reload" ? "团队服务已停用;修复文件后还需重载服务端 personal-bot 插件。" :
|
|
149
149
|
this.#recovery === "retry" ? "控制锁持续占用,后台会继续重试;不会自动删除锁或重新提交任务。" : "报告或控制记录读取失败,修复后后台会重试扫描。") +
|
|
150
150
|
(this.#pausePending ? "\n\n团队暂停尚未确认,不能据此开始成员私人任务。" : "") };
|
|
@@ -25,6 +25,7 @@ export class DshAgentRuntime {
|
|
|
25
25
|
#answer = "";
|
|
26
26
|
#hasAnswer = false;
|
|
27
27
|
#activeTeam;
|
|
28
|
+
#teamBriefed = false;
|
|
28
29
|
#pendingPause;
|
|
29
30
|
#pump;
|
|
30
31
|
#timer;
|
|
@@ -127,13 +128,12 @@ export class DshAgentRuntime {
|
|
|
127
128
|
requireThat(link, "团队关联不可读取。");
|
|
128
129
|
const seen = this.#seen.get(link.team.teamId) ?? new Set();
|
|
129
130
|
const context = createTeamContext(link, seen);
|
|
130
|
-
if (!context)
|
|
131
|
+
if (this.#teamBriefed && !context)
|
|
131
132
|
return decision;
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
const text = [...(this.#teamBriefed ? [] : [teamBrief(link)]), ...(context ? [context.content] : [])].join("\n\n");
|
|
134
|
+
return { ...decision, messages: [...decision.messages, createUserMessage({ content: [{ type: "text", text }],
|
|
135
|
+
source: { kind: "pbot-team-context", form: "relay", teamId: link.team.teamId, seqs: context?.seqs ?? [] } })] };
|
|
134
136
|
});
|
|
135
|
-
this.ctx.systemPrompt.section({ name: "pbot:team", order: 600, interpolate: false,
|
|
136
|
-
text: () => this.#activeTeam && !this.humanPending() && this.execution.current?.source === "parent" ? teamBrief(this.#activeTeam) : "" });
|
|
137
137
|
this.execution.save({ state: "idle", activity: "空闲" });
|
|
138
138
|
this.ctx.effect(() => () => this.stop());
|
|
139
139
|
}
|
|
@@ -167,6 +167,7 @@ export class DshAgentRuntime {
|
|
|
167
167
|
this.#turnEvents = [];
|
|
168
168
|
this.#answer = "";
|
|
169
169
|
this.#hasAnswer = false;
|
|
170
|
+
this.#teamBriefed = false;
|
|
170
171
|
this.execution.begin();
|
|
171
172
|
}
|
|
172
173
|
if (this.execution.current)
|
|
@@ -199,6 +200,8 @@ export class DshAgentRuntime {
|
|
|
199
200
|
this.execution.humanInput();
|
|
200
201
|
if (event.data.source.kind === "pbot-team-context") {
|
|
201
202
|
const { teamId, seqs } = event.data.source, seen = this.#seen.get(teamId) ?? new Set();
|
|
203
|
+
if (this.#activeTeam?.team.teamId === teamId)
|
|
204
|
+
this.#teamBriefed = true;
|
|
202
205
|
for (const seq of seqs)
|
|
203
206
|
seen.add(seq);
|
|
204
207
|
this.#seen.set(teamId, seen);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Type } from "typebox";
|
|
1
|
+
import { Type } from "../../common/typebox.js";
|
|
2
2
|
import { object, json } from "../../common/json.js";
|
|
3
3
|
import { requireThat, schema } from "../../common/validation.js";
|
|
4
4
|
import { prepareWorkspace } from "../../services/workspace/workspace-preparation.js";
|
|
@@ -87,7 +87,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
87
87
|
import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
|
|
88
88
|
import { SessionId } from "@deepseek-ai/dsh-session";
|
|
89
89
|
import { extractSessionEventText } from "@deepseek-ai/dsh-session-query";
|
|
90
|
-
import { Type } from "typebox";
|
|
90
|
+
import { Type } from "../../common/typebox.js";
|
|
91
91
|
import { json } from "../../common/json.js";
|
|
92
92
|
import { requireThat, schema } from "../../common/validation.js";
|
|
93
93
|
import { packageVersion } from "../../common/version.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Context } from "@deepseek-ai/cordis";
|
|
2
2
|
import type { Agent } from "@deepseek-ai/dsh-agent";
|
|
3
3
|
import type { AgentOptions } from "../../model/agent.js";
|
|
4
|
-
export declare function dshResources(ctx: Context,
|
|
4
|
+
export declare function dshResources(ctx: Context, _agent: Agent, root: string, role: "coordinator" | "general-purpose", python: () => {
|
|
5
5
|
state: string;
|
|
6
6
|
directory?: string;
|
|
7
7
|
error?: string;
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { FileSystemSkillProvider } from "@deepseek-ai/dsh-skill-filesystem";
|
|
4
3
|
import { agentText } from "../agent-resources.js";
|
|
5
4
|
import { resourceRoot } from "../../common/paths.js";
|
|
6
5
|
import { requireThat } from "../../common/validation.js";
|
|
7
|
-
export async function dshResources(ctx,
|
|
8
|
-
|
|
9
|
-
const workspace = await
|
|
6
|
+
export async function dshResources(ctx, _agent, root, role, python, check) {
|
|
7
|
+
const read = () => Promise.all([agentText(role, root), readFile(join(resourceRoot, "prompts/workspace.md"), "utf8")]);
|
|
8
|
+
const [text, workspace] = await read();
|
|
10
9
|
check();
|
|
11
|
-
ctx.systemPrompt.section({ name: "pbot:role", order: 1, text
|
|
10
|
+
ctx.systemPrompt.section({ name: "pbot:role", order: 1, text, interpolate: false });
|
|
12
11
|
ctx.systemPrompt.section({ name: "pbot:workspace", order: 2, text: workspace, interpolate: false });
|
|
13
12
|
ctx.systemPrompt.context({ name: "pbot:environment", order: 300, required: true, interpolate: false,
|
|
14
|
-
text: () =>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
ctx.on("agent/pre-step", async (_payload, next) => {
|
|
13
|
+
text: () => {
|
|
14
|
+
const { state, directory } = python();
|
|
15
|
+
return JSON.stringify({ workspaceRoot: root, resourceRoot, python: { state, ...(directory ? { directory } : {}) } });
|
|
16
|
+
} });
|
|
17
|
+
ctx.on("system-prompt/assemble", async (_assembly, _context, next) => {
|
|
20
18
|
check();
|
|
21
|
-
|
|
19
|
+
const [roleText, workspaceText] = await read();
|
|
22
20
|
check();
|
|
23
|
-
|
|
21
|
+
const assembly = await next();
|
|
22
|
+
return { ...assembly, sections: assembly.sections.map(section => section.name === "pbot:role" ? { ...section, text: roleText }
|
|
23
|
+
: section.name === "pbot:workspace" ? { ...section, text: workspaceText } : section) };
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
/** Map the expert's native loadout; this is not isolation from Bash, CLI, or MCP. */
|
|
27
27
|
export function dshExpertTools(ctx, agent, options) {
|
|
28
28
|
const names = new Set(ctx.tools.definitions(agent).map(tool => tool.name));
|
|
29
|
-
const forbidden = new Set(["pbot_agent", "pbot_team", "pbot_history", "subagent", "list_subagent_models", "list_agents", "send_message", "interrupt_agent"]);
|
|
29
|
+
const forbidden = new Set(["pbot_agent", "pbot_team", "pbot_history", "subagent", "subagent_fork", "list_subagent_models", "list_agents", "send_message", "interrupt_agent"]);
|
|
30
30
|
if (options.noSkills)
|
|
31
31
|
forbidden.add("skill");
|
|
32
32
|
if (options.tools) {
|
|
@@ -29,6 +29,7 @@ export async function openDshAgent(ctx, d, parent, resume, setup, signal) {
|
|
|
29
29
|
signal.throwIfAborted();
|
|
30
30
|
const compose = async (agentCtx, agent) => {
|
|
31
31
|
validateHeader(d, agent.session.header);
|
|
32
|
+
agentCtx.get("agentPresets")?.composeFrom(agentCtx, parent.ctx);
|
|
32
33
|
if (resume)
|
|
33
34
|
agent.inbox.clear();
|
|
34
35
|
const commit = await setup(agentCtx, agent);
|
|
@@ -52,19 +52,16 @@ export async function inspectPackages(root, workspace) {
|
|
|
52
52
|
for (const pkg of manager.listConfiguredPackages()) {
|
|
53
53
|
const entries = (pkg.scope === "project" ? settings.getProjectSettings() : settings.getGlobalSettings()).packages ?? [];
|
|
54
54
|
const entry = entries.find(item => sourceOf(item) === pkg.source);
|
|
55
|
-
let name = npmName(pkg.source), version;
|
|
55
|
+
let name = npmName(pkg.source), version, singleFile = false;
|
|
56
56
|
if (pkg.installedPath) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
else
|
|
61
|
-
file = ""; // Single-file extensions have no npm identity.
|
|
62
|
-
if (file) {
|
|
57
|
+
const info = await stat(pkg.installedPath);
|
|
58
|
+
singleFile = info.isFile(); // An existing standalone extension has no npm identity.
|
|
59
|
+
if (info.isDirectory()) {
|
|
63
60
|
try {
|
|
64
|
-
const manifest = JSON.parse(await readFile(
|
|
61
|
+
const manifest = JSON.parse(await readFile(join(pkg.installedPath, "package.json"), "utf8"));
|
|
65
62
|
if (name && manifest.name !== name)
|
|
66
63
|
throw new Error(`安装包身份不匹配:${pkg.source}`);
|
|
67
|
-
name = typeof manifest.name === "string" ? manifest.name : name;
|
|
64
|
+
name = typeof manifest.name === "string" && manifest.name.trim() ? manifest.name : name;
|
|
68
65
|
version = typeof manifest.version === "string" ? manifest.version : undefined;
|
|
69
66
|
}
|
|
70
67
|
catch (error) {
|
|
@@ -73,6 +70,9 @@ export async function inspectPackages(root, workspace) {
|
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
72
|
}
|
|
73
|
+
if (!name && !singleFile) {
|
|
74
|
+
throw new Error(`无法辨认 ${pkg.scope} 来源的包身份:${pkg.source}。请先通过 Pi 原生配置恢复或修正该来源,再重新运行 setup。`);
|
|
75
|
+
}
|
|
76
76
|
result.push({ source: pkg.source, scope: pkg.scope, filtered: pkg.filtered, entry,
|
|
77
77
|
...(pkg.installedPath ? { installedPath: pkg.installedPath } : {}), ...(name ? { name } : {}), ...(version ? { version } : {}) });
|
|
78
78
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
1
3
|
import { markdownBlock } from "../common/markdown.js";
|
|
4
|
+
import { resourceRoot } from "../common/paths.js";
|
|
2
5
|
function messageMarkdown(message) {
|
|
3
6
|
return [
|
|
4
7
|
"## 消息 " + message.seq, "",
|
|
@@ -15,14 +18,15 @@ function messageMarkdown(message) {
|
|
|
15
18
|
export function teamMessagesMarkdown(page) {
|
|
16
19
|
return ["# 团队公共消息", "", "- `teamId`: `" + page.teamId + "`", "- `lastSeq`: `" + page.lastSeq + "`",
|
|
17
20
|
"- `nextAfterSeq`: `" + page.nextAfterSeq + "`", "",
|
|
18
|
-
"
|
|
21
|
+
"nextOffset 非空时先续读该条正文,再读取后续消息。", "",
|
|
19
22
|
page.messages.map(messageMarkdown).join("\n\n")].join("\n");
|
|
20
23
|
}
|
|
21
24
|
export function teamBrief(link) {
|
|
22
25
|
return ["# 团队协作", "", "- 团队:" + link.team.name, "- `teamId`: `" + link.team.teamId + "`",
|
|
23
26
|
"- 当前成员 `agentId`: `" + link.request.agentId + "`", "- `runId`: `" + link.run.runId + "`",
|
|
24
27
|
"- 轮次:" + link.request.round + " / " + link.run.rounds, "", "## 共同目标", "", link.team.brief,
|
|
25
|
-
"", "## 成员职责", "", ...link.team.members.flatMap(member => ["### " + member.agentId, "", member.role, ""])
|
|
28
|
+
"", "## 成员职责", "", ...link.team.members.flatMap(member => ["### " + member.agentId, "", member.role, ""]),
|
|
29
|
+
readFileSync(join(resourceRoot, "prompts/team-member.md"), "utf8").trim()].join("\n");
|
|
26
30
|
}
|
|
27
31
|
export function createTeamContext(link, seen, throughSeq = link.team.messages.length) {
|
|
28
32
|
const pending = link.team.messages.filter(m => m.seq <= throughSeq && !seen.has(m.seq));
|
|
@@ -51,7 +55,7 @@ export function createTeamContext(link, seen, throughSeq = link.team.messages.le
|
|
|
51
55
|
const seqs = messages.map(m => m.seq);
|
|
52
56
|
return { content: ["# 团队公共上下文", "", "- `teamId`: `" + link.team.teamId + "`", "- `throughSeq`: `" + throughSeq + "`",
|
|
53
57
|
"- `remainingFromSeq`: `" + (pending[messages.length]?.seq ?? null) + "`", "",
|
|
54
|
-
"
|
|
58
|
+
"未包含或被截断的正文用 pbot_team_message read 读取。remainingFromSeq 非空时,用 afterSeq: remainingFromSeq - 1 读取未包含的消息。", "",
|
|
55
59
|
messages.map(messageMarkdown).join("\n\n")].join("\n"),
|
|
56
60
|
seqs };
|
|
57
61
|
}
|
|
@@ -5,7 +5,7 @@ export function teamNotice(values, known) {
|
|
|
5
5
|
if (!notes.length)
|
|
6
6
|
return;
|
|
7
7
|
return { kind: "teams", keys: notes.map(value => value.key), content: ["# 团队批次状态", "",
|
|
8
|
-
"
|
|
8
|
+
"团队批次状态已变化,用 pbot_team status/read 查看状态和结果。暂停时可能仍有在途工作,重跑前先查看原请求结果。", "",
|
|
9
9
|
notes.map(value => ["## " + value.name, "", "- `teamId`: `" + value.teamId + "`", "- `runId`: `" + value.runId + "`",
|
|
10
10
|
"- 状态:" + value.state, "- 在途工作:" + value.activeCount, ...(value.reason ? ["", "### 原因", "", value.reason] : [])].join("\n")).join("\n\n")].join("\n") };
|
|
11
11
|
}
|
|
@@ -17,7 +17,7 @@ export function agentNotice(values, links, known) {
|
|
|
17
17
|
return;
|
|
18
18
|
return { kind: "agents", keys: batch.map(value => value.agentId + ":" + value.cycle.cycleId),
|
|
19
19
|
content: "# 子会话工作结果\n\n子会话工作已结束。完整报告用 pbot_agent read 读取,指定对应 agentId 和 cycle.cycleId;nextOffset 非空时沿用该 cycleId 续读。\n\n" +
|
|
20
|
-
(batch.some(value => value.cycle.source !== "parent") ? "
|
|
20
|
+
(batch.some(value => value.cycle.source !== "parent") ? "部分结果包含人工子会话输入,来源见 cycle.source。\n\n" : "") +
|
|
21
21
|
batch.map(value => "## " + value.name + "\n\n" + markdownFields(json({ agentId: value.agentId,
|
|
22
22
|
cycle: { cycleId: value.cycle.cycleId, state: value.cycle.state, source: value.cycle.source, requestIds: value.cycle.requestIds,
|
|
23
23
|
...(value.cycle.error === undefined ? {} : { error: value.cycle.error }) },
|
|
@@ -317,7 +317,7 @@ export class TeamService {
|
|
|
317
317
|
slots--;
|
|
318
318
|
changed = true;
|
|
319
319
|
inputs.push({ ...q, teamId: team.teamId, runId: run.runId,
|
|
320
|
-
message: ["# 团队发言任务", "", "
|
|
320
|
+
message: ["# 团队发言任务", "", "执行本次团队发言安排。最终答复将公开给全体成员。", "",
|
|
321
321
|
"- `teamId`: `" + team.teamId + "`", "- `runId`: `" + run.runId + "`", "- 轮次:" + q.round,
|
|
322
322
|
"", "## 本批次要求", "", run.instruction].join("\n") });
|
|
323
323
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
|
-
export declare const agentDescription = "\
|
|
2
|
+
export declare const agentDescription = "\u59D4\u6D3E\u4E13\u5BB6\u5E76\u7EE7\u7EED\u5BF9\u8BDD\u3002start \u542F\u52A8\u540E\u5373\u8FD4\u56DE\uFF0C\u5B8C\u6210\u81EA\u52A8\u901A\u77E5\uFF0C\u65E0\u9700\u8F6E\u8BE2\uFF1B\u7701\u7565\u521D\u59CB\u8F93\u5165\u65F6\u5F85\u547D\u3002send \u7EE7\u7EED\u5BF9\u8BDD\uFF0C\u56E2\u961F\u5360\u7528\u671F\u95F4\u4E0D\u53EF\u79C1\u4EBA send\u3002status \u67E5\u770B\u72B6\u6001\uFF0Cread \u8BFB\u53D6\u62A5\u544A\uFF1B\u8BFB\u53D6\u5DF2\u7ED3\u675F\u5468\u671F\u5373\u9886\u53D6\u5176\u901A\u77E5\uFF0C\u5305\u62EC\u90E8\u5206\u8BFB\u53D6\u3002\u7EED\u8BFB\u56FA\u5B9A cycle.cycleId \u5E76\u4F7F\u7528 nextOffset\u3002state \u8868\u793A\u6267\u884C\u72B6\u6001\uFF0Ccycle.state \u8868\u793A\u5DE5\u4F5C\u7ED3\u679C\uFF0Cqueued \u53EA\u8868\u793A\u5165\u961F\u3002stop \u4FDD\u7559\u5386\u53F2\uFF0Cresume \u643A\u65B0 message \u7EE7\u7EED\u3002\u6BCF\u4E2A\u7236\u4F1A\u8BDD\u6700\u591A 50 \u4E2A\u5B58\u6D3B\u4E13\u5BB6\uFF0C\u7A7A\u95F2\u4E5F\u8BA1\u5165\u3002";
|
|
3
3
|
export declare const agentStartOptions: {
|
|
4
4
|
name: Type.TOptional<Type.TString>;
|
|
5
5
|
message: Type.TOptional<Type.TString>;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { Type } from "typebox";
|
|
2
|
-
export const agentDescription = "
|
|
1
|
+
import { Type } from "../../common/typebox.js";
|
|
2
|
+
export const agentDescription = "委派专家并继续对话。start 启动后即返回,完成自动通知,无需轮询;省略初始输入时待命。send 继续对话,团队占用期间不可私人 send。status 查看状态,read 读取报告;读取已结束周期即领取其通知,包括部分读取。续读固定 cycle.cycleId 并使用 nextOffset。state 表示执行状态,cycle.state 表示工作结果,queued 只表示入队。stop 保留历史,resume 携新 message 继续。每个父会话最多 50 个存活专家,空闲也计入。";
|
|
3
3
|
const id = Type.String({ minLength: 1, maxLength: 128 });
|
|
4
|
-
const message = Type.String({ minLength: 1, maxLength: 24000, description: "
|
|
4
|
+
const message = Type.String({ minLength: 1, maxLength: 24000, description: "本次目标、相关资料、约束和交付要求。" });
|
|
5
5
|
const name = Type.String({ minLength: 1, maxLength: 64, pattern: "^[^\\r\\n\\x00-\\x1f]+$" });
|
|
6
6
|
export const agentStartOptions = {
|
|
7
7
|
name: Type.Optional(name), message: Type.Optional(message),
|
|
8
8
|
files: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { maxItems: 32, description: "随初始消息读取的文件;相对路径基于原工作区根目录。" })),
|
|
9
|
-
prompts: Type.Optional(Type.Array(message, { maxItems: 32, description: "与 message
|
|
9
|
+
prompts: Type.Optional(Type.Array(message, { maxItems: 32, description: "与 message 按顺序合并为同一初始消息。" })),
|
|
10
10
|
provider: Type.Optional(Type.String({ ...id, description: "Pi 模型提供方,默认继承主会话。" })),
|
|
11
|
-
model: Type.Optional(Type.String({ ...id, description: "
|
|
11
|
+
model: Type.Optional(Type.String({ ...id, description: "Pi 模型 ID,默认继承主会话。" })),
|
|
12
12
|
thinking: Type.Optional(Type.Union([Type.Literal("off"), Type.Literal("minimal"), Type.Literal("low"), Type.Literal("medium"), Type.Literal("high"), Type.Literal("xhigh"), Type.Literal("max")], { description: "默认继承主会话思考级别。" })),
|
|
13
13
|
cwd: Type.Optional(Type.String({ minLength: 1, description: "执行目录,相对原工作区根目录;省略时使用工作区根目录。" })),
|
|
14
|
-
tools: Type.Optional(Type.Array(id, { minItems: 1, description: "按 Pi
|
|
14
|
+
tools: Type.Optional(Type.Array(id, { minItems: 1, description: "按 Pi 规则选择工具,省略时使用默认工具;MCP 工具按当前配置提供。" })),
|
|
15
15
|
noExtensions: Type.Optional(Type.Boolean({ description: "默认 true,不发现其他扩展。" })),
|
|
16
16
|
noSkills: Type.Optional(Type.Boolean({ description: "关闭技能发现,默认 false。" })),
|
|
17
17
|
noPromptTemplates: Type.Optional(Type.Boolean({ description: "关闭提示模板发现,默认 false。" })),
|
|
@@ -39,7 +39,7 @@ export const agentActionSchema = Type.Union([
|
|
|
39
39
|
Type.Object({ action: Type.Literal("read"), agentId: id, ...page }, { additionalProperties: false }),
|
|
40
40
|
]);
|
|
41
41
|
const cycle = Type.Object({ cycleId: Type.String(), startedAt: Type.Number(), finishedAt: Type.Optional(Type.Number()),
|
|
42
|
-
state: Type.Union([Type.Literal("running"), Type.Literal("completed"), Type.Literal("failed"), Type.Literal("cancelled"), Type.Literal("interrupted")], { description: "
|
|
42
|
+
state: Type.Union([Type.Literal("running"), Type.Literal("completed"), Type.Literal("failed"), Type.Literal("cancelled"), Type.Literal("interrupted")], { description: "本周期的工作结果,正文用 read 读取。" }),
|
|
43
43
|
requestIds: Type.Array(Type.String()),
|
|
44
44
|
source: Type.Union([Type.Literal("parent"), Type.Literal("interactive"), Type.Literal("mixed")]), error: Type.Optional(Type.String()),
|
|
45
45
|
}, { additionalProperties: false });
|
|
@@ -49,7 +49,7 @@ export const agentViewSchema = Type.Object({ agentId: Type.String(), name: Type.
|
|
|
49
49
|
activity: Type.String(), cycle: Type.Optional(cycle), error: Type.Optional(Type.String()),
|
|
50
50
|
requestId: Type.Optional(Type.String()), messageStatus: Type.Optional(Type.Literal("queued", { description: "消息已入队,不代表模型已阅读或完成。" })),
|
|
51
51
|
cycles: Type.Optional(Type.Array(Type.Object({ cycleId: Type.String(), state: Type.String() }), { description: "仅 read 返回:可读取的周期索引。" })),
|
|
52
|
-
report: Type.Optional(Type.String({ description: "仅 read
|
|
52
|
+
report: Type.Optional(Type.String({ description: "仅 read 返回:选定周期的报告正文片段。" })),
|
|
53
53
|
totalLength: Type.Optional(Type.Integer({ description: "仅 read 返回:完整报告的 UTF-16 字符数。" })),
|
|
54
54
|
nextOffset: Type.Optional(Type.Union([Type.Integer(), Type.Null()], { description: "仅 read 返回:null 表示本报告已读完;否则以相同 agentId、cycle.cycleId 和此 offset 继续。" })),
|
|
55
55
|
}, { additionalProperties: false });
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { Type } from "typebox";
|
|
1
|
+
import { Type } from "../../common/typebox.js";
|
|
2
2
|
import { agentActionSchema, agentParametersSchema, agentStartOptions } from "./contract.js";
|
|
3
3
|
const options = Type.Omit(Type.Object(agentStartOptions), ["provider", "model", "thinking", "files", "tools", "noExtensions", "noPromptTemplates", "noContextFiles", "noSkills"]).properties;
|
|
4
4
|
const native = {
|
|
5
5
|
provider: Type.Optional(Type.String({ minLength: 1, maxLength: 128, description: "dsh 原生 provider route,默认继承父会话。" })),
|
|
6
6
|
model: Type.Optional(Type.String({ minLength: 1, maxLength: 128, description: "该 dsh provider 的模型 ID,默认继承父会话。" })),
|
|
7
|
-
thinking: Type.Optional(Type.String({ minLength: 1, maxLength: 128, description: "该 dsh
|
|
8
|
-
files: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { maxItems: 32, description: "
|
|
9
|
-
tools: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { minItems: 1, description: "
|
|
10
|
-
noSkills: Type.Optional(Type.Boolean({ description: "
|
|
7
|
+
thinking: Type.Optional(Type.String({ minLength: 1, maxLength: 128, description: "该 dsh 模型的 reasoning effort ID,默认继承父会话。" })),
|
|
8
|
+
files: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { maxItems: 32, description: "附给专家的文件;相对原工作区根目录。图片大小与格式遵循 dsh 限制。" })),
|
|
9
|
+
tools: Type.Optional(Type.Array(Type.String({ minLength: 1 }), { minItems: 1, description: "能力工具名,不填写 run_code;省略时使用原生工具和 pbot_team_message。" })),
|
|
10
|
+
noSkills: Type.Optional(Type.Boolean({ description: "关闭该专家的技能目录和 skill 工具。" })),
|
|
11
11
|
};
|
|
12
12
|
const omitted = ["noExtensions", "noPromptTemplates", "noContextFiles", "provider", "model", "thinking", "files", "tools", "noSkills"];
|
|
13
13
|
export const dshAgentParametersSchema = Type.Object({ ...Type.Omit(agentParametersSchema, omitted).properties, ...native }, { additionalProperties: false });
|
|
@@ -64,7 +64,7 @@ export declare const historyResultSchema: Type.TObject<{
|
|
|
64
64
|
}>>;
|
|
65
65
|
warnings: Type.TArray<Type.TString>;
|
|
66
66
|
}>;
|
|
67
|
-
export declare const historyDescription = "\u67E5\u8BE2\u5F53\u524D\u5DE5\u4F5C\u533A\u7684 Pi
|
|
67
|
+
export declare const historyDescription = "\u67E5\u8BE2\u5F53\u524D\u5DE5\u4F5C\u533A\u7684 Pi/dsh \u95EE\u7B54\u5F52\u6863\uFF0Chost \u53EF\u7B5B\u9009\u6765\u6E90\u3002search \u6309\u4E0D\u533A\u5206\u5927\u5C0F\u5199\u7684\u8FDE\u7EED\u6587\u672C\u5339\u914D\u539F\u6587\u548C\u6458\u8981\uFF1B\u65E0\u5339\u914D\u65F6\u6362\u8BCD\uFF0C\u7701\u7565 query \u5217\u4F1A\u8BDD\u3002read \u6309 parents/children \u7684 id \u5C55\u5F00\uFF0CnextOffset \u7EED\u8BFB\u6B63\u6587\uFF0CnextChildrenOffset \u7EED\u8BFB\u5B50\u8282\u70B9\u3002\u9700\u8981\u5BF9\u8BDD\u7EC6\u8282\u65F6\u8BFB\u53D6 exchange \u539F\u6587\uFF1B\u9700\u8981\u5DE5\u5177\u65E5\u5FD7\u65F6\u67E5\u6240\u5C5E\u5BBF\u4E3B\u7684\u539F\u59CB\u4F1A\u8BDD\u3002";
|
|
68
68
|
export declare const historyParameters: Type.TObject<{
|
|
69
69
|
action: Type.TUnion<[Type.TLiteral<"search">, Type.TLiteral<"read">]>;
|
|
70
70
|
host: Type.TOptional<Type.TUnion<[Type.TLiteral<"pi">, Type.TLiteral<"dsh">]>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Type } from "typebox";
|
|
1
|
+
import { Type } from "../../common/typebox.js";
|
|
2
2
|
import { requireThat, schema } from "../../common/validation.js";
|
|
3
3
|
const host = Type.Union([Type.Literal("pi"), Type.Literal("dsh")]);
|
|
4
4
|
const nullableOffset = Type.Union([Type.Integer(), Type.Null()]);
|
|
@@ -9,10 +9,10 @@ export const historyResultSchema = Type.Object({
|
|
|
9
9
|
total: Type.Optional(Type.Integer()), nextOffset: Type.Optional(nullableOffset),
|
|
10
10
|
node: Type.Optional(Type.Object({ ...node.properties, text: Type.String(), totalLength: Type.Integer(), nextOffset: nullableOffset,
|
|
11
11
|
parents: Type.Array(node), children: Type.Array(node), nextChildrenOffset: nullableOffset,
|
|
12
|
-
source: Type.Object({ host, sessionId: Type.String({ description: "原始宿主会话 ID
|
|
12
|
+
source: Type.Object({ host, sessionId: Type.String({ description: "原始宿主会话 ID。" }), entryIds: Type.Array(Type.String()) }), warnings: Type.Array(Type.String()) })),
|
|
13
13
|
warnings: Type.Array(Type.String()),
|
|
14
14
|
});
|
|
15
|
-
export const historyDescription = "查询当前工作区的 Pi
|
|
15
|
+
export const historyDescription = "查询当前工作区的 Pi/dsh 问答归档,host 可筛选来源。search 按不区分大小写的连续文本匹配原文和摘要;无匹配时换词,省略 query 列会话。read 按 parents/children 的 id 展开,nextOffset 续读正文,nextChildrenOffset 续读子节点。需要对话细节时读取 exchange 原文;需要工具日志时查所属宿主的原始会话。";
|
|
16
16
|
export const historyParameters = Type.Object({ action: Type.Union([Type.Literal("search"), Type.Literal("read")]),
|
|
17
17
|
host: Type.Optional(host), query: Type.Optional(Type.String()), sessionId: Type.Optional(Type.String()),
|
|
18
18
|
from: Type.Optional(Type.String({ description: "search:ISO 日期或时间,下界。" })),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
|
-
export declare const teamDescription = "\
|
|
3
|
-
export declare const teamMessageDescription = "\
|
|
2
|
+
export declare const teamDescription = "\u7EC4\u7EC7\u56FA\u5B9A\u6210\u5458\u534F\u4F5C\u3002create \u5EFA\u7ACB\u56E2\u961F\uFF0Crun \u5F00\u59CB\u4E00\u6279\u8BA8\u8BBA\u3002\u8FD0\u884C\u65F6\u5360\u7528\u6210\u5458\uFF1Bpause \u505C\u6B62\u65B0\u5B89\u6392\uFF0C\u5141\u8BB8\u5728\u9014\u5DE5\u4F5C\u6536\u5C3E\uFF0C\u4E4B\u540E\u53EF\u79C1\u4EBA send\uFF1B\u4E2D\u6B62\u6210\u5458\u7528 pbot_agent stop\u3002close \u4FDD\u7559\u6210\u5458\u548C\u5386\u53F2\uFF1B\u6362\u6210\u5458\u987B\u5173\u95ED\u65E7\u56E2\u961F\u518D\u521B\u5EFA\u3002\u7EE7\u7EED\u8BA8\u8BBA\u7528 run \u63D0\u4EA4\u65B0\u8981\u6C42\u3002\u6210\u5458\u6700\u7EC8\u7B54\u590D\u5411\u56E2\u961F\u516C\u5F00\u3002";
|
|
3
|
+
export declare const teamMessageDescription = "\u8BFB\u5199\u56E2\u961F\u516C\u5171\u539F\u6587\u3002post \u5411\u5168\u4F53\u6210\u5458\u53D1\u5E03\u4FE1\u606F\uFF0C\u9700\u8981\u5B89\u6392\u56DE\u7B54\u65F6\u7531\u4E3B\u4F1A\u8BDD\u8C03\u7528 pbot_team run\uFF1B\u6210\u5458\u53EA\u80FD\u5728\u81EA\u5DF1\u7684\u56E2\u961F\u5DE5\u4F5C\u4E2D post\u3002read \u7528 afterSeq \u7FFB\u9875\uFF0C\u957F\u6B63\u6587\u6309 seq/offset \u7EED\u8BFB\uFF0C\u5148\u8865\u5B8C nextOffset \u975E\u7A7A\u7684\u6D88\u606F\u3002";
|
|
4
4
|
export declare const teamParametersSchema: Type.TObject<{
|
|
5
5
|
afterSeq: Type.TOptional<Type.TInteger>;
|
|
6
6
|
seq: Type.TOptional<Type.TInteger>;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { Type } from "typebox";
|
|
2
|
-
export const teamDescription = "
|
|
3
|
-
export const teamMessageDescription = "
|
|
1
|
+
import { Type } from "../../common/typebox.js";
|
|
2
|
+
export const teamDescription = "组织固定成员协作。create 建立团队,run 开始一批讨论。运行时占用成员;pause 停止新安排,允许在途工作收尾,之后可私人 send;中止成员用 pbot_agent stop。close 保留成员和历史;换成员须关闭旧团队再创建。继续讨论用 run 提交新要求。成员最终答复向团队公开。";
|
|
3
|
+
export const teamMessageDescription = "读写团队公共原文。post 向全体成员发布信息,需要安排回答时由主会话调用 pbot_team run;成员只能在自己的团队工作中 post。read 用 afterSeq 翻页,长正文按 seq/offset 续读,先补完 nextOffset 非空的消息。";
|
|
4
4
|
const id = Type.String({ minLength: 1, maxLength: 128 });
|
|
5
5
|
const text = Type.String({ minLength: 1, maxLength: 24000 });
|
|
6
6
|
const name = Type.String({ minLength: 1, maxLength: 64, pattern: "^[^\\r\\n\\x00-\\x1f]+$" });
|
|
7
7
|
const mode = Type.Union([Type.Literal("roundRobin"), Type.Literal("parallel")], { description: "run 必填:roundRobin 按成员顺序轮流发言;parallel 在并发上限内发言,全员本轮完成后才进入下一轮。" });
|
|
8
8
|
const members = Type.Array(Type.Object({ agentId: id, role: Type.String({ minLength: 1, maxLength: 4000 }) }, { additionalProperties: false }), {
|
|
9
|
-
minItems: 1, maxItems: 50, description: "仅 create
|
|
9
|
+
minItems: 1, maxItems: 50, description: "仅 create,必填:当前分支中的固定成员及职责;成员须版本兼容且未加入其他未关闭团队。",
|
|
10
10
|
});
|
|
11
11
|
const run = {
|
|
12
|
-
instruction: Type.String({ ...text, description: "仅 run
|
|
12
|
+
instruction: Type.String({ ...text, description: "仅 run,必填:本批次的任务、约束与交付要求。" }), mode,
|
|
13
13
|
rounds: Type.Optional(Type.Integer({ minimum: 1, maximum: 10, description: "仅 run:每位成员的轮数,默认 2。" })),
|
|
14
|
-
maxConcurrent: Type.Optional(Type.Integer({ minimum: 1, maximum: 50, description: "仅 run:roundRobin 默认且只允许 1;parallel 默认 min(2, 成员数)
|
|
15
|
-
timeoutSeconds: Type.Optional(Type.Integer({ minimum: 1, maximum: 86400, description: "仅 run:整批期限,默认 900
|
|
14
|
+
maxConcurrent: Type.Optional(Type.Integer({ minimum: 1, maximum: 50, description: "仅 run:roundRobin 默认且只允许 1;parallel 默认 min(2, 成员数)。不得超过成员数;待处理和执行中的发言都计入上限。" })),
|
|
15
|
+
timeoutSeconds: Type.Optional(Type.Integer({ minimum: 1, maximum: 86400, description: "仅 run:整批期限,默认 900 秒,包含所有轮次和等待。到期停止安排并尝试中止尚未人工接管的工作,之后仍须核对实际状态;pause 则允许在途工作收尾。" })),
|
|
16
16
|
};
|
|
17
17
|
const page = {
|
|
18
18
|
afterSeq: Type.Optional(Type.Integer({ minimum: 0, description: "仅 read:读取序号大于此值的消息,默认 0,不得超过 lastSeq。返回 nextAfterSeq 用于继续消息列表;单条续读使用 seq/offset,省略 afterSeq。先补完被截断的正文,再继续列表。" })),
|
|
@@ -23,7 +23,7 @@ const page = {
|
|
|
23
23
|
const object = (fields) => Type.Object(fields, { additionalProperties: false });
|
|
24
24
|
export const teamParametersSchema = object({
|
|
25
25
|
action: Type.Union(["create", "list", "status", "read", "run", "pause", "close"].map(v => Type.Literal(v)), {
|
|
26
|
-
description: "create
|
|
26
|
+
description: "create 必填 name/brief/members;list 只接受 action;status/pause/close 必填 teamId;read 必填 teamId,可选 afterSeq/seq/offset/limit;run 必填 teamId/instruction/mode,可选 rounds/maxConcurrent/timeoutSeconds。只传对应 action 的字段。run 前须确认所有成员存活、idle、可参与团队且无待处理私人输入,团队未关闭,也无运行批次或在途工作。close 前先暂停并等待在途工作结束。",
|
|
27
27
|
}),
|
|
28
28
|
teamId: Type.Optional(id), name: Type.Optional(name), brief: Type.Optional(text), members: Type.Optional(members),
|
|
29
29
|
instruction: Type.Optional(run.instruction), mode: Type.Optional(mode), rounds: run.rounds, maxConcurrent: run.maxConcurrent, timeoutSeconds: run.timeoutSeconds, ...page,
|
|
@@ -38,7 +38,7 @@ export const teamActionSchema = Type.Union([
|
|
|
38
38
|
export const teamMessageParametersSchema = object({
|
|
39
39
|
action: Type.Union([Type.Literal("read"), Type.Literal("post")], {
|
|
40
40
|
description: "read 必填 teamId,只可选 afterSeq/seq/offset/limit,禁止 text/replyTo;post 必填 teamId/text,只可选 replyTo,禁止所有分页字段。",
|
|
41
|
-
}), teamId: id, text: Type.Optional(Type.String({ ...text, description: "仅 post
|
|
41
|
+
}), teamId: id, text: Type.Optional(Type.String({ ...text, description: "仅 post,必填:向全体成员公开的原文。" })),
|
|
42
42
|
replyTo: Type.Optional(Type.Integer({ minimum: 1, description: "仅 post:回复已有消息的 seq。" })), ...page,
|
|
43
43
|
});
|
|
44
44
|
export const teamMessageActionSchema = Type.Union([
|
|
@@ -55,10 +55,10 @@ export const teamPageSchema = object({ teamId: id, messages: Type.Array(message)
|
|
|
55
55
|
nextAfterSeq: Type.Union([Type.Integer(), Type.Null()], { description: "后续消息列表的 afterSeq;null 只表示列表已到末尾,仍须检查每条消息的 nextOffset。指定 seq 时始终为 null。" }) });
|
|
56
56
|
const ownedView = object({ teamId: id, name: Type.String(), brief: Type.String(), closed: Type.Boolean(), owned: Type.Literal(true),
|
|
57
57
|
members: Type.Array(object({ agentId: id, role: Type.String(), name: Type.String(), state: Type.String() })),
|
|
58
|
-
lastSeq: Type.Integer(), activeCount: Type.Integer({ description: "
|
|
58
|
+
lastSeq: Type.Integer(), activeCount: Type.Integer({ description: "各批次仍在途的请求数;paused 时也可能大于 0。" }),
|
|
59
59
|
unresolved: Type.Array(object({ requestId: id, agentId: id, runId: id, round: Type.Integer(), active: Type.Boolean(),
|
|
60
|
-
state: Type.String({ description: "queued
|
|
61
|
-
description: "
|
|
60
|
+
state: Type.String({ description: "queued=待处理;accepted=在途;uncertain=结果未确认;cancelled=未执行或已取消;unpublished=已完成但结果尚未公开;mixed/interactive=含人工或私人工作,不自动公开;failed/interrupted=失败或中断。" }), cycleId: Type.Optional(id) }), {
|
|
61
|
+
description: "各批次尚未确认完成且公开的请求。先核对原请求和实际结果,再决定后续操作,避免重复执行。",
|
|
62
62
|
}),
|
|
63
63
|
run: Type.Optional(object({ runId: id, instruction: Type.String(), mode, state: Type.Union([Type.Literal("running"), Type.Literal("paused"), Type.Literal("finished")]),
|
|
64
64
|
rounds: Type.Integer(), maxConcurrent: Type.Integer(), deadlineAt: Type.Number(), scheduled: Type.Integer(), published: Type.Integer(), reason: Type.Optional(Type.String()) })) });
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "personal-bot",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "personal-bot",
|
|
9
|
-
"version": "0.2.
|
|
9
|
+
"version": "0.2.9",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"ajv": "8.17.1",
|
|
12
12
|
"ajv-formats": "3.0.1",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"@deepseek-ai/cordis": "4.1.0",
|
|
20
20
|
"@deepseek-ai/dsh": "0.2.2-rc.1",
|
|
21
21
|
"@deepseek-ai/dsh-agent": "0.2.2-rc.1",
|
|
22
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.2.2-rc.1",
|
|
22
23
|
"@deepseek-ai/dsh-api-remotes": "0.2.2-rc.1",
|
|
23
24
|
"@deepseek-ai/dsh-attachment": "0.2.2-rc.1",
|
|
24
25
|
"@deepseek-ai/dsh-client-file-upload": "0.2.2-rc.1",
|
|
@@ -51,33 +52,34 @@
|
|
|
51
52
|
"typescript": "5.9.3"
|
|
52
53
|
},
|
|
53
54
|
"engines": {
|
|
54
|
-
"dsh": "0.2.2-rc.1",
|
|
55
|
+
"dsh": ">=0.2.2-rc.1",
|
|
55
56
|
"node": ">=22.19.0"
|
|
56
57
|
},
|
|
57
58
|
"peerDependencies": {
|
|
58
59
|
"@deepseek-ai/cordis": "~4.1.0",
|
|
59
|
-
"@deepseek-ai/dsh-agent": "
|
|
60
|
-
"@deepseek-ai/dsh-
|
|
61
|
-
"@deepseek-ai/dsh-
|
|
62
|
-
"@deepseek-ai/dsh-
|
|
63
|
-
"@deepseek-ai/dsh-client-
|
|
64
|
-
"@deepseek-ai/dsh-commands": "
|
|
65
|
-
"@deepseek-ai/dsh-
|
|
66
|
-
"@deepseek-ai/dsh-fs
|
|
67
|
-
"@deepseek-ai/dsh-
|
|
68
|
-
"@deepseek-ai/dsh-
|
|
69
|
-
"@deepseek-ai/dsh-
|
|
70
|
-
"@deepseek-ai/dsh-session
|
|
71
|
-
"@deepseek-ai/dsh-session-
|
|
72
|
-
"@deepseek-ai/dsh-
|
|
73
|
-
"@deepseek-ai/dsh-skill
|
|
74
|
-
"@deepseek-ai/dsh-
|
|
75
|
-
"@deepseek-ai/dsh-
|
|
76
|
-
"@deepseek-ai/dsh-
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@deepseek-ai/dsh-typert-
|
|
79
|
-
"@deepseek-ai/dsh-
|
|
80
|
-
"@deepseek-ai/dsh-
|
|
60
|
+
"@deepseek-ai/dsh-agent": "*",
|
|
61
|
+
"@deepseek-ai/dsh-agent-preset-registry": "*",
|
|
62
|
+
"@deepseek-ai/dsh-api-remotes": "*",
|
|
63
|
+
"@deepseek-ai/dsh-attachment": "*",
|
|
64
|
+
"@deepseek-ai/dsh-client-file-upload": "*",
|
|
65
|
+
"@deepseek-ai/dsh-client-ui-commands": "*",
|
|
66
|
+
"@deepseek-ai/dsh-commands": "*",
|
|
67
|
+
"@deepseek-ai/dsh-fs": "*",
|
|
68
|
+
"@deepseek-ai/dsh-fs-patch": "*",
|
|
69
|
+
"@deepseek-ai/dsh-home-paths": "*",
|
|
70
|
+
"@deepseek-ai/dsh-llm": "*",
|
|
71
|
+
"@deepseek-ai/dsh-session": "*",
|
|
72
|
+
"@deepseek-ai/dsh-session-persistence": "*",
|
|
73
|
+
"@deepseek-ai/dsh-session-query": "*",
|
|
74
|
+
"@deepseek-ai/dsh-skill": "*",
|
|
75
|
+
"@deepseek-ai/dsh-skill-filesystem": "*",
|
|
76
|
+
"@deepseek-ai/dsh-system-prompt": "*",
|
|
77
|
+
"@deepseek-ai/dsh-tool-executor-ptc": "*",
|
|
78
|
+
"@deepseek-ai/dsh-tools": "*",
|
|
79
|
+
"@deepseek-ai/dsh-typert-protocol": "*",
|
|
80
|
+
"@deepseek-ai/dsh-typert-registry": "*",
|
|
81
|
+
"@deepseek-ai/dsh-user-approval": "*",
|
|
82
|
+
"@deepseek-ai/dsh-working-directory": "*",
|
|
81
83
|
"@earendil-works/pi-ai": "*",
|
|
82
84
|
"@earendil-works/pi-coding-agent": "*",
|
|
83
85
|
"@earendil-works/pi-tui": "*",
|
|
@@ -90,6 +92,9 @@
|
|
|
90
92
|
"@deepseek-ai/dsh-agent": {
|
|
91
93
|
"optional": true
|
|
92
94
|
},
|
|
95
|
+
"@deepseek-ai/dsh-agent-preset-registry": {
|
|
96
|
+
"optional": true
|
|
97
|
+
},
|
|
93
98
|
"@deepseek-ai/dsh-api-remotes": {
|
|
94
99
|
"optional": true
|
|
95
100
|
},
|
|
@@ -161,6 +166,9 @@
|
|
|
161
166
|
},
|
|
162
167
|
"@earendil-works/pi-tui": {
|
|
163
168
|
"optional": true
|
|
169
|
+
},
|
|
170
|
+
"typebox": {
|
|
171
|
+
"optional": true
|
|
164
172
|
}
|
|
165
173
|
}
|
|
166
174
|
},
|