@qilin-agent/client-ui-permission-presets 3.1.5 → 3.1.6

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/README.i18n.yaml CHANGED
@@ -18,8 +18,8 @@
18
18
  en: 91606bff7da02253
19
19
  zh: ef68e813d64c89be
20
20
  /qilin-agent-client-ui-permission-presets/use-this-package/the-picker:
21
- en: d851eab85fe002bd
22
- zh: 0fdf6eeb1cbd609b
21
+ en: d330757a5562d174
22
+ zh: d4cc99873fa3b699
23
23
  /qilin-agent-client-ui-permission-presets/use-this-package/the-settings-row:
24
24
  en: 5067f6aa12496225
25
25
  zh: cfa6796684f97535
package/README.md CHANGED
@@ -29,7 +29,7 @@ Mount this plugin alongside the settings, commands, and conversation packages. G
29
29
 
30
30
  ### The picker
31
31
 
32
- A pick submits the `/permission <preset>` command line. The argument-bearing form (`/permission <preset>` typed directly) still switches directly; the decoration replaces only the bare invocation. The built-in labels are `Read Only`, `Workspace Write`, `Full access`, and `Auto review` in English and `仅可查看`, `工作区内修改`, `完全权限`, and `Auto review` in Chinese. Explicit host labels remain unchanged, unknown kebab-case names render in title case, and `auto` carries an `EXP` badge plus an experimental-risk confirmation. `custom` is display state, never a target.
32
+ A pick submits the `/permission <preset>` command line. The argument-bearing form (`/permission <preset>` typed directly) still switches directly; the decoration replaces only the bare invocation. The built-in labels are `Read Only`, `Workspace Write`, `Full access`, and `Auto review` in English and `仅可查看`, `工作区内修改`, `完全权限`, and `Auto review` in Chinese. Explicit host labels remain unchanged, unknown kebab-case names render in title case, and `auto` carries an `EXP` badge in menu options plus an experimental-risk confirmation. The selected composer control shows the mode without the badge. `custom` is display state, never a target.
33
33
 
34
34
  When the live catalog withdraws a preset, the composer closes its pending confirmation and shows the Session's current value instead of an unavailable optimistic pick. Every catalog invalidation — the payload-free notification or a connection-generation change — closes an open slash picker or its confirmation without consuming the draft, while publishing the result of a read the picker waits for leaves it open with its failure and retry state; reopening reads the current catalog. A submitted command remains busy until its response settles.
35
35
 
package/README.zh.md CHANGED
@@ -29,7 +29,7 @@ kind: "package-reference"
29
29
 
30
30
  ### 选择器
31
31
 
32
- 选中即提交 `/permission <preset>` 命令行。带参形式(直接键入 `/permission <preset>`)仍直接切换;装饰只替换裸调用。内置标签在英文界面中是 `Read Only`、`Workspace Write`、`Full access` 和 `Auto review`,在中文界面中是「仅可查看」「工作区内修改」「完全权限」和 `Auto review`。显式 host 标签保持原样,未知 kebab-case 名称渲染为 Title Case;`auto` 带有 `EXP` badge,并在可见选择时要求实验风险确认。`custom` 只是显示状态,绝非目标。
32
+ 选中即提交 `/permission <preset>` 命令行。带参形式(直接键入 `/permission <preset>`)仍直接切换;装饰只替换裸调用。内置标签在英文界面中是 `Read Only`、`Workspace Write`、`Full access` 和 `Auto review`,在中文界面中是「仅可查看」「工作区内修改」「完全权限」和 `Auto review`。显式 host 标签保持原样,未知 kebab-case 名称渲染为 Title Case;`auto` 在菜单选项中带有 `EXP` 标记,并在可见选择时要求实验风险确认。选中后的 composer 控件显示模式,不展示该标记。`custom` 只是显示状态,绝非目标。
33
33
 
34
34
  实时目录撤销某个预设时,composer 关闭对应的待确认对话框,并用 Session 的当前值替代已不可用的乐观选择。每次目录失效(无 payload 的通知或连接代际变更)会关闭已打开的 slash 选择器或其确认对话框,不消费草稿;而发布某个 picker 正在等待的读取结果时,该 picker 保持打开并保留失败与重试状态;重新打开时读取当前目录。已经提交的命令在响应结束前继续保持忙碌状态。
35
35
 
package/lib/client.js CHANGED
@@ -159,6 +159,8 @@ window.__ModuleLoader__.load({
159
159
  const zh = {
160
160
  "title": "权限",
161
161
  "description": "选择新会话的默认权限模式",
162
+ "unset": "未设定",
163
+ "unsetDescription": "尚未设定;新会话先使用主机默认,可在此选择一个预设固定下来",
162
164
  "loading": "加载中",
163
165
  "unavailable": "不可用",
164
166
  "preset.readOnly": "仅可查看",
@@ -174,6 +176,8 @@ window.__ModuleLoader__.load({
174
176
  const en = {
175
177
  "title": "Permission",
176
178
  "description": "Choose the default permission mode for new sessions",
179
+ "unset": "Not set",
180
+ "unsetDescription": "Not set yet; new sessions use the host default. Pick a preset here to pin it.",
177
181
  "loading": "Loading",
178
182
  "unavailable": "Unavailable",
179
183
  "preset.readOnly": "Read Only",
@@ -262,7 +266,7 @@ window.__ModuleLoader__.load({
262
266
  }
263
267
  //#endregion
264
268
  //#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-permission-presets/src/client/PermissionSelect.module.css.mjs
265
- const css$1 = ".OiI-WW_trigger{min-width:0;max-width:220px;height:28px;color:var(--qilin-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:24px;outline:none;align-items:center;gap:4px;padding:0 4px 0 8px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.OiI-WW_trigger:hover:not(:disabled){background:var(--qilin-alias-interactive-bg-hover)}.OiI-WW_trigger:focus-visible{box-shadow:0 0 0 2px var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary))}.OiI-WW_trigger:disabled{color:var(--qilin-alias-label-dimmed);cursor:default}.OiI-WW_triggerIcon{flex:none;display:inline-flex}.OiI-WW_triggerIcon svg{width:14px;height:14px}.OiI-WW_triggerLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.OiI-WW_optionLabel{align-items:baseline;gap:4px;min-width:0;max-width:100%;display:inline-flex}.OiI-WW_optionLabelText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.OiI-WW_badge{color:var(--qilin-alias-label-tertiary);letter-spacing:.2px;flex:none;align-self:flex-start;margin-top:-1px;font-size:8px;font-weight:600;line-height:10px}.OiI-WW_chevron{color:var(--qilin-alias-label-caption);flex:none;transition:transform .12s;display:inline-flex}@container (width<=460px){.OiI-WW_trigger:has(.OiI-WW_triggerIcon) .OiI-WW_triggerLabel{display:none}}.OiI-WW_chevronOpen{transform:rotate(180deg)}";
269
+ const css$1 = ".OiI-WW_trigger{min-width:0;max-width:220px;height:28px;color:var(--qilin-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:24px;outline:none;align-items:center;gap:4px;padding:0 4px 0 8px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.OiI-WW_trigger:hover:not(:disabled){background:var(--qilin-alias-interactive-bg-hover)}.OiI-WW_trigger:focus-visible{box-shadow:0 0 0 2px var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary))}.OiI-WW_trigger:disabled{color:var(--qilin-alias-label-dimmed);cursor:default}.OiI-WW_triggerIcon{flex:none;display:inline-flex}.OiI-WW_triggerIcon svg{width:14px;height:14px}.OiI-WW_triggerLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.OiI-WW_optionLabel{align-items:center;gap:4px;min-width:0;max-width:100%;display:inline-flex}.OiI-WW_optionLabelText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.OiI-WW_badge{color:var(--qilin-alias-label-tertiary);letter-spacing:.2px;flex:none;font-size:8px;font-weight:500;line-height:10px}.OiI-WW_chevron{color:var(--qilin-alias-label-caption);flex:none;transition:transform .12s;display:inline-flex}@container (width<=460px){.OiI-WW_trigger:has(.OiI-WW_triggerIcon) .OiI-WW_triggerLabel{display:none}}.OiI-WW_chevronOpen{transform:rotate(180deg)}";
266
270
  const tagId$1 = "@qilin-agent/client-ui-permission-presets/PermissionSelect.module.css";
267
271
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
268
272
  const tag = document.createElement("style");
@@ -403,7 +407,7 @@ window.__ModuleLoader__.load({
403
407
  children: [(0, react_jsx_runtime.jsx)("span", {
404
408
  className: PermissionSelect_module_css_default.optionLabelText,
405
409
  children: label
406
- }), (0, react_jsx_runtime.jsx)("sup", {
410
+ }), (0, react_jsx_runtime.jsx)("span", {
407
411
  className: PermissionSelect_module_css_default.badge,
408
412
  children: badge
409
413
  })]
@@ -439,8 +443,6 @@ window.__ModuleLoader__.load({
439
443
  const confirmationDescription = confirmation === "auto" ? t("auto.confirm.description") : t("confirm.description");
440
444
  const confirmationAcknowledge = confirmation === "auto" ? t("auto.confirm.acknowledge") : t("confirm.acknowledge");
441
445
  const confirmationEnable = confirmation === "auto" ? t("auto.confirm.enable") : t("confirm.enable");
442
- const currentBadge = optionBadge(currentValue, t);
443
- const currentAccessibleLabel = currentBadge === void 0 ? currentLabel : `${currentLabel} ${currentBadge}`;
444
446
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(_qilin_agent_client_ui_primitives.Menu, {
445
447
  open,
446
448
  items,
@@ -454,7 +456,7 @@ window.__ModuleLoader__.load({
454
456
  anchor: (0, react_jsx_runtime.jsxs)("button", {
455
457
  type: "button",
456
458
  className: PermissionSelect_module_css_default.trigger,
457
- "aria-label": t("mode", { name: currentAccessibleLabel }),
459
+ "aria-label": t("mode", { name: currentLabel }),
458
460
  title: current === void 0 ? void 0 : optionDescription(current, t),
459
461
  disabled: locked || busy,
460
462
  onClick: () => {
@@ -470,10 +472,6 @@ window.__ModuleLoader__.load({
470
472
  className: PermissionSelect_module_css_default.triggerLabel,
471
473
  children: currentLabel
472
474
  }),
473
- currentBadge !== void 0 && (0, react_jsx_runtime.jsx)("sup", {
474
- className: PermissionSelect_module_css_default.badge,
475
- children: currentBadge
476
- }),
477
475
  (0, react_jsx_runtime.jsx)("span", {
478
476
  className: clsx(PermissionSelect_module_css_default.chevron, open && PermissionSelect_module_css_default.chevronOpen),
479
477
  "aria-hidden": true,
@@ -547,8 +545,9 @@ window.__ModuleLoader__.load({
547
545
  const selected = state.options.find((option) => option.id === state.currentValue);
548
546
  const busy = state.status === "loading" || state.status === "saving" || confirmingFullAccess;
549
547
  const optionLabel = (option) => displayPermissionPreset(option.id, option.label, t);
550
- const label = selected !== void 0 ? optionLabel(selected) : busy ? t("loading") : t("unavailable");
551
- const description = state.error ?? t("description");
548
+ const unset = state.currentValue === "" && state.error === null;
549
+ const label = selected !== void 0 ? optionLabel(selected) : busy ? t("loading") : t("unset");
550
+ const description = state.error ?? (unset ? t("unsetDescription") : t("description"));
552
551
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("div", {
553
552
  className: PermissionRow_module_css_default.row,
554
553
  children: [(0, react_jsx_runtime.jsxs)("div", {
@@ -621,34 +620,33 @@ window.__ModuleLoader__.load({
621
620
  //#region lib/types/client/settings-store.js
622
621
  /**
623
622
  * Permission default-settings controller. The permission descriptor comes
624
- * from the shared describe mirror (the dynamic preset enum lives in the
625
- * namespace schema, which per-namespace scopes do not carry); writes target
626
- * only `defaultPreset`, carry the descriptor revision, and fold their answer
627
- * back into the mirror.
623
+ * from the shared describe mirror and the selectable presets from the shared
624
+ * permission catalog directory (the namespace schema carries a plain string,
625
+ * so it cannot enumerate the presets); writes target only `defaultPreset`,
626
+ * carry the descriptor revision, and fold their answer back into the mirror.
628
627
  */
629
628
  /** Permission's settings namespace on the host wire. */
630
629
  const PERMISSION_SETTINGS_NS = "permission";
631
630
  /**
632
- * Read the dynamic preset enum encoded by the host's `defaultPreset` schema.
631
+ * Read the new-session default and its selectable presets from the shared
632
+ * catalog.
633
633
  * @param view - permission namespace descriptor.
634
- * @param schema - settings schema operations.
635
- * @returns current value and selectable options.
634
+ * @param catalog - the host's permission catalog.
635
+ * @returns current value (empty when never set) and selectable options.
636
636
  */
637
- function permissionDefaultOf(view, schema) {
637
+ function permissionDefaultOf(view, catalog) {
638
638
  const value = view.value?.defaultPreset;
639
- if (typeof value !== "string") throw new Error("permission settings has no defaultPreset value");
640
- const node = schema.nodeAtPath(schema.rehydrate(view.schema), ["defaultPreset"]);
641
- if (node === void 0) throw new Error("permission settings schema has no defaultPreset field");
642
- const options = (node.type === "union" ? node.list ?? [] : [node]).flatMap((candidate) => {
643
- const choice = candidate;
644
- if (choice.type !== "const" || typeof choice.value !== "string") return [];
645
- const described = choice.meta?.description;
646
- return [{
647
- id: choice.value,
648
- label: typeof described === "string" && described.length > 0 ? displayPermissionPreset(choice.value, described) : displayPermissionPreset(choice.value, choice.value)
649
- }];
650
- });
651
- if (options.length === 0 || !options.some((option) => option.id === value)) throw new Error("permission settings schema does not advertise its current preset");
639
+ if (value !== void 0 && typeof value !== "string") throw new Error("permission settings has a non-string defaultPreset value");
640
+ const options = catalog.defaultOptions.map((option) => ({
641
+ id: option.value,
642
+ label: displayPermissionPreset(option.value, option.name)
643
+ }));
644
+ if (options.length === 0) throw new Error("permission catalog advertises no default presets");
645
+ if (value === void 0) return {
646
+ currentValue: "",
647
+ options
648
+ };
649
+ if (!options.some((option) => option.id === value)) throw new Error("permission settings value does not match any default preset");
652
650
  return {
653
651
  currentValue: value,
654
652
  options
@@ -657,8 +655,8 @@ window.__ModuleLoader__.load({
657
655
  /** Controller deriving the row from the shared mirror and writing the default through it. */
658
656
  var PermissionPresetSettingsController = class {
659
657
  describeFace;
658
+ catalogFace;
660
659
  ctx;
661
- schema;
662
660
  /** Row snapshot consumed through a bound selector hook. */
663
661
  store = (0, _qilin_agent_client_store.createSnapshotStore)({
664
662
  status: "idle",
@@ -672,25 +670,35 @@ window.__ModuleLoader__.load({
672
670
  saving = false;
673
671
  disposed = false;
674
672
  /**
675
- * @param describeFace - the shared mirror's read/fold face (descriptor and schema source).
673
+ * @param describeFace - the shared mirror's read/fold face (descriptor source).
674
+ * @param catalogFace - the shared catalog directory's store, narrowed.
676
675
  * @param ctx - the row plugin's context, whose `remote.settings` namespace
677
676
  * carries the `defaultPreset` write.
678
- * @param schema - settings-owned schema operations.
679
677
  */
680
- constructor(describeFace, ctx, schema) {
678
+ constructor(describeFace, catalogFace, ctx) {
681
679
  this.describeFace = describeFace;
680
+ this.catalogFace = catalogFace;
682
681
  this.ctx = ctx;
683
- this.schema = schema;
684
682
  }
685
683
  /**
686
- * Begin following the mirror (idempotent) and reflect its current answer.
684
+ * Begin following the mirror and the catalog (idempotent) and reflect their
685
+ * current answer.
687
686
  * @returns settlement once the snapshot reflects the mirror.
688
687
  */
689
688
  async load() {
690
689
  if (this.disposed) return;
691
- this.following ??= this.describeFace.subscribe(() => {
692
- this.derive();
693
- });
690
+ this.following ??= (() => {
691
+ const stopDescriptor = this.describeFace.subscribe(() => {
692
+ this.derive();
693
+ });
694
+ const stopCatalog = this.catalogFace.subscribe(() => {
695
+ this.derive();
696
+ });
697
+ return () => {
698
+ stopDescriptor();
699
+ stopCatalog();
700
+ };
701
+ })();
694
702
  this.store.update((state) => {
695
703
  state.status = "loading";
696
704
  state.error = null;
@@ -765,7 +773,9 @@ window.__ModuleLoader__.load({
765
773
  return;
766
774
  }
767
775
  try {
768
- const resolved = permissionDefaultOf(view, this.schema);
776
+ const catalog = this.catalogFace.snapshot();
777
+ if (catalog === null) return;
778
+ const resolved = permissionDefaultOf(view, catalog);
769
779
  const { writable } = mirrored.view;
770
780
  this.store.update((state) => {
771
781
  state.status = "ready";
@@ -855,7 +865,10 @@ window.__ModuleLoader__.load({
855
865
  zh,
856
866
  en
857
867
  }), "ui-permission: settings row dictionaries");
858
- const controller = new PermissionPresetSettingsController(ctx.configForms.describe(), ctx, ctx.settingsSchema);
868
+ const controller = new PermissionPresetSettingsController(ctx.configForms.describe(), {
869
+ snapshot: () => catalog.store.getSnapshot().value,
870
+ subscribe: (listener) => catalog.store.subscribe(listener)
871
+ }, ctx);
859
872
  const load = () => controller.load();
860
873
  const select = (preset) => controller.select(preset);
861
874
  const injected = () => ({
@@ -5,6 +5,8 @@ export declare const PERMISSION_ACCESS_NS = "permission.access";
5
5
  export declare const zh: {
6
6
  title: string;
7
7
  description: string;
8
+ unset: string;
9
+ unsetDescription: string;
8
10
  loading: string;
9
11
  unavailable: string;
10
12
  'preset.readOnly': string;
@@ -22,6 +24,8 @@ export type PermissionSettingsKey = keyof typeof zh;
22
24
  export declare const en: {
23
25
  title: string;
24
26
  description: string;
27
+ unset: string;
28
+ unsetDescription: string;
25
29
  loading: string;
26
30
  unavailable: string;
27
31
  'preset.readOnly': string;
@@ -1,14 +1,15 @@
1
1
  /**
2
2
  * Permission default-settings controller. The permission descriptor comes
3
- * from the shared describe mirror (the dynamic preset enum lives in the
4
- * namespace schema, which per-namespace scopes do not carry); writes target
5
- * only `defaultPreset`, carry the descriptor revision, and fold their answer
6
- * back into the mirror.
3
+ * from the shared describe mirror and the selectable presets from the shared
4
+ * permission catalog directory (the namespace schema carries a plain string,
5
+ * so it cannot enumerate the presets); writes target only `defaultPreset`,
6
+ * carry the descriptor revision, and fold their answer back into the mirror.
7
7
  */
8
8
  import type { Context as ClientContext } from '@qilin-agent/kylin';
9
9
  import type { SettingsNamespaceView } from '@qilin-agent/api-remotes/client';
10
10
  import { type SnapshotStore } from '@qilin-agent/client-store';
11
- import type { SettingsDescribeFace, SettingsSchemaService } from '@qilin-agent/client-ui-settings/client';
11
+ import type { PermissionCatalog } from '@qilin-agent/permission-presets/client';
12
+ import type { SettingsDescribeFace } from '@qilin-agent/client-ui-settings/client';
12
13
  /** Permission's settings namespace on the host wire. */
13
14
  export declare const PERMISSION_SETTINGS_NS = "permission";
14
15
  /** One selectable new-session default. */
@@ -27,35 +28,44 @@ export interface PermissionSettingsState {
27
28
  options: readonly PermissionDefaultOption[];
28
29
  revision: number;
29
30
  }
31
+ /** Catalog face the row follows: the shared directory's store, narrowed. */
32
+ export interface PermissionCatalogFace {
33
+ /** Latest complete catalog, or null before the first read settles. */
34
+ snapshot(): PermissionCatalog | null;
35
+ /** Subscribe to catalog publications; returns the disposer. */
36
+ subscribe(listener: () => void): () => void;
37
+ }
30
38
  /**
31
- * Read the dynamic preset enum encoded by the host's `defaultPreset` schema.
39
+ * Read the new-session default and its selectable presets from the shared
40
+ * catalog.
32
41
  * @param view - permission namespace descriptor.
33
- * @param schema - settings schema operations.
34
- * @returns current value and selectable options.
42
+ * @param catalog - the host's permission catalog.
43
+ * @returns current value (empty when never set) and selectable options.
35
44
  */
36
- export declare function permissionDefaultOf(view: SettingsNamespaceView, schema: SettingsSchemaService): {
45
+ export declare function permissionDefaultOf(view: SettingsNamespaceView, catalog: PermissionCatalog): {
37
46
  currentValue: string;
38
47
  options: PermissionDefaultOption[];
39
48
  };
40
49
  /** Controller deriving the row from the shared mirror and writing the default through it. */
41
50
  export declare class PermissionPresetSettingsController {
42
51
  private readonly describeFace;
52
+ private readonly catalogFace;
43
53
  private readonly ctx;
44
- private readonly schema;
45
54
  /** Row snapshot consumed through a bound selector hook. */
46
55
  readonly store: SnapshotStore<PermissionSettingsState>;
47
56
  private following;
48
57
  private saving;
49
58
  private disposed;
50
59
  /**
51
- * @param describeFace - the shared mirror's read/fold face (descriptor and schema source).
60
+ * @param describeFace - the shared mirror's read/fold face (descriptor source).
61
+ * @param catalogFace - the shared catalog directory's store, narrowed.
52
62
  * @param ctx - the row plugin's context, whose `remote.settings` namespace
53
63
  * carries the `defaultPreset` write.
54
- * @param schema - settings-owned schema operations.
55
64
  */
56
- constructor(describeFace: SettingsDescribeFace, ctx: ClientContext, schema: SettingsSchemaService);
65
+ constructor(describeFace: SettingsDescribeFace, catalogFace: PermissionCatalogFace, ctx: ClientContext);
57
66
  /**
58
- * Begin following the mirror (idempotent) and reflect its current answer.
67
+ * Begin following the mirror and the catalog (idempotent) and reflect their
68
+ * current answer.
59
69
  * @returns settlement once the snapshot reflects the mirror.
60
70
  */
61
71
  load(): Promise<void>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@qilin-agent/client-ui-permission-presets",
3
3
  "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection",
4
- "version": "3.1.5",
4
+ "version": "3.1.6",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -44,29 +44,29 @@
44
44
  },
45
45
  "license": "MIT",
46
46
  "peerDependencies": {
47
- "@qilin-agent/kylin": "~4.0.3"
47
+ "@qilin-agent/kylin": "~4.0.5"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/react": "~18.3.1",
51
51
  "clsx": "^2.0.0",
52
52
  "react": "^18.2.0",
53
- "@qilin-agent/remote-mock": "3.1.5",
54
- "@qilin-agent/kylin": "~4.0.3",
55
- "@qilin-agent/api-remotes": "3.1.5",
56
- "@qilin-agent/api-session-controller": "3.1.5",
57
- "@qilin-agent/client-connection": "3.1.5",
58
- "@qilin-agent/client-store": "3.1.5",
59
- "@qilin-agent/client-locale": "3.1.5",
60
- "@qilin-agent/client-test-runtime": "3.1.5",
61
- "@qilin-agent/client-ui-conversation": "3.1.5",
62
- "@qilin-agent/client-ui-commands": "3.1.5",
63
- "@qilin-agent/client-ui-primitives": "3.1.5",
64
- "@qilin-agent/client-ui-settings": "3.1.5",
65
- "@qilin-agent/client-ui-slots": "3.1.5",
66
- "@qilin-agent/client-ui-input-trigger": "3.1.5",
67
- "@qilin-agent/permission-presets": "3.1.5",
68
- "@qilin-agent/client-ui-renderer": "3.1.5",
69
- "@qilin-agent/client-ui-session": "3.1.5"
53
+ "@qilin-agent/kylin": "~4.0.5",
54
+ "@qilin-agent/api-session-controller": "3.1.6",
55
+ "@qilin-agent/remote-mock": "3.1.6",
56
+ "@qilin-agent/client-connection": "3.1.6",
57
+ "@qilin-agent/api-remotes": "3.1.6",
58
+ "@qilin-agent/client-locale": "3.1.6",
59
+ "@qilin-agent/client-store": "3.1.6",
60
+ "@qilin-agent/client-test-runtime": "3.1.6",
61
+ "@qilin-agent/client-ui-commands": "3.1.6",
62
+ "@qilin-agent/client-ui-primitives": "3.1.6",
63
+ "@qilin-agent/client-ui-input-trigger": "3.1.6",
64
+ "@qilin-agent/permission-presets": "3.1.6",
65
+ "@qilin-agent/client-ui-renderer": "3.1.6",
66
+ "@qilin-agent/client-ui-session": "3.1.6",
67
+ "@qilin-agent/client-ui-settings": "3.1.6",
68
+ "@qilin-agent/client-ui-slots": "3.1.6",
69
+ "@qilin-agent/client-ui-conversation": "3.1.6"
70
70
  },
71
71
  "files": [
72
72
  "lib/index.js",