@co0ontty/wand 4.79.0 → 4.80.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.
Files changed (58) hide show
  1. package/README.md +18 -6
  2. package/dist/agent-dispatch.d.ts +3 -0
  3. package/dist/agent-dispatch.js +5 -0
  4. package/dist/ai-team-runner.js +4 -2
  5. package/dist/ai-team-types.d.ts +34 -0
  6. package/dist/ai-team-types.js +12 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/config.d.ts +4 -3
  9. package/dist/config.js +25 -0
  10. package/dist/git-quick-commit.d.ts +9 -8
  11. package/dist/git-quick-commit.js +123 -8
  12. package/dist/models.d.ts +3 -0
  13. package/dist/models.js +24 -2
  14. package/dist/process-manager.js +16 -3
  15. package/dist/provider-cli-updater.d.ts +1 -1
  16. package/dist/provider-cli-updater.js +12 -1
  17. package/dist/server-ai-team-routes.js +4 -1
  18. package/dist/server-employee-routes.d.ts +22 -0
  19. package/dist/server-employee-routes.js +277 -0
  20. package/dist/server-session-routes.js +38 -13
  21. package/dist/server-settings-routes.js +5 -0
  22. package/dist/server-task-routes.d.ts +2 -0
  23. package/dist/server-task-routes.js +174 -22
  24. package/dist/server-update-routes.js +1 -1
  25. package/dist/server-workspace-routes.js +3 -0
  26. package/dist/server.js +16 -3
  27. package/dist/session-ai-context.d.ts +7 -2
  28. package/dist/session-ai-context.js +36 -9
  29. package/dist/session-provider.d.ts +6 -1
  30. package/dist/session-provider.js +27 -1
  31. package/dist/session-transport.js +4 -0
  32. package/dist/silicon-employee-dispatch.d.ts +9 -0
  33. package/dist/silicon-employee-dispatch.js +13 -0
  34. package/dist/silicon-employee-draft.d.ts +36 -0
  35. package/dist/silicon-employee-draft.js +146 -0
  36. package/dist/storage.d.ts +19 -2
  37. package/dist/storage.js +158 -7
  38. package/dist/structured-gemini-adapter.d.ts +40 -0
  39. package/dist/structured-gemini-adapter.js +198 -0
  40. package/dist/structured-provider-common.d.ts +2 -1
  41. package/dist/structured-provider-common.js +7 -2
  42. package/dist/structured-session-manager.d.ts +10 -0
  43. package/dist/structured-session-manager.js +106 -14
  44. package/dist/system-ai.js +1 -1
  45. package/dist/system-employee.d.ts +35 -0
  46. package/dist/system-employee.js +81 -0
  47. package/dist/task-types.d.ts +8 -1
  48. package/dist/task-types.js +7 -0
  49. package/dist/types.d.ts +23 -4
  50. package/dist/web-ui/content/ai-teams.js +13 -13
  51. package/dist/web-ui/content/scripts.js +64 -64
  52. package/dist/web-ui/content/styles.css +1 -1
  53. package/dist/web-ui/content/tailwind.css +3 -0
  54. package/dist/web-ui/embedded-assets.js +3 -3
  55. package/dist/web-ui/provider-identity.d.ts +2 -1
  56. package/dist/web-ui/provider-identity.js +10 -1
  57. package/dist/web-ui/session-activity.js +1 -1
  58. package/package.json +1 -1
@@ -0,0 +1,81 @@
1
+ import { SYSTEM_EMPLOYEE_ID, SYSTEM_EMPLOYEE_KEY, SYSTEM_EMPLOYEE_NAME, SYSTEM_EMPLOYEE_TAG, isSystemSiliconEmployee, } from "./ai-team-types.js";
2
+ import { isSessionProvider } from "./session-provider.js";
3
+ import { DEFAULT_WAND_TASK_AGENT_KIND, DEFAULT_WAND_TASK_AGENT_MODE, normalizeWandTaskAgentMode } from "./task-types.js";
4
+ // 常量与判定定义在 ai-team-types(浏览器也要用),这里再导出一次,服务端只从一个地方引用。
5
+ export { SYSTEM_EMPLOYEE_ID, SYSTEM_EMPLOYEE_KEY, SYSTEM_EMPLOYEE_NAME, SYSTEM_EMPLOYEE_TAG, isSystemSiliconEmployee, };
6
+ /**
7
+ * 内置的「系统运维」员工。
8
+ *
9
+ * Wand 自己的 AI 调用(commit message / tag、提示词优化、会话与任务标题、
10
+ * 员工起草)都由这位员工执行:名字、职责与人设写死在代码里,不可编辑、不可归档、
11
+ * 不可删除;只有执行候选(CLI 工具 + 模型 + 思考深度,按顺序降级)由用户维护。
12
+ */
13
+ export const SYSTEM_EMPLOYEE_DUTY = "Wand 系统运维:服务与 CLI 线路、更新分发、仓库与会话操作,Wand 自有 AI 任务的执行者。";
14
+ /**
15
+ * 同时承担两个角色,所以规则写在一起:
16
+ * - 作为会话系统提示:用户直接找它做运维/功能实现;
17
+ * - 作为内部 AI 调用的系统提示:任务通常带严格输出格式。
18
+ */
19
+ export const SYSTEM_EMPLOYEE_PROMPT = [
20
+ `你是 Wand 的系统运维「${SYSTEM_EMPLOYEE_NAME}」。你常驻在这台机器上,负责 Wand 自身的运转:服务与守护进程、CLI 与模型线路、更新与分发、会话与终端、SQLite 配置、以及仓库与提交操作。`,
21
+ "",
22
+ "工作方式:",
23
+ "- 先看真实状态再动手:读日志、跑命令、看 diff,不靠猜测下结论,也不编造没有执行过的结果。",
24
+ "- 改动小而准:只解决当下这件事,不顺手重构;发现同类问题就一并修掉并说明。",
25
+ "- 危险操作(删除数据、强推、改权限、停服)先说清后果再执行;无法确认时停下来问,不要赌。",
26
+ "- 用中文汇报,先说结论再说证据;引用命令与文件路径,不贴无用日志。",
27
+ "",
28
+ "格式纪律:当任务给出了明确的输出格式、字段或字数限制(例如一行 commit message、只输出一个 JSON 对象、只输出标题),一律严格照做——",
29
+ "不寒暄、不解释、不加「优化后:」这类前后缀、不包代码块、不输出思考过程;绝不复述任务里没有的信息。",
30
+ ].join("\n");
31
+ /** 首次创建内置员工时使用的候选:优先沿用用户已有的系统 AI 工具与模型。 */
32
+ export function systemEmployeeSeedAgents(seed = {}) {
33
+ const cli = isSessionProvider(seed.cli) ? seed.cli : null;
34
+ const provider = cli
35
+ ?? (isSessionProvider(seed.provider) ? seed.provider : "claude");
36
+ const model = cli ? (seed.model ?? "").trim() || "default" : "default";
37
+ return [{
38
+ provider,
39
+ model,
40
+ thinkingEffort: "off",
41
+ mode: normalizeWandTaskAgentMode(provider, DEFAULT_WAND_TASK_AGENT_MODE),
42
+ kind: DEFAULT_WAND_TASK_AGENT_KIND,
43
+ }];
44
+ }
45
+ export function systemEmployeeDefinition(agents, now, existing) {
46
+ return {
47
+ id: existing?.id ?? SYSTEM_EMPLOYEE_ID,
48
+ name: SYSTEM_EMPLOYEE_NAME,
49
+ duty: SYSTEM_EMPLOYEE_DUTY,
50
+ prompt: SYSTEM_EMPLOYEE_PROMPT,
51
+ // 空头像 = 按 id/name 稳定派生一只像素猫,与用户员工同一套。
52
+ avatar: "",
53
+ agents: agents.length ? agents : systemEmployeeSeedAgents(),
54
+ systemKey: SYSTEM_EMPLOYEE_KEY,
55
+ createdAt: existing?.createdAt ?? now,
56
+ updatedAt: now,
57
+ };
58
+ }
59
+ /** 内置员工只保留结构化候选(会话与内部 AI 调用都要求结构化执行)。 */
60
+ export function systemEmployeeAgentsOrNull(value) {
61
+ if (!Array.isArray(value) || value.length === 0)
62
+ return null;
63
+ return value;
64
+ }
65
+ /**
66
+ * 内部 AI 调用的 CLI 降级链:按用户设置的顺序,模型为空 / "default" 时跟随 provider 默认值。
67
+ */
68
+ export function systemEmployeeCliCandidates(employee) {
69
+ if (!employee)
70
+ return [];
71
+ return employee.agents
72
+ .filter((agent) => agent.kind === "structured")
73
+ .map((agent) => {
74
+ const model = (agent.model ?? "").trim();
75
+ return {
76
+ provider: agent.provider,
77
+ model: !model || model === "default" ? undefined : model,
78
+ thinkingEffort: agent.thinkingEffort,
79
+ };
80
+ });
81
+ }
@@ -5,7 +5,7 @@ export type WandTaskPriority = "none" | "low" | "medium" | "high" | "urgent";
5
5
  /** 新建任务的默认优先级:用户没挑就是「低」,不再落成「无优先级」。 */
6
6
  export declare const DEFAULT_WAND_TASK_PRIORITY: WandTaskPriority;
7
7
  /** 任务派发时选择的 CLI 工具;空串表示尚未指定。 */
8
- export type WandTaskAgentProvider = "claude" | "codex" | "opencode" | "grok" | "qoder" | "pi";
8
+ export type WandTaskAgentProvider = "claude" | "codex" | "opencode" | "grok" | "qoder" | "pi" | "gemini";
9
9
  export type WandTaskAgentModel = string;
10
10
  /** 与会话思考档位同一套:旧四档,或 `provider:level` 原生档。 */
11
11
  export type WandTaskAgentEffort = "off" | "standard" | "deep" | "max" | `${WandTaskAgentProvider}:${string}`;
@@ -51,6 +51,12 @@ export interface WandTaskAgent {
51
51
  /** 派发出来的会话是结构化对话还是 PTY 终端;缺省时按结构化处理。 */
52
52
  kind: WandTaskAgentKind;
53
53
  }
54
+ /** 看板任务指定的对话对象。CLI id 是 provider,员工/团队 id 是稳定定义 ID。 */
55
+ export interface TaskExecutionSubject {
56
+ type: "employee" | "team" | "cli";
57
+ id: string;
58
+ }
59
+ export declare function isTaskExecutionSubject(value: unknown): value is TaskExecutionSubject;
54
60
  /** 任务标题来源;标题是可选字段,留空时由服务端按描述自动生成。 */
55
61
  export type WandTaskTitleSource = "user" | "auto";
56
62
  /** 里程碑名上限;所有任务面板的新增入口共用同一约束。 */
@@ -142,6 +148,7 @@ export interface WandTask {
142
148
  sortOrder: number;
143
149
  /** 该任务绑定的执行 Agent;null 表示还没指定。 */
144
150
  agent: WandTaskAgent | null;
151
+ executionSubject?: TaskExecutionSubject | null;
145
152
  createdAt: string;
146
153
  updatedAt: string;
147
154
  }
@@ -37,6 +37,13 @@ export const DEFAULT_WAND_TASK_AGENT_KIND = "structured";
37
37
  export function isWandTaskAgentKind(value) {
38
38
  return value === "structured" || value === "pty";
39
39
  }
40
+ export function isTaskExecutionSubject(value) {
41
+ if (!value || typeof value !== "object" || Array.isArray(value))
42
+ return false;
43
+ const subject = value;
44
+ return (subject.type === "employee" || subject.type === "team" || subject.type === "cli")
45
+ && typeof subject.id === "string" && subject.id.length > 0;
46
+ }
40
47
  /** 里程碑名上限;所有任务面板的新增入口共用同一约束。 */
41
48
  export const WAND_MILESTONE_NAME_MAX_LENGTH = 60;
42
49
  /** 兜底迭代的名字;用户没选迭代时任务/会话都归到它下面。 */
package/dist/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export type SessionKind = "pty" | "structured";
2
- export type SessionProvider = "claude" | "codex" | "opencode" | "grok" | "qoder" | "pi";
2
+ export type SessionProvider = "claude" | "codex" | "opencode" | "grok" | "qoder" | "pi" | "gemini";
3
3
  type CommitAiSource = "cli" | "api";
4
- export type SessionRunner = "claude-cli" | "claude-cli-print" | "claude-sdk" | "codex-cli-exec" | "opencode-cli-run" | "grok-cli-headless" | "qoder-cli-print" | "pi-cli-json" | "pty";
4
+ export type SessionRunner = "claude-cli" | "claude-cli-print" | "claude-sdk" | "codex-cli-exec" | "opencode-cli-run" | "grok-cli-headless" | "qoder-cli-print" | "pi-cli-json" | "gemini-cli-json" | "pty";
5
5
  export type SessionSource = "interactive" | "automation" | "startup";
6
6
  export type ExecutionMode = "assist" | "agent" | "agent-max" | "default" | "auto-edit" | "full-access" | "native" | "managed";
7
7
  export type AutonomyPolicy = "assist" | "agent" | "agent-max";
@@ -153,6 +153,8 @@ export interface WandConfig {
153
153
  defaultQoderModel?: string;
154
154
  /** 新建 Pi 会话时默认使用的 provider/model pattern。 */
155
155
  defaultPiModel?: string;
156
+ /** 新建 Gemini 会话时默认使用的模型。留空则不传 --model,由 gemini 自行决定。 */
157
+ defaultGeminiModel?: string;
156
158
  /** 快捷提交生成 commit message / tag 时使用的 CLI。 */
157
159
  commitCli?: SessionProvider;
158
160
  /** 快捷提交专用模型。留空则跟随所选 CLI 的默认模型。 */
@@ -176,6 +178,16 @@ export interface WandConfig {
176
178
  */
177
179
  inheritEnv?: boolean;
178
180
  }
181
+ /**
182
+ * Wand 自有 AI 调用(commit message、标题、提示词优化…)的一条 CLI 执行候选。
183
+ * 候选顺序即降级顺序;由内置「系统运维」员工维护。
184
+ */
185
+ export interface AiCliCandidate {
186
+ provider: SessionProvider;
187
+ /** 具体模型 ID;未设置表示跟随 provider 默认模型。 */
188
+ model?: string;
189
+ thinkingEffort?: ThinkingEffort;
190
+ }
179
191
  export type SystemAiProtocol = "openai" | "anthropic";
180
192
  type SystemAiAuthHeader = "bearer" | "x-api-key";
181
193
  export interface SystemAiConfig {
@@ -227,7 +239,8 @@ interface ReasoningEffortInfo {
227
239
  * 旧的四档值需要继续兼容已有会话。CLI 动态档位加 provider 前缀,
228
240
  * 避免 `max`(旧值,各家含义不同)和 CLI 新增的原生档位冲突。
229
241
  */
230
- export type ThinkingEffort = "off" | "standard" | "deep" | "max" | `${"claude" | "codex" | "opencode" | "grok" | "qoder" | "pi"}:${string}`;
242
+ export type { SiliconEmployee } from "./ai-team-types.js";
243
+ export type ThinkingEffort = "off" | "standard" | "deep" | "max" | `${"claude" | "codex" | "opencode" | "grok" | "qoder" | "pi" | "gemini"}:${string}`;
231
244
  export interface WorktreeInfo {
232
245
  branch: string;
233
246
  path: string;
@@ -575,6 +588,13 @@ export interface SessionSnapshot {
575
588
  sessionSource?: SessionSource;
576
589
  /** 自动化创建会话时关联的自动化任务 ID。 */
577
590
  automationId?: string;
591
+ /** 创建会话时选定的员工身份快照;定义归档或删除后仍可展示历史会话。 */
592
+ employeeId?: string;
593
+ employeeName?: string;
594
+ employeeAvatar?: string;
595
+ /** 员工建会话时的有序候选快照;首轮启动失败时沿此链降级。 */
596
+ employeeCandidates?: import("./task-types.js").WandTaskAgent[];
597
+ employeeCandidateIndex?: number;
578
598
  /**
579
599
  * 会话级系统提示:自动化 / 团队会话的角色与规则放这里,走 provider 的系统提示通道,
580
600
  * 不要拼进首条用户消息。provider 没有该通道时(codex / opencode)由调用方退回并入消息。
@@ -798,4 +818,3 @@ export interface SessionIdData {
798
818
  export interface SessionEndData {
799
819
  exitCode: number | null;
800
820
  }
801
- export {};