@mengruo/dsh-vision-toolkit 0.0.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.
- package/LICENSE +21 -0
- package/README.i18n.yaml +6 -0
- package/README.md +356 -0
- package/README.zh.md +354 -0
- package/assets/community-group-qr.png +0 -0
- package/assets/dsh-conversation-artifact.png +0 -0
- package/assets/dsh-conversation-image-qa-top.png +0 -0
- package/assets/dsh-conversation-image-qa.png +0 -0
- package/assets/dsh-conversation-pixel-diff.png +0 -0
- package/assets/dsh-conversation-screenshot-debugging-top.png +0 -0
- package/assets/dsh-conversation-screenshot-debugging.png +0 -0
- package/assets/dsh-conversation-tool-call.png +0 -0
- package/assets/dsh-conversation-vision-trace.png +0 -0
- package/assets/dsh-view-example.png +0 -0
- package/assets/hero-v2.png +0 -0
- package/assets/logo_aihubmix.png +0 -0
- package/assets/python-bootstrap.json +48 -0
- package/assets/skill/SKILL.md +329 -0
- package/assets/skill/UPSTREAM.json +71 -0
- package/assets/skill/references/gui.md +88 -0
- package/assets/skill/references/long-screenshot-ocr.md +77 -0
- package/assets/skill/references/restore-graphic.md +84 -0
- package/assets/skill/references/restore-structure.md +45 -0
- package/assets/skill/references/restore-ui.md +202 -0
- package/assets/social-preview.png +0 -0
- package/assets/upstream/README.md +18 -0
- package/assets/upstream/focus-hint-comparison-1.webp +0 -0
- package/assets/upstream/focus-hint-comparison-2.webp +0 -0
- package/assets/upstream/infographic-reference.webp +0 -0
- package/assets/upstream/infographic-result.webp +0 -0
- package/assets/upstream/ui-fast-restore-reference.webp +0 -0
- package/assets/upstream/ui-fast-restore-result.webp +0 -0
- package/assets/upstream/ui-result.webp +0 -0
- package/assets/upstream/ui-sketch.webp +0 -0
- package/assets/vision-model-test.png +0 -0
- package/assets/vision-settings.png +0 -0
- package/assets/wechat-reward.png +0 -0
- package/cordis.patch.yml +6 -0
- package/docs/aihubmix-gemini-vision.i18n.yaml +6 -0
- package/docs/aihubmix-gemini-vision.md +138 -0
- package/docs/aihubmix-gemini-vision.zh.md +138 -0
- package/docs/assets/aihubmix-api-keys.png +0 -0
- package/docs/assets/aihubmix-create-key.png +0 -0
- package/docs/assets/aihubmix-free-vision-model.png +0 -0
- package/docs/assets/aihubmix-home.png +0 -0
- package/docs/assets/aihubmix-sign-up.png +0 -0
- package/docs/assets/groq-console-home.png +0 -0
- package/docs/assets/groq-console-keys-login.png +0 -0
- package/docs/assets/groq-docs-quickstart.png +0 -0
- package/docs/assets/groq-docs-qwen3.6.png +0 -0
- package/docs/assets/groq-docs-vision.png +0 -0
- package/docs/assets/vision-settings.png +0 -0
- package/docs/dsh-desktop-install.md +67 -0
- package/docs/dsh-desktop-install.zh.md +67 -0
- package/docs/groq-qwen3.6-vision.i18n.yaml +6 -0
- package/docs/groq-qwen3.6-vision.md +236 -0
- package/docs/groq-qwen3.6-vision.zh.md +236 -0
- package/docs/python-runtime.i18n.yaml +6 -0
- package/docs/python-runtime.md +89 -0
- package/docs/python-runtime.zh.md +89 -0
- package/docs/requirements-traceability/README.i18n.yaml +6 -0
- package/docs/requirements-traceability/README.md +75 -0
- package/docs/requirements-traceability/README.zh.md +75 -0
- package/examples/ui-restoration/README.i18n.yaml +6 -0
- package/examples/ui-restoration/README.md +70 -0
- package/examples/ui-restoration/README.zh.md +70 -0
- package/examples/ui-restoration/assets/final-heatmap.png +0 -0
- package/examples/ui-restoration/assets/final-report.json +83 -0
- package/examples/ui-restoration/assets/implementation.png +0 -0
- package/examples/ui-restoration/assets/initial-heatmap.png +0 -0
- package/examples/ui-restoration/assets/initial-report.json +83 -0
- package/examples/ui-restoration/assets/initial.png +0 -0
- package/examples/ui-restoration/assets/metrics.json +12 -0
- package/examples/ui-restoration/assets/reference.png +0 -0
- package/examples/ui-restoration/implementation.html +94 -0
- package/examples/ui-restoration/initial.html +57 -0
- package/lib/artifact-access.js +369 -0
- package/lib/artifact-access.js.map +1 -0
- package/lib/artifacts.js +56 -0
- package/lib/artifacts.js.map +1 -0
- package/lib/client.js +2099 -0
- package/lib/client.js.map +1 -0
- package/lib/config.js +172 -0
- package/lib/config.js.map +1 -0
- package/lib/defaults.js +6 -0
- package/lib/defaults.js.map +1 -0
- package/lib/errors.js +56 -0
- package/lib/errors.js.map +1 -0
- package/lib/evidence-cache.js +350 -0
- package/lib/evidence-cache.js.map +1 -0
- package/lib/exposure.js +247 -0
- package/lib/exposure.js.map +1 -0
- package/lib/image-input-variants.js +882 -0
- package/lib/image-input-variants.js.map +1 -0
- package/lib/index.js +105 -0
- package/lib/index.js.map +1 -0
- package/lib/paste-images.js +217 -0
- package/lib/paste-images.js.map +1 -0
- package/lib/paths.js +354 -0
- package/lib/paths.js.map +1 -0
- package/lib/plugin-update.js +1003 -0
- package/lib/plugin-update.js.map +1 -0
- package/lib/runtime-install.js +964 -0
- package/lib/runtime-install.js.map +1 -0
- package/lib/runtime-manager.js +133 -0
- package/lib/runtime-manager.js.map +1 -0
- package/lib/runtime.js +1678 -0
- package/lib/runtime.js.map +1 -0
- package/lib/skill.js +25 -0
- package/lib/skill.js.map +1 -0
- package/lib/tools.js +549 -0
- package/lib/tools.js.map +1 -0
- package/lib/types/artifact-access.d.ts +61 -0
- package/lib/types/artifact-access.d.ts.map +1 -0
- package/lib/types/artifacts.d.ts +42 -0
- package/lib/types/artifacts.d.ts.map +1 -0
- package/lib/types/client/display-config.d.ts +24 -0
- package/lib/types/client/display-config.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +350 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/model-variants-hider.d.ts +40 -0
- package/lib/types/client/model-variants-hider.d.ts.map +1 -0
- package/lib/types/client/paste-images.d.ts +126 -0
- package/lib/types/client/paste-images.d.ts.map +1 -0
- package/lib/types/config.d.ts +123 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/defaults.d.ts +6 -0
- package/lib/types/defaults.d.ts.map +1 -0
- package/lib/types/errors.d.ts +35 -0
- package/lib/types/errors.d.ts.map +1 -0
- package/lib/types/evidence-cache.d.ts +91 -0
- package/lib/types/evidence-cache.d.ts.map +1 -0
- package/lib/types/exposure.d.ts +50 -0
- package/lib/types/exposure.d.ts.map +1 -0
- package/lib/types/image-input-variants.d.ts +144 -0
- package/lib/types/image-input-variants.d.ts.map +1 -0
- package/lib/types/index.d.ts +19 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/paste-images.d.ts +73 -0
- package/lib/types/paste-images.d.ts.map +1 -0
- package/lib/types/paths.d.ts +117 -0
- package/lib/types/paths.d.ts.map +1 -0
- package/lib/types/plugin-update.d.ts +119 -0
- package/lib/types/plugin-update.d.ts.map +1 -0
- package/lib/types/runtime-install.d.ts +92 -0
- package/lib/types/runtime-install.d.ts.map +1 -0
- package/lib/types/runtime-manager.d.ts +60 -0
- package/lib/types/runtime-manager.d.ts.map +1 -0
- package/lib/types/runtime.d.ts +412 -0
- package/lib/types/runtime.d.ts.map +1 -0
- package/lib/types/skill.d.ts +14 -0
- package/lib/types/skill.d.ts.map +1 -0
- package/lib/types/tools.d.ts +35 -0
- package/lib/types/tools.d.ts.map +1 -0
- package/lib/types/upstream.d.ts +233 -0
- package/lib/types/upstream.d.ts.map +1 -0
- package/lib/types/version.d.ts +15 -0
- package/lib/types/version.d.ts.map +1 -0
- package/lib/types/web-request.d.ts +11 -0
- package/lib/types/web-request.d.ts.map +1 -0
- package/lib/types/web.d.ts +118 -0
- package/lib/types/web.d.ts.map +1 -0
- package/lib/upstream.js +860 -0
- package/lib/upstream.js.map +1 -0
- package/lib/version.js +18 -0
- package/lib/version.js.map +1 -0
- package/lib/web-request.js +29 -0
- package/lib/web-request.js.map +1 -0
- package/lib/web.js +462 -0
- package/lib/web.js.map +1 -0
- package/package.json +149 -0
- package/patches/vision-tools-dsh.patch +970 -0
- package/runtime/requirements.lock +3 -0
- package/src/artifact-access.ts +386 -0
- package/src/artifacts.ts +85 -0
- package/src/client/display-config.ts +62 -0
- package/src/client/index.tsx +1580 -0
- package/src/client/model-variants-hider.ts +159 -0
- package/src/client/paste-images.tsx +747 -0
- package/src/config.ts +290 -0
- package/src/defaults.ts +5 -0
- package/src/errors.ts +62 -0
- package/src/evidence-cache.ts +418 -0
- package/src/exposure.ts +265 -0
- package/src/image-input-variants.ts +996 -0
- package/src/index.ts +141 -0
- package/src/paste-images.ts +286 -0
- package/src/paths.ts +383 -0
- package/src/plugin-update.ts +1143 -0
- package/src/runtime-install.ts +1161 -0
- package/src/runtime-manager.ts +174 -0
- package/src/runtime.ts +2189 -0
- package/src/skill.ts +35 -0
- package/src/tools.ts +691 -0
- package/src/upstream.ts +1078 -0
- package/src/version.ts +37 -0
- package/src/web-request.ts +27 -0
- package/src/web.ts +594 -0
- package/vendor/agent-vision-toolkit/CHANGELOG.md +30 -0
- package/vendor/agent-vision-toolkit/LICENSE +21 -0
- package/vendor/agent-vision-toolkit/README.md +405 -0
- package/vendor/agent-vision-toolkit/UPSTREAM_MANIFEST.json +94 -0
- package/vendor/agent-vision-toolkit/bin/crop +90 -0
- package/vendor/agent-vision-toolkit/bin/detect +13 -0
- package/vendor/agent-vision-toolkit/bin/glance +93 -0
- package/vendor/agent-vision-toolkit/bin/ground +13 -0
- package/vendor/agent-vision-toolkit/bin/trace +129 -0
- package/vendor/agent-vision-toolkit/detect.py +60 -0
- package/vendor/agent-vision-toolkit/ground.py +267 -0
- package/vendor/agent-vision-toolkit/skills/vision-tools/scripts/dominant_colors.py +224 -0
- package/vendor/agent-vision-toolkit/skills/vision-tools/scripts/extract_fg.py +278 -0
- package/vendor/agent-vision-toolkit/skills/vision-tools/scripts/html_shot.py +420 -0
- package/vendor/agent-vision-toolkit/skills/vision-tools/scripts/long_screenshot_ocr.py +1245 -0
- package/vendor/agent-vision-toolkit/skills/vision-tools/scripts/pixel_diff.py +88 -0
- package/vendor/agent-vision-toolkit/tests/test_vision_client.py +450 -0
- package/vendor/agent-vision-toolkit/vision_client.py +310 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/** Durable, Session-scoped cache for image descriptions used by model variants. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { defineDomain, domainTable } from '@deepseek-ai/dsh-storage-domain';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { UPSTREAM_COMMIT } from "./version.js";
|
|
6
|
+
/** Bump only when the model-visible evidence contract changes incompatibly. */
|
|
7
|
+
export const EVIDENCE_CONTRACT_VERSION = 1;
|
|
8
|
+
/** Persistent cache bounds keep the Profile storage proportional and predictable. */
|
|
9
|
+
const DEFAULT_PERSISTED_ENTRY_LIMIT = 512;
|
|
10
|
+
const DEFAULT_PERSISTED_BYTE_LIMIT = 8 * 1024 * 1024;
|
|
11
|
+
const DEFAULT_PERSISTED_ENTRY_BYTE_LIMIT = 64 * 1024;
|
|
12
|
+
const MAX_SCHEMA_TEXT_CHARS = 256 * 1024;
|
|
13
|
+
const MAX_SCHEMA_RECORD_CHARS = 512 * 1024;
|
|
14
|
+
const hexDigestSchema = z.string().regex(/^[0-9a-f]{64}$/u);
|
|
15
|
+
const sessionIdentitySchema = z.object({
|
|
16
|
+
createdAt: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER),
|
|
17
|
+
cwd: z.string().optional(),
|
|
18
|
+
});
|
|
19
|
+
const evidenceRecordSchema = z.object({
|
|
20
|
+
contractVersion: z.number().int().nonnegative(),
|
|
21
|
+
sessionId: z.string().min(1),
|
|
22
|
+
session: sessionIdentitySchema,
|
|
23
|
+
attachmentId: z.string().min(1),
|
|
24
|
+
promptHash: hexDigestSchema,
|
|
25
|
+
runtimeHash: hexDigestSchema,
|
|
26
|
+
text: z.string().min(1).max(MAX_SCHEMA_TEXT_CHARS),
|
|
27
|
+
storedAt: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER),
|
|
28
|
+
});
|
|
29
|
+
/** Plugin-owned sidecar domain; the host backend handles atomicity and file safety. */
|
|
30
|
+
export const evidenceCacheDomainSpec = defineDomain({
|
|
31
|
+
name: 'vision_toolkit_evidence',
|
|
32
|
+
version: 0,
|
|
33
|
+
tables: {
|
|
34
|
+
// Keep the durable boundary tolerant of one damaged cache payload: each
|
|
35
|
+
// record is parsed and validated independently below, so corruption causes
|
|
36
|
+
// a miss instead of preventing the entire optional domain from opening.
|
|
37
|
+
evidence: domainTable(z.string().max(MAX_SCHEMA_RECORD_CHARS)),
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
function hash(value) {
|
|
41
|
+
return createHash('sha256').update(value).digest('hex');
|
|
42
|
+
}
|
|
43
|
+
/** Fingerprint every runtime setting that can change the generated description. */
|
|
44
|
+
export function evidenceRuntimeFingerprint(config, credentialSha256, sslVerify) {
|
|
45
|
+
return hash(JSON.stringify({
|
|
46
|
+
upstreamCommit: UPSTREAM_COMMIT,
|
|
47
|
+
provider: {
|
|
48
|
+
baseUrl: config.provider.baseUrl,
|
|
49
|
+
credential: {
|
|
50
|
+
ref: String(config.provider.credential),
|
|
51
|
+
sha256: credentialSha256 ?? null,
|
|
52
|
+
},
|
|
53
|
+
model: config.provider.model,
|
|
54
|
+
protocol: config.provider.protocol,
|
|
55
|
+
anthropicThinking: config.provider.anthropicThinking,
|
|
56
|
+
sslVerify: sslVerify ?? null,
|
|
57
|
+
userAgent: config.provider.userAgent,
|
|
58
|
+
},
|
|
59
|
+
language: config.language,
|
|
60
|
+
timeoutMs: config.timeoutMs,
|
|
61
|
+
concurrency: config.concurrency,
|
|
62
|
+
maxImageBytes: config.maxImageBytes,
|
|
63
|
+
maxImagePixels: config.maxImagePixels,
|
|
64
|
+
runtime: config.runtime,
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
/** Build a non-secret cache key from the Session, attachment, focus, and runtime contract. */
|
|
68
|
+
export function createEvidenceCacheKey(input) {
|
|
69
|
+
const promptHash = hash(input.prompt);
|
|
70
|
+
const digest = hash(JSON.stringify([
|
|
71
|
+
EVIDENCE_CONTRACT_VERSION,
|
|
72
|
+
input.sessionId ?? '',
|
|
73
|
+
input.sessionIdentity?.createdAt ?? '',
|
|
74
|
+
input.sessionIdentity?.cwd ?? '',
|
|
75
|
+
input.attachmentId,
|
|
76
|
+
promptHash,
|
|
77
|
+
input.runtimeHash,
|
|
78
|
+
]));
|
|
79
|
+
return Object.freeze({
|
|
80
|
+
digest,
|
|
81
|
+
contractVersion: EVIDENCE_CONTRACT_VERSION,
|
|
82
|
+
...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }),
|
|
83
|
+
...(input.sessionIdentity === undefined ? {} : { sessionCreatedAt: input.sessionIdentity.createdAt }),
|
|
84
|
+
...(input.sessionIdentity?.cwd === undefined ? {} : { sessionCwd: input.sessionIdentity.cwd }),
|
|
85
|
+
attachmentId: input.attachmentId,
|
|
86
|
+
promptHash,
|
|
87
|
+
runtimeHash: input.runtimeHash,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** Bounded promise cache; concurrent readers join one load and rejected loads are evicted. */
|
|
91
|
+
export class EvidenceCache {
|
|
92
|
+
limit;
|
|
93
|
+
persistence;
|
|
94
|
+
entries = new Map();
|
|
95
|
+
constructor(limit, persistence) {
|
|
96
|
+
this.limit = limit;
|
|
97
|
+
this.persistence = persistence;
|
|
98
|
+
}
|
|
99
|
+
/** Read a memory/durable hit or compute and persist one model-visible result. */
|
|
100
|
+
read(key, load) {
|
|
101
|
+
const memoryKey = typeof key === 'string' ? key : key.digest;
|
|
102
|
+
const existing = this.entries.get(memoryKey);
|
|
103
|
+
if (existing !== undefined) {
|
|
104
|
+
// Refresh recency: Map iteration order is insertion order.
|
|
105
|
+
this.entries.delete(memoryKey);
|
|
106
|
+
this.entries.set(memoryKey, existing);
|
|
107
|
+
return existing;
|
|
108
|
+
}
|
|
109
|
+
const pending = (async () => {
|
|
110
|
+
if (typeof key !== 'string' && this.persistence !== undefined) {
|
|
111
|
+
try {
|
|
112
|
+
const persisted = await this.persistence.read(key);
|
|
113
|
+
if (persisted !== undefined)
|
|
114
|
+
return persisted;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Persistence is an optimization; a damaged/unavailable sidecar must
|
|
118
|
+
// never block the model request from recomputing evidence.
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const block = await load();
|
|
122
|
+
if (typeof key !== 'string' && this.persistence !== undefined) {
|
|
123
|
+
try {
|
|
124
|
+
await this.persistence.write(key, block);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Keep the process-local result even when durability fails.
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return block;
|
|
131
|
+
})().then(block => block, (error) => {
|
|
132
|
+
// Only evict our own entry: this promise may have been LRU-evicted and
|
|
133
|
+
// the key re-populated by a newer read meanwhile.
|
|
134
|
+
if (this.entries.get(memoryKey) === pending) {
|
|
135
|
+
this.entries.delete(memoryKey);
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
});
|
|
139
|
+
this.entries.set(memoryKey, pending);
|
|
140
|
+
while (this.entries.size > this.limit) {
|
|
141
|
+
const oldest = this.entries.keys().next().value;
|
|
142
|
+
if (oldest === undefined)
|
|
143
|
+
break;
|
|
144
|
+
this.entries.delete(oldest);
|
|
145
|
+
}
|
|
146
|
+
return pending;
|
|
147
|
+
}
|
|
148
|
+
/** Drop process-local descriptions; durable rows stay versioned by their runtime fingerprint. */
|
|
149
|
+
clear() {
|
|
150
|
+
this.entries.clear();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function identityOf(header) {
|
|
154
|
+
return Object.freeze({
|
|
155
|
+
createdAt: header.createdAt,
|
|
156
|
+
...(header.cwd === undefined ? {} : { cwd: header.cwd }),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function sameIdentity(record, header) {
|
|
160
|
+
return record.session.createdAt === header.createdAt && record.session.cwd === header.cwd;
|
|
161
|
+
}
|
|
162
|
+
function matchesKey(record, key) {
|
|
163
|
+
return record.contractVersion === key.contractVersion
|
|
164
|
+
&& record.sessionId === key.sessionId
|
|
165
|
+
&& record.attachmentId === key.attachmentId
|
|
166
|
+
&& record.promptHash === key.promptHash
|
|
167
|
+
&& record.runtimeHash === key.runtimeHash;
|
|
168
|
+
}
|
|
169
|
+
function byteLength(text) {
|
|
170
|
+
return Buffer.byteLength(text, 'utf8');
|
|
171
|
+
}
|
|
172
|
+
function messageOf(error) {
|
|
173
|
+
return error instanceof Error ? error.message : String(error);
|
|
174
|
+
}
|
|
175
|
+
function parseRecord(value) {
|
|
176
|
+
try {
|
|
177
|
+
const parsed = JSON.parse(value);
|
|
178
|
+
const result = evidenceRecordSchema.safeParse(parsed);
|
|
179
|
+
return result.success ? result.data : undefined;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/** Official DSH storage-domain sidecar used to survive Profile restarts. */
|
|
186
|
+
export class SessionEvidenceStore {
|
|
187
|
+
ctx;
|
|
188
|
+
storage;
|
|
189
|
+
storageFiber;
|
|
190
|
+
storageReady;
|
|
191
|
+
mutationTail = Promise.resolve();
|
|
192
|
+
flushes = new Map();
|
|
193
|
+
warned = false;
|
|
194
|
+
maxEntries;
|
|
195
|
+
maxBytes;
|
|
196
|
+
maxEntryBytes;
|
|
197
|
+
now;
|
|
198
|
+
constructor(ctx, options = {}) {
|
|
199
|
+
this.ctx = ctx;
|
|
200
|
+
this.maxEntries = options.maxEntries ?? DEFAULT_PERSISTED_ENTRY_LIMIT;
|
|
201
|
+
this.maxBytes = options.maxBytes ?? DEFAULT_PERSISTED_BYTE_LIMIT;
|
|
202
|
+
this.maxEntryBytes = options.maxEntryBytes ?? DEFAULT_PERSISTED_ENTRY_BYTE_LIMIT;
|
|
203
|
+
this.now = options.now ?? Date.now;
|
|
204
|
+
if (typeof ctx.inject !== 'function')
|
|
205
|
+
return;
|
|
206
|
+
this.storageFiber = ctx.inject(['storageDomain'], async (storageCtx) => {
|
|
207
|
+
const domain = await storageCtx.storageDomain.open(evidenceCacheDomainSpec);
|
|
208
|
+
const binding = { table: domain.table('evidence') };
|
|
209
|
+
try {
|
|
210
|
+
await this.enqueueMutation(async () => { await this.prune(binding.table); });
|
|
211
|
+
this.storage = binding;
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
await domain.close();
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
return async () => {
|
|
218
|
+
if (this.storage === binding)
|
|
219
|
+
this.storage = undefined;
|
|
220
|
+
await this.mutationTail;
|
|
221
|
+
await domain.close();
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
this.storageReady = Promise.resolve(this.storageFiber).then(() => undefined, (error) => { this.warnOnce(error); });
|
|
225
|
+
}
|
|
226
|
+
/** Release the optional storage binding with the owning variant lifecycle. */
|
|
227
|
+
dispose() {
|
|
228
|
+
const fiber = this.storageFiber;
|
|
229
|
+
this.storageFiber = undefined;
|
|
230
|
+
this.storageReady = undefined;
|
|
231
|
+
if (fiber !== undefined)
|
|
232
|
+
void fiber.dispose().catch(error => { this.warnOnce(error); });
|
|
233
|
+
}
|
|
234
|
+
async read(key) {
|
|
235
|
+
const session = this.sessionFor(key);
|
|
236
|
+
if (session === undefined)
|
|
237
|
+
return undefined;
|
|
238
|
+
const binding = await this.prepareStorage();
|
|
239
|
+
if (binding === undefined)
|
|
240
|
+
return undefined;
|
|
241
|
+
const stored = binding.table.get(key.digest);
|
|
242
|
+
const record = stored === undefined ? undefined : parseRecord(stored);
|
|
243
|
+
if (record === undefined || !matchesKey(record, key) || !sameIdentity(record, session.header)) {
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
if (byteLength(record.text) > this.maxEntryBytes)
|
|
247
|
+
return undefined;
|
|
248
|
+
return { type: 'text', text: record.text };
|
|
249
|
+
}
|
|
250
|
+
async write(key, block) {
|
|
251
|
+
if (block.type !== 'text' || block.text.length === 0 || byteLength(block.text) > this.maxEntryBytes)
|
|
252
|
+
return;
|
|
253
|
+
const session = this.sessionFor(key);
|
|
254
|
+
if (session === undefined)
|
|
255
|
+
return;
|
|
256
|
+
const binding = await this.prepareStorage();
|
|
257
|
+
if (binding === undefined)
|
|
258
|
+
return;
|
|
259
|
+
try {
|
|
260
|
+
const participated = await this.flushSession(session);
|
|
261
|
+
if (!participated)
|
|
262
|
+
return;
|
|
263
|
+
const record = Object.freeze({
|
|
264
|
+
contractVersion: key.contractVersion,
|
|
265
|
+
sessionId: key.sessionId,
|
|
266
|
+
session: identityOf(session.header),
|
|
267
|
+
attachmentId: key.attachmentId,
|
|
268
|
+
promptHash: key.promptHash,
|
|
269
|
+
runtimeHash: key.runtimeHash,
|
|
270
|
+
text: block.text,
|
|
271
|
+
storedAt: this.now(),
|
|
272
|
+
});
|
|
273
|
+
await this.enqueueMutation(async () => {
|
|
274
|
+
await binding.table.put(key.digest, JSON.stringify(record));
|
|
275
|
+
await this.prune(binding.table);
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
this.warnOnce(error);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
sessionFor(key) {
|
|
283
|
+
if (key.sessionId === undefined)
|
|
284
|
+
return undefined;
|
|
285
|
+
const session = this.ctx.sessions.get(key.sessionId);
|
|
286
|
+
if (session === undefined)
|
|
287
|
+
return undefined;
|
|
288
|
+
if (key.sessionCreatedAt !== undefined
|
|
289
|
+
&& (session.header.createdAt !== key.sessionCreatedAt || session.header.cwd !== key.sessionCwd)) {
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
return session;
|
|
293
|
+
}
|
|
294
|
+
async prepareStorage() {
|
|
295
|
+
if (this.storage !== undefined)
|
|
296
|
+
return this.storage;
|
|
297
|
+
if (this.ctx.get('storageDomain') === undefined)
|
|
298
|
+
return undefined;
|
|
299
|
+
await this.storageReady;
|
|
300
|
+
return this.storage;
|
|
301
|
+
}
|
|
302
|
+
enqueueMutation(operation) {
|
|
303
|
+
const result = this.mutationTail.then(operation);
|
|
304
|
+
this.mutationTail = result.then(() => undefined, () => undefined);
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
flushSession(session) {
|
|
308
|
+
const key = `${session.id}\u0000${session.header.createdAt}\u0000${session.header.cwd ?? ''}`;
|
|
309
|
+
const existing = this.flushes.get(key);
|
|
310
|
+
if (existing !== undefined)
|
|
311
|
+
return existing;
|
|
312
|
+
const pending = this.ctx.sessions.flush(session).finally(() => {
|
|
313
|
+
if (this.flushes.get(key) === pending)
|
|
314
|
+
this.flushes.delete(key);
|
|
315
|
+
});
|
|
316
|
+
this.flushes.set(key, pending);
|
|
317
|
+
return pending;
|
|
318
|
+
}
|
|
319
|
+
async prune(table) {
|
|
320
|
+
const records = [...table.entries()].map(([key, stored]) => {
|
|
321
|
+
const record = parseRecord(stored);
|
|
322
|
+
return {
|
|
323
|
+
key,
|
|
324
|
+
bytes: byteLength(stored),
|
|
325
|
+
storedAt: record?.storedAt ?? -1,
|
|
326
|
+
valid: record !== undefined && byteLength(record.text) <= this.maxEntryBytes,
|
|
327
|
+
};
|
|
328
|
+
});
|
|
329
|
+
let totalBytes = records.reduce((sum, record) => sum + record.bytes, 0);
|
|
330
|
+
let totalEntries = records.length;
|
|
331
|
+
records.sort((left, right) => Number(left.valid) - Number(right.valid)
|
|
332
|
+
|| left.storedAt - right.storedAt
|
|
333
|
+
|| left.key.localeCompare(right.key));
|
|
334
|
+
for (const record of records) {
|
|
335
|
+
if (record.valid && totalEntries <= this.maxEntries && totalBytes <= this.maxBytes)
|
|
336
|
+
break;
|
|
337
|
+
if (await table.delete(record.key)) {
|
|
338
|
+
totalEntries -= 1;
|
|
339
|
+
totalBytes -= record.bytes;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
warnOnce(error) {
|
|
344
|
+
if (this.warned)
|
|
345
|
+
return;
|
|
346
|
+
this.warned = true;
|
|
347
|
+
this.ctx.logger?.warn('dsh-vision-toolkit: persistent image evidence cache is unavailable; using the process cache only. %s', messageOf(error).slice(0, 500));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=evidence-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-cache.js","sourceRoot":"","sources":["../src/evidence-cache.ts"],"names":[],"mappings":"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"}
|
package/lib/exposure.js
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-scoped progressive exposure for the model-facing visual tools.
|
|
3
|
+
* Runtime readiness is global, while tool schemas enter only an Agent through
|
|
4
|
+
* the matching Skill or its bootstrap tool; administrative diagnostics stay on
|
|
5
|
+
* the Web seam.
|
|
6
|
+
* @module dsh-vision-toolkit/exposure
|
|
7
|
+
*/
|
|
8
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
9
|
+
import { VISION_SKILLS_CONTENT, VISION_SKILLS_NAME } from "./skill.js";
|
|
10
|
+
import { VISION_TOOL_NAMES } from "./tools.js";
|
|
11
|
+
/** Small bootstrap tool retained only until the current Agent gains visual tools. */
|
|
12
|
+
export const VISION_TOOLKIT_ACTIVATE = 'vision_toolkit_activate';
|
|
13
|
+
/** Skill name used by releases before the rename to vision-skills. */
|
|
14
|
+
export const LEGACY_VISION_TOOLS_SKILL_NAME = 'vision-tools';
|
|
15
|
+
/** Unique pre-rename line in bundled instructions, kept for Session restore. */
|
|
16
|
+
export const LEGACY_VISION_TOOLS_SKILL_MARKER = 'If this content arrived through a direct `/vision-tools` invocation and the';
|
|
17
|
+
function renderJson(_args, value) {
|
|
18
|
+
return [{ type: 'text', text: JSON.stringify(value, null, 2) }];
|
|
19
|
+
}
|
|
20
|
+
function isRecord(value) {
|
|
21
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
function isBundledSkillName(name) {
|
|
24
|
+
return name === VISION_SKILLS_NAME || name === LEGACY_VISION_TOOLS_SKILL_NAME;
|
|
25
|
+
}
|
|
26
|
+
function isBundledSkillContent(text) {
|
|
27
|
+
return text.includes(VISION_SKILLS_CONTENT) || text.includes(LEGACY_VISION_TOOLS_SKILL_MARKER);
|
|
28
|
+
}
|
|
29
|
+
function isVisionSkillArguments(value) {
|
|
30
|
+
return isRecord(value) && isBundledSkillName(value.name);
|
|
31
|
+
}
|
|
32
|
+
function nativeSkillCall(raw) {
|
|
33
|
+
try {
|
|
34
|
+
return isVisionSkillArguments(JSON.parse(raw));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function containsBundledSkillContent(blocks) {
|
|
41
|
+
return blocks.some(block => isRecord(block)
|
|
42
|
+
&& block.type === 'text'
|
|
43
|
+
&& typeof block.text === 'string'
|
|
44
|
+
&& isBundledSkillContent(block.text));
|
|
45
|
+
}
|
|
46
|
+
function isBundledSkillResult(value) {
|
|
47
|
+
return isRecord(value)
|
|
48
|
+
&& isBundledSkillName(value.name)
|
|
49
|
+
&& typeof value.content === 'string'
|
|
50
|
+
&& isBundledSkillContent(value.content);
|
|
51
|
+
}
|
|
52
|
+
/** Whether durable history proves that this Session loaded the bundled Skill. */
|
|
53
|
+
function hasLoadedVisionSkill(session) {
|
|
54
|
+
const nativeCalls = new Set();
|
|
55
|
+
for (const event of session.events) {
|
|
56
|
+
if (event.type === 'user/message') {
|
|
57
|
+
const source = event.data.source;
|
|
58
|
+
if (source.kind === 'skill-invocation'
|
|
59
|
+
&& isBundledSkillName(source.name)
|
|
60
|
+
&& containsBundledSkillContent(event.data.content))
|
|
61
|
+
return true;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (event.type === 'tool/call') {
|
|
65
|
+
if (event.data.name === 'skill' && nativeSkillCall(event.data.arguments)) {
|
|
66
|
+
nativeCalls.add(String(event.data.callId));
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (event.type === 'tool/result') {
|
|
71
|
+
const [block] = event.data.message.content;
|
|
72
|
+
if (block?.type === 'tool-result'
|
|
73
|
+
&& block.isError !== true
|
|
74
|
+
&& nativeCalls.has(String(block.toolCallId))
|
|
75
|
+
&& containsBundledSkillContent(block.content))
|
|
76
|
+
return true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (event.type === 'tool/code-dispatch'
|
|
80
|
+
&& event.data.name === 'skill'
|
|
81
|
+
&& event.data.isError === false
|
|
82
|
+
&& isVisionSkillArguments(event.data.arguments)
|
|
83
|
+
&& containsBundledSkillContent(event.data.content))
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Owns one progressive-exposure generation for a ready Vision Toolkit runtime.
|
|
90
|
+
* The bootstrap tool is global; visual definitions are created and registered
|
|
91
|
+
* in an Agent scope after the Skill load is durable, just succeeded, or the
|
|
92
|
+
* model explicitly invokes the bootstrap fallback.
|
|
93
|
+
*/
|
|
94
|
+
export class VisionToolExposure {
|
|
95
|
+
ctx;
|
|
96
|
+
createTools;
|
|
97
|
+
activationTool;
|
|
98
|
+
states = new Map();
|
|
99
|
+
installed = false;
|
|
100
|
+
/**
|
|
101
|
+
* @param ctx - Plugin context with Tool and Agent registries.
|
|
102
|
+
* @param createTools - Fresh definitions bound to the current runtime generation.
|
|
103
|
+
*/
|
|
104
|
+
constructor(ctx, createTools) {
|
|
105
|
+
this.ctx = ctx;
|
|
106
|
+
this.createTools = createTools;
|
|
107
|
+
this.activationTool = defineTool({
|
|
108
|
+
name: VISION_TOOLKIT_ACTIVATE,
|
|
109
|
+
description: `Activate the independent Vision Toolkit execution tools for this Agent: ${Object.values(VISION_TOOL_NAMES).join(', ')}. `
|
|
110
|
+
+ `Loading the ${VISION_SKILLS_NAME} Skill normally activates them automatically; call this once when the visual tools are still absent, then use them for image understanding, OCR, UI detection, and related tasks. `
|
|
111
|
+
+ 'It is safe to call before the Skill is loaded, and this activation tool disappears after success.',
|
|
112
|
+
parameters: {},
|
|
113
|
+
output: {
|
|
114
|
+
schema: {
|
|
115
|
+
type: 'object',
|
|
116
|
+
additionalProperties: false,
|
|
117
|
+
properties: {
|
|
118
|
+
activated: { type: 'boolean', required: true },
|
|
119
|
+
tools: { type: 'array', items: { type: 'string' }, required: true },
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
render: renderJson,
|
|
123
|
+
},
|
|
124
|
+
execute: (_args, exec) => {
|
|
125
|
+
if (exec.agent === undefined) {
|
|
126
|
+
throw new Error(`${VISION_TOOLKIT_ACTIVATE}: an Agent Session is required`);
|
|
127
|
+
}
|
|
128
|
+
return Promise.resolve(this.activate(exec.agent));
|
|
129
|
+
},
|
|
130
|
+
presentCall: () => ({ card: 'generic', title: 'Activate vision tools', kind: 'execute' }),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/** Install lifecycle listeners and adopt Agents that already exist. */
|
|
134
|
+
install() {
|
|
135
|
+
if (this.installed)
|
|
136
|
+
throw new Error('dsh-vision-toolkit: progressive exposure is already installed');
|
|
137
|
+
this.installed = true;
|
|
138
|
+
const listeners = [
|
|
139
|
+
this.ctx.on('agent/created', ({ agent }) => { this.attach(agent); }),
|
|
140
|
+
this.ctx.on('agent/disposed', ({ agent }) => { this.detach(agent); }),
|
|
141
|
+
this.ctx.on('session/event', (session, event) => {
|
|
142
|
+
if (event.type === 'step/end')
|
|
143
|
+
this.applyHideActivationForSession(session);
|
|
144
|
+
}),
|
|
145
|
+
this.ctx.on('tools/result', (exec, result) => {
|
|
146
|
+
if (result.isError === false
|
|
147
|
+
&& exec.name === 'skill'
|
|
148
|
+
&& exec.agent !== undefined
|
|
149
|
+
&& isVisionSkillArguments(exec.arguments)
|
|
150
|
+
&& isBundledSkillResult(result.value)) {
|
|
151
|
+
this.activate(exec.agent);
|
|
152
|
+
}
|
|
153
|
+
return undefined;
|
|
154
|
+
}),
|
|
155
|
+
];
|
|
156
|
+
try {
|
|
157
|
+
for (const agent of this.ctx.agents.list())
|
|
158
|
+
this.attach(agent);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
for (const dispose of listeners.reverse())
|
|
162
|
+
dispose();
|
|
163
|
+
this.disposeStates();
|
|
164
|
+
this.installed = false;
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
return () => {
|
|
168
|
+
if (!this.installed)
|
|
169
|
+
return;
|
|
170
|
+
this.installed = false;
|
|
171
|
+
for (const dispose of listeners.reverse())
|
|
172
|
+
dispose();
|
|
173
|
+
this.disposeStates();
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
attach(agent) {
|
|
177
|
+
if (this.states.has(agent))
|
|
178
|
+
return;
|
|
179
|
+
this.states.set(agent, { active: false, toolDisposers: [], toolNames: [] });
|
|
180
|
+
if (hasLoadedVisionSkill(agent.session))
|
|
181
|
+
this.activate(agent);
|
|
182
|
+
}
|
|
183
|
+
activate(agent) {
|
|
184
|
+
this.attach(agent);
|
|
185
|
+
const state = this.states.get(agent);
|
|
186
|
+
/* v8 ignore next -- attach() synchronously creates this exact entry. */
|
|
187
|
+
if (state === undefined)
|
|
188
|
+
throw new Error(`dsh-vision-toolkit: Agent ${String(agent.id)} has no exposure state`);
|
|
189
|
+
if (state.active)
|
|
190
|
+
return { activated: false, tools: [...state.toolNames] };
|
|
191
|
+
const definitions = this.createTools();
|
|
192
|
+
const toolDisposers = [];
|
|
193
|
+
try {
|
|
194
|
+
for (const definition of definitions)
|
|
195
|
+
toolDisposers.push(agent.ctx.tools.register(definition));
|
|
196
|
+
// A Skill call and the bootstrap can be issued in the same model step.
|
|
197
|
+
// Restricting immediately would turn the still-in-flight bootstrap call
|
|
198
|
+
// into an UNKNOWN_TOOL error, so live sessions hide at step/end.
|
|
199
|
+
if (!this.isLiveSession(agent.session))
|
|
200
|
+
this.applyHideActivation(agent);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
for (const dispose of toolDisposers.reverse())
|
|
204
|
+
dispose();
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
state.active = true;
|
|
208
|
+
state.toolDisposers = toolDisposers;
|
|
209
|
+
state.toolNames = definitions.map(definition => definition.name);
|
|
210
|
+
return { activated: true, tools: [...state.toolNames] };
|
|
211
|
+
}
|
|
212
|
+
/** Whether the session is attached to the live SessionStore (production). */
|
|
213
|
+
isLiveSession(session) {
|
|
214
|
+
return this.ctx.sessions.get(session.id) === session;
|
|
215
|
+
}
|
|
216
|
+
applyHideActivationForSession(session) {
|
|
217
|
+
for (const agent of this.ctx.agents.list()) {
|
|
218
|
+
if (agent.session === session && this.states.get(agent)?.active === true) {
|
|
219
|
+
this.applyHideActivation(agent);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
applyHideActivation(agent) {
|
|
224
|
+
const state = this.states.get(agent);
|
|
225
|
+
if (state === undefined || state.liftRestriction !== undefined)
|
|
226
|
+
return;
|
|
227
|
+
state.liftRestriction = agent.ctx.tools.restrict({ deny: [VISION_TOOLKIT_ACTIVATE] });
|
|
228
|
+
}
|
|
229
|
+
detach(agent) {
|
|
230
|
+
const state = this.states.get(agent);
|
|
231
|
+
if (state === undefined)
|
|
232
|
+
return;
|
|
233
|
+
this.states.delete(agent);
|
|
234
|
+
this.disposeState(state);
|
|
235
|
+
}
|
|
236
|
+
disposeStates() {
|
|
237
|
+
for (const state of this.states.values())
|
|
238
|
+
this.disposeState(state);
|
|
239
|
+
this.states.clear();
|
|
240
|
+
}
|
|
241
|
+
disposeState(state) {
|
|
242
|
+
state.liftRestriction?.();
|
|
243
|
+
for (const dispose of state.toolDisposers.reverse())
|
|
244
|
+
dispose();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=exposure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposure.js","sourceRoot":"","sources":["../src/exposure.ts"],"names":[],"mappings":"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"}
|