dsh-llm-verifier 0.1.13 → 0.1.14

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 (50) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +301 -301
  3. package/cordis.patch.yml +4 -4
  4. package/lib/client.js +176 -14
  5. package/lib/index.js +418 -43
  6. package/lib/types/client-i18n.d.ts +27 -0
  7. package/lib/types/client-i18n.js +18 -0
  8. package/lib/types/client.d.ts +15 -2
  9. package/lib/types/client.js +134 -9
  10. package/lib/types/config.d.ts +4 -0
  11. package/lib/types/config.js +5 -3
  12. package/lib/types/index.d.ts +2 -0
  13. package/lib/types/index.js +185 -4
  14. package/lib/types/plan-gate.d.ts +14 -0
  15. package/lib/types/plan-gate.js +70 -0
  16. package/lib/types/router.d.ts +10 -1
  17. package/lib/types/router.js +37 -7
  18. package/lib/types/session.js +25 -10
  19. package/lib/types/team-gate.d.ts +11 -0
  20. package/lib/types/team-gate.js +51 -0
  21. package/package.json +112 -112
  22. package/src/auto.test.ts +86 -86
  23. package/src/auto.ts +133 -133
  24. package/src/cache.ts +115 -115
  25. package/src/caller.test.ts +34 -34
  26. package/src/caller.ts +151 -151
  27. package/src/client-i18n.ts +18 -0
  28. package/src/client.tsx +385 -213
  29. package/src/config.ts +189 -183
  30. package/src/core.test.ts +71 -71
  31. package/src/core.ts +205 -205
  32. package/src/engine.test.ts +136 -136
  33. package/src/engine.ts +140 -140
  34. package/src/images.ts +33 -33
  35. package/src/index.ts +416 -247
  36. package/src/parity.test.ts +85 -85
  37. package/src/plan-gate.test.ts +56 -0
  38. package/src/plan-gate.ts +77 -0
  39. package/src/router.test.ts +107 -89
  40. package/src/router.ts +349 -309
  41. package/src/session.test.ts +53 -36
  42. package/src/session.ts +117 -103
  43. package/src/statistics.test.ts +80 -80
  44. package/src/statistics.ts +328 -328
  45. package/src/team-gate.test.ts +56 -0
  46. package/src/team-gate.ts +63 -0
  47. package/src/top-logprobs.test.ts +84 -84
  48. package/src/top-logprobs.ts +153 -153
  49. package/src/topic-storage.test.ts +31 -31
  50. package/src/topic-storage.ts +42 -42
@@ -0,0 +1,70 @@
1
+ import { sanitizeVerifierText } from "./session.js";
2
+ export function detectPlanExit(events, fromSeq = 0) {
3
+ for (let i = events.length - 1; i >= 0; i--) {
4
+ const event = events[i];
5
+ if (event.seq < fromSeq)
6
+ break;
7
+ if (event.type === 'tool/call' && event.data.name === 'exit_plan_mode') {
8
+ let planText = '';
9
+ try {
10
+ const parsed = JSON.parse(event.data.arguments);
11
+ if (typeof parsed.plan === 'string' && parsed.plan.trim()) {
12
+ planText = parsed.plan.trim();
13
+ }
14
+ }
15
+ catch { }
16
+ if (!planText) {
17
+ for (let j = i - 1; j >= 0; j--) {
18
+ const prev = events[j];
19
+ if (prev.seq < fromSeq)
20
+ break;
21
+ if (prev.type === 'assistant/message') {
22
+ const msg = prev.data.message;
23
+ if (Array.isArray(msg?.content)) {
24
+ const texts = msg.content
25
+ .filter((b) => b.type === 'text')
26
+ .map(b => b.text);
27
+ if (texts.length > 0) {
28
+ planText = texts.join('\n').trim();
29
+ break;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ return { hasExitPlanMode: true, callSeq: event.seq, planText };
36
+ }
37
+ }
38
+ return { hasExitPlanMode: false };
39
+ }
40
+ export function buildPlanPreReviewPrompt(problem, planText, maxChars = 20000) {
41
+ return [
42
+ 'You are an expert independent technical plan verifier. A candidate implementation plan was submitted for human review.',
43
+ 'Evaluate whether the plan is sound, executable, and comprehensive.',
44
+ 'Scoring criteria:',
45
+ 'A: Flawless, thorough, with clear steps, rigorous verification, edge cases handled.',
46
+ 'B-J: Mostly sound, minor gaps or nuances missing.',
47
+ 'K-S: Noticeable architectural gaps, missing regression checks, or ambiguities.',
48
+ 'T: Fundamentally flawed, dangerous, or missing core requirements.',
49
+ '',
50
+ 'Task requirement:',
51
+ sanitizeVerifierText(problem, 4000),
52
+ '',
53
+ 'Proposed Plan:',
54
+ sanitizeVerifierText(planText, maxChars),
55
+ '',
56
+ 'Output format:',
57
+ 'Line 1: Verdict: <Single uppercase letter A-T>',
58
+ 'Line 2: Summary: <One sentence assessment>',
59
+ 'Line 3+: Key strengths, blind spots, and verification guidance.',
60
+ ].join('\n\n');
61
+ }
62
+ export function parsePlanReviewVerdict(text) {
63
+ const match = /Verdict:\s*([A-T])/i.exec(text);
64
+ const verdict = match ? match[1].toUpperCase() : 'B';
65
+ // A is 1.0, T is 0.0
66
+ const index = verdict.charCodeAt(0) - 65;
67
+ const score = Math.max(0, Math.min(1, 1 - index / 19));
68
+ return { verdict, score, feedback: text.trim() };
69
+ }
70
+ //# sourceMappingURL=plan-gate.js.map
@@ -1,7 +1,7 @@
1
1
  import type { SessionEvent, TodoItem } from '@deepseek-ai/dsh-session';
2
2
  import type { AutoVerifyMode } from './auto.ts';
3
3
  export type RoutedVerifierKind = 'compare' | 'select' | 'track';
4
- export type RoutePhase = 'semantic' | RoutedVerifierKind | 'final';
4
+ export type RoutePhase = 'semantic' | RoutedVerifierKind | 'final' | 'plan_review' | 'team_task';
5
5
  export interface CandidateArtifact {
6
6
  id: string;
7
7
  groupId: string;
@@ -63,10 +63,19 @@ export interface EvidenceCall {
63
63
  resultSeq: number;
64
64
  text: string;
65
65
  }
66
+ export interface TeamTaskItem {
67
+ id: string;
68
+ revision: number;
69
+ subject: string;
70
+ description?: string;
71
+ status: 'pending' | 'in_progress' | 'completed' | 'deleted';
72
+ ownerId?: string;
73
+ }
66
74
  interface EvidenceIndex {
67
75
  problemSeq: number;
68
76
  calls: Map<string, EvidenceCall>;
69
77
  todos: Map<number, TodoItem[]>;
78
+ teamTasks: Map<number, TeamTaskItem[]>;
70
79
  }
71
80
  export declare function buildEvidenceIndex(events: readonly SessionEvent[]): EvidenceIndex | undefined;
72
81
  export declare function analyzeStructuredRoute(events: readonly SessionEvent[], maxCandidates?: number, maxItemChars?: number): RouteDecision | undefined;
@@ -44,15 +44,26 @@ export function buildEvidenceIndex(events) {
44
44
  const calls = new Map();
45
45
  const results = new Map();
46
46
  const todos = new Map();
47
+ const teamTasks = new Map();
47
48
  const paired = new Map();
48
- for (const event of relevant) {
49
+ // Track the rolling view of team tasks across the session
50
+ const currentTeamTasks = new Map();
51
+ for (const rawEvent of relevant) {
52
+ const event = rawEvent;
49
53
  if (event.type === 'tool/call')
50
- calls.set(String(event.data.callId), event);
51
- else if (event.type === 'tool/result' && successful(event))
52
- results.set(String(event.data.message.source.callId), event);
54
+ calls.set(String(event.data.callId), rawEvent);
55
+ else if (event.type === 'tool/result' && successful(rawEvent))
56
+ results.set(String(event.data.message.source.callId), rawEvent);
53
57
  else if (event.type === 'todo/write')
54
58
  todos.set(event.seq, event.data.todos);
55
- else if (event.type === 'tool/code-dispatch') {
59
+ else if (event.type === 'team/task') {
60
+ const data = event.data;
61
+ if (data?.task) {
62
+ currentTeamTasks.set(data.task.id, { ...data.task });
63
+ teamTasks.set(event.seq, [...currentTeamTasks.values()]);
64
+ }
65
+ }
66
+ else if (event.type === 'tool/ptc-dispatch' || event.type === 'tool/code-dispatch') {
56
67
  const data = event.data;
57
68
  const isOk = data.isError !== true && (!Array.isArray(data.content) || data.content.every(b => b.isError !== true));
58
69
  if (isOk) {
@@ -67,7 +78,7 @@ export function buildEvidenceIndex(events) {
67
78
  if (result)
68
79
  paired.set(callId, { name: call.data.name, callSeq: call.seq, resultSeq: result.seq, text: blockText(result.data.message.content) });
69
80
  }
70
- return { problemSeq: taskStartSeq, calls: paired, todos };
81
+ return { problemSeq: taskStartSeq, calls: paired, todos, teamTasks };
71
82
  }
72
83
  function parseTrustedWorkflow(value, callId, callSeq, resultSeq, maxCandidates, maxItemChars) {
73
84
  if (typeof value !== 'object' || value === null || Array.isArray(value))
@@ -119,6 +130,17 @@ function canonicalTodoSnapshots(index) {
119
130
  }
120
131
  return values;
121
132
  }
133
+ function canonicalTeamTaskSnapshots(index) {
134
+ const values = [];
135
+ let previous = '';
136
+ for (const [seq, tasks] of index.teamTasks) {
137
+ const canonical = JSON.stringify(tasks.map(t => ({ id: t.id, status: t.status, revision: t.revision })));
138
+ if (canonical !== previous)
139
+ values.push({ seq, tasks });
140
+ previous = canonical;
141
+ }
142
+ return values;
143
+ }
122
144
  export function analyzeStructuredRoute(events, maxCandidates = 8, maxItemChars = 20_000) {
123
145
  const index = buildEvidenceIndex(events);
124
146
  if (!index)
@@ -145,6 +167,12 @@ export function analyzeStructuredRoute(events, maxCandidates = 8, maxItemChars =
145
167
  const checkpoints = steps.map((_, i) => i + 1);
146
168
  return { kind: 'track', source: 'structured', confidence: 1, reason: 'changed durable todo snapshots', fingerprint: stableHash({ kind: 'track', snapshots }), steps, checkpoints, evidenceSeqs: snapshots.map(snapshot => snapshot.seq) };
147
169
  }
170
+ const teamSnapshots = canonicalTeamTaskSnapshots(index);
171
+ if (teamSnapshots.length >= 2) {
172
+ const steps = teamSnapshots.map(snapshot => sanitizeVerifierText('Team task checkpoint seq ' + snapshot.seq + ':\n' + snapshot.tasks.map(task => '- [' + task.status + '] ' + task.subject + (task.description ? ' (' + task.description + ')' : '')).join('\n'), maxItemChars));
173
+ const checkpoints = steps.map((_, i) => i + 1);
174
+ return { kind: 'track', source: 'structured', confidence: 1, reason: 'changed durable team tasks', fingerprint: stableHash({ kind: 'track', teamSnapshots }), steps, checkpoints, evidenceSeqs: teamSnapshots.map(snapshot => snapshot.seq) };
175
+ }
148
176
  }
149
177
  return undefined;
150
178
  }
@@ -152,10 +180,12 @@ export function semanticRouteHint(events) {
152
180
  const index = buildEvidenceIndex(events);
153
181
  if (!index)
154
182
  return false;
155
- if ([...index.calls.values()].some(pair => pair.name === 'subagent' || pair.name === 'subagent_fork' || pair.name === 'workflow'))
183
+ if ([...index.calls.values()].some(pair => pair.name === 'subagent' || pair.name === 'subagent_fork' || pair.name === 'workflow' || pair.name === 'exit_plan_mode'))
156
184
  return true;
157
185
  if (canonicalTodoSnapshots(index).length >= 2)
158
186
  return true;
187
+ if (canonicalTeamTaskSnapshots(index).length >= 2)
188
+ return true;
159
189
  return false;
160
190
  }
161
191
  export function buildSemanticRoutePrompt(problem, events, maxCandidates, maxItemChars = 20_000) {
@@ -1,14 +1,19 @@
1
1
  function textOf(blocks) {
2
2
  const parts = [];
3
3
  for (const block of blocks) {
4
- if (block.type === 'text')
4
+ const blockType = block.type;
5
+ if (blockType === 'text')
5
6
  parts.push(block.text);
6
- else if (block.type === 'reasoning')
7
+ else if (blockType === 'reasoning')
7
8
  parts.push('[Reasoning] ' + block.text);
8
- else if (block.type === 'tool-call')
9
+ else if (blockType === 'tool-call')
9
10
  parts.push('[Tool Call] ' + block.name + ' ' + block.arguments);
10
- else if (block.type === 'tool-result')
11
+ else if (blockType === 'tool-result')
11
12
  parts.push('[Tool Result] ' + textOf(block.content));
13
+ else if (blockType === 'file') {
14
+ const fileData = block;
15
+ parts.push('[File] ' + (fileData.path ?? fileData.filename ?? fileData.title ?? 'attachment'));
16
+ }
12
17
  }
13
18
  return parts.join('\n');
14
19
  }
@@ -53,17 +58,20 @@ export async function extractSession(agent, loadImage, options = {}) {
53
58
  let problem = '';
54
59
  const trace = [];
55
60
  const images = [];
56
- for (const event of events) {
61
+ for (const rawEvent of events) {
62
+ const event = rawEvent;
57
63
  if (event.type === 'user/message') {
58
- if (event.data.source.kind !== 'user')
64
+ const sourceKind = event.data?.source?.kind;
65
+ if (sourceKind !== 'user' && sourceKind !== 'team-message')
59
66
  continue;
60
67
  const text = textOf(event.data.content);
61
- if (!problem && text.trim())
68
+ if (!problem && sourceKind === 'user' && text.trim())
62
69
  problem = text.trim();
63
70
  for (const block of event.data.content)
64
71
  if (block.type === 'image')
65
72
  images.push(await loadImage(block.attachment));
66
- trace.push('--- User seq ' + event.seq + ' ---\n' + text);
73
+ const tag = sourceKind === 'team-message' ? 'Team Message' : 'User';
74
+ trace.push('--- ' + tag + ' seq ' + event.seq + ' ---\n' + text);
67
75
  }
68
76
  else if (event.type === 'assistant/message' && options.includeAssistantText !== false) {
69
77
  trace.push('--- Assistant turn ' + event.data.turn + ' step ' + event.data.step + ' ---\n' + textOf(event.data.message.content));
@@ -74,7 +82,7 @@ export async function extractSession(agent, loadImage, options = {}) {
74
82
  else if (event.type === 'tool/result') {
75
83
  trace.push('--- Tool Result turn ' + event.data.turn + ' step ' + event.data.step + ' ---\n[Output] ' + textOf(event.data.message.content));
76
84
  }
77
- else if (event.type === 'tool/code-dispatch') {
85
+ else if (event.type === 'tool/ptc-dispatch' || event.type === 'tool/code-dispatch') {
78
86
  const data = event.data;
79
87
  const status = data.isError ? ' [Error]' : '';
80
88
  const args = data.arguments !== undefined ? ' ' + (typeof data.arguments === 'string' ? data.arguments : JSON.stringify(data.arguments)) : '';
@@ -85,7 +93,14 @@ export async function extractSession(agent, loadImage, options = {}) {
85
93
  images.push(await loadImage(block.attachment));
86
94
  }
87
95
  }
88
- trace.push('--- Code Dispatch ' + data.name + status + ' seq ' + event.seq + ' ---\n[Command] ' + data.name + args + '\n[Output] ' + content);
96
+ const label = event.type === 'tool/ptc-dispatch' ? 'PTC Dispatch ' : 'Code Dispatch ';
97
+ trace.push('--- ' + label + data.name + status + ' seq ' + event.seq + ' ---\n[Command] ' + data.name + args + '\n[Output] ' + content);
98
+ }
99
+ else if (event.type === 'team/message/queued') {
100
+ const data = event.data;
101
+ const sender = data?.message?.senderName ?? 'Teammate';
102
+ const content = Array.isArray(data?.message?.content) ? textOf(data.message.content) : '';
103
+ trace.push('--- Team Message Queued from ' + sender + ' seq ' + event.seq + ' ---\n' + content);
89
104
  }
90
105
  }
91
106
  const raw = redactText(trace.join('\n\n'), patterns);
@@ -0,0 +1,11 @@
1
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
2
+ import type { TeamTaskItem } from './router.ts';
3
+ export interface TeamTaskInspection {
4
+ latestCompletedTask?: TeamTaskItem;
5
+ completedSeq?: number;
6
+ activeTasks: TeamTaskItem[];
7
+ hasRecentCompletedTask: boolean;
8
+ }
9
+ export declare function inspectTeamTasks(events: readonly SessionEvent[], fromSeq?: number): TeamTaskInspection;
10
+ export declare function buildTeamTaskVerificationPrompt(task: TeamTaskItem, executionTrace: string, maxChars?: number): string;
11
+ //# sourceMappingURL=team-gate.d.ts.map
@@ -0,0 +1,51 @@
1
+ import { sanitizeVerifierText } from "./session.js";
2
+ export function inspectTeamTasks(events, fromSeq = 0) {
3
+ let latestCompletedTask;
4
+ let completedSeq;
5
+ const taskMap = new Map();
6
+ for (const rawEvent of events) {
7
+ const event = rawEvent;
8
+ if (event.type === 'team/task') {
9
+ const data = event.data;
10
+ if (data?.task) {
11
+ taskMap.set(data.task.id, { ...data.task });
12
+ if (event.seq >= fromSeq && data.task.status === 'completed') {
13
+ latestCompletedTask = { ...data.task };
14
+ completedSeq = event.seq;
15
+ }
16
+ }
17
+ }
18
+ }
19
+ return {
20
+ latestCompletedTask,
21
+ completedSeq,
22
+ activeTasks: [...taskMap.values()].filter(t => t.status !== 'deleted'),
23
+ hasRecentCompletedTask: latestCompletedTask !== undefined,
24
+ };
25
+ }
26
+ export function buildTeamTaskVerificationPrompt(task, executionTrace, maxChars = 20000) {
27
+ return [
28
+ 'You are an expert independent technical verifier reviewing a completed Agent Teams task.',
29
+ 'Verify if the task goal has been satisfied by concrete evidence (code edits, test runs, successful commands).',
30
+ 'Task Details:',
31
+ 'ID: ' + task.id,
32
+ 'Subject: ' + task.subject,
33
+ task.description ? 'Description: ' + task.description : '',
34
+ '',
35
+ 'Execution Evidence & Trace:',
36
+ sanitizeVerifierText(executionTrace, maxChars),
37
+ '',
38
+ 'Evaluate whether the task is genuinely completed with verified proof.',
39
+ 'Scoring criteria:',
40
+ 'A: Completely fulfilled with solid execution/test evidence.',
41
+ 'B-J: Mostly complete, minor gaps or edge cases not fully asserted.',
42
+ 'K-S: Incomplete, missing key requirements or untested.',
43
+ 'T: Unfulfilled, failed, or contradictory evidence.',
44
+ '',
45
+ 'Output format:',
46
+ 'Line 1: Verdict: <Single uppercase letter A-T>',
47
+ 'Line 2: Summary: <One sentence evaluation of task fulfillment>',
48
+ 'Line 3+: Remaining gaps or next steps for the team.',
49
+ ].filter(Boolean).join('\n\n');
50
+ }
51
+ //# sourceMappingURL=team-gate.js.map
package/package.json CHANGED
@@ -1,112 +1,112 @@
1
- {
2
- "name": "dsh-llm-verifier",
3
- "version": "0.1.13",
4
- "description": "Configurable DSH-native LLM verifier with a Web settings page",
5
- "repository": {
6
- "type": "git",
7
- "url": "git+https://github.com/Aa728848/dsh-llm-verifier.git"
8
- },
9
- "homepage": "https://github.com/Aa728848/dsh-llm-verifier#readme",
10
- "bugs": {
11
- "url": "https://github.com/Aa728848/dsh-llm-verifier/issues"
12
- },
13
- "keywords": [
14
- "deepseek",
15
- "dsh",
16
- "verifier",
17
- "llm",
18
- "cordis",
19
- "plugin"
20
- ],
21
- "author": "eddyskywalker",
22
- "type": "module",
23
- "main": "lib/index.js",
24
- "types": "lib/types/index.d.ts",
25
- "exports": {
26
- ".": {
27
- "types": "./lib/types/index.d.ts",
28
- "default": "./lib/index.js"
29
- },
30
- "./core": {
31
- "types": "./lib/types/core.d.ts",
32
- "default": "./lib/core.js"
33
- },
34
- "./caller": {
35
- "types": "./lib/types/caller.d.ts",
36
- "default": "./lib/caller.js"
37
- },
38
- "./package.json": "./package.json",
39
- "./client": {
40
- "types": "./lib/types/client.d.ts",
41
- "default": "./lib/client.js"
42
- }
43
- },
44
- "dsh": {
45
- "bundle": {
46
- "patch": "./cordis.patch.yml"
47
- },
48
- "client": {
49
- "inject": [
50
- "@deepseek-ai/dsh-client-connection",
51
- "@deepseek-ai/dsh-client-runtime",
52
- "@deepseek-ai/dsh-client-ui-slots",
53
- "@deepseek-ai/dsh-client-ui-settings",
54
- "@deepseek-ai/dsh-client-ui-conversation",
55
- "@deepseek-ai/dsh-client-locale",
56
- "@deepseek-ai/dsh-api-remotes"
57
- ],
58
- "platform": "web"
59
- }
60
- },
61
- "peerDependencies": {
62
- "@deepseek-ai/cordis": "^4.0.1 || ^4.0.2",
63
- "@deepseek-ai/dsh-tools": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2",
64
- "@deepseek-ai/dsh-agent": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2",
65
- "@deepseek-ai/dsh-session": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2",
66
- "@deepseek-ai/dsh-llm": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2",
67
- "@deepseek-ai/dsh-attachment": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2",
68
- "@deepseek-ai/dsh-settings": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2",
69
- "@deepseek-ai/dsh-credentials": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2",
70
- "@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2"
71
- },
72
- "dependencies": {
73
- "schemastery": "^3.18.0"
74
- },
75
- "devDependencies": {
76
- "@deepseek-ai/cordis": "^4.0.1",
77
- "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
78
- "@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
79
- "@deepseek-ai/dsh-session": "^0.1.1-rc.2",
80
- "@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
81
- "@deepseek-ai/dsh-attachment": "^0.1.1-rc.2",
82
- "@types/node": "^22.20.0",
83
- "tsdown": "0.22.2",
84
- "typescript": "~5.7.2",
85
- "vitest": "^3.0.0",
86
- "@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
87
- "@deepseek-ai/dsh-api-remotes": "^0.1.1-rc.2",
88
- "@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
89
- "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
90
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.2",
91
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
92
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.1-rc.2",
93
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.2",
94
- "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
95
- "react": "^18.2.0",
96
- "@types/react": "~18.3.1",
97
- "@deepseek-ai/dsh-credentials": "^0.1.1-rc.2"
98
- },
99
- "files": [
100
- "lib/**/*.js",
101
- "lib/**/*.d.ts",
102
- "src",
103
- "cordis.patch.yml",
104
- "README.md"
105
- ],
106
- "scripts": {
107
- "build": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc -p tsconfig.build.json && tsdown",
108
- "typecheck": "tsc --noEmit -p tsconfig.build.json",
109
- "test": "vitest run"
110
- },
111
- "license": "MIT"
112
- }
1
+ {
2
+ "name": "dsh-llm-verifier",
3
+ "version": "0.1.14",
4
+ "description": "Configurable DSH-native LLM verifier with a Web settings page",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/Aa728848/dsh-llm-verifier.git"
8
+ },
9
+ "homepage": "https://github.com/Aa728848/dsh-llm-verifier#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/Aa728848/dsh-llm-verifier/issues"
12
+ },
13
+ "keywords": [
14
+ "deepseek",
15
+ "dsh",
16
+ "verifier",
17
+ "llm",
18
+ "cordis",
19
+ "plugin"
20
+ ],
21
+ "author": "eddyskywalker",
22
+ "type": "module",
23
+ "main": "lib/index.js",
24
+ "types": "lib/types/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./lib/types/index.d.ts",
28
+ "default": "./lib/index.js"
29
+ },
30
+ "./core": {
31
+ "types": "./lib/types/core.d.ts",
32
+ "default": "./lib/core.js"
33
+ },
34
+ "./caller": {
35
+ "types": "./lib/types/caller.d.ts",
36
+ "default": "./lib/caller.js"
37
+ },
38
+ "./package.json": "./package.json",
39
+ "./client": {
40
+ "types": "./lib/types/client.d.ts",
41
+ "default": "./lib/client.js"
42
+ }
43
+ },
44
+ "dsh": {
45
+ "bundle": {
46
+ "patch": "./cordis.patch.yml"
47
+ },
48
+ "client": {
49
+ "inject": [
50
+ "@deepseek-ai/dsh-client-connection",
51
+ "@deepseek-ai/dsh-client-runtime",
52
+ "@deepseek-ai/dsh-client-ui-slots",
53
+ "@deepseek-ai/dsh-client-ui-settings",
54
+ "@deepseek-ai/dsh-client-ui-conversation",
55
+ "@deepseek-ai/dsh-client-locale",
56
+ "@deepseek-ai/dsh-api-remotes"
57
+ ],
58
+ "platform": "web"
59
+ }
60
+ },
61
+ "peerDependencies": {
62
+ "@deepseek-ai/cordis": "^4.0.1 || ^4.0.2",
63
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5",
64
+ "@deepseek-ai/dsh-agent": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5",
65
+ "@deepseek-ai/dsh-session": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5",
66
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5",
67
+ "@deepseek-ai/dsh-attachment": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5",
68
+ "@deepseek-ai/dsh-settings": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5",
69
+ "@deepseek-ai/dsh-credentials": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5",
70
+ "@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2 || ^0.1.2-alpha.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1 || ~0.1.2 || ^0.1.3 || ^0.1.4 || ^0.1.5-alpha.1 || ^0.1.5-rc.1 || ~0.1.5"
71
+ },
72
+ "dependencies": {
73
+ "schemastery": "^3.18.0"
74
+ },
75
+ "devDependencies": {
76
+ "@deepseek-ai/cordis": "^4.0.1",
77
+ "@deepseek-ai/dsh-tools": "^0.1.1-rc.2",
78
+ "@deepseek-ai/dsh-agent": "^0.1.1-rc.2",
79
+ "@deepseek-ai/dsh-session": "^0.1.1-rc.2",
80
+ "@deepseek-ai/dsh-llm": "^0.1.1-rc.2",
81
+ "@deepseek-ai/dsh-attachment": "^0.1.1-rc.2",
82
+ "@types/node": "^22.20.0",
83
+ "tsdown": "0.22.2",
84
+ "typescript": "~5.7.2",
85
+ "vitest": "^3.0.0",
86
+ "@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
87
+ "@deepseek-ai/dsh-api-remotes": "^0.1.1-rc.2",
88
+ "@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
89
+ "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
90
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.2",
91
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
92
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.1-rc.2",
93
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.2",
94
+ "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
95
+ "react": "^18.2.0",
96
+ "@types/react": "~18.3.1",
97
+ "@deepseek-ai/dsh-credentials": "^0.1.1-rc.2"
98
+ },
99
+ "files": [
100
+ "lib/**/*.js",
101
+ "lib/**/*.d.ts",
102
+ "src",
103
+ "cordis.patch.yml",
104
+ "README.md"
105
+ ],
106
+ "scripts": {
107
+ "build": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\" && tsc -p tsconfig.build.json && tsdown",
108
+ "typecheck": "tsc --noEmit -p tsconfig.build.json",
109
+ "test": "vitest run"
110
+ },
111
+ "license": "MIT"
112
+ }