@dsh-electron/dsh-plugin-multi-root-workspace 0.1.10 → 0.1.12

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 (60) hide show
  1. package/CHANGELOG.en.md +25 -1
  2. package/CHANGELOG.md +25 -1
  3. package/README.en.md +11 -9
  4. package/README.md +11 -9
  5. package/cordis.patch.yml +3 -2
  6. package/lib/auto-review.js +1 -1
  7. package/lib/client.js +252 -129
  8. package/lib/client.js.map +1 -1
  9. package/lib/{command-BGdz7VBH.js → command-CmLekG1M.js} +3 -2
  10. package/lib/command.js +1 -1
  11. package/lib/{compat-D-MljsPV.js → compat-Bg2HFVMX.js} +6 -1
  12. package/lib/compat.js +1 -1
  13. package/lib/{sandbox-CXk5h-ct.js → dialects-Dr4rDR-H.js} +6 -264
  14. package/lib/{fs-BTXySwSG.js → fs-CfzJq2wd.js} +23 -8
  15. package/lib/fs.js +1 -1
  16. package/lib/index.js +7 -6
  17. package/lib/{instructions-MePoRigy.js → instructions-KsUwUFE0.js} +53 -37
  18. package/lib/instructions.js +1 -1
  19. package/lib/lsp.js +19 -16
  20. package/lib/native-win32-2waCRkPI.js +312 -0
  21. package/lib/process-fence.js +62 -12
  22. package/lib/protocol-4zdwV7u4.js +641 -0
  23. package/lib/{registry-KSsmU393.js → registry-YTUOjmVu.js} +368 -25
  24. package/lib/registry-operation-C2ZV3Jhw.js +116 -0
  25. package/lib/registry.js +3 -2
  26. package/lib/{review-context-AH-SXHmj.js → review-context-NDpKeMCc.js} +1 -1
  27. package/lib/review-context.js +1 -1
  28. package/lib/sandbox-C-vCJCp3.js +278 -0
  29. package/lib/sandbox.js +1 -1
  30. package/lib/scope.js +70 -10
  31. package/lib/skills.js +48 -29
  32. package/lib/types/authority/native-win32.d.ts +7 -0
  33. package/lib/types/authority/native.d.ts +23 -0
  34. package/lib/types/authority/protocol.d.ts +70 -0
  35. package/lib/types/client/open-in-app/OpenInAppAction.d.ts +5 -3
  36. package/lib/types/client/open-in-app/OpenTargetButton.d.ts +16 -10
  37. package/lib/types/client/open-in-app/adapter.d.ts +5 -1
  38. package/lib/types/client/open-in-app/controller.d.ts +5 -2
  39. package/lib/types/client/open-in-app/device.d.ts +11 -0
  40. package/lib/types/client/open-in-app/locales.d.ts +1 -1
  41. package/lib/types/client/open-in-app/open-path.d.ts +6 -5
  42. package/lib/types/client/open-in-app/open-toast.d.ts +39 -0
  43. package/lib/types/client/open-in-app/outcome.d.ts +23 -0
  44. package/lib/types/client/styles.d.ts +1 -1
  45. package/lib/types/compat/authority-storage.d.ts +6 -0
  46. package/lib/types/compat/dsh-version.d.ts +4 -4
  47. package/lib/types/compat/open-in-app-device.d.ts +23 -0
  48. package/lib/types/compat/process-entrypoints.d.ts +2 -0
  49. package/lib/types/compat/process-profile.d.ts +3 -0
  50. package/lib/types/compat/sandbox-confine.d.ts +2 -0
  51. package/lib/types/fs.d.ts +4 -1
  52. package/lib/types/instructions.d.ts +0 -47
  53. package/lib/types/registry-operation.d.ts +31 -0
  54. package/lib/types/registry.d.ts +47 -6
  55. package/lib/types/scope.d.ts +12 -0
  56. package/lib/types/skills/catalog.d.ts +3 -0
  57. package/lib/types/skills/pool.d.ts +1 -1
  58. package/lib/workspace-files.js +63 -7
  59. package/package.json +87 -80
  60. package/lib/types/client/open-in-app/open-failure-toast.d.ts +0 -11
package/lib/client.js CHANGED
@@ -123,7 +123,7 @@ window.__ModuleLoader__.load({
123
123
  return typeof count === "number" && count > 0;
124
124
  }
125
125
  //#endregion
126
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/util.js
126
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/util.js
127
127
  function getEnumValues(entries) {
128
128
  const numericValues = Object.values(entries).filter((v) => typeof v === "number");
129
129
  return Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
@@ -430,6 +430,17 @@ window.__ModuleLoader__.load({
430
430
  function unwrapMessage(message) {
431
431
  return typeof message === "string" ? message : message?.message;
432
432
  }
433
+ /** The leading size checks of `defChecks` that set an upper bound, each paired with it. */
434
+ function sizeCaps(defChecks) {
435
+ const caps = [];
436
+ for (const ch of defChecks ?? []) {
437
+ const d = ch._zod.def;
438
+ if (!/_(length|size)$|_equals$/.test(d.check)) break;
439
+ const max = d.maximum ?? d.length ?? d.size;
440
+ if (max >= 0) caps.push([max, ch]);
441
+ }
442
+ return caps;
443
+ }
433
444
  function attachSchema(issues, start, inst) {
434
445
  var _a;
435
446
  for (let i = start; i < issues.length; i++) (_a = issues[i]).schema ?? (_a.schema = inst);
@@ -506,7 +517,6 @@ window.__ModuleLoader__.load({
506
517
  });
507
518
  else defineBound(proto, key, desc.value);
508
519
  }
509
- for (const sym of Object.getOwnPropertySymbols(table)) defineBound(proto, sym, table[sym]);
510
520
  }
511
521
  /** Shadows a prototype member with an own value, so a getter that builds from the instance runs once. */
512
522
  function own(inst, key, value, enumerable = true) {
@@ -647,7 +657,7 @@ window.__ModuleLoader__.load({
647
657
  return fn;
648
658
  }
649
659
  //#endregion
650
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/core.js
660
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/core.js
651
661
  var _a$1;
652
662
  const _zodDesc = {
653
663
  value: void 0,
@@ -692,8 +702,7 @@ window.__ModuleLoader__.load({
692
702
  } finally {
693
703
  _zodDesc.value = void 0;
694
704
  }
695
- }
696
- if (inst._zod.traits.has(name)) return;
705
+ } else if (inst._zod.traits.has(name)) return;
697
706
  inst._zod.traits.add(name);
698
707
  initializer(inst, def);
699
708
  if (initialized) {
@@ -754,7 +763,7 @@ window.__ModuleLoader__.load({
754
763
  return globalConfig;
755
764
  }
756
765
  //#endregion
757
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/errors.js
766
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/errors.js
758
767
  function _getMessage() {
759
768
  const internals = this._zod;
760
769
  internals.message ?? (internals.message = JSON.stringify(internals.def, jsonStringifyReplacer, 2));
@@ -870,7 +879,7 @@ window.__ModuleLoader__.load({
870
879
  return fieldErrors;
871
880
  }
872
881
  //#endregion
873
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/parse.js
882
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/parse.js
874
883
  function finalizeParams(callee, params) {
875
884
  return {
876
885
  callee: params?.callee ?? callee,
@@ -1073,7 +1082,7 @@ window.__ModuleLoader__.load({
1073
1082
  return _safeParseAsync(_Err)(schema, value, _ctx);
1074
1083
  };
1075
1084
  //#endregion
1076
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/regexes.js
1085
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/regexes.js
1077
1086
  /**
1078
1087
  * @deprecated CUID v1 is deprecated by its authors due to information leakage
1079
1088
  * (timestamps embedded in the id). Use {@link cuid2} instead.
@@ -1144,7 +1153,7 @@ window.__ModuleLoader__.load({
1144
1153
  const lowercase = /^[^A-Z]*$/;
1145
1154
  const uppercase = /^[^a-z]*$/;
1146
1155
  //#endregion
1147
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/checks.js
1156
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/checks.js
1148
1157
  const $ZodCheck = /*@__PURE__*/ $constructor("$ZodCheck", (inst, def) => {
1149
1158
  var _a;
1150
1159
  inst._zod ?? (inst._zod = {});
@@ -1440,7 +1449,7 @@ window.__ModuleLoader__.load({
1440
1449
  };
1441
1450
  });
1442
1451
  //#endregion
1443
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/doc.js
1452
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/doc.js
1444
1453
  var Doc = class {
1445
1454
  constructor(args = [], closed = {}) {
1446
1455
  this.content = [];
@@ -1474,14 +1483,14 @@ window.__ModuleLoader__.load({
1474
1483
  }
1475
1484
  };
1476
1485
  //#endregion
1477
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/versions.js
1486
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/versions.js
1478
1487
  const version = {
1479
1488
  major: 4,
1480
1489
  minor: 6,
1481
- patch: 2
1490
+ patch: 7
1482
1491
  };
1483
1492
  //#endregion
1484
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/schemas.js
1493
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/schemas.js
1485
1494
  const $ZodType = /*@__PURE__*/ $constructor("$ZodType", (inst, def) => {
1486
1495
  var _a;
1487
1496
  inst ?? (inst = {});
@@ -1641,10 +1650,27 @@ window.__ModuleLoader__.load({
1641
1650
  def.pattern ?? (def.pattern = email);
1642
1651
  $ZodStringFormat.init(inst, def);
1643
1652
  });
1644
- /** Parses a URL for `$ZodURL`, applying the one guard the URL constructor cannot express. Returns the parsed URL, or a code naming the stage that rejected it — the runtime needs that distinction to pick an issue note, and compiled code only needs to know it is not a URL. */
1653
+ function canParseURL(input) {
1654
+ try {
1655
+ if (typeof URL !== "undefined" && typeof URL.canParse === "function") return URL.canParse(input);
1656
+ new URL(input);
1657
+ return true;
1658
+ } catch {
1659
+ return false;
1660
+ }
1661
+ }
1662
+ function validateURL(trimmed, def) {
1663
+ if (!("normalize" in def) && !("hostname" in def) && !("protocol" in def)) return canParseURL(trimmed) || 2;
1664
+ return parseURLObject(trimmed, def);
1665
+ }
1666
+ /** Parses a URL while preserving the non-normalizing HTTP guard. */
1645
1667
  function parseURLObject(trimmed, def) {
1646
1668
  if (!def.normalize && def.protocol?.source === httpProtocol.source && !/^https?:\/\//i.test(trimmed)) return 1;
1647
1669
  try {
1670
+ if (typeof URL !== "undefined") {
1671
+ const URLStatic = URL;
1672
+ if (typeof URLStatic.parse === "function") return URLStatic.parse(trimmed) ?? 2;
1673
+ }
1648
1674
  return new URL(trimmed);
1649
1675
  } catch {
1650
1676
  return 2;
@@ -1668,7 +1694,7 @@ window.__ModuleLoader__.load({
1668
1694
  inst._zod.check = (payload) => {
1669
1695
  try {
1670
1696
  const trimmed = payload.value.trim();
1671
- const url = parseURLObject(trimmed, def);
1697
+ const url = validateURL(trimmed, def);
1672
1698
  if (url === 1) {
1673
1699
  payload.issues.push({
1674
1700
  code: "invalid_format",
@@ -1690,6 +1716,10 @@ window.__ModuleLoader__.load({
1690
1716
  });
1691
1717
  return;
1692
1718
  }
1719
+ if (url === true) {
1720
+ payload.value = stripTabAndNewline(trimmed);
1721
+ return;
1722
+ }
1693
1723
  if (def.hostname && !urlHostnameOk(url, def.hostname)) payload.issues.push({
1694
1724
  code: "invalid_format",
1695
1725
  format: "url",
@@ -1779,12 +1809,7 @@ window.__ModuleLoader__.load({
1779
1809
  const ipv6Alphabet = /^[0-9a-fA-F:.]+$/;
1780
1810
  function isValidIPv6(value) {
1781
1811
  if (!ipv6Alphabet.test(value)) return false;
1782
- try {
1783
- new URL(`http://[${value}]`);
1784
- return true;
1785
- } catch {
1786
- return false;
1787
- }
1812
+ return canParseURL(`http://[${value}]`);
1788
1813
  }
1789
1814
  const $ZodIPv6 = /*@__PURE__*/ $constructor("$ZodIPv6", (inst, def) => {
1790
1815
  def.pattern ?? (def.pattern = ipv6);
@@ -1962,6 +1987,26 @@ window.__ModuleLoader__.load({
1962
1987
  return payload;
1963
1988
  };
1964
1989
  });
1990
+ function capSize(inst, size) {
1991
+ const caps = sizeCaps(inst._zod.def.checks);
1992
+ if (!caps.length) return;
1993
+ const cap = Math.min(...caps.map((c) => c[0]));
1994
+ const parse = inst._zod.parse;
1995
+ inst._zod.parse = (payload, ctx) => {
1996
+ const n = size(payload.value);
1997
+ if (n > cap && !ctx?.skipChecks && ctx?.direction !== "backward") {
1998
+ for (const [max, ch] of sizeCaps(inst._zod.def.checks)) if (n > max && ch._zod.def.when(payload)) {
1999
+ const start = payload.issues.length;
2000
+ ch._zod.check(payload);
2001
+ payload.issues[start].continue = false;
2002
+ attachSchema(payload.issues, start, inst);
2003
+ return payload;
2004
+ }
2005
+ }
2006
+ return parse(payload, ctx);
2007
+ };
2008
+ }
2009
+ const arraySize = (input) => Array.isArray(input) ? input.length : -1;
1965
2010
  function handleArrayResult(result, final, index) {
1966
2011
  if (result.issues.length) final.issues.push(...prefixIssues(index, result.issues));
1967
2012
  final.value[index] = result.value;
@@ -1999,6 +2044,7 @@ window.__ModuleLoader__.load({
1999
2044
  if (proms.length) return Promise.all(proms).then(() => payload);
2000
2045
  return payload;
2001
2046
  };
2047
+ capSize(inst, arraySize);
2002
2048
  });
2003
2049
  function handlePropertyResult(result, final, key, input, optin, optout) {
2004
2050
  const isPresent = key in input;
@@ -2107,7 +2153,7 @@ window.__ModuleLoader__.load({
2107
2153
  }
2108
2154
  return propValues;
2109
2155
  });
2110
- const isObject$2 = isObject;
2156
+ const isObject$1 = isObject;
2111
2157
  const catchall = def.catchall;
2112
2158
  let value;
2113
2159
  const memo = globalConfig.memoizer;
@@ -2115,7 +2161,7 @@ window.__ModuleLoader__.load({
2115
2161
  inst._zod.parse = (payload, ctx) => {
2116
2162
  value ?? (value = _normalized.value);
2117
2163
  const input = payload.value;
2118
- if (!isObject$2(input)) {
2164
+ if (!isObject$1(input)) {
2119
2165
  payload.issues.push({
2120
2166
  expected: "object",
2121
2167
  code: "invalid_type",
@@ -2245,7 +2291,7 @@ window.__ModuleLoader__.load({
2245
2291
  return doc.compile();
2246
2292
  };
2247
2293
  let fastpass;
2248
- const isObject$1 = isObject;
2294
+ const isObject$2 = isObject;
2249
2295
  const jit = !globalConfig.jitless;
2250
2296
  const fastEnabled = jit && allowsEval.value;
2251
2297
  const catchall = def.catchall;
@@ -2253,7 +2299,7 @@ window.__ModuleLoader__.load({
2253
2299
  inst._zod.parse = (payload, ctx) => {
2254
2300
  value ?? (value = _normalized.value);
2255
2301
  const input = payload.value;
2256
- if (!isObject$1(input)) {
2302
+ if (!isObject$2(input)) {
2257
2303
  payload.issues.push({
2258
2304
  expected: "object",
2259
2305
  code: "invalid_type",
@@ -2683,7 +2729,7 @@ window.__ModuleLoader__.load({
2683
2729
  }
2684
2730
  }
2685
2731
  //#endregion
2686
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/memoizer.js
2732
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/memoizer.js
2687
2733
  var $ZodCyclicError = class extends Error {
2688
2734
  constructor() {
2689
2735
  super(`Cannot parse a reference cycle that closes through a transform`);
@@ -2694,7 +2740,7 @@ window.__ModuleLoader__.load({
2694
2740
  const STATE = "~memo";
2695
2741
  const NO_ISSUES = [];
2696
2742
  function isRef(value) {
2697
- return value !== null && (typeof value === "object" || typeof value === "function");
2743
+ return value !== null && typeof value === "object";
2698
2744
  }
2699
2745
  function cloneIssues(issues) {
2700
2746
  return issues.map((iss) => iss.path ? {
@@ -2741,9 +2787,6 @@ window.__ModuleLoader__.load({
2741
2787
  check(def.catchall);
2742
2788
  break;
2743
2789
  }
2744
- case "properties":
2745
- merge(shape(def.shape, false));
2746
- break;
2747
2790
  case "array":
2748
2791
  check(def.element);
2749
2792
  break;
@@ -2939,7 +2982,7 @@ window.__ModuleLoader__.load({
2939
2982
  return backEdges !== void 0 && isRef(value) && backEdges.has(value);
2940
2983
  }
2941
2984
  //#endregion
2942
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/locales/en.js
2985
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/locales/en.js
2943
2986
  const error = () => {
2944
2987
  const Sizable = {
2945
2988
  string: {
@@ -2994,6 +3037,7 @@ window.__ModuleLoader__.load({
2994
3037
  base64url: "base64url-encoded string",
2995
3038
  json_string: "JSON string",
2996
3039
  e164: "E.164 number",
3040
+ currency_code: "currency code",
2997
3041
  credit_card: "credit card number",
2998
3042
  iban: "IBAN",
2999
3043
  jwt: "JWT",
@@ -3046,7 +3090,7 @@ window.__ModuleLoader__.load({
3046
3090
  return { localeError: error() };
3047
3091
  }
3048
3092
  //#endregion
3049
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/registries.js
3093
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/registries.js
3050
3094
  var _a;
3051
3095
  var $ZodRegistry = class {
3052
3096
  constructor() {
@@ -3093,13 +3137,17 @@ window.__ModuleLoader__.load({
3093
3137
  (_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());
3094
3138
  const globalRegistry = globalThis.__zod_globalRegistry;
3095
3139
  //#endregion
3096
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/api.js
3140
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/api.js
3141
+ function snapshotChecks(def) {
3142
+ if (def.checks) def.checks = [...def.checks];
3143
+ return def;
3144
+ }
3097
3145
  // @__NO_SIDE_EFFECTS__
3098
3146
  function _string(Class, params) {
3099
- return new Class({
3147
+ return new Class(snapshotChecks({
3100
3148
  type: "string",
3101
3149
  ...normalizeParams(params)
3102
- });
3150
+ }));
3103
3151
  }
3104
3152
  // @__NO_SIDE_EFFECTS__
3105
3153
  function _email(Class, params) {
@@ -3371,11 +3419,11 @@ window.__ModuleLoader__.load({
3371
3419
  }
3372
3420
  // @__NO_SIDE_EFFECTS__
3373
3421
  function _number(Class, params) {
3374
- return new Class({
3422
+ return new Class(snapshotChecks({
3375
3423
  type: "number",
3376
3424
  checks: [],
3377
3425
  ...normalizeParams(params)
3378
- });
3426
+ }));
3379
3427
  }
3380
3428
  // @__NO_SIDE_EFFECTS__
3381
3429
  function _int(Class, params) {
@@ -3598,7 +3646,7 @@ window.__ModuleLoader__.load({
3598
3646
  return ch;
3599
3647
  }
3600
3648
  //#endregion
3601
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/to-json-schema.js
3649
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/to-json-schema.js
3602
3650
  function assignProps(target, ...sources) {
3603
3651
  for (const source of sources) for (const key of Reflect.ownKeys(source)) if (Object.prototype.propertyIsEnumerable.call(source, key)) assignProp(target, key, source[key]);
3604
3652
  return target;
@@ -4042,7 +4090,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4042
4090
  return finalize(ctx, schema);
4043
4091
  };
4044
4092
  //#endregion
4045
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/json-schema-processors.js
4093
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/json-schema-processors.js
4046
4094
  const narrowMin = (agg, key, value) => {
4047
4095
  if (agg[key] === void 0 || value > agg[key]) agg[key] = value;
4048
4096
  };
@@ -4229,13 +4277,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4229
4277
  key
4230
4278
  ]
4231
4279
  }));
4232
- const allKeys = new Set(Object.keys(shape));
4233
- const requiredKeys = new Set([...allKeys].filter((key) => {
4280
+ const requiredKeys = [];
4281
+ for (const key of Object.keys(shape)) {
4234
4282
  const field = def.shape[key];
4235
- if (ctx.io === "input") return inputOptin(field) === void 0;
4236
- else return field._zod.optout === void 0;
4237
- }));
4238
- if (requiredKeys.size > 0) json.required = Array.from(requiredKeys);
4283
+ if (ctx.io === "input" ? inputOptin(field) === void 0 : field._zod.optout === void 0) requiredKeys.push(key);
4284
+ }
4285
+ if (requiredKeys.length > 0) json.required = requiredKeys;
4239
4286
  if (def.catchall?._zod.def.type === "never") json.additionalProperties = false;
4240
4287
  else if (!def.catchall) {
4241
4288
  if (ctx.io === "output") json.additionalProperties = false;
@@ -4364,7 +4411,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4364
4411
  seen.ref = def.innerType;
4365
4412
  };
4366
4413
  //#endregion
4367
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/classic/errors.js
4414
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/classic/errors.js
4368
4415
  const _installedErrorProtos = /* @__PURE__ */ new WeakSet([Object.prototype, Error.prototype]);
4369
4416
  function _lazyMethod(proto, key, make) {
4370
4417
  Object.defineProperty(proto, key, {
@@ -4414,7 +4461,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4414
4461
  };
4415
4462
  const ZodRealError = /*@__PURE__*/ $constructor("ZodError", initializer, void 0, { Parent: Error });
4416
4463
  //#endregion
4417
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/classic/parse.js
4464
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/classic/parse.js
4418
4465
  const parse = /* @__PURE__ */ _parse(ZodRealError);
4419
4466
  const parseAsync = /* @__PURE__ */ _parseAsync(ZodRealError);
4420
4467
  const safeParse = /* @__PURE__ */ _safeParse(ZodRealError);
@@ -4428,7 +4475,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4428
4475
  const safeEncodeAsync = /* @__PURE__ */ _safeEncodeAsync(ZodRealError);
4429
4476
  const safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
4430
4477
  //#endregion
4431
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/classic/schemas.js
4478
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/classic/schemas.js
4432
4479
  function _ensureDefaultLocale() {
4433
4480
  if (!globalConfig.localeError) config(en_default());
4434
4481
  }
@@ -5986,7 +6033,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5986
6033
 
5987
6034
  /* ── files-tree fork (verbatim rules, renamed classes) ─────────────────────
5988
6035
  Copied from upstream's FilesBody.module.css (ui-sidebar-files @
5989
- 0.2.1-alpha.2) with local names mapped to mrfw-ft* so the rules cannot
6036
+ 0.2.2-alpha.2) with local names mapped to mrfw-ft* so the rules cannot
5990
6037
  collide with host DOM — and so the fork's own body (which must NOT carry
5991
6038
  data-files-body) stays visible while the rules above hide the native one.
5992
6039
  The header-only rules (root/header/path/tool/status/statusLine/titleIcon)
@@ -6043,8 +6090,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6043
6090
  cursor: pointer;
6044
6091
  }
6045
6092
 
6046
- .mrfw-ftRow:hover {
6047
- background: var(--dsw-alias-interactive-bg-hover);
6093
+ @media (hover: hover) {
6094
+ .mrfw-ftRow:hover {
6095
+ background: var(--dsw-alias-interactive-bg-hover);
6096
+ }
6048
6097
  }
6049
6098
 
6050
6099
  /* The folder glyph rides the tertiary ink, as the workspace tree's does. */
@@ -6072,8 +6121,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6072
6121
  cursor: default;
6073
6122
  }
6074
6123
 
6075
- .mrfw-ftOther:hover {
6076
- background: transparent;
6124
+ @media (hover: hover) {
6125
+ .mrfw-ftOther:hover {
6126
+ background: transparent;
6127
+ }
6077
6128
  }
6078
6129
 
6079
6130
  .mrfw-ftNote {
@@ -6898,7 +6949,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6898
6949
  * Named imports cannot spell both releases: each name is absent from the
6899
6950
  * other release's declaration, so the compiler is told once, here.
6900
6951
  */
6901
- const installed$1 = _deepseek_ai_dsh_client_ui_primitives;
6952
+ const installed$2 = _deepseek_ai_dsh_client_ui_primitives;
6902
6953
  /**
6903
6954
  * Pick the first export name this release actually provides.
6904
6955
  * @param module - the icon module to read.
@@ -6921,7 +6972,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6921
6972
  */
6922
6973
  function maybeIcon(names) {
6923
6974
  for (const name of names) {
6924
- const found = installed$1[name];
6975
+ const found = installed$2[name];
6925
6976
  if (found !== void 0) return found;
6926
6977
  }
6927
6978
  }
@@ -6936,7 +6987,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6936
6987
  }
6937
6988
  /** Resolved once, against the installed module. */
6938
6989
  function icon(pixelName, regularName) {
6939
- return selectIcon(installed$1, [pixelName, regularName]);
6990
+ return selectIcon(installed$2, [pixelName, regularName]);
6940
6991
  }
6941
6992
  const IconChevronDown = icon("IconChevronDownOutline14", "IconChevronDownOutlineRegular");
6942
6993
  const IconChevronUp = icon("IconChevronUpOutline14", "IconChevronUpOutlineRegular");
@@ -6953,7 +7004,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6953
7004
  const IconAccessReadOnly = maybeIcon(["PermissionIconReadOnlyRegular", "IconReadOnlyRegular"]);
6954
7005
  const IconAccessInherit = maybeIcon(["IconWorkspaceTreeOutline16", "IconWorkspaceTreeOutlineRegular"]);
6955
7006
  //#endregion
6956
- //#region node_modules/.pnpm/@deepseek-ai+dsh-typert-protocol@0.2.1-rc.3_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-typert-protocol/lib/index.js
7007
+ //#region node_modules/.pnpm/@deepseek-ai+dsh-typert-protocol@0.2.2-alpha.2_@deepseek-ai+cordis@4.0.6-alpha.1/node_modules/@deepseek-ai/dsh-typert-protocol/lib/index.js
6957
7008
  /** The one Remote failure class shared by owners, the Gateway, and consumers. */
6958
7009
  /**
6959
7010
  * One Remote call failure: a real Error carrying its stable code and typed
@@ -7463,7 +7514,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7463
7514
  return n;
7464
7515
  }
7465
7516
  //#endregion
7466
- //#region node_modules/.pnpm/@deepseek-ai+dsh-util-workspace-path@0.2.1-rc.3_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-util-workspace-path/lib/index.js
7517
+ //#region node_modules/.pnpm/@deepseek-ai+dsh-util-workspace-path@0.2.2-alpha.2_@deepseek-ai+cordis@4.0.6-alpha.1/node_modules/@deepseek-ai/dsh-util-workspace-path/lib/index.js
7467
7518
  /**
7468
7519
  * The `dsh-resource://file/…` address grammar: how a file is named across the
7469
7520
  * Sidebar and the resource model, built and parsed without touching a
@@ -7885,7 +7936,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7885
7936
  };
7886
7937
  }
7887
7938
  //#endregion
7888
- //#region node_modules/.pnpm/@deepseek-ai+dsh-host-open-in-app@0.2.1-rc.3_@deepseek-ai+cordis@4.0.5_@deepseek-ai+dsh_5b371ee77d0b761177ea40ae8a5dc767/node_modules/@deepseek-ai/dsh-host-open-in-app/lib/types/shared.js
7939
+ //#region node_modules/.pnpm/@deepseek-ai+dsh-host-open-in-app@0.2.2-alpha.2_@deepseek-ai+cordis@4.0.6-alpha.1_@deep_d76f08f4e35ff3a756a48d7d013379f6/node_modules/@deepseek-ai/dsh-host-open-in-app/lib/types/shared.js
7889
7940
  var shared_exports = /* @__PURE__ */ __exportAll({
7890
7941
  OPEN_IN_APP_APPS_PATH: () => OPEN_IN_APP_APPS_PATH,
7891
7942
  OPEN_IN_APP_APPS_ROUTE: () => OPEN_IN_APP_APPS_ROUTE,
@@ -7941,7 +7992,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7941
7992
  * Named imports cannot spell both eras: each name is absent from the other
7942
7993
  * era's declaration, so the compiler is told once, here.
7943
7994
  */
7944
- const installed = shared_exports;
7995
+ const installed$1 = shared_exports;
7945
7996
  /**
7946
7997
  * Pick the first export name this release actually provides.
7947
7998
  * @param module - the shared module to read.
@@ -7963,7 +8014,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7963
8014
  * `iconUrl` on runtimes whose glyph gate already passed, and on the pixel era
7964
8015
  * the absolute form is exactly what upstream's own client fetched.
7965
8016
  */
7966
- const OPEN_IN_APP_ICON_URL_PREFIX = selectSharedRoute(installed, ["OPEN_IN_APP_ICON_PREFIX_ROUTE", "OPEN_IN_APP_ICON_PREFIX"]);
8017
+ const OPEN_IN_APP_ICON_URL_PREFIX = selectSharedRoute(installed$1, ["OPEN_IN_APP_ICON_PREFIX_ROUTE", "OPEN_IN_APP_ICON_PREFIX"]);
7967
8018
  //#endregion
7968
8019
  //#region src/client/open-in-app/applications.ts
7969
8020
  /** Label keys for applications supported by this client. */
@@ -8059,10 +8110,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8059
8110
  * @param appId - catalog id from the availability list.
8060
8111
  * @param path - the session's absolute workspace directory.
8061
8112
  * Concurrent gestures are ignored until the current Host request settles.
8062
- * @returns after the host acknowledged the launch; rejects on any failure.
8113
+ * @returns the acknowledged handoff, or `{ kind: 'skipped' }` while another
8114
+ * launch holds the operation, or a named failure when the Host refuses or
8115
+ * cannot be reached. Host and transport failures resolve without rejecting.
8063
8116
  */
8064
8117
  async launch(appId, path) {
8065
- if (this.operation.getSnapshot().phase === "busy") return;
8118
+ if (this.operation.getSnapshot().phase === "busy") return { kind: "skipped" };
8066
8119
  this.operation.set({
8067
8120
  phase: "busy",
8068
8121
  path
@@ -8082,12 +8135,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8082
8135
  phase: "idle",
8083
8136
  path
8084
8137
  });
8085
- } catch (error) {
8138
+ return { kind: "opened" };
8139
+ } catch (_error) {
8086
8140
  this.operation.set({
8087
8141
  phase: "error",
8088
8142
  path
8089
8143
  });
8090
- throw error;
8144
+ return {
8145
+ kind: "failed",
8146
+ failure: "openError"
8147
+ };
8091
8148
  }
8092
8149
  }
8093
8150
  async run() {
@@ -8107,36 +8164,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8107
8164
  /** Dictionary namespace owned by upstream's plugin (verbatim). */
8108
8165
  const NS = "open-in-app";
8109
8166
  //#endregion
8110
- //#region src/client/open-in-app/open-failure-toast.tsx
8111
- /** Per-control failure banner for path gestures. */
8112
- /**
8113
- * Transient failure banner owned by the control that initiated the gesture,
8114
- * so one failed request announces once, from the control the user pressed.
8115
- * @returns `toast` owned by the control and `show` to announce one
8116
- * failure with resolved copy; announcing again replays the banner.
8117
- */
8118
- function useOpenFailureToast() {
8119
- const seq = (0, react.useRef)(0);
8120
- const [banner, setBanner] = (0, react.useState)(null);
8121
- const dismiss = (0, react.useCallback)(() => {
8122
- setBanner(null);
8123
- }, []);
8124
- return {
8125
- toast: banner === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
8126
- text: banner.text,
8127
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, {}),
8128
- onDone: dismiss
8129
- }, banner.seq),
8130
- show: (text) => {
8131
- seq.current += 1;
8132
- setBanner({
8133
- seq: seq.current,
8134
- text
8135
- });
8136
- }
8137
- };
8138
- }
8139
- //#endregion
8140
8167
  //#region src/client/open-in-app/OpenTargetButton.module.css.ts
8141
8168
  /**
8142
8169
  * Fork-facing shim for upstream `OpenTargetButton.module.css`.
@@ -8168,27 +8195,24 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8168
8195
  };
8169
8196
  //#endregion
8170
8197
  //#region src/client/open-in-app/OpenTargetButton.tsx
8171
- /** Shared file and directory opener: one default action, application menu, and per-gesture feedback. */
8198
+ /** Shared file and directory opener: one default action, application menu, and one reported outcome per gesture. */
8172
8199
  /**
8173
- * Serialize gestures and announce their failures through the initiating control's toast.
8174
- * @param execute - target adapter that returns the failure to announce, or null.
8175
- * @param t - localized control copy.
8176
- * @returns the pending state, feedback, and guarded action callback.
8200
+ * Serialize gestures and report the outcome each one settles on to the app-wide
8201
+ * announcer, which outlives this control and the panel holding it.
8202
+ * @param execute - target adapter that settles on the gesture's outcome.
8203
+ * @param report - announcement seat the settled outcome is sent to.
8204
+ * @returns the pending state and the guarded action callback.
8177
8205
  */
8178
- function useOpenTargetGesture(execute, t) {
8206
+ function useOpenTargetGesture(execute, report) {
8179
8207
  const [pending, setPending] = (0, react.useState)(false);
8180
8208
  const inFlight = (0, react.useRef)(false);
8181
- const { toast, show } = useOpenFailureToast();
8182
8209
  return {
8183
8210
  pending,
8184
- toast,
8185
8211
  act: (operation) => {
8186
8212
  if (inFlight.current) return;
8187
8213
  inFlight.current = true;
8188
8214
  setPending(true);
8189
- execute(operation).then((failure) => {
8190
- if (failure !== null) show(t(`path.${failure}`));
8191
- }).finally(() => {
8215
+ execute(operation).then(report).finally(() => {
8192
8216
  inFlight.current = false;
8193
8217
  setPending(false);
8194
8218
  });
@@ -8214,12 +8238,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8214
8238
  * Render identical split buttons for files and directories. File reveal always
8215
8239
  * stays last; it is the default only when no application is registered.
8216
8240
  * @param props - target applications, default selection, and operations.
8217
- * @returns the control and its transient failure feedback.
8241
+ * @returns the control alone: its settled outcomes are announced by the seat it reports to.
8218
8242
  */
8219
8243
  function OpenTargetButton(props) {
8220
8244
  const { applications, defaultId, kind, t } = props;
8221
8245
  const [menuOpen, setMenuOpen] = (0, react.useState)(false);
8222
- const { pending, toast, act } = useOpenTargetGesture(props.execute, t);
8246
+ const { pending, act } = useOpenTargetGesture(props.execute, props.report);
8223
8247
  const preferred = kind === "file" ? applications.find((app) => app.id === defaultId) ?? applications[0] : applications.find((app) => app.id === defaultId);
8224
8248
  const disabled = pending || props.busy === true || props.loading === true;
8225
8249
  const hasMenu = props.loading === true || props.failed || applications.length + (kind === "file" ? 1 : 0) > 1;
@@ -8255,7 +8279,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8255
8279
  source: preferred?.icon ?? null,
8256
8280
  size: props.prominent ? 18 : 13
8257
8281
  }, preferred?.icon);
8258
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
8282
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
8259
8283
  className: css.menuAnchor,
8260
8284
  open: menuOpen && !disabled && hasMenu,
8261
8285
  autoFocus: true,
@@ -8323,13 +8347,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8323
8347
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: props.prominent ? 14 : 10 })
8324
8348
  })]
8325
8349
  })
8326
- }), toast] });
8350
+ });
8327
8351
  }
8328
8352
  //#endregion
8329
8353
  //#region src/client/open-in-app/OpenInAppAction.tsx
8330
8354
  /**
8331
8355
  * Adapt the installed directory catalog to the shared opening control.
8332
- * @param props - displayed directory, installed catalog, and launch operations.
8356
+ * @param props - displayed directory, installed catalog, launch operations, and the announcement seat.
8333
8357
  * @returns the shared control, or null without an eligible application.
8334
8358
  */
8335
8359
  function OpenInAppAction(props) {
@@ -8356,19 +8380,101 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8356
8380
  t,
8357
8381
  busy: operation.phase === "busy",
8358
8382
  shortcut,
8383
+ report: props.report,
8359
8384
  execute: async (operation) => {
8360
8385
  const id = operation.kind === "application" ? operation.id : preferred.id;
8361
- try {
8362
- await props.launch(id, absolutePath);
8363
- } catch (_error) {
8364
- return "openError";
8365
- }
8366
- if (operation.kind === "application") props.choose(id);
8367
- return null;
8386
+ const outcome = await props.launch(id, absolutePath);
8387
+ if (outcome.kind === "opened" && operation.kind === "application") props.choose(id);
8388
+ return outcome;
8368
8389
  }
8369
8390
  }, absolutePath);
8370
8391
  }
8371
8392
  //#endregion
8393
+ //#region src/compat/open-in-app-device.ts
8394
+ /**
8395
+ * Compatibility adapter for `isMobileDevice` from
8396
+ * `@deepseek-ai/dsh-client-ui-primitives`.
8397
+ *
8398
+ * ```text
8399
+ * 0.1.5-rc.2 through 0.2.1-rc.5 no `isMobileDevice` export
8400
+ * 0.2.2-alpha.2 + `isMobileDevice` exported
8401
+ * ```
8402
+ *
8403
+ * The open-in-app fork's verbatim `open-toast.tsx` spells the detector as a
8404
+ * primitives import — a name absent before `0.2.2-alpha.2` — so the lookup
8405
+ * is by export name, not by release string (the `client-icons.ts` pattern).
8406
+ * An older runtime falls back to upstream's identical detection: mobile
8407
+ * userAgent, or a touch-capable MacIntel platform, memoized like upstream's.
8408
+ *
8409
+ * @module @dsh-electron/dsh-plugin-multi-root-workspace/compat/open-in-app-device
8410
+ */
8411
+ /** The primitives module, addressed by export name. */
8412
+ const installed = _deepseek_ai_dsh_client_ui_primitives;
8413
+ /** Upstream's own detector when the installed release carries it (verbatim logic below otherwise). */
8414
+ const upstream = typeof installed.isMobileDevice === "function" ? installed.isMobileDevice : void 0;
8415
+ let fallbackResult;
8416
+ /**
8417
+ * Whether this browser is a mobile device — upstream's detection verbatim.
8418
+ * @returns true for a mobile userAgent or a touch-capable macOS surface.
8419
+ */
8420
+ function isMobileDeviceFallback() {
8421
+ fallbackResult ??= /Android|iPhone|iPad|iPod/i.test(navigator.userAgent) || navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
8422
+ return fallbackResult;
8423
+ }
8424
+ /**
8425
+ * Resolve the installed release's `isMobileDevice`, or the identical local
8426
+ * fallback on releases that predate the export.
8427
+ * @returns the mobile-device verdict.
8428
+ */
8429
+ function isMobileDevice() {
8430
+ return upstream === void 0 ? isMobileDeviceFallback() : upstream();
8431
+ }
8432
+ //#endregion
8433
+ //#region src/client/open-in-app/open-toast.tsx
8434
+ /**
8435
+ * Create the one outcome store the overlay entry shows.
8436
+ * @returns the observable notice with its report and dismiss actions.
8437
+ */
8438
+ function createOpenInAppToastSource() {
8439
+ const store = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(null);
8440
+ let seq = 0;
8441
+ return {
8442
+ hooks: { toast: store },
8443
+ report: (outcome) => {
8444
+ if (outcome.kind === "skipped") return;
8445
+ if (outcome.kind !== "failed" && !isMobileDevice()) return;
8446
+ seq += 1;
8447
+ store.set({
8448
+ ...outcome,
8449
+ seq
8450
+ });
8451
+ },
8452
+ dismiss: () => {
8453
+ store.set(null);
8454
+ }
8455
+ };
8456
+ }
8457
+ /**
8458
+ * Render a mobile handoff confirmation or a native-open failure.
8459
+ * @param props - the notice hook, its dismissal, and the locale seat.
8460
+ * @returns the banner on display, or null.
8461
+ */
8462
+ function OpenInAppToast({ useToast, dismiss, t }) {
8463
+ const toast = useToast((current) => current);
8464
+ if (toast === null) return null;
8465
+ const key = `open-in-app-${String(toast.seq)}`;
8466
+ if (toast.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
8467
+ text: t(toast.failure === "revealError" ? "path.revealError" : "path.openError"),
8468
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, {}),
8469
+ onDone: dismiss
8470
+ }, key);
8471
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
8472
+ text: t(toast.kind === "opened" ? "path.opened" : "path.revealed"),
8473
+ tone: "success",
8474
+ onDone: dismiss
8475
+ }, key);
8476
+ }
8477
+ //#endregion
8372
8478
  //#region src/client/open-in-app/adapter.tsx
8373
8479
  /**
8374
8480
  * The plugin-owned wiring around the verbatim open-in-app fork.
@@ -8433,17 +8539,22 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8433
8539
  if (!REQUIRED_GLYPHS.every((name) => maybeIcon([name]) !== void 0)) return void 0;
8434
8540
  const controller = new OpenInAppController();
8435
8541
  controller.load();
8542
+ const toast = createOpenInAppToastSource();
8436
8543
  return {
8437
- useOpenInAppApps: bindSnapshot(controller.apps),
8438
- useOpenInAppChoice: bindSnapshot(controller.choice),
8439
- useOpenInAppLaunch: bindSnapshot(controller.operation),
8440
- useShortcuts: bindSnapshot(deps.shortcuts ?? NO_SHORTCUTS),
8441
- launch: (appId, path) => controller.launch(appId, path),
8442
- choose: (appId) => {
8443
- controller.choose(appId);
8444
- },
8445
- iconUrl: (appId) => `${OPEN_IN_APP_ICON_URL_PREFIX}/${appId}`,
8446
- t: deps.t
8544
+ toast,
8545
+ adapter: {
8546
+ useOpenInAppApps: bindSnapshot(controller.apps),
8547
+ useOpenInAppChoice: bindSnapshot(controller.choice),
8548
+ useOpenInAppLaunch: bindSnapshot(controller.operation),
8549
+ useShortcuts: bindSnapshot(deps.shortcuts ?? NO_SHORTCUTS),
8550
+ launch: (appId, path) => controller.launch(appId, path),
8551
+ report: toast.report,
8552
+ choose: (appId) => {
8553
+ controller.choose(appId);
8554
+ },
8555
+ iconUrl: (appId) => `${OPEN_IN_APP_ICON_URL_PREFIX}/${appId}`,
8556
+ t: deps.t
8557
+ }
8447
8558
  };
8448
8559
  }
8449
8560
  //#endregion
@@ -9747,6 +9858,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9747
9858
  t: ctx.locale.bind(NS),
9748
9859
  shortcuts: readService(ctx, "shortcuts")?.catalog
9749
9860
  });
9861
+ if (openInApp !== void 0) {
9862
+ const { toast } = openInApp;
9863
+ ctx.slots.inject("shell.overlay", () => ctx.slots.register({
9864
+ name: "shell.overlay",
9865
+ id: "multi-root-open-in-app.toast",
9866
+ locale: NS,
9867
+ inject: () => ({
9868
+ hooks: toast.hooks,
9869
+ dismiss: toast.dismiss
9870
+ })
9871
+ }, OpenInAppToast));
9872
+ }
9750
9873
  const filesTreeSeats = createFilesTreeSeats(ctx);
9751
9874
  const filesTreeT = ctx.locale.bind(NS$1);
9752
9875
  ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
@@ -9790,7 +9913,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
9790
9913
  sessionId: paneSessionId,
9791
9914
  subscribeSession,
9792
9915
  t,
9793
- openInApp,
9916
+ openInApp: openInApp?.adapter,
9794
9917
  filesTree
9795
9918
  });
9796
9919
  }));