@webskill/sdk 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.js +909 -0
  3. package/dist/browser.d.ts +233 -4
  4. package/dist/browser.js +869 -19
  5. package/dist/{catalogComponents-KsujmL4b-Clx1kCnU.js → catalogComponents-Dr5dFMAb-Dacibl1e.js} +372 -126
  6. package/dist/{dist-D9Lcn5Pp.js → dist-DnYG2-eY.js} +642 -39
  7. package/dist/{dist-C-Sh0MDU.js → dist-DusANsrn.js} +1035 -99
  8. package/dist/{env--jJB-TSX-04klhTYi.js → env-8cY40DXB-CGnEVZby.js} +7 -6
  9. package/dist/{env-BPUBZCwJ-4jat_SVG.d.ts → env-AK3cSMEA-Dli6QU5E.d.ts} +4 -3
  10. package/dist/governance.d.ts +46 -4
  11. package/dist/governance.js +45 -2
  12. package/dist/{index-CHXxDccV.d.ts → index-BMocOEi0.d.ts} +106 -10
  13. package/dist/index-BuTpBMzr.d.ts +474 -0
  14. package/dist/{index-DLfR2Y6I.d.ts → index-C-KFAZoF.d.ts} +337 -18
  15. package/dist/index.d.ts +3 -3
  16. package/dist/index.js +3 -3
  17. package/dist/mcp.d.ts +39 -8
  18. package/dist/mcp.js +53 -19
  19. package/dist/{memoryArtifactStore-BtOeB_hm-tj3fC5ip.js → memoryArtifactStore-52Zn9npI-BMPYwvoy.js} +10 -2
  20. package/dist/node.d.ts +4 -4
  21. package/dist/node.js +9 -2
  22. package/dist/{openUiLibrary-YLS-cxyT-C96jWDQq.js → openUiLibrary-Bdrji9qK-DzAxRlTY.js} +3 -3
  23. package/dist/{skillVersionStore-uyefLPR1-DXOzbksv.d.ts → skillVersionStore-BzLbzFOL-CxdAFWO2.d.ts} +4 -3
  24. package/dist/{testing-DDCJWvgA.js → testing-CYTFqkDm.js} +1 -1
  25. package/dist/testing.d.ts +2 -2
  26. package/dist/testing.js +3 -3
  27. package/dist/{types-7Wcg--Vh-1YlQ4jF9.d.ts → types-4pg-qp_I-Gq63X8Oa.d.ts} +55 -5
  28. package/dist/ui-react.d.ts +26 -5
  29. package/dist/ui-react.js +147 -29
  30. package/dist/ui-vue.d.ts +1 -1
  31. package/dist/ui-vue.js +30 -6
  32. package/dist/ui.d.ts +4 -4
  33. package/dist/ui.js +3 -3
  34. package/dist/{webskillLitCatalog-CSTbhBe_-CYIs5BX8.js → webskillLitCatalog-_mugzRHx-B_54vxum.js} +88 -2
  35. package/package.json +6 -1
package/dist/ui-react.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { r as __exportAll$1 } from "./rolldown-runtime-BOF7iYI8.js";
2
2
  import { m as WebSkillError } from "./dist-8oQRa8Xz.js";
3
- import { X as validateUiSpecEvent, Z as validateUiSpecNode } from "./dist-C-Sh0MDU.js";
4
- import { C as interactionToUiSpec, D as renderMiniChart, K as renderMiniMarkdown, M as toJsonRenderSpec, N as toOpenUiSpecLang, S as interactionToFormModel, U as chartSpecFromProps, h as collectValues, k as shapeInteractionValue, q as uiCatalog } from "./dist-D9Lcn5Pp.js";
5
- import { _ as DropdownMenuContent, a as SurfaceField, b as Markdown, c as str, d as Badge, f as Button, g as DropdownMenuCheckboxItem, h as DropdownMenu, i as SurfaceButton, l as useCatalogSurfaceForm, m as DataTable, n as CatalogSurfaceProvider, o as SurfaceFormButtons, p as Checkbox, r as EChart, s as catalogComponentImpls, u as useSurfaceForm, v as DropdownMenuTrigger, x as Separator, y as Input } from "./catalogComponents-KsujmL4b-Clx1kCnU.js";
3
+ import { Ct as validateUiSpecEvent, wt as validateUiSpecNode } from "./dist-DusANsrn.js";
4
+ import { B as toOpenUiSpecLang, I as shapeInteractionValue, O as interactionToFormModel, P as renderMiniChart, Q as chartSpecFromProps, g as applySuggestion, k as interactionToUiSpec, nt as uiCatalog, tt as renderMiniMarkdown, x as collectValues, z as toJsonRenderSpec } from "./dist-DnYG2-eY.js";
5
+ import { C as Input, S as DropdownMenuTrigger, T as Separator, _ as Checkbox, a as SpecProgress, b as DropdownMenuCheckboxItem, c as SurfaceButton, d as catalogComponentImpls, f as str, g as Button, h as Badge, i as SpecGrid, l as SurfaceField, m as useSurfaceForm, n as CatalogSurfaceProvider, o as SpecTabs, p as useCatalogSurfaceForm, r as EChart, s as SpecTimeline, u as SurfaceFormButtons, v as DataTable, w as Markdown, x as DropdownMenuContent, y as DropdownMenu } from "./catalogComponents-Dr5dFMAb-Dacibl1e.js";
6
6
  import { z } from "zod";
7
7
  import * as React$1 from "react";
8
8
  import React, { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
@@ -6367,9 +6367,19 @@ function applyPatch(node, patch) {
6367
6367
  }
6368
6368
  return copy;
6369
6369
  }
6370
+ /** 键序无关的序列化:同一份内容不能因写入顺序不同而算两个 surface(FR-21.5) */
6371
+ function stableStringify(value) {
6372
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
6373
+ if (isRecord(value)) return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`).join(",")}}`;
6374
+ return JSON.stringify(value) ?? "null";
6375
+ }
6370
6376
  /** Observable, revision-checked snapshot store for framework-neutral UI surfaces. @experimental */
6371
6377
  var UiSurfaceStore = class {
6372
6378
  #entries = /* @__PURE__ */ new Map();
6379
+ /** 内容指纹 → 首次开的 surface id;仅在同一 runId 内合并 */
6380
+ #fingerprints = /* @__PURE__ */ new Map();
6381
+ /** 后到的重复 id → 已存在的 surface id,让后续 patch/complete 仍然寻址得到 */
6382
+ #aliases = /* @__PURE__ */ new Map();
6373
6383
  #listeners = /* @__PURE__ */ new Set();
6374
6384
  #snapshots = [];
6375
6385
  #patchEmitTimer;
@@ -6383,23 +6393,36 @@ var UiSurfaceStore = class {
6383
6393
  apply(event) {
6384
6394
  event = validateUiSpecEvent(event);
6385
6395
  switch (event.type) {
6386
- case "open":
6387
- this.#entries.set(event.id, {
6396
+ case "open": {
6397
+ const snapshot = {
6388
6398
  id: event.id,
6389
6399
  node: structuredClone(event.node),
6390
6400
  ...event.actions ? { actions: structuredClone(event.actions) } : {},
6391
6401
  revision: 0,
6392
6402
  status: "active",
6393
6403
  ...event.runId ? { runId: event.runId } : {}
6394
- });
6404
+ };
6405
+ const fingerprint = this.#fingerprint(event);
6406
+ const merged = fingerprint === void 0 ? void 0 : this.#fingerprints.get(fingerprint);
6407
+ if (merged !== void 0 && this.#entries.has(merged)) {
6408
+ this.#aliases.set(event.id, merged);
6409
+ this.#entries.set(merged, {
6410
+ ...snapshot,
6411
+ id: merged
6412
+ });
6413
+ } else {
6414
+ if (fingerprint !== void 0) this.#fingerprints.set(fingerprint, event.id);
6415
+ this.#entries.set(event.id, snapshot);
6416
+ }
6395
6417
  break;
6418
+ }
6396
6419
  case "patch": {
6397
6420
  const current = this.#entry(event.id);
6398
6421
  this.#assertRunId(current, event.runId);
6399
6422
  if (current.status !== "active" || event.revision !== current.revision + 1) throw new WebSkillError("VALIDATION_FAILED", `Surface patch revision is invalid for "${event.id}"`);
6400
6423
  let node = current.node;
6401
6424
  for (const operation of event.operations) node = applyPatch(node, operation);
6402
- this.#entries.set(event.id, {
6425
+ this.#entries.set(current.id, {
6403
6426
  ...current,
6404
6427
  node: validateUiSpecNode(node),
6405
6428
  revision: event.revision
@@ -6410,7 +6433,7 @@ var UiSurfaceStore = class {
6410
6433
  const current = this.#entry(event.id);
6411
6434
  this.#assertRunId(current, event.runId);
6412
6435
  if (event.revision !== current.revision) throw new WebSkillError("VALIDATION_FAILED", `Surface completion revision is invalid for "${event.id}"`);
6413
- this.#entries.set(event.id, {
6436
+ this.#entries.set(current.id, {
6414
6437
  ...current,
6415
6438
  status: "complete"
6416
6439
  });
@@ -6419,7 +6442,7 @@ var UiSurfaceStore = class {
6419
6442
  case "error": {
6420
6443
  const current = this.#entry(event.id);
6421
6444
  this.#assertRunId(current, event.runId);
6422
- this.#entries.set(event.id, {
6445
+ this.#entries.set(current.id, {
6423
6446
  ...current,
6424
6447
  status: "error",
6425
6448
  error: {
@@ -6432,7 +6455,7 @@ var UiSurfaceStore = class {
6432
6455
  case "cancel": {
6433
6456
  const current = this.#entry(event.id);
6434
6457
  this.#assertRunId(current, event.runId);
6435
- this.#entries.set(event.id, {
6458
+ this.#entries.set(current.id, {
6436
6459
  ...current,
6437
6460
  status: "cancelled"
6438
6461
  });
@@ -6446,8 +6469,16 @@ var UiSurfaceStore = class {
6446
6469
  this.#emit();
6447
6470
  }
6448
6471
  }
6472
+ /** 跨 run 的相同界面是合法重复(用户又问了一次),所以无 runId 时不合并 */
6473
+ #fingerprint(event) {
6474
+ if (event.runId === void 0) return void 0;
6475
+ return `${event.runId}\u0000${stableStringify({
6476
+ node: event.node,
6477
+ actions: event.actions ?? null
6478
+ })}`;
6479
+ }
6449
6480
  #entry(id) {
6450
- const entry = this.#entries.get(id);
6481
+ const entry = this.#entries.get(this.#aliases.get(id) ?? id);
6451
6482
  if (!entry) throw new WebSkillError("VALIDATION_FAILED", `Unknown UI surface "${id}"`);
6452
6483
  return entry;
6453
6484
  }
@@ -6489,8 +6520,10 @@ var ReactBridgeState = class {
6489
6520
  #processedSurfaceActionNonces = /* @__PURE__ */ new Set();
6490
6521
  #surfaceDrafts = /* @__PURE__ */ new Map();
6491
6522
  #onSurfaceDraftChange;
6523
+ #onDroppedSurfaceAction;
6492
6524
  constructor(options = {}) {
6493
6525
  this.#onSurfaceDraftChange = options.onSurfaceDraftChange;
6526
+ this.#onDroppedSurfaceAction = options.onDroppedSurfaceAction;
6494
6527
  this.surfaceStore.subscribe(() => this.#emit());
6495
6528
  }
6496
6529
  get surfaceSnapshots() {
@@ -6559,12 +6592,25 @@ var ReactBridgeState = class {
6559
6592
  this.#surfaceActionResolvers.set(input.nonce, resolve);
6560
6593
  });
6561
6594
  }
6562
- /** Resolves exactly one pending action capability; stale or duplicate nonces are ignored. */
6595
+ /**
6596
+ * Resolves exactly one pending action capability; stale or duplicate nonces are ignored.
6597
+ * Every ignored response is reported through `onDroppedSurfaceAction` (FR-11.7).
6598
+ */
6563
6599
  resolveSurfaceAction(response) {
6564
- if (this.#processedSurfaceActionNonces.has(response.nonce)) return false;
6600
+ if (this.#processedSurfaceActionNonces.has(response.nonce)) {
6601
+ this.#reportDropped("duplicate", response);
6602
+ return false;
6603
+ }
6565
6604
  const resolver = this.#surfaceActionResolvers.get(response.nonce);
6566
6605
  const pending = this.pendingSurfaceAction;
6567
- if (!resolver || !pending || pending.runId !== response.runId || pending.surfaceId !== response.surfaceId || pending.actionId !== response.actionId || pending.nonce !== response.nonce) return false;
6606
+ if (!resolver || !pending) {
6607
+ this.#reportDropped("no-pending", response);
6608
+ return false;
6609
+ }
6610
+ if (pending.runId !== response.runId || pending.surfaceId !== response.surfaceId || pending.actionId !== response.actionId || pending.nonce !== response.nonce) {
6611
+ this.#reportDropped("mismatch", response);
6612
+ return false;
6613
+ }
6568
6614
  this.#processedSurfaceActionNonces.add(response.nonce);
6569
6615
  this.#surfaceActionResolvers.delete(response.nonce);
6570
6616
  this.pendingSurfaceAction = null;
@@ -6585,6 +6631,21 @@ var ReactBridgeState = class {
6585
6631
  cancelled: true
6586
6632
  });
6587
6633
  }
6634
+ #reportDropped(reason, response) {
6635
+ const pending = this.pendingSurfaceAction;
6636
+ const state = pending === null ? "no action is pending" : `pending action is ${pending.surfaceId}/${pending.actionId} (nonce ${pending.nonce}, run ${pending.runId})`;
6637
+ const warning = {
6638
+ reason,
6639
+ nonce: response.nonce,
6640
+ message: `Dropped UI surface action ${response.surfaceId}/${response.actionId} with nonce ${response.nonce}: ${reason}; ${state}`,
6641
+ pending
6642
+ };
6643
+ if (this.#onDroppedSurfaceAction) {
6644
+ this.#onDroppedSurfaceAction(warning);
6645
+ return;
6646
+ }
6647
+ console.warn(`[webskill] ${warning.message}`);
6648
+ }
6588
6649
  async onTextDelta(runId, delta) {
6589
6650
  if (this.streamingRunId !== runId) {
6590
6651
  this.streamingRunId = runId;
@@ -6594,6 +6655,40 @@ var ReactBridgeState = class {
6594
6655
  this.#emit();
6595
6656
  }
6596
6657
  };
6658
+ /**
6659
+ * 建议值以**建议**形态出现(FR-19.4):控件初始值仍为空,
6660
+ * 用户点「使用」才写入。切勿改成 defaultValue。
6661
+ */
6662
+ function Suggestion({ control, onUse }) {
6663
+ if (control.suggestion === void 0) return null;
6664
+ const preview = String(control.suggestion.value);
6665
+ const reason = control.suggestion.reason;
6666
+ return /* @__PURE__ */ jsxs("div", {
6667
+ className: "webskill-form__suggestion",
6668
+ "data-webskill-suggestion": control.name,
6669
+ children: [
6670
+ /* @__PURE__ */ jsxs("span", {
6671
+ className: "webskill-form__suggestion-value",
6672
+ children: ["Suggested: ", preview]
6673
+ }),
6674
+ reason ? /* @__PURE__ */ jsxs("span", {
6675
+ className: "webskill-form__suggestion-reason",
6676
+ children: [
6677
+ "(",
6678
+ reason,
6679
+ ")"
6680
+ ]
6681
+ }) : null,
6682
+ /* @__PURE__ */ jsx("button", {
6683
+ type: "button",
6684
+ className: "webskill-form__suggestion-use",
6685
+ "data-webskill-suggestion-use": control.name,
6686
+ onClick: onUse,
6687
+ children: "Use"
6688
+ })
6689
+ ]
6690
+ });
6691
+ }
6597
6692
  function Control({ control, invalid }) {
6598
6693
  const controlId = `webskill-field-${control.name}`;
6599
6694
  const label = /* @__PURE__ */ jsxs("label", {
@@ -6709,15 +6804,24 @@ function InteractionForm({ bridge }) {
6709
6804
  }) : null,
6710
6805
  model.controls.map((control) => /* @__PURE__ */ jsxs("div", {
6711
6806
  className: invalid.includes(control.name) ? "webskill-form__control--invalid" : void 0,
6712
- children: [/* @__PURE__ */ jsx(Control, {
6713
- control,
6714
- invalid: invalid.includes(control.name)
6715
- }), invalid.includes(control.name) ? /* @__PURE__ */ jsx("div", {
6716
- id: `webskill-error-${control.name}`,
6717
- role: "alert",
6718
- className: "webskill-form__error",
6719
- children: "This field is required"
6720
- }) : null]
6807
+ children: [
6808
+ /* @__PURE__ */ jsx(Control, {
6809
+ control,
6810
+ invalid: invalid.includes(control.name)
6811
+ }),
6812
+ /* @__PURE__ */ jsx(Suggestion, {
6813
+ control,
6814
+ onUse: () => {
6815
+ if (formRef.current) applySuggestion(control, formRef.current);
6816
+ }
6817
+ }),
6818
+ invalid.includes(control.name) ? /* @__PURE__ */ jsx("div", {
6819
+ id: `webskill-error-${control.name}`,
6820
+ role: "alert",
6821
+ className: "webskill-form__error",
6822
+ children: "This field is required"
6823
+ }) : null
6824
+ ]
6721
6825
  }, control.name)),
6722
6826
  /* @__PURE__ */ jsxs("div", {
6723
6827
  className: "webskill-form__actions",
@@ -6955,9 +7059,10 @@ const TONE_CLASS = {
6955
7059
  info: "text-info",
6956
7060
  destructive: "text-destructive"
6957
7061
  };
6958
- function renderNode(node, context, key) {
7062
+ function renderNode(node, context, key, scope) {
6959
7063
  const props = node.props ?? {};
6960
- const children = (node.children ?? []).map((child, index) => renderNode(child, context, `${key}.${index}`));
7064
+ const nodeScope = node.component === "Form" ? context.scopeOfNode(node) : scope;
7065
+ const children = (node.children ?? []).map((child, index) => renderNode(child, context, `${key}.${index}`, nodeScope));
6961
7066
  switch (node.component) {
6962
7067
  case "Stack": return /* @__PURE__ */ jsx("div", {
6963
7068
  className: `flex gap-3 ${str(props, "direction", "vertical") === "horizontal" ? "flex-row items-center" : "flex-col"}`,
@@ -7015,6 +7120,16 @@ function renderNode(node, context, key) {
7015
7120
  label: str(props, "title", "Data")
7016
7121
  }, key);
7017
7122
  case "Chart": return /* @__PURE__ */ jsx(EChart, { chart: chartSpecFromProps(props) }, key);
7123
+ case "Tabs": return /* @__PURE__ */ jsx(SpecTabs, {
7124
+ props,
7125
+ children
7126
+ }, key);
7127
+ case "Grid": return /* @__PURE__ */ jsx(SpecGrid, {
7128
+ props,
7129
+ children
7130
+ }, key);
7131
+ case "Timeline": return /* @__PURE__ */ jsx(SpecTimeline, { props }, key);
7132
+ case "Progress": return /* @__PURE__ */ jsx(SpecProgress, { props }, key);
7018
7133
  case "FileLink": return /* @__PURE__ */ jsxs("div", {
7019
7134
  className: "flex items-center gap-2 text-sm",
7020
7135
  children: [/* @__PURE__ */ jsx("span", {
@@ -7032,7 +7147,7 @@ function renderNode(node, context, key) {
7032
7147
  className: "flex flex-col gap-3",
7033
7148
  onSubmit: (event) => {
7034
7149
  event.preventDefault();
7035
- context.submit("submit");
7150
+ context.submit("submit", void 0, nodeScope);
7036
7151
  },
7037
7152
  noValidate: true,
7038
7153
  children: [
@@ -7043,17 +7158,20 @@ function renderNode(node, context, key) {
7043
7158
  children,
7044
7159
  /* @__PURE__ */ jsx(SurfaceFormButtons, {
7045
7160
  form: context,
7046
- props
7161
+ props,
7162
+ scope: nodeScope
7047
7163
  })
7048
7164
  ]
7049
7165
  }, key);
7050
7166
  case "Field": return /* @__PURE__ */ jsx(SurfaceField, {
7051
7167
  form: context,
7052
- props
7168
+ props,
7169
+ scope
7053
7170
  }, key);
7054
7171
  case "Button": return /* @__PURE__ */ jsx(SurfaceButton, {
7055
7172
  form: context,
7056
7173
  props,
7174
+ scope,
7057
7175
  ...node.id ? { nodeId: node.id } : {}
7058
7176
  }, key);
7059
7177
  case "Alert": return /* @__PURE__ */ jsxs("div", {
@@ -7418,7 +7536,7 @@ function OpenUiSpecSurface({ spec, surfaceId, actions, onAction }) {
7418
7536
  const [unavailable, setUnavailable] = useState(false);
7419
7537
  useEffect(() => {
7420
7538
  let cancelled = false;
7421
- import("./openUiLibrary-YLS-cxyT-C96jWDQq.js").then((loaded) => {
7539
+ import("./openUiLibrary-Bdrji9qK-DzAxRlTY.js").then((loaded) => {
7422
7540
  if (!cancelled) setModule(loaded);
7423
7541
  }).catch(() => {
7424
7542
  if (!cancelled) setUnavailable(true);
package/dist/ui-vue.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { o as InteractionRequest, s as InteractionResponse, v as RenderResultRequest, y as UiBridge } from "./types-7Wcg--Vh-1YlQ4jF9.js";
1
+ import { b as UiBridge, c as InteractionResponse, s as InteractionRequest, y as RenderResultRequest } from "./types-4pg-qp_I-Gq63X8Oa.js";
2
2
  import { PropType } from "vue";
3
3
  //#region ../ui-vue/dist/index.d.ts
4
4
  //#region src/bridgeState.d.ts
package/dist/ui-vue.js CHANGED
@@ -1,4 +1,4 @@
1
- import { D as renderMiniChart, K as renderMiniMarkdown, S as interactionToFormModel, h as collectValues, k as shapeInteractionValue } from "./dist-D9Lcn5Pp.js";
1
+ import { I as shapeInteractionValue, O as interactionToFormModel, P as renderMiniChart, g as applySuggestion, tt as renderMiniMarkdown, x as collectValues } from "./dist-DnYG2-eY.js";
2
2
  import { defineComponent, h, reactive, ref } from "vue";
3
3
 
4
4
  //#region ../ui-vue/dist/index.js
@@ -46,6 +46,24 @@ var VueBridgeState = class {
46
46
  this.state.streamingText += delta;
47
47
  }
48
48
  };
49
+ /** 建议值以**建议**形态出现(FR-19.4):控件初始值仍为空,用户点「使用」才写入 */
50
+ function renderSuggestion(control, onUse) {
51
+ if (control.suggestion === void 0) return null;
52
+ const reason = control.suggestion.reason;
53
+ return h("div", {
54
+ class: "webskill-form__suggestion",
55
+ "data-webskill-suggestion": control.name
56
+ }, [
57
+ h("span", { class: "webskill-form__suggestion-value" }, `Suggested: ${String(control.suggestion.value)}`),
58
+ ...reason ? [h("span", { class: "webskill-form__suggestion-reason" }, `(${reason})`)] : [],
59
+ h("button", {
60
+ type: "button",
61
+ class: "webskill-form__suggestion-use",
62
+ "data-webskill-suggestion-use": control.name,
63
+ onClick: onUse
64
+ }, "Use")
65
+ ]);
66
+ }
49
67
  function renderControl(control, invalid) {
50
68
  const controlId = `webskill-field-${control.name}`;
51
69
  const label = h("label", {
@@ -137,11 +155,17 @@ const InteractionForm = defineComponent({
137
155
  }, [
138
156
  model.title ? h("div", { class: "webskill-form__title" }, model.title) : null,
139
157
  model.message && (model.kind === "form" || model.kind === "authorize") ? h("p", { class: "webskill-form__message" }, model.message) : null,
140
- ...model.controls.map((control) => h("div", { key: control.name }, [renderControl(control, invalid.value.includes(control.name)), invalid.value.includes(control.name) ? h("div", {
141
- id: `webskill-error-${control.name}`,
142
- role: "alert",
143
- class: "webskill-form__error"
144
- }, "This field is required") : null])),
158
+ ...model.controls.map((control) => h("div", { key: control.name }, [
159
+ renderControl(control, invalid.value.includes(control.name)),
160
+ renderSuggestion(control, () => {
161
+ if (formRef.value) applySuggestion(control, formRef.value);
162
+ }),
163
+ invalid.value.includes(control.name) ? h("div", {
164
+ id: `webskill-error-${control.name}`,
165
+ role: "alert",
166
+ class: "webskill-form__error"
167
+ }, "This field is required") : null
168
+ ])),
145
169
  h("div", { class: "webskill-form__actions" }, [h("button", {
146
170
  type: "submit",
147
171
  class: "webskill-form__button webskill-form__button--primary"
package/dist/ui.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { pt as UiSpecNode } from "./types-7Wcg--Vh-1YlQ4jF9.js";
2
- import { Bt as buildRenderResult } from "./index-DLfR2Y6I.js";
3
- import { $ as fromA2uiSpecAction, A as UiCatalogToolSourceOptions, B as WEBSKILL_SURFACE_ACTION, C as OpenUiRuntime, D as UiCatalog, E as UiActionDef, F as VERCEL_INTERACTION_TOOL_NAME, G as buildA2uiCatalogDefinition, H as ZodRuntime, I as VercelToolInvocation, J as collectSpecActions, K as chartSpecFromProps, L as VercelUiBridge, M as UiSpecIssue, N as UiSpecValidation, O as UiCatalogInput, P as UiSurfaceActionDispatch, Q as ensureStyles, R as WEBSKILL_A2UI_CATALOG_ID, S as OpenUiRendererProps, T as UI_CATALOG_GROUPS, U as a2uiComponentSchema, V as WebFormBridge, W as a2uiComponentShapes, X as createUiCatalogToolSource, Y as collectValues, Z as defineUiCatalog, _ as EchartHandle, _t as toUiSurfaceActionDispatch, a as A2UI_SURFACE_ACTION, at as loadOpenUiPeers, b as JsonRenderSpec, c as A2uiCatalogDefinition, ct as renderBlocks, d as A2uiMessage, dt as renderRenderResult, et as fromA2uiSurfaceAction, f as A2uiSpecActionEvent, ft as shapeInteractionValue, g as ControlModel, gt as toOpenUiSpecLang, h as CollectedValues, ht as toJsonRenderSpec, i as A2UI_SPEC_FORM_PATH, it as interactionToUiSpec, j as UiComponentDef, k as UiCatalogPromptOptions, l as A2uiCatalogHandle, lt as renderMiniChart, m as CHART_PALETTE, mt as toA2uiSurfaceAction, n as A2UI_COMMON_TYPES, nt as fromVercelToolResult, o as A2UI_VERSION, ot as loadWebSkillLitCatalog, p as A2uiSpecMessageOptions, pt as toA2uiSpecMessages, q as chartToTable, r as A2UI_SPEC_ACTION, rt as interactionToFormModel, s as A2uiCatalogComponent, st as mountEchart, t as A2UI_BASIC_CATALOG_ID, tt as fromUiSurfaceActionDispatch, u as A2uiComponentShape, ut as renderMiniMarkdown, v as FormModel, vt as toVercelToolInvocation, w as RENDER_UI_TOOL, x as LoadedOpenUiPeers, y as InteractionSpecLabels, yt as uiCatalog, z as WEBSKILL_STYLES_CSS } from "./index-CHXxDccV.js";
4
- export { A2UI_BASIC_CATALOG_ID, A2UI_COMMON_TYPES, A2UI_SPEC_ACTION, A2UI_SPEC_FORM_PATH, A2UI_SURFACE_ACTION, A2UI_VERSION, type A2uiCatalogComponent, type A2uiCatalogDefinition, type A2uiCatalogHandle, type A2uiComponentShape, type A2uiMessage, type A2uiSpecActionEvent, type A2uiSpecMessageOptions, CHART_PALETTE, type CollectedValues, type ControlModel, type EchartHandle, type FormModel, type InteractionSpecLabels, type JsonRenderSpec, type LoadedOpenUiPeers, type OpenUiRendererProps, type OpenUiRuntime, RENDER_UI_TOOL, UI_CATALOG_GROUPS, type UiActionDef, type UiCatalog, type UiCatalogInput, type UiCatalogPromptOptions, type UiCatalogToolSourceOptions, type UiComponentDef, type UiSpecIssue, type UiSpecNode, type UiSpecValidation, type UiSurfaceActionDispatch, VERCEL_INTERACTION_TOOL_NAME, type VercelToolInvocation, VercelUiBridge, WEBSKILL_A2UI_CATALOG_ID, WEBSKILL_STYLES_CSS, WEBSKILL_SURFACE_ACTION, WebFormBridge, type ZodRuntime, a2uiComponentSchema, a2uiComponentShapes, buildA2uiCatalogDefinition, buildRenderResult, chartSpecFromProps, chartToTable, collectSpecActions, collectValues, createUiCatalogToolSource, defineUiCatalog, ensureStyles, fromA2uiSpecAction, fromA2uiSurfaceAction, fromUiSurfaceActionDispatch, fromVercelToolResult, interactionToFormModel, interactionToUiSpec, loadOpenUiPeers, loadWebSkillLitCatalog, mountEchart, renderBlocks, renderMiniChart, renderMiniMarkdown, renderRenderResult, shapeInteractionValue, toA2uiSpecMessages, toA2uiSurfaceAction, toJsonRenderSpec, toOpenUiSpecLang, toUiSurfaceActionDispatch, toVercelToolInvocation, uiCatalog };
1
+ import { mt as UiSpecNode } from "./types-4pg-qp_I-Gq63X8Oa.js";
2
+ import { dn as buildRenderResult } from "./index-C-KFAZoF.js";
3
+ import { $ as buildA2uiCatalogDefinition, A as UiActionDef, At as uiCatalog, B as UiSpecValidation, C as OpenUiRendererProps, Ct as shapeInteractionValue, D as UI_CATALOG_PROMPT_BUDGET_BYTES, Dt as toOpenUiSpecLang, E as UI_CATALOG_GROUPS, Et as toJsonRenderSpec, F as UiComponentDef, G as WEBSKILL_A2UI_CATALOG_ID, H as VERCEL_INTERACTION_TOOL_NAME, I as UiFormScope, J as WebFormBridge, K as WEBSKILL_STYLES_CSS, L as UiPreset, M as UiCatalogInput, N as UiCatalogPromptOptions, O as UI_PRESETS, Ot as toUiSurfaceActionDispatch, P as UiCatalogToolSourceOptions, Q as applySuggestion, R as UiPresetName, S as LoadedOpenUiPeers, St as renderRenderResult, T as RENDER_UI_TOOL, Tt as toA2uiSurfaceAction, U as VercelToolInvocation, V as UiSurfaceActionDispatch, W as VercelUiBridge, X as a2uiComponentSchema, Y as ZodRuntime, Z as a2uiComponentShapes, _ as DESCRIBE_UI_PRESET_TOOL, _t as mountEchart, a as A2UI_SURFACE_ACTION, at as collectValues, b as InteractionSpecLabels, bt as renderMiniChart, c as A2uiCatalogDefinition, ct as ensureStyles, d as A2uiMessage, dt as fromUiSurfaceActionDispatch, et as chartSpecFromProps, f as A2uiSpecActionEvent, ft as fromVercelToolResult, g as ControlModel, gt as loadWebSkillLitCatalog, h as CollectedValues, ht as loadOpenUiPeers, i as A2UI_SPEC_FORM_PATH, it as collectSpecActions, j as UiCatalog, jt as uiPreset, k as UI_PRESET_NAMES, kt as toVercelToolInvocation, l as A2uiCatalogHandle, lt as fromA2uiSpecAction, m as CHART_PALETTE, mt as interactionToUiSpec, n as A2UI_COMMON_TYPES, nt as collectFormScopes, o as A2UI_VERSION, ot as createUiCatalogToolSource, p as A2uiSpecMessageOptions, pt as interactionToFormModel, q as WEBSKILL_SURFACE_ACTION, r as A2UI_SPEC_ACTION, rt as collectScopedValues, s as A2uiCatalogComponent, st as defineUiCatalog, t as A2UI_BASIC_CATALOG_ID, tt as chartToTable, u as A2uiComponentShape, ut as fromA2uiSurfaceAction, v as EchartHandle, vt as qualifyFieldName, w as OpenUiRuntime, wt as toA2uiSpecMessages, x as JsonRenderSpec, xt as renderMiniMarkdown, y as FormModel, yt as renderBlocks, z as UiSpecIssue } from "./index-BMocOEi0.js";
4
+ export { A2UI_BASIC_CATALOG_ID, A2UI_COMMON_TYPES, A2UI_SPEC_ACTION, A2UI_SPEC_FORM_PATH, A2UI_SURFACE_ACTION, A2UI_VERSION, type A2uiCatalogComponent, type A2uiCatalogDefinition, type A2uiCatalogHandle, type A2uiComponentShape, type A2uiMessage, type A2uiSpecActionEvent, type A2uiSpecMessageOptions, CHART_PALETTE, type CollectedValues, type ControlModel, DESCRIBE_UI_PRESET_TOOL, type EchartHandle, type FormModel, type InteractionSpecLabels, type JsonRenderSpec, type LoadedOpenUiPeers, type OpenUiRendererProps, type OpenUiRuntime, RENDER_UI_TOOL, UI_CATALOG_GROUPS, UI_CATALOG_PROMPT_BUDGET_BYTES, UI_PRESETS, UI_PRESET_NAMES, type UiActionDef, type UiCatalog, type UiCatalogInput, type UiCatalogPromptOptions, type UiCatalogToolSourceOptions, type UiComponentDef, type UiFormScope, type UiPreset, type UiPresetName, type UiSpecIssue, type UiSpecNode, type UiSpecValidation, type UiSurfaceActionDispatch, VERCEL_INTERACTION_TOOL_NAME, type VercelToolInvocation, VercelUiBridge, WEBSKILL_A2UI_CATALOG_ID, WEBSKILL_STYLES_CSS, WEBSKILL_SURFACE_ACTION, WebFormBridge, type ZodRuntime, a2uiComponentSchema, a2uiComponentShapes, applySuggestion, buildA2uiCatalogDefinition, buildRenderResult, chartSpecFromProps, chartToTable, collectFormScopes, collectScopedValues, collectSpecActions, collectValues, createUiCatalogToolSource, defineUiCatalog, ensureStyles, fromA2uiSpecAction, fromA2uiSurfaceAction, fromUiSurfaceActionDispatch, fromVercelToolResult, interactionToFormModel, interactionToUiSpec, loadOpenUiPeers, loadWebSkillLitCatalog, mountEchart, qualifyFieldName, renderBlocks, renderMiniChart, renderMiniMarkdown, renderRenderResult, shapeInteractionValue, toA2uiSpecMessages, toA2uiSurfaceAction, toJsonRenderSpec, toOpenUiSpecLang, toUiSurfaceActionDispatch, toVercelToolInvocation, uiCatalog, uiPreset };
package/dist/ui.js CHANGED
@@ -1,4 +1,4 @@
1
- import { k as buildRenderResult } from "./dist-C-Sh0MDU.js";
2
- import { A as toA2uiSpecMessages, B as a2uiComponentSchema, C as interactionToUiSpec, D as renderMiniChart, E as renderBlocks, F as toVercelToolInvocation, G as mountEchart, H as buildA2uiCatalogDefinition, K as renderMiniMarkdown, L as A2UI_COMMON_TYPES, M as toJsonRenderSpec, N as toOpenUiSpecLang, O as renderRenderResult, P as toUiSurfaceActionDispatch, R as UI_CATALOG_GROUPS, S as interactionToFormModel, T as loadWebSkillLitCatalog, U as chartSpecFromProps, V as a2uiComponentShapes, W as defineUiCatalog, _ as ensureStyles, a as A2UI_VERSION, b as fromUiSurfaceActionDispatch, c as VERCEL_INTERACTION_TOOL_NAME, d as WEBSKILL_SURFACE_ACTION, f as WebFormBridge, g as createUiCatalogToolSource, h as collectValues, i as A2UI_SURFACE_ACTION, j as toA2uiSurfaceAction, k as shapeInteractionValue, l as VercelUiBridge, m as collectSpecActions, n as A2UI_SPEC_ACTION, o as CHART_PALETTE, p as chartToTable, q as uiCatalog, r as A2UI_SPEC_FORM_PATH, s as RENDER_UI_TOOL, t as A2UI_BASIC_CATALOG_ID, u as WEBSKILL_STYLES_CSS, v as fromA2uiSpecAction, w as loadOpenUiPeers, x as fromVercelToolResult, y as fromA2uiSurfaceAction, z as WEBSKILL_A2UI_CATALOG_ID } from "./dist-D9Lcn5Pp.js";
1
+ import { B as buildRenderResult } from "./dist-DusANsrn.js";
2
+ import { $ as defineUiCatalog, A as loadOpenUiPeers, B as toOpenUiSpecLang, C as ensureStyles, D as fromVercelToolResult, E as fromUiSurfaceActionDispatch, F as renderRenderResult, G as A2UI_COMMON_TYPES, H as toVercelToolInvocation, I as shapeInteractionValue, J as WEBSKILL_A2UI_CATALOG_ID, K as UI_CATALOG_GROUPS, L as toA2uiSpecMessages, M as qualifyFieldName, N as renderBlocks, O as interactionToFormModel, P as renderMiniChart, Q as chartSpecFromProps, R as toA2uiSurfaceAction, S as createUiCatalogToolSource, T as fromA2uiSurfaceAction, U as uiPreset, V as toUiSurfaceActionDispatch, X as a2uiComponentShapes, Y as a2uiComponentSchema, Z as buildA2uiCatalogDefinition, _ as chartToTable, a as A2UI_VERSION, b as collectSpecActions, c as RENDER_UI_TOOL, d as VERCEL_INTERACTION_TOOL_NAME, et as mountEchart, f as VercelUiBridge, g as applySuggestion, h as WebFormBridge, i as A2UI_SURFACE_ACTION, j as loadWebSkillLitCatalog, k as interactionToUiSpec, l as UI_PRESETS, m as WEBSKILL_SURFACE_ACTION, n as A2UI_SPEC_ACTION, nt as uiCatalog, o as CHART_PALETTE, p as WEBSKILL_STYLES_CSS, q as UI_CATALOG_PROMPT_BUDGET_BYTES, r as A2UI_SPEC_FORM_PATH, s as DESCRIBE_UI_PRESET_TOOL, t as A2UI_BASIC_CATALOG_ID, tt as renderMiniMarkdown, u as UI_PRESET_NAMES, v as collectFormScopes, w as fromA2uiSpecAction, x as collectValues, y as collectScopedValues, z as toJsonRenderSpec } from "./dist-DnYG2-eY.js";
3
3
 
4
- export { A2UI_BASIC_CATALOG_ID, A2UI_COMMON_TYPES, A2UI_SPEC_ACTION, A2UI_SPEC_FORM_PATH, A2UI_SURFACE_ACTION, A2UI_VERSION, CHART_PALETTE, RENDER_UI_TOOL, UI_CATALOG_GROUPS, VERCEL_INTERACTION_TOOL_NAME, VercelUiBridge, WEBSKILL_A2UI_CATALOG_ID, WEBSKILL_STYLES_CSS, WEBSKILL_SURFACE_ACTION, WebFormBridge, a2uiComponentSchema, a2uiComponentShapes, buildA2uiCatalogDefinition, buildRenderResult, chartSpecFromProps, chartToTable, collectSpecActions, collectValues, createUiCatalogToolSource, defineUiCatalog, ensureStyles, fromA2uiSpecAction, fromA2uiSurfaceAction, fromUiSurfaceActionDispatch, fromVercelToolResult, interactionToFormModel, interactionToUiSpec, loadOpenUiPeers, loadWebSkillLitCatalog, mountEchart, renderBlocks, renderMiniChart, renderMiniMarkdown, renderRenderResult, shapeInteractionValue, toA2uiSpecMessages, toA2uiSurfaceAction, toJsonRenderSpec, toOpenUiSpecLang, toUiSurfaceActionDispatch, toVercelToolInvocation, uiCatalog };
4
+ export { A2UI_BASIC_CATALOG_ID, A2UI_COMMON_TYPES, A2UI_SPEC_ACTION, A2UI_SPEC_FORM_PATH, A2UI_SURFACE_ACTION, A2UI_VERSION, CHART_PALETTE, DESCRIBE_UI_PRESET_TOOL, RENDER_UI_TOOL, UI_CATALOG_GROUPS, UI_CATALOG_PROMPT_BUDGET_BYTES, UI_PRESETS, UI_PRESET_NAMES, VERCEL_INTERACTION_TOOL_NAME, VercelUiBridge, WEBSKILL_A2UI_CATALOG_ID, WEBSKILL_STYLES_CSS, WEBSKILL_SURFACE_ACTION, WebFormBridge, a2uiComponentSchema, a2uiComponentShapes, applySuggestion, buildA2uiCatalogDefinition, buildRenderResult, chartSpecFromProps, chartToTable, collectFormScopes, collectScopedValues, collectSpecActions, collectValues, createUiCatalogToolSource, defineUiCatalog, ensureStyles, fromA2uiSpecAction, fromA2uiSurfaceAction, fromUiSurfaceActionDispatch, fromVercelToolResult, interactionToFormModel, interactionToUiSpec, loadOpenUiPeers, loadWebSkillLitCatalog, mountEchart, qualifyFieldName, renderBlocks, renderMiniChart, renderMiniMarkdown, renderRenderResult, shapeInteractionValue, toA2uiSpecMessages, toA2uiSurfaceAction, toJsonRenderSpec, toOpenUiSpecLang, toUiSurfaceActionDispatch, toVercelToolInvocation, uiCatalog, uiPreset };
@@ -1,4 +1,4 @@
1
- import { G as mountEchart, I as A2UI_CHILDREN_PROP, K as renderMiniMarkdown, U as chartSpecFromProps, V as a2uiComponentShapes, q as uiCatalog, z as WEBSKILL_A2UI_CATALOG_ID } from "./dist-D9Lcn5Pp.js";
1
+ import { J as WEBSKILL_A2UI_CATALOG_ID, Q as chartSpecFromProps, W as A2UI_CHILDREN_PROP, X as a2uiComponentShapes, et as mountEchart, nt as uiCatalog, tt as renderMiniMarkdown } from "./dist-DnYG2-eY.js";
2
2
  import { A2uiController, A2uiLitElement } from "@a2ui/lit/v0_9";
3
3
  import { Catalog } from "@a2ui/web_core/v0_9";
4
4
  import { z } from "zod/v3";
@@ -1419,7 +1419,7 @@ var f = class extends i {
1419
1419
  };
1420
1420
 
1421
1421
  //#endregion
1422
- //#region ../ui/dist/webskillLitCatalog-CSTbhBe_.js
1422
+ //#region ../ui/dist/webskillLitCatalog-_mugzRHx.js
1423
1423
  /**
1424
1424
  * Lit 元素上的 echarts 挂载指令。
1425
1425
  * A2UI 档的 catalog `Chart` 渲染在 shadow root 里,实例必须随元素断开而 dispose,
@@ -1598,6 +1598,33 @@ const sharedStyles = i$4`
1598
1598
  .error {
1599
1599
  color: var(--destructive);
1600
1600
  }
1601
+ .tabs {
1602
+ display: flex;
1603
+ gap: 0.25rem;
1604
+ border-bottom: 1px solid var(--border);
1605
+ }
1606
+ .grid {
1607
+ display: grid;
1608
+ gap: 0.75rem;
1609
+ }
1610
+ ol.timeline {
1611
+ display: flex;
1612
+ flex-direction: column;
1613
+ gap: 0.5rem;
1614
+ margin: 0;
1615
+ padding-left: 1rem;
1616
+ }
1617
+ .bar {
1618
+ height: 0.5rem;
1619
+ border-radius: 999px;
1620
+ background: var(--secondary);
1621
+ overflow: hidden;
1622
+ }
1623
+ .bar > span {
1624
+ display: block;
1625
+ height: 100%;
1626
+ background: var(--foreground);
1627
+ }
1601
1628
  `;
1602
1629
  const str = (props, key, fallback = "") => typeof props[key] === "string" ? props[key] : fallback;
1603
1630
  const list = (value) => Array.isArray(value) ? value : [];
@@ -1618,6 +1645,34 @@ const renderers = {
1618
1645
  </section>
1619
1646
  `,
1620
1647
  Separator: () => T`<hr />`,
1648
+ Tabs: (props, host) => {
1649
+ const labels = list(props["labels"]);
1650
+ const panels = props.children ?? [];
1651
+ const active = Math.min(host.view["tab"] ?? 0, Math.max(panels.length - 1, 0));
1652
+ return T`
1653
+ <div class="stack" data-direction="vertical">
1654
+ <div class="tabs" role="tablist">
1655
+ ${labels.map((label, index) => T`<button
1656
+ type="button"
1657
+ role="tab"
1658
+ aria-selected=${index === active ? "true" : "false"}
1659
+ @click=${() => {
1660
+ host.view["tab"] = index;
1661
+ host.refresh();
1662
+ }}
1663
+ >
1664
+ ${label}
1665
+ </button>`)}
1666
+ </div>
1667
+ ${panels[active] ? host.renderChild(panels[active]) : A}
1668
+ </div>
1669
+ `;
1670
+ },
1671
+ Grid: (props, host) => T`
1672
+ <div class="grid" style=${`grid-template-columns: repeat(${Number(props["columns"] ?? 2)}, minmax(0, 1fr))`}>
1673
+ ${children(props, host)}
1674
+ </div>
1675
+ `,
1621
1676
  Heading: (props) => {
1622
1677
  const text = str(props, "text");
1623
1678
  if (props["level"] === 2) return T`<h2>${text}</h2>`;
@@ -1651,6 +1706,33 @@ const renderers = {
1651
1706
  </div>
1652
1707
  `,
1653
1708
  Chart: (props) => T`<div class="chart" ${echart(chartSpecFromProps(props))}></div>`,
1709
+ Timeline: (props) => T`
1710
+ <ol class="timeline">
1711
+ ${list(props["items"]).map((item) => T`<li>
1712
+ <strong>${String(item["title"] ?? "")}</strong>
1713
+ ${item["time"] ? T`<p class="muted">${String(item["time"])}</p>` : A}
1714
+ ${item["description"] ? T`<p>${String(item["description"])}</p>` : A}
1715
+ </li>`)}
1716
+ </ol>
1717
+ `,
1718
+ Progress: (props) => {
1719
+ const value = Math.max(0, Math.min(100, Number(props["value"] ?? 0)));
1720
+ return T`
1721
+ <div class="metric">
1722
+ ${props["label"] ? T`<span class="muted">${str(props, "label")}</span>` : A}
1723
+ <div
1724
+ class="bar"
1725
+ role="progressbar"
1726
+ aria-valuenow=${value}
1727
+ aria-valuemin="0"
1728
+ aria-valuemax="100"
1729
+ aria-label=${str(props, "label", "Progress")}
1730
+ >
1731
+ <span style=${`width: ${value}%`}></span>
1732
+ </div>
1733
+ </div>
1734
+ `;
1735
+ },
1654
1736
  FileLink: (props) => T`<p>${str(props, "label", str(props, "path"))}</p>`,
1655
1737
  Form: (props, host) => T`
1656
1738
  <form @submit=${(event) => event.preventDefault()}>
@@ -1752,12 +1834,16 @@ function apiSchema(shape) {
1752
1834
  function defineElement(api, render) {
1753
1835
  class WebSkillA2uiElement extends A2uiLitElement {
1754
1836
  static styles = sharedStyles;
1837
+ view = {};
1755
1838
  createController() {
1756
1839
  return new A2uiController(this, api);
1757
1840
  }
1758
1841
  renderChild(ref) {
1759
1842
  return this.renderNode(ref);
1760
1843
  }
1844
+ refresh() {
1845
+ this.requestUpdate();
1846
+ }
1761
1847
  render() {
1762
1848
  const props = this.controller?.props;
1763
1849
  return props ? render(props, this) : A;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webskill/sdk",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "WebSkill \u2014 browser/Node agent skill runtime (skills, tools, MCP, governance, UI)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -40,6 +40,10 @@
40
40
  "types": "./dist/governance.d.ts",
41
41
  "import": "./dist/governance.js"
42
42
  },
43
+ "./agent": {
44
+ "types": "./dist/agent.d.ts",
45
+ "import": "./dist/agent.js"
46
+ },
43
47
  "./testing": {
44
48
  "types": "./dist/testing.d.ts",
45
49
  "import": "./dist/testing.js"
@@ -92,6 +96,7 @@
92
96
  },
93
97
  "devDependencies": {
94
98
  "@types/node": "24.13.3",
99
+ "@webskill/agent": "workspace:*",
95
100
  "@webskill/browser": "workspace:*",
96
101
  "@webskill/core": "workspace:*",
97
102
  "@webskill/governance": "workspace:*",