@nanmicoder/dsh-agent-teams 0.1.22 → 0.1.24-rc.1

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 (45) hide show
  1. package/README.md +35 -13
  2. package/README_ZH.md +35 -13
  3. package/compatibility.json +6 -2
  4. package/lib/artifacts.js +342 -0
  5. package/lib/capabilities.js +6 -4
  6. package/lib/client/ActivityPanel.js +5 -2
  7. package/lib/client/agent-teams-card-definition.js +100 -6
  8. package/lib/client.js +90 -7
  9. package/lib/client.js.map +1 -1
  10. package/lib/command.js +3 -2
  11. package/lib/git-artifact-stamp.json +2 -2
  12. package/lib/harness-compat.js +139 -24
  13. package/lib/index.js +26 -3
  14. package/lib/lineage.js +198 -0
  15. package/lib/mailbox.js +59 -34
  16. package/lib/members.js +355 -82
  17. package/lib/profiles.js +3 -2
  18. package/lib/quality-gates.js +850 -65
  19. package/lib/scheduler.js +22 -3
  20. package/lib/snapshot.js +22 -1
  21. package/lib/state.js +282 -13
  22. package/lib/tool-policies.js +187 -0
  23. package/lib/tools.js +382 -109
  24. package/lib/types/artifacts.d.ts +66 -0
  25. package/lib/types/client/activity-monitor.d.ts +6 -0
  26. package/lib/types/client/agent-teams-card-definition.d.ts +56 -0
  27. package/lib/types/harness-compat.d.ts +78 -15
  28. package/lib/types/index.d.ts +26 -1
  29. package/lib/types/lineage.d.ts +92 -0
  30. package/lib/types/members.d.ts +113 -2
  31. package/lib/types/profiles.d.ts +6 -0
  32. package/lib/types/quality-gates.d.ts +216 -10
  33. package/lib/types/scheduler.d.ts +2 -1
  34. package/lib/types/snapshot.d.ts +20 -0
  35. package/lib/types/state.d.ts +22 -5
  36. package/lib/types/tool-policies.d.ts +119 -0
  37. package/lib/types/tools.d.ts +12 -1
  38. package/lib/types/types.d.ts +100 -0
  39. package/lib/types/workspace-audit.d.ts +27 -0
  40. package/lib/workspace-audit.js +52 -0
  41. package/package.json +61 -54
  42. package/pnpm-workspace.yaml +304 -273
  43. package/release-notes/v0.1.23.md +34 -0
  44. package/release-notes/v0.1.24-rc.1.md +13 -0
  45. package/scripts/legacy-session-source-repair.mjs +344 -0
@@ -7,6 +7,7 @@
7
7
  * survives harness restarts.
8
8
  * @module dsh-agent-teams/types
9
9
  */
10
+ import type { MemberToolFilter } from './tool-policies.ts';
10
11
  /** Task lifecycle statuses in progression order. */
11
12
  export type TaskStatus = 'pending' | 'claimed' | 'in_progress' | 'completed' | 'failed' | 'cancelled';
12
13
  /** Statuses after which a task can no longer be claimed or worked on. */
@@ -44,6 +45,49 @@ export interface CommandResult {
44
45
  exitCode?: number;
45
46
  evidence?: string;
46
47
  }
48
+ /**
49
+ * Identity of one workspace path at one instant. A verdict is evidence about a
50
+ * revision, so recording the bytes it judged (not only the task id) lets the
51
+ * delivery check refuse to advertise a revision no review ever saw.
52
+ */
53
+ export interface ArtifactDigest {
54
+ /** Workspace-relative POSIX path. */
55
+ path: string;
56
+ /** Whether a regular file existed when the digest was taken. */
57
+ present: boolean;
58
+ /** Lowercase hex sha256 of the file bytes; absent unless the file was read. */
59
+ sha256?: string;
60
+ /** File size in bytes; absent unless the file was read. */
61
+ size?: number;
62
+ /** File mtime in epoch ms; lets a legacy record detect a later edit. */
63
+ mtimeMs?: number;
64
+ /**
65
+ * The path exists but could not be read or safely resolved (permissions,
66
+ * symlink escaping the workspace, I/O error). Never conflated with "absent":
67
+ * unreadable bytes cannot be claimed as unchanged.
68
+ */
69
+ unreadable?: boolean;
70
+ /** Why the path could not be read, when `unreadable` is set. */
71
+ reason?: string;
72
+ }
73
+ /**
74
+ * A declared scope that could not be fully enumerated (file cap reached,
75
+ * unreadable directory, path that is not workspace-relative). Recorded so a
76
+ * partial artifact list is never mistaken for complete coverage.
77
+ */
78
+ export interface ArtifactScopeGap {
79
+ /** The pattern or path that could not be fully resolved. */
80
+ pattern: string;
81
+ reason: string;
82
+ }
83
+ /** One set of artifact digests captured at a single instant. */
84
+ export interface ArtifactSnapshot {
85
+ /** Epoch ms when these bytes were read. */
86
+ at: number;
87
+ artifacts: ArtifactDigest[];
88
+ /** Present when the recorded coverage is known to be incomplete. */
89
+ gaps?: ArtifactScopeGap[];
90
+ }
47
91
  /** Profile / team review-loop limits. */
48
92
  export interface ReviewPolicy {
49
93
  requirementsMinRounds?: number;
@@ -121,9 +165,47 @@ export interface TeamTask {
121
165
  /** Supplemental observations, attributed to their original execution generation. */
122
166
  supplementalEvidence?: TaskEvidence[];
123
167
  reviewedTaskId?: string;
168
+ /** Execution generation of the reviewed task at the moment of judgment. */
124
169
  reviewedAttempt?: number;
170
+ /**
171
+ * Bytes this verdict judged, read from the workspace when the gate closed.
172
+ * A later edit, deletion or re-attempt invalidates the verdict.
173
+ */
174
+ reviewedArtifacts?: ArtifactDigest[];
175
+ /** Scope of that verdict that could not be fully enumerated, if any. */
176
+ reviewedGaps?: ArtifactScopeGap[];
177
+ /**
178
+ * Scope patterns the verdict bound (e.g. `lib/`). A file that appears under
179
+ * one of them later was never reviewed, so the verdict must not claim it.
180
+ */
181
+ reviewedScope?: string[];
182
+ /**
183
+ * Drift observed while this verdict was being formed (the workspace changed
184
+ * between claim and close). The verdict cannot be read as binding a stable
185
+ * revision.
186
+ */
187
+ reviewedDuringDrift?: string[];
188
+ /**
189
+ * Workspace snapshot taken when this verdict's attempt started, so a close
190
+ * can tell whether it judged a revision that was changing underneath it.
191
+ */
192
+ verdictStartSnapshot?: ArtifactSnapshot;
193
+ /**
194
+ * Workspace snapshot an auto-generated contract (acceptance / inScope /
195
+ * verify) was derived from. When a cited artifact changes underneath it the
196
+ * work order is marked stale instead of being read as authoritative.
197
+ */
198
+ contractSnapshot?: ArtifactSnapshot;
125
199
  /** Repair source: the implementation / previous successful artifact. */
126
200
  sourceTaskId?: string;
201
+ /**
202
+ * The failed gate task(s) whose findings this repair fixes. Recorded as an
203
+ * explicit causal edge because `dependencies` cannot carry it: a failed task
204
+ * never reaches `completed`, so a dependency on it would make the repair
205
+ * permanently unclaimable. Delivery reads this to tell a closed loop from
206
+ * genuinely unresolved work (issue #175A).
207
+ */
208
+ findingSourceTaskIds?: string[];
127
209
  sourceFindingIds?: string[];
128
210
  /** User-constraint / goal items this task claims to cover. */
129
211
  coverageOf?: string[];
@@ -157,6 +239,24 @@ export interface TeamMember {
157
239
  activeModel?: string;
158
240
  /** Whether the fallback route is currently active. */
159
241
  fallbackActive?: boolean;
242
+ /**
243
+ * Owner-declared tool-policy id this member selected (`#59`), absent for a
244
+ * member without a policy (the unchanged default behavior). The Captain
245
+ * model may only select a configured id; it never submits raw tool lists.
246
+ */
247
+ toolPolicy?: string;
248
+ /**
249
+ * The immutable effective tool filter resolved when the member was created
250
+ * and handed to the child's `toolFilter`. `team.json` keeps it for audit,
251
+ * status, and recovery diagnostics; the continuable descriptor remains the
252
+ * authority that reapplies the filter to a cold-resumed child.
253
+ */
254
+ toolFilter?: MemberToolFilter;
255
+ /** Exact child-scoped setup restored on hosts with managed activations. */
256
+ runtimeSetup?: {
257
+ persona: string;
258
+ toolFilter: MemberToolFilter;
259
+ };
160
260
  joinedAt: number;
161
261
  status: MemberStatus;
162
262
  /** Execution admission is closed while a failed/pending handoff is drained. */
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The single workspace audit shared by every surface that reports a delivery
3
+ * or quality-loop conclusion.
4
+ *
5
+ * `agent_teams_status`, the activity-panel route and any Web API consumer must
6
+ * read the same current bytes: if only one of them compared recorded verdicts
7
+ * against the workspace, the other would keep advertising a passing gate over
8
+ * a revision no review ever saw (issue #161).
9
+ *
10
+ * The audit consumes the artifact reader's *complete* result — digests, the
11
+ * enumeration gaps and unreadable paths — because a partial read must never
12
+ * look like a clean one: a scope that outgrew its cap after the review would
13
+ * otherwise be reported as fully verified.
14
+ * @module dsh-agent-teams/workspace-audit
15
+ */
16
+ import type { DeliveryAudit } from './quality-gates.ts';
17
+ import type { TeamState } from './types.ts';
18
+ /**
19
+ * Read the current workspace bytes a team's recorded verdicts and generated
20
+ * work orders depend on.
21
+ * @param workspace - absolute path of the owning workspace.
22
+ * @param team - the durable team record.
23
+ * @returns digests of every recorded path, the current contents of the scopes
24
+ * the verdicts bound (so a new file cannot slip into a broad scope), and every
25
+ * gap that makes this audit incomplete.
26
+ */
27
+ export declare function auditTeamWorkspace(workspace: string, team: TeamState): DeliveryAudit;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The single workspace audit shared by every surface that reports a delivery
3
+ * or quality-loop conclusion.
4
+ *
5
+ * `agent_teams_status`, the activity-panel route and any Web API consumer must
6
+ * read the same current bytes: if only one of them compared recorded verdicts
7
+ * against the workspace, the other would keep advertising a passing gate over
8
+ * a revision no review ever saw (issue #161).
9
+ *
10
+ * The audit consumes the artifact reader's *complete* result — digests, the
11
+ * enumeration gaps and unreadable paths — because a partial read must never
12
+ * look like a clean one: a scope that outgrew its cap after the review would
13
+ * otherwise be reported as fully verified.
14
+ * @module dsh-agent-teams/workspace-audit
15
+ */
16
+ import { readArtifactScope } from "./artifacts.js";
17
+ import { deliveryArtifactPaths, deliveryScopePatterns } from "./quality-gates.js";
18
+ /**
19
+ * Read the current workspace bytes a team's recorded verdicts and generated
20
+ * work orders depend on.
21
+ * @param workspace - absolute path of the owning workspace.
22
+ * @param team - the durable team record.
23
+ * @returns digests of every recorded path, the current contents of the scopes
24
+ * the verdicts bound (so a new file cannot slip into a broad scope), and every
25
+ * gap that makes this audit incomplete.
26
+ */
27
+ export function auditTeamWorkspace(workspace, team) {
28
+ const paths = deliveryArtifactPaths(team);
29
+ const scopePatterns = deliveryScopePatterns(team);
30
+ const pathRead = paths.length === 0 ? { artifacts: [], gaps: [] } : readArtifactScope(workspace, paths);
31
+ const scopeRead = scopePatterns.length === 0 ? { artifacts: [], gaps: [] } : readArtifactScope(workspace, scopePatterns);
32
+ const gaps = [...pathRead.gaps, ...scopeRead.gaps];
33
+ const seen = new Set(gaps.map((gap) => `${gap.pattern}\u0000${gap.reason}`));
34
+ const recordGap = (pattern, reason) => {
35
+ const key = `${pattern}\u0000${reason}`;
36
+ if (seen.has(key))
37
+ return;
38
+ seen.add(key);
39
+ gaps.push({ pattern, reason });
40
+ };
41
+ for (const artifact of [...pathRead.artifacts, ...scopeRead.artifacts]) {
42
+ // An unreadable path is not a gap in enumeration but a gap in evidence:
43
+ // report it the same way so no surface treats it as a clean read.
44
+ if (artifact.unreadable === true)
45
+ recordGap(artifact.path, artifact.reason ?? 'path could not be read');
46
+ }
47
+ return {
48
+ artifacts: pathRead.artifacts,
49
+ expandedScope: scopeRead.artifacts.map((artifact) => ({ path: artifact.path, present: artifact.present })),
50
+ ...gaps.length === 0 ? {} : { gaps },
51
+ };
52
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanmicoder/dsh-agent-teams",
3
- "version": "0.1.22",
3
+ "version": "0.1.24-rc.1",
4
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
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -29,7 +29,8 @@
29
29
  "compatibility.json",
30
30
  "scripts/doctor.mjs",
31
31
  "scripts/compatibility.mjs",
32
- "pnpm-workspace.yaml"
32
+ "pnpm-workspace.yaml",
33
+ "scripts/legacy-session-source-repair.mjs"
33
34
  ],
34
35
  "license": "MIT",
35
36
  "author": {
@@ -60,7 +61,7 @@
60
61
  },
61
62
  "publishConfig": {
62
63
  "access": "public",
63
- "tag": "latest",
64
+ "tag": "next",
64
65
  "registry": "https://registry.npmjs.org/"
65
66
  },
66
67
  "dsh": {
@@ -83,27 +84,27 @@
83
84
  },
84
85
  "peerDependencies": {
85
86
  "@deepseek-ai/cordis": "^4.0.2",
86
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
87
- "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
88
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
89
- "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
90
- "@deepseek-ai/dsh-client-store": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
91
- "@deepseek-ai/dsh-client-ui-chat": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
92
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
93
- "@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
94
- "@deepseek-ai/dsh-client-ui-model-selection": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
95
- "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
96
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
97
- "@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
98
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
99
- "@deepseek-ai/dsh-commands": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
100
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
101
- "@deepseek-ai/dsh-session": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
102
- "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
103
- "@deepseek-ai/dsh-subagent": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
104
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
105
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
106
- "@deepseek-ai/dsh-util-values": "0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
87
+ "@deepseek-ai/dsh-agent": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
88
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
89
+ "@deepseek-ai/dsh-client-connection": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
90
+ "@deepseek-ai/dsh-client-locale": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
91
+ "@deepseek-ai/dsh-client-store": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
92
+ "@deepseek-ai/dsh-client-ui-chat": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
93
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
94
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
95
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
96
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
97
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
98
+ "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
99
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
100
+ "@deepseek-ai/dsh-commands": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
101
+ "@deepseek-ai/dsh-llm": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
102
+ "@deepseek-ai/dsh-session": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
103
+ "@deepseek-ai/dsh-session-projection": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
104
+ "@deepseek-ai/dsh-subagent": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
105
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
106
+ "@deepseek-ai/dsh-tools": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
107
+ "@deepseek-ai/dsh-util-values": "0.2.1-rc.1 || 0.2.0-rc.2 || 0.1.7-rc.2 || 0.1.5-rc.3 || 0.1.5-rc.2 || 0.1.5-rc.1 || 0.1.2-rc.1 || 0.1.2-alpha.5 || 0.1.2-alpha.2",
107
108
  "@deepseek-ai/schemastery": "^3.18.2",
108
109
  "react": "^18.2.0"
109
110
  },
@@ -182,33 +183,33 @@
182
183
  }
183
184
  },
184
185
  "devDependencies": {
185
- "@deepseek-ai/cordis": "4.0.4",
186
- "@deepseek-ai/dsh": "0.2.0-rc.2",
187
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
188
- "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
189
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
190
- "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
191
- "@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
192
- "@deepseek-ai/dsh-client-ui-chat": "0.2.0-rc.2",
193
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
194
- "@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2",
195
- "@deepseek-ai/dsh-client-ui-model-selection": "0.2.0-rc.2",
196
- "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
197
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
198
- "@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
199
- "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.0-rc.2",
200
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
201
- "@deepseek-ai/dsh-commands": "0.2.0-rc.2",
202
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
203
- "@deepseek-ai/dsh-llm-retry": "0.2.0-rc.2",
204
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
205
- "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2",
206
- "@deepseek-ai/dsh-subagent": "0.2.0-rc.2",
207
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
208
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
209
- "@deepseek-ai/dsh-util-values": "0.2.0-rc.2",
210
- "@deepseek-ai/dsh-workspace": "0.2.0-rc.2",
211
- "@deepseek-ai/schemastery": "3.18.4",
186
+ "@deepseek-ai/cordis": "4.0.5",
187
+ "@deepseek-ai/dsh": "0.2.1-rc.1",
188
+ "@deepseek-ai/dsh-agent": "0.2.1-rc.1",
189
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.1",
190
+ "@deepseek-ai/dsh-client-connection": "0.2.1-rc.1",
191
+ "@deepseek-ai/dsh-client-locale": "0.2.1-rc.1",
192
+ "@deepseek-ai/dsh-client-store": "0.2.1-rc.1",
193
+ "@deepseek-ai/dsh-client-ui-chat": "0.2.1-rc.1",
194
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.1",
195
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.1-rc.1",
196
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.2.1-rc.1",
197
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.1",
198
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.1",
199
+ "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.1",
200
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.1-rc.1",
201
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.1",
202
+ "@deepseek-ai/dsh-commands": "0.2.1-rc.1",
203
+ "@deepseek-ai/dsh-llm": "0.2.1-rc.1",
204
+ "@deepseek-ai/dsh-llm-retry": "0.2.1-rc.1",
205
+ "@deepseek-ai/dsh-session": "0.2.1-rc.1",
206
+ "@deepseek-ai/dsh-session-projection": "0.2.1-rc.1",
207
+ "@deepseek-ai/dsh-subagent": "0.2.1-rc.1",
208
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-rc.1",
209
+ "@deepseek-ai/dsh-tools": "0.2.1-rc.1",
210
+ "@deepseek-ai/dsh-util-values": "0.2.1-rc.1",
211
+ "@deepseek-ai/dsh-workspace": "0.2.1-rc.1",
212
+ "@deepseek-ai/schemastery": "3.18.5",
212
213
  "@types/node": "^24.13.3",
213
214
  "@types/react": "~18.3.1",
214
215
  "@types/react-dom": "^18.3.7",
@@ -228,8 +229,10 @@
228
229
  "update:skills": "node scripts/update-skills.mjs",
229
230
  "test:skills-updater": "node --test scripts/update-skills.test.mjs",
230
231
  "verify:skill": "node scripts/sync-skill.mjs --check",
231
- "verify": "node scripts/verify.mjs && node scripts/fallback-tdd.mjs && node scripts/member-failure-tdd.mjs && pnpm verify:quality-gates && node scripts/lifecycle-verify.mjs && node scripts/stress-verify.mjs && node --test scripts/issue-159.test.mjs && pnpm verify:web-routes && pnpm verify:release && pnpm verify:readme && pnpm verify:skill && pnpm verify:harness-contract && pnpm verify:http-body && pnpm verify:compatibility && pnpm verify:capabilities && pnpm verify:member-spawn-recovery && pnpm test:git-install && pnpm verify:source-runner && pnpm verify:git-artifact",
232
- "verify:quality-gates": "node scripts/quality-gates-tdd.mjs && node --test scripts/quality-gates-repair-scope.test.mjs scripts/quality-gates-amend.test.mjs",
232
+ "verify": "node scripts/verify.mjs && node scripts/fallback-tdd.mjs && node scripts/member-failure-tdd.mjs && pnpm verify:issue-regressions && pnpm verify:quality-gates && node scripts/lifecycle-verify.mjs && node scripts/stress-verify.mjs && node --test scripts/issue-159.test.mjs && pnpm verify:issue-203 && pnpm verify:corrupt-state && pnpm verify:web-routes && pnpm verify:release && pnpm verify:readme && pnpm verify:skill && pnpm verify:harness-contract && pnpm verify:http-body && pnpm verify:compatibility && pnpm verify:capabilities && pnpm verify:tool-policies && pnpm verify:member-spawn-recovery && pnpm test:git-install && pnpm verify:source-runner && pnpm verify:lineage-identity && pnpm verify:legacy-session-repair && pnpm verify:git-artifact",
233
+ "verify:quality-gates": "node scripts/quality-gates-tdd.mjs && node --test scripts/quality-gates-repair-scope.test.mjs scripts/quality-gates-amend.test.mjs scripts/quality-gates-content-bound.test.mjs scripts/quality-gates-work-order.test.mjs scripts/quality-gates-repair-wiring.test.mjs scripts/quality-gates-excluded-scope.test.mjs scripts/quality-gates-cross-binding.test.mjs",
234
+ "verify:issue-203": "node --test scripts/issue-203-card.test.mjs",
235
+ "verify:corrupt-state": "node --test scripts/corrupt-teamjson.test.mjs",
233
236
  "verify:web-routes": "node scripts/web-routes-verify.mjs",
234
237
  "verify:release": "node --test scripts/release-metadata.test.mjs",
235
238
  "verify:readme": "node scripts/readme-version.mjs && node --test scripts/readme-version.test.mjs",
@@ -238,9 +241,13 @@
238
241
  "verify:http-body": "node --test scripts/http-body.test.mjs",
239
242
  "doctor": "node scripts/doctor.mjs",
240
243
  "verify:capabilities": "node --test scripts/capabilities.test.mjs",
244
+ "verify:tool-policies": "node --test scripts/tool-policies.test.mjs",
241
245
  "verify:member-spawn-recovery": "node --test scripts/member-spawn-recovery.test.mjs",
242
246
  "test:git-install": "node --test scripts/git-artifacts.test.mjs",
243
247
  "verify:source-runner": "node --test scripts/harness-source-verify.test.mjs",
244
- "verify:git-artifact": "node scripts/git-artifacts.mjs"
248
+ "verify:git-artifact": "node scripts/git-artifacts.mjs",
249
+ "verify:issue-regressions": "node --test scripts/issue-188.test.mjs scripts/issue-189.test.mjs scripts/issue-205.test.mjs",
250
+ "verify:legacy-session-repair": "node --test scripts/legacy-session-source-repair.test.mjs",
251
+ "verify:lineage-identity": "node --test scripts/lineage-identity.test.mjs"
245
252
  }
246
253
  }