dsh-web-search-enhanced 0.2.2 → 0.2.4

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/lib/index.js CHANGED
@@ -150,10 +150,23 @@ function decodeJsonEscapes(value) {
150
150
  }
151
151
  //#endregion
152
152
  //#region ../core/src/host/adapter.ts
153
+ /** The default: generic wording with the generic explanation, as today. */
154
+ const statusVerdict = (response) => ({
155
+ kind: "status",
156
+ detail: response.explanation
157
+ });
153
158
  function mapWire(wire, map) {
159
+ const parseFailure = wire.parseFailure === void 0 ? void 0 : wire.parseFailure.bind(wire);
154
160
  const mapped = {
155
161
  request: (input, endpoint, auth) => wire.request(input, endpoint, auth),
156
- parse: (payload, input) => map(wire.parse(payload, input))
162
+ parse: (payload, input) => map(wire.parse(payload, input)),
163
+ ...parseFailure === void 0 ? {} : { parseFailure(response, input) {
164
+ const verdict = parseFailure(response, input);
165
+ return verdict.kind === "status" ? verdict : {
166
+ kind: "outcome",
167
+ outcome: map(verdict.outcome)
168
+ };
169
+ } }
157
170
  };
158
171
  const route = wire.keyless;
159
172
  if (route === void 0) return mapped;
@@ -216,8 +229,7 @@ function runAdapter(io, wire, target, input, signal) {
216
229
  }, deadline, upstream);
217
230
  return route.parse(result, input);
218
231
  }
219
- const request = wire.request(input, target.endpoint, { kind: "keyless" });
220
- return wire.parse(await io.transport.requestJson(request, deadline, upstream), input);
232
+ return await runRest(io, wire, wire.request(input, target.endpoint, { kind: "keyless" }), input, deadline, upstream);
221
233
  }
222
234
  const stored = storedApiKey(await adapterCredential(io, target.credentialRef, deadline));
223
235
  if (stored.kind === "missing") throw io.errors.error("WEB_PROVIDER_CREDENTIAL_MISSING", io.credentialMissing(target.credentialRef));
@@ -229,17 +241,23 @@ function runAdapter(io, wire, target, input, signal) {
229
241
  onDiagnostic: io.onDiagnostic,
230
242
  matcher
231
243
  };
232
- const request = wire.request(input, target.endpoint, {
244
+ return await runRest(io, wire, wire.request(input, target.endpoint, {
233
245
  kind: "api-key",
234
246
  key: stored.key
235
- });
236
- return redactJson(wire.parse(await io.transport.requestJson(request, deadline, upstream), input), matcher);
247
+ }), input, deadline, upstream);
237
248
  } catch (error) {
238
249
  if (error instanceof WebError) throw error;
239
250
  throw redactDiagnostic(error, matcher === void 0 ? secretMatcher([]) : matcher);
240
251
  }
241
252
  });
242
253
  }
254
+ async function runRest(io, wire, request, input, signal, upstream) {
255
+ const exchange = await io.transport.exchangeJson(request, signal, upstream);
256
+ if (exchange.kind === "ok") return redactJson(wire.parse(exchange.payload, input), upstream.matcher);
257
+ const verdict = wire.parseFailure === void 0 ? statusVerdict(exchange.response) : wire.parseFailure(exchange.response, input);
258
+ if (verdict.kind === "status") throw io.transport.statusFailure(exchange.response.status, upstream, verdict.detail);
259
+ return verdict.outcome;
260
+ }
243
261
  async function adapterCredential(io, ref, signal) {
244
262
  try {
245
263
  return await io.errors.abortable(io.credential(ref), signal);
@@ -304,9 +322,8 @@ function createTransport(errors, { timeoutMs, maxResponseBytes, messages }) {
304
322
  clearTimeout(timer);
305
323
  }
306
324
  }
307
- async function send(request, signal, upstream) {
325
+ async function exchangeResponse(request, signal, upstream, matcher) {
308
326
  throwIfAborted(signal);
309
- const matcher = upstream.matcher === void 0 ? secretMatcher([]) : upstream.matcher;
310
327
  let response;
311
328
  try {
312
329
  response = await fetch(request.url, {
@@ -321,14 +338,25 @@ function createTransport(errors, { timeoutMs, maxResponseBytes, messages }) {
321
338
  throwIfAborted(signal);
322
339
  throw capabilityError("WEB_PROVIDER_ERROR", messages.unreachable(upstream.label));
323
340
  }
324
- if (!response.ok) {
325
- const failure = statusError(response.status, upstream);
326
- const body = await readFailureText(response, signal, upstream, matcher);
327
- const detail = failureExplanation(body.text, matcher, body.truncated);
328
- if (detail === void 0) throw failure;
329
- throw new WebError(failure.message + upstreamSuffix(upstream.label, detail), failure.code);
330
- }
331
- return response;
341
+ if (response.ok) return {
342
+ kind: "ok",
343
+ response
344
+ };
345
+ const body = await readFailureText(response, signal, upstream, matcher);
346
+ return {
347
+ kind: "failure",
348
+ response: failureResponse(response.status, body.text, matcher, body.truncated)
349
+ };
350
+ }
351
+ async function send(request, signal, upstream) {
352
+ const exchange = await exchangeResponse(request, signal, upstream, upstream.matcher === void 0 ? secretMatcher([]) : upstream.matcher);
353
+ if (exchange.kind === "failure") throw statusFailure(exchange.response.status, upstream, exchange.response.explanation);
354
+ return exchange.response;
355
+ }
356
+ function statusFailure(status, upstream, detail) {
357
+ const failure = statusError(status, upstream);
358
+ if (detail === void 0) return failure;
359
+ return new WebError(failure.message + upstreamSuffix(upstream.label, detail), failure.code);
332
360
  }
333
361
  function statusError(status, { label, access }) {
334
362
  if (status === 401 || status === 403) {
@@ -448,12 +476,19 @@ function createTransport(errors, { timeoutMs, maxResponseBytes, messages }) {
448
476
  }
449
477
  return payload;
450
478
  }
451
- async function requestJson(request, signal, upstream) {
479
+ async function exchangeJson(request, signal, upstream) {
452
480
  const matcher = upstream.matcher === void 0 ? secretMatcher([]) : upstream.matcher;
453
- return redactJson(await readJson(await send(request, signal, {
454
- ...upstream,
455
- matcher
456
- }), signal, upstream.onDiagnostic, matcher), matcher);
481
+ const exchange = await exchangeResponse(request, signal, upstream, matcher);
482
+ if (exchange.kind === "failure") return exchange;
483
+ return {
484
+ kind: "ok",
485
+ payload: redactJson(await readJson(exchange.response, signal, upstream.onDiagnostic, matcher), matcher)
486
+ };
487
+ }
488
+ async function requestJson(request, signal, upstream) {
489
+ const exchange = await exchangeJson(request, signal, upstream);
490
+ if (exchange.kind === "failure") throw statusFailure(exchange.response.status, upstream, exchange.response.explanation);
491
+ return exchange.payload;
457
492
  }
458
493
  function invalidResponse(detail) {
459
494
  return capabilityError("WEB_PROVIDER_ERROR", messages.invalidResponse(detail));
@@ -467,6 +502,8 @@ function createTransport(errors, { timeoutMs, maxResponseBytes, messages }) {
467
502
  readText,
468
503
  readJson,
469
504
  requestJson,
505
+ exchangeJson,
506
+ statusFailure,
470
507
  invalidResponse
471
508
  };
472
509
  }
@@ -479,26 +516,55 @@ function upstreamText(value) {
479
516
  const boundary = last >= 55296 && last <= 56319 ? 1998 : 1999;
480
517
  return text.slice(0, boundary) + "…";
481
518
  }
519
+ function screenedText(value) {
520
+ return value.trim() === "" ? void 0 : {
521
+ kind: "text",
522
+ text: value
523
+ };
524
+ }
525
+ /** Text from a successful body, already redacted by transport: uncut, never withheld. */
526
+ function bodyDetail(value) {
527
+ return typeof value === "string" ? screenedText(value) : void 0;
528
+ }
482
529
  /** Sensitive raw explanations are withheld, not precisely edited. */
483
530
  function upstreamDetail(value, matcher, truncated = false) {
484
531
  if (containsSecret(value, matcher)) return { kind: "withheld" };
485
- const text = upstreamText(truncated ? stripPrefix(value, matcher) : value);
486
- return text === void 0 ? void 0 : {
487
- kind: "text",
488
- text
489
- };
532
+ return screenedText(truncated ? stripPrefix(value, matcher) : value);
490
533
  }
491
534
  function upstreamSuffix(label, detail) {
492
535
  if (detail === void 0) return "";
493
- if (detail.kind === "withheld") return "\n\n" + label + "'s response was withheld because it contained this request's credential.";
494
- return "\n\n" + label + " responded (untrusted): " + detail.text;
536
+ if ("text" in detail) {
537
+ const text = upstreamText(detail.text);
538
+ return text === void 0 ? "" : "\n\n" + label + " responded (untrusted): " + text;
539
+ }
540
+ return "\n\n" + label + "'s response was withheld because it contained this request's credential.";
495
541
  }
496
542
  function stripPrefix(text, matcher) {
497
543
  for (let length = Math.min(7, text.length); length > 0; length--) if (matcher.prefixes.has(text.slice(-length))) return text.slice(0, -length);
498
544
  return text;
499
545
  }
500
- function failureExplanation(body, matcher, truncated) {
501
- if (containsSecret(body, matcher)) return { kind: "withheld" };
546
+ function failureResponse(status, body, matcher, truncated) {
547
+ const sensitive = containsSecret(body, matcher);
548
+ return {
549
+ status,
550
+ json: truncated ? void 0 : redactJson(failureJson(body), matcher),
551
+ explanation: failureExplanation(body, matcher, truncated, sensitive),
552
+ explain(value) {
553
+ if (sensitive) return { kind: "withheld" };
554
+ return typeof value === "string" ? upstreamDetail(value, matcher) : void 0;
555
+ }
556
+ };
557
+ }
558
+ function failureJson(body) {
559
+ try {
560
+ return JSON.parse(body);
561
+ } catch (error) {
562
+ if (!(error instanceof SyntaxError)) throw error;
563
+ return;
564
+ }
565
+ }
566
+ function failureExplanation(body, matcher, truncated, sensitive) {
567
+ if (sensitive) return { kind: "withheld" };
502
568
  const text = truncated ? stripPrefix(body, matcher) : body;
503
569
  let payload;
504
570
  try {
@@ -14484,9 +14550,9 @@ function settingsRow(options) {
14484
14550
  } catch (error) {
14485
14551
  ctx.logger.warn("%s: invalid initial " + capabilityLabel + " settings: %s", identity.rowId, error);
14486
14552
  }
14487
- ctx.on("internal/config", function(_raw, next) {
14553
+ ctx.on("internal/config", (fiber, next) => {
14488
14554
  const raw = next();
14489
- if (this === ctx.fiber) resolve(read(Config(raw)));
14555
+ if (fiber === ctx.fiber) resolve(read(Config(raw)));
14490
14556
  return raw;
14491
14557
  });
14492
14558
  ctx.inject(["settings"], (scope) => {
@@ -15146,11 +15212,9 @@ function oneLine(value, max) {
15146
15212
  const last = flat.charCodeAt(max - 2);
15147
15213
  return flat.slice(0, last >= 55296 && last <= 56319 ? max - 2 : max - 1) + "…";
15148
15214
  }
15149
- function nextModel(ctx, agent) {
15150
- const pending = ctx.get("sessionProjections")?.stateOf(agent.session, "modelSelection")?.pending;
15151
- if (pending !== void 0 && pending !== null) return complete(pending);
15152
- const request = agent.session.requestHeader();
15153
- return complete(request === void 0 ? agent.options : request.config);
15215
+ function nextModel(_ctx, agent) {
15216
+ const current = agent.model.current();
15217
+ return current === void 0 ? void 0 : complete(current);
15154
15218
  }
15155
15219
  function complete(value) {
15156
15220
  if (!value.provider || !value.model) return void 0;
@@ -15318,13 +15382,9 @@ function sessionOrigin(header) {
15318
15382
  parent,
15319
15383
  seeded
15320
15384
  };
15321
- return parent === void 0 ? {
15385
+ return {
15322
15386
  kind: "top-level",
15323
15387
  seeded
15324
- } : {
15325
- kind: "fork",
15326
- parent,
15327
- seeded
15328
15388
  };
15329
15389
  }
15330
15390
  function parentOf(origin) {
@@ -15332,10 +15392,12 @@ function parentOf(origin) {
15332
15392
  }
15333
15393
  //#endregion
15334
15394
  //#region ../core/src/host/provider-lists.ts
15335
- /** Live setup/created events do not make a new conversation a restored one. */
15395
+ /** Public lifecycle offsets distinguish a fresh ordinary fork from its persisted resume. */
15336
15396
  function isNewConversation(session) {
15337
15397
  const origin = sessionOrigin(session.header);
15338
- return parentOf(origin) === void 0 && !origin.seeded && session.firstLiveSeq === 0 && session.firstLifecycleSeq === 0;
15398
+ if (origin.kind === "subagent") return false;
15399
+ if (origin.seeded) return session.firstLifecycleSeq === session.inheritedEventCount;
15400
+ return session.firstLiveSeq === 0 && session.firstLifecycleSeq === 0;
15339
15401
  }
15340
15402
  /** Immutable conversation authorization, sharing the selection queue and storage lifetime. */
15341
15403
  var ProviderLists = class {
@@ -15468,7 +15530,7 @@ var Sessions = class {
15468
15530
  const origin = sessionOrigin(target.header);
15469
15531
  const parentSession = parentOf(origin);
15470
15532
  const seeded = parentSession !== void 0 && origin.seeded;
15471
- let inherited = stored !== void 0 && seeded && (stored.inherited ?? table.get(parentSession) !== void 0);
15533
+ let inherited = stored !== void 0 && (stored.inherited ?? (seeded && table.get(parentSession) !== void 0));
15472
15534
  if (stored === void 0 && seeded) {
15473
15535
  const parentAgent = this.ctx.get("agents")?.get(parentSession);
15474
15536
  if (parentAgent !== void 0 && persist) await this.current(liveSession(parentAgent));
@@ -16617,7 +16679,7 @@ function envelope(payload) {
16617
16679
  payload.message
16618
16680
  ]) {
16619
16681
  if (typeof candidate !== "string") continue;
16620
- detail = upstreamText(candidate);
16682
+ detail = bodyDetail(candidate);
16621
16683
  if (detail !== void 0) break;
16622
16684
  }
16623
16685
  return {
@@ -16935,6 +16997,54 @@ const tinyfishSearch = {
16935
16997
  }
16936
16998
  };
16937
16999
  //#endregion
17000
+ //#region ../core/src/host/providers/anysearch.ts
17001
+ /** AnySearch REST search and extract. The catalog offers personal keys only; there is no anonymous route here. */
17002
+ /** 402 means the quota is spent; its body is ignored (for anonymous callers it carries a generated account). */
17003
+ function quotaVerdict(response) {
17004
+ return response.status === 402 ? {
17005
+ kind: "status",
17006
+ detail: void 0
17007
+ } : void 0;
17008
+ }
17009
+ const anysearchSearch = {
17010
+ request(input, endpoint, auth) {
17011
+ return postJson(endpoint, bearer(auth), {
17012
+ ...input.options,
17013
+ query: input.query,
17014
+ ...count("max_results", input.maxResults, 10)
17015
+ });
17016
+ },
17017
+ parse(payload) {
17018
+ if (!isRecord(payload)) return {
17019
+ kind: "failure",
17020
+ failure: "invalid",
17021
+ reason: "not-object"
17022
+ };
17023
+ if (typeof payload.code !== "number") return {
17024
+ kind: "failure",
17025
+ failure: "invalid",
17026
+ reason: "code-number"
17027
+ };
17028
+ if (payload.code !== 0) return {
17029
+ kind: "failure",
17030
+ failure: "api",
17031
+ detail: bodyDetail(payload.message)
17032
+ };
17033
+ const rows = isRecord(payload.data) ? payload.data.results : void 0;
17034
+ if (!Array.isArray(rows)) return {
17035
+ kind: "failure",
17036
+ failure: "invalid",
17037
+ reason: "data-results-array"
17038
+ };
17039
+ return mapRows(rows, (row) => ({
17040
+ url: row.url,
17041
+ title: row.title,
17042
+ snippet: text$1(row.snippet) ?? row.content
17043
+ }));
17044
+ },
17045
+ parseFailure: (response) => quotaVerdict(response) ?? statusVerdict(response)
17046
+ };
17047
+ //#endregion
16938
17048
  //#region ../core/src/host/providers/openalex.ts
16939
17049
  /** OpenAlex works search, scholarly field mapping and bounded inverted abstracts. */
16940
17050
  /** OpenAlex asks anonymous clients to identify themselves for the polite pool. */
@@ -17431,7 +17541,7 @@ const { withDeadline, readJson, requestJson, invalidResponse } = transport;
17431
17541
  const mcp = createMcpClient(transport, searchErrors, {
17432
17542
  clientInfo: {
17433
17543
  name: SEARCH.packageName,
17434
- version: "0.2.2"
17544
+ version: "0.2.4"
17435
17545
  },
17436
17546
  messages: {
17437
17547
  toolFailed: (label, detail) => label + " could not complete the search; retry later or choose another search connection" + upstreamSuffix(label, detail),
@@ -17780,6 +17890,30 @@ const CATALOG = {
17780
17890
  }
17781
17891
  }
17782
17892
  },
17893
+ anysearch: {
17894
+ label: "AnySearch",
17895
+ endpoint: "https://api.anysearch.com/v1/search",
17896
+ access: {
17897
+ keyless: false,
17898
+ apiKey: { credentialRef: "ANYSEARCH_API_KEY" },
17899
+ account: false
17900
+ },
17901
+ kind: "adapter",
17902
+ remote: true,
17903
+ optIn: true,
17904
+ freshness: [],
17905
+ homepage: "https://www.anysearch.com",
17906
+ options: {
17907
+ zone: {
17908
+ kind: "enum",
17909
+ values: ["cn", "intl"]
17910
+ },
17911
+ language: {
17912
+ kind: "text",
17913
+ pattern: /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8}){0,2}$/u
17914
+ }
17915
+ }
17916
+ },
17783
17917
  openalex: {
17784
17918
  label: "OpenAlex",
17785
17919
  endpoint: "https://api.openalex.org/works",
@@ -18157,6 +18291,8 @@ contract.options;
18157
18291
  /** What the search service returned, in the model-facing invalid-response message. */
18158
18292
  const INVALID_DETAIL = {
18159
18293
  "not-object": "a body that is not a JSON object",
18294
+ "code-number": "no numeric \"code\" field",
18295
+ "data-results-array": "no \"data.results\" array",
18160
18296
  "results-array": "no \"results\" array",
18161
18297
  "data-array": "no \"data\" array",
18162
18298
  "data-web-array": "no \"data.web\" array",
@@ -18172,11 +18308,7 @@ function searchSources(outcome) {
18172
18308
  for (const row of outcome.rows) list.add(row);
18173
18309
  return list.sources;
18174
18310
  }
18175
- if (outcome.failure === "api") {
18176
- const detail = outcome.detail === void 0 ? void 0 : upstreamText(outcome.detail);
18177
- const message = "the search service reported an API error; retry later or choose another search connection";
18178
- throw searchError("WEB_PROVIDER_ERROR", detail === void 0 ? message : message + "\n\nThe search service responded (untrusted): " + detail);
18179
- }
18311
+ if (outcome.failure === "api") throw searchError("WEB_PROVIDER_ERROR", "the search service reported an API error; retry later or choose another search connection" + upstreamSuffix("The search service", outcome.detail));
18180
18312
  throw invalidResponse(INVALID_DETAIL[outcome.reason]);
18181
18313
  }
18182
18314
  //#endregion
@@ -18186,6 +18318,7 @@ const ADAPTER_WIRES = {
18186
18318
  firecrawl: mapWire(firecrawlSearch, searchSources),
18187
18319
  tavily: mapWire(tavilySearch, searchSources),
18188
18320
  tinyfish: mapWire(tinyfishSearch, searchSources),
18321
+ anysearch: mapWire(anysearchSearch, searchSources),
18189
18322
  openalex: mapWire(openalexSearch, searchSources),
18190
18323
  semanticscholar: mapWire(semanticscholarSearch, searchSources)
18191
18324
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-web-search-enhanced",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "web_search provider for DeepSeek Harness with switchable search backends; installed through dsh-tool-web-enhanced-profile",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -39,38 +39,38 @@
39
39
  "access": "public"
40
40
  },
41
41
  "engines": {
42
- "node": "^22.19.0 || >=24.0.0",
43
- "dsh": ">=0.2.1-rc.2 <0.3.0-0"
42
+ "node": ">=24.9.0",
43
+ "dsh": ">=0.2.2-rc.1 <0.3.0-0"
44
44
  },
45
45
  "peerDependencies": {
46
- "@deepseek-ai/cordis": "~4.0.5",
47
- "@deepseek-ai/dsh-agent": ">=0.2.1-rc.2 <0.3.0-0",
48
- "@deepseek-ai/dsh-api-remotes": ">=0.2.1-rc.2 <0.3.0-0",
49
- "@deepseek-ai/dsh-api-session-controller": ">=0.2.1-rc.2 <0.3.0-0",
50
- "@deepseek-ai/dsh-client-locale": ">=0.2.1-rc.2 <0.3.0-0",
51
- "@deepseek-ai/dsh-client-store": ">=0.2.1-rc.2 <0.3.0-0",
52
- "@deepseek-ai/dsh-client-ui-commands": ">=0.2.1-rc.2 <0.3.0-0",
53
- "@deepseek-ai/dsh-client-ui-conversation": ">=0.2.1-rc.2 <0.3.0-0",
54
- "@deepseek-ai/dsh-client-ui-plugin-manager": ">=0.2.1-rc.2 <0.3.0-0",
55
- "@deepseek-ai/dsh-client-ui-primitives": ">=0.2.1-rc.2 <0.3.0-0",
56
- "@deepseek-ai/dsh-client-ui-renderer": ">=0.2.1-rc.2 <0.3.0-0",
57
- "@deepseek-ai/dsh-client-ui-session": ">=0.2.1-rc.2 <0.3.0-0",
58
- "@deepseek-ai/dsh-client-ui-settings": ">=0.2.1-rc.2 <0.3.0-0",
59
- "@deepseek-ai/dsh-client-ui-slots": ">=0.2.1-rc.2 <0.3.0-0",
60
- "@deepseek-ai/dsh-credentials": ">=0.2.1-rc.2 <0.3.0-0",
61
- "@deepseek-ai/dsh-deepseek-account": ">=0.2.1-rc.2 <0.3.0-0",
62
- "@deepseek-ai/dsh-launch-environment": ">=0.2.1-rc.2 <0.3.0-0",
63
- "@deepseek-ai/dsh-scope": ">=0.2.1-rc.2 <0.3.0-0",
64
- "@deepseek-ai/dsh-session": ">=0.2.1-rc.2 <0.3.0-0",
65
- "@deepseek-ai/dsh-settings": ">=0.2.1-rc.2 <0.3.0-0",
66
- "@deepseek-ai/dsh-storage-domain": ">=0.2.1-rc.2 <0.3.0-0",
67
- "@deepseek-ai/dsh-tool-web": ">=0.2.1-rc.2 <0.3.0-0",
68
- "@deepseek-ai/dsh-tools": ">=0.2.1-rc.2 <0.3.0-0",
69
- "@deepseek-ai/dsh-typert-protocol": ">=0.2.1-rc.2 <0.3.0-0",
70
- "@deepseek-ai/dsh-web": ">=0.2.1-rc.2 <0.3.0-0",
71
- "@deepseek-ai/dsh-web-deepseek-api": ">=0.2.1-rc.2 <0.3.0-0",
72
- "@deepseek-ai/dsh-web-search-deepseek": ">=0.2.1-rc.2 <0.3.0-0",
73
- "@deepseek-ai/schemastery": "^3.18.5",
46
+ "@deepseek-ai/cordis": "~4.1.0",
47
+ "@deepseek-ai/dsh-agent": ">=0.2.2-rc.1 <0.3.0-0",
48
+ "@deepseek-ai/dsh-api-remotes": ">=0.2.2-rc.1 <0.3.0-0",
49
+ "@deepseek-ai/dsh-api-session-controller": ">=0.2.2-rc.1 <0.3.0-0",
50
+ "@deepseek-ai/dsh-client-locale": ">=0.2.2-rc.1 <0.3.0-0",
51
+ "@deepseek-ai/dsh-client-store": ">=0.2.2-rc.1 <0.3.0-0",
52
+ "@deepseek-ai/dsh-client-ui-commands": ">=0.2.2-rc.1 <0.3.0-0",
53
+ "@deepseek-ai/dsh-client-ui-conversation": ">=0.2.2-rc.1 <0.3.0-0",
54
+ "@deepseek-ai/dsh-client-ui-plugin-manager": ">=0.2.2-rc.1 <0.3.0-0",
55
+ "@deepseek-ai/dsh-client-ui-primitives": ">=0.2.2-rc.1 <0.3.0-0",
56
+ "@deepseek-ai/dsh-client-ui-renderer": ">=0.2.2-rc.1 <0.3.0-0",
57
+ "@deepseek-ai/dsh-client-ui-session": ">=0.2.2-rc.1 <0.3.0-0",
58
+ "@deepseek-ai/dsh-client-ui-settings": ">=0.2.2-rc.1 <0.3.0-0",
59
+ "@deepseek-ai/dsh-client-ui-slots": ">=0.2.2-rc.1 <0.3.0-0",
60
+ "@deepseek-ai/dsh-credentials": ">=0.2.2-rc.1 <0.3.0-0",
61
+ "@deepseek-ai/dsh-deepseek-account": ">=0.2.2-rc.1 <0.3.0-0",
62
+ "@deepseek-ai/dsh-launch-environment": ">=0.2.2-rc.1 <0.3.0-0",
63
+ "@deepseek-ai/dsh-scope": ">=0.2.2-rc.1 <0.3.0-0",
64
+ "@deepseek-ai/dsh-session": ">=0.2.2-rc.1 <0.3.0-0",
65
+ "@deepseek-ai/dsh-settings": ">=0.2.2-rc.1 <0.3.0-0",
66
+ "@deepseek-ai/dsh-storage-domain": ">=0.2.2-rc.1 <0.3.0-0",
67
+ "@deepseek-ai/dsh-tool-web": ">=0.2.2-rc.1 <0.3.0-0",
68
+ "@deepseek-ai/dsh-tools": ">=0.2.2-rc.1 <0.3.0-0",
69
+ "@deepseek-ai/dsh-typert-protocol": ">=0.2.2-rc.1 <0.3.0-0",
70
+ "@deepseek-ai/dsh-web": ">=0.2.2-rc.1 <0.3.0-0",
71
+ "@deepseek-ai/dsh-web-deepseek-api": ">=0.2.2-rc.1 <0.3.0-0",
72
+ "@deepseek-ai/dsh-web-search-deepseek": ">=0.2.2-rc.1 <0.3.0-0",
73
+ "@deepseek-ai/schemastery": "^3.19.0",
74
74
  "react": "^18.2.0",
75
75
  "react-dom": "^18.2.0"
76
76
  },
@@ -119,35 +119,35 @@
119
119
  }
120
120
  },
121
121
  "devDependencies": {
122
- "@deepseek-ai/cordis": "4.0.5",
123
- "@deepseek-ai/cordis-plugin-loader": "1.0.6",
124
- "@deepseek-ai/dsh-agent": "0.2.1-rc.2",
125
- "@deepseek-ai/dsh-api-remotes": "0.2.1-rc.2",
126
- "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.2",
127
- "@deepseek-ai/dsh-client-locale": "0.2.1-rc.2",
128
- "@deepseek-ai/dsh-client-store": "0.2.1-rc.2",
129
- "@deepseek-ai/dsh-client-ui-commands": "0.2.1-rc.2",
130
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.2",
131
- "@deepseek-ai/dsh-client-ui-plugin-manager": "0.2.1-rc.2",
132
- "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.2",
133
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.2",
134
- "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.2",
135
- "@deepseek-ai/dsh-client-ui-settings": "0.2.1-rc.2",
136
- "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.2",
137
- "@deepseek-ai/dsh-credentials": "0.2.1-rc.2",
138
- "@deepseek-ai/dsh-deepseek-account": "0.2.1-rc.2",
139
- "@deepseek-ai/dsh-launch-environment": "0.2.1-rc.2",
140
- "@deepseek-ai/dsh-scope": "0.2.1-rc.2",
141
- "@deepseek-ai/dsh-session": "0.2.1-rc.2",
142
- "@deepseek-ai/dsh-settings": "0.2.1-rc.2",
143
- "@deepseek-ai/dsh-storage-domain": "0.2.1-rc.2",
144
- "@deepseek-ai/dsh-tool-web": "0.2.1-rc.2",
145
- "@deepseek-ai/dsh-tools": "0.2.1-rc.2",
146
- "@deepseek-ai/dsh-typert-protocol": "0.2.1-rc.2",
147
- "@deepseek-ai/dsh-web": "0.2.1-rc.2",
148
- "@deepseek-ai/dsh-web-deepseek-api": "0.2.1-rc.2",
149
- "@deepseek-ai/dsh-web-search-deepseek": "0.2.1-rc.2",
150
- "@deepseek-ai/schemastery": "3.18.5",
122
+ "@deepseek-ai/cordis": "4.1.0",
123
+ "@deepseek-ai/cordis-plugin-loader": "1.1.0",
124
+ "@deepseek-ai/dsh-agent": "0.2.2-rc.1",
125
+ "@deepseek-ai/dsh-api-remotes": "0.2.2-rc.1",
126
+ "@deepseek-ai/dsh-api-session-controller": "0.2.2-rc.1",
127
+ "@deepseek-ai/dsh-client-locale": "0.2.2-rc.1",
128
+ "@deepseek-ai/dsh-client-store": "0.2.2-rc.1",
129
+ "@deepseek-ai/dsh-client-ui-commands": "0.2.2-rc.1",
130
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.2-rc.1",
131
+ "@deepseek-ai/dsh-client-ui-plugin-manager": "0.2.2-rc.1",
132
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.2-rc.1",
133
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.2-rc.1",
134
+ "@deepseek-ai/dsh-client-ui-session": "0.2.2-rc.1",
135
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.2-rc.1",
136
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.2-rc.1",
137
+ "@deepseek-ai/dsh-credentials": "0.2.2-rc.1",
138
+ "@deepseek-ai/dsh-deepseek-account": "0.2.2-rc.1",
139
+ "@deepseek-ai/dsh-launch-environment": "0.2.2-rc.1",
140
+ "@deepseek-ai/dsh-scope": "0.2.2-rc.1",
141
+ "@deepseek-ai/dsh-session": "0.2.2-rc.1",
142
+ "@deepseek-ai/dsh-settings": "0.2.2-rc.1",
143
+ "@deepseek-ai/dsh-storage-domain": "0.2.2-rc.1",
144
+ "@deepseek-ai/dsh-tool-web": "0.2.2-rc.1",
145
+ "@deepseek-ai/dsh-tools": "0.2.2-rc.1",
146
+ "@deepseek-ai/dsh-typert-protocol": "0.2.2-rc.1",
147
+ "@deepseek-ai/dsh-web": "0.2.2-rc.1",
148
+ "@deepseek-ai/dsh-web-deepseek-api": "0.2.2-rc.1",
149
+ "@deepseek-ai/dsh-web-search-deepseek": "0.2.2-rc.1",
150
+ "@deepseek-ai/schemastery": "3.19.0",
151
151
  "dsh-tool-web-enhanced-core": "0.0.0",
152
152
  "react": "18.3.1",
153
153
  "react-dom": "18.3.1",