@senguoyun/dsh-arkme 0.1.32 → 0.1.33

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 (44) hide show
  1. package/README.md +24 -0
  2. package/lib/client.js +514 -1546
  3. package/lib/client.js.map +1 -1
  4. package/lib/extension-profile-restart-helper.js +17 -5
  5. package/lib/index.js +296 -11
  6. package/lib/persistent-extension.js +1 -1
  7. package/lib/{persistent-runtime-CFeIg6aw.js → persistent-runtime-DUqdJv8K.js} +28508 -1
  8. package/lib/types/client/ArkmeExtensionRecoveryNotice.d.ts +9 -0
  9. package/lib/types/client/ArkmeExtensionRecoveryNotice.d.ts.map +1 -0
  10. package/lib/types/client/ArkmeFooterAction.d.ts +1 -7
  11. package/lib/types/client/ArkmeFooterAction.d.ts.map +1 -1
  12. package/lib/types/client/ArkmeFooterDropdown.d.ts.map +1 -1
  13. package/lib/types/client/ArkmeMarketplace.d.ts +2 -1
  14. package/lib/types/client/ArkmeMarketplace.d.ts.map +1 -1
  15. package/lib/types/client/ArkmePersistentShell.d.ts.map +1 -1
  16. package/lib/types/client/ArkmeProductNavigation.d.ts.map +1 -1
  17. package/lib/types/client/ArkmeSettingsSurface.d.ts +4 -19
  18. package/lib/types/client/ArkmeSettingsSurface.d.ts.map +1 -1
  19. package/lib/types/client/ArkmeSidebar.d.ts.map +1 -1
  20. package/lib/types/client/ArkmeUpdateSurfaces.d.ts +38 -5
  21. package/lib/types/client/ArkmeUpdateSurfaces.d.ts.map +1 -1
  22. package/lib/types/client/api.d.ts +1 -1
  23. package/lib/types/client/api.d.ts.map +1 -1
  24. package/lib/types/client/desktop-quarantine-status.d.ts +3 -0
  25. package/lib/types/client/desktop-quarantine-status.d.ts.map +1 -0
  26. package/lib/types/client/index.d.ts +0 -2
  27. package/lib/types/client/index.d.ts.map +1 -1
  28. package/lib/types/client/update-presentation.d.ts +1 -1
  29. package/lib/types/client/update-presentation.d.ts.map +1 -1
  30. package/lib/types/client/update-ui-controller.d.ts +1 -1
  31. package/lib/types/client/update-ui-controller.d.ts.map +1 -1
  32. package/lib/types/extensions/desktop-quarantine.d.ts +79 -0
  33. package/lib/types/extensions/desktop-quarantine.d.ts.map +1 -0
  34. package/lib/types/extensions/profile-installer.d.ts +5 -0
  35. package/lib/types/extensions/profile-installer.d.ts.map +1 -1
  36. package/lib/types/extensions/profile-restart-helper.d.ts +3 -1
  37. package/lib/types/extensions/profile-restart-helper.d.ts.map +1 -1
  38. package/lib/types/host-api.d.ts +3 -1
  39. package/lib/types/host-api.d.ts.map +1 -1
  40. package/lib/types/index.d.ts +1 -0
  41. package/lib/types/index.d.ts.map +1 -1
  42. package/lib/types/types.d.ts +1 -1
  43. package/lib/types/types.d.ts.map +1 -1
  44. package/package.json +6 -5
package/lib/client.js CHANGED
@@ -5024,6 +5024,9 @@ window.__ModuleLoader__.load({
5024
5024
  };
5025
5025
  qrcode.stringToBytes;
5026
5026
  //#endregion
5027
+ //#region package.json
5028
+ var version = "0.1.33";
5029
+ //#endregion
5027
5030
  //#region src/client/arkme-billing.ts
5028
5031
  function createBillingClientRequestId(source = globalThis.crypto) {
5029
5032
  if (typeof source?.randomUUID === "function") return source.randomUUID().toLowerCase();
@@ -6603,995 +6606,6 @@ window.__ModuleLoader__.load({
6603
6606
  return equivalent.length === 1 ? equivalent[0] : void 0;
6604
6607
  }
6605
6608
  //#endregion
6606
- //#region src/plugin-update-policy.ts
6607
- const PLUGIN_UPDATE_TERMINAL_STATE_TTL_MS = 10 * 6e4;
6608
- //#endregion
6609
- //#region node_modules/semver/internal/debug.js
6610
- var require_debug = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6611
- module.exports = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
6612
- }));
6613
- //#endregion
6614
- //#region node_modules/semver/internal/constants.js
6615
- var require_constants = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6616
- const SEMVER_SPEC_VERSION = "2.0.0";
6617
- const MAX_LENGTH = 256;
6618
- const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
6619
- module.exports = {
6620
- MAX_LENGTH,
6621
- MAX_SAFE_COMPONENT_LENGTH: 16,
6622
- MAX_SAFE_BUILD_LENGTH: MAX_LENGTH - 6,
6623
- MAX_SAFE_INTEGER,
6624
- RELEASE_TYPES: [
6625
- "major",
6626
- "premajor",
6627
- "minor",
6628
- "preminor",
6629
- "patch",
6630
- "prepatch",
6631
- "prerelease"
6632
- ],
6633
- SEMVER_SPEC_VERSION,
6634
- FLAG_INCLUDE_PRERELEASE: 1,
6635
- FLAG_LOOSE: 2
6636
- };
6637
- }));
6638
- //#endregion
6639
- //#region node_modules/semver/internal/re.js
6640
- var require_re = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6641
- const { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_LENGTH } = require_constants();
6642
- const debug = require_debug();
6643
- exports = module.exports = {};
6644
- const re = exports.re = [];
6645
- const safeRe = exports.safeRe = [];
6646
- const src = exports.src = [];
6647
- const safeSrc = exports.safeSrc = [];
6648
- const t = exports.t = {};
6649
- let R = 0;
6650
- const LETTERDASHNUMBER = "[a-zA-Z0-9-]";
6651
- const safeRegexReplacements = [
6652
- ["\\s", 1],
6653
- ["\\d", MAX_LENGTH],
6654
- [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
6655
- ];
6656
- const makeSafeRegex = (value) => {
6657
- for (const [token, max] of safeRegexReplacements) value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
6658
- return value;
6659
- };
6660
- const createToken = (name, value, isGlobal) => {
6661
- const safe = makeSafeRegex(value);
6662
- const index = R++;
6663
- debug(name, index, value);
6664
- t[name] = index;
6665
- src[index] = value;
6666
- safeSrc[index] = safe;
6667
- re[index] = new RegExp(value, isGlobal ? "g" : void 0);
6668
- safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0);
6669
- };
6670
- createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
6671
- createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
6672
- createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
6673
- createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);
6674
- createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);
6675
- createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
6676
- createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
6677
- createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
6678
- createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
6679
- createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
6680
- createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
6681
- createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
6682
- createToken("FULL", `^${src[t.FULLPLAIN]}$`);
6683
- createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
6684
- createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
6685
- createToken("GTLT", "((?:<|>)?=?)");
6686
- createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
6687
- createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
6688
- createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);
6689
- createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);
6690
- createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
6691
- createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
6692
- createToken("COERCEPLAIN", `(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
6693
- createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
6694
- createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);
6695
- createToken("COERCERTL", src[t.COERCE], true);
6696
- createToken("COERCERTLFULL", src[t.COERCEFULL], true);
6697
- createToken("LONETILDE", "(?:~>?)");
6698
- createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
6699
- exports.tildeTrimReplace = "$1~";
6700
- createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
6701
- createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
6702
- createToken("LONECARET", "(?:\\^)");
6703
- createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
6704
- exports.caretTrimReplace = "$1^";
6705
- createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
6706
- createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
6707
- createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
6708
- createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
6709
- createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
6710
- exports.comparatorTrimReplace = "$1$2$3";
6711
- createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);
6712
- createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);
6713
- createToken("STAR", "(<|>)?=?\\s*\\*");
6714
- createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
6715
- createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
6716
- }));
6717
- //#endregion
6718
- //#region node_modules/semver/internal/parse-options.js
6719
- var require_parse_options = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6720
- const looseOption = Object.freeze({ loose: true });
6721
- const emptyOpts = Object.freeze({});
6722
- const parseOptions = (options) => {
6723
- if (!options) return emptyOpts;
6724
- if (typeof options !== "object") return looseOption;
6725
- return options;
6726
- };
6727
- module.exports = parseOptions;
6728
- }));
6729
- //#endregion
6730
- //#region node_modules/semver/internal/identifiers.js
6731
- var require_identifiers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6732
- const numeric = /^[0-9]+$/;
6733
- const compareIdentifiers = (a, b) => {
6734
- if (typeof a === "number" && typeof b === "number") return a === b ? 0 : a < b ? -1 : 1;
6735
- const anum = numeric.test(a);
6736
- const bnum = numeric.test(b);
6737
- if (anum && bnum) {
6738
- a = +a;
6739
- b = +b;
6740
- }
6741
- return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
6742
- };
6743
- const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
6744
- module.exports = {
6745
- compareIdentifiers,
6746
- rcompareIdentifiers
6747
- };
6748
- }));
6749
- //#endregion
6750
- //#region node_modules/semver/classes/semver.js
6751
- var require_semver = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6752
- const debug = require_debug();
6753
- const { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
6754
- const { safeRe: re, t } = require_re();
6755
- const parseOptions = require_parse_options();
6756
- const { compareIdentifiers } = require_identifiers();
6757
- const isPrereleaseIdentifier = (prerelease, identifier) => {
6758
- const identifiers = identifier.split(".");
6759
- if (identifiers.length > prerelease.length) return false;
6760
- for (let i = 0; i < identifiers.length; i++) if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) return false;
6761
- return true;
6762
- };
6763
- module.exports = class SemVer {
6764
- constructor(version, options) {
6765
- options = parseOptions(options);
6766
- if (version instanceof SemVer) if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) return version;
6767
- else version = version.version;
6768
- else if (typeof version !== "string") throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
6769
- if (version.length > MAX_LENGTH) throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
6770
- debug("SemVer", version, options);
6771
- this.options = options;
6772
- this.loose = !!options.loose;
6773
- this.includePrerelease = !!options.includePrerelease;
6774
- const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
6775
- if (!m) throw new TypeError(`Invalid Version: ${version}`);
6776
- this.raw = version;
6777
- this.major = +m[1];
6778
- this.minor = +m[2];
6779
- this.patch = +m[3];
6780
- if (this.major > MAX_SAFE_INTEGER || this.major < 0) throw new TypeError("Invalid major version");
6781
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) throw new TypeError("Invalid minor version");
6782
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) throw new TypeError("Invalid patch version");
6783
- if (!m[4]) this.prerelease = [];
6784
- else this.prerelease = m[4].split(".").map((id) => {
6785
- if (/^[0-9]+$/.test(id)) {
6786
- const num = +id;
6787
- if (num >= 0 && num < MAX_SAFE_INTEGER) return num;
6788
- }
6789
- return id;
6790
- });
6791
- this.build = m[5] ? m[5].split(".") : [];
6792
- this.format();
6793
- }
6794
- format() {
6795
- this.version = `${this.major}.${this.minor}.${this.patch}`;
6796
- if (this.prerelease.length) this.version += `-${this.prerelease.join(".")}`;
6797
- return this.version;
6798
- }
6799
- toString() {
6800
- return this.version;
6801
- }
6802
- compare(other) {
6803
- debug("SemVer.compare", this.version, this.options, other);
6804
- if (!(other instanceof SemVer)) {
6805
- if (typeof other === "string" && other === this.version) return 0;
6806
- other = new SemVer(other, this.options);
6807
- }
6808
- if (other.version === this.version) return 0;
6809
- return this.compareMain(other) || this.comparePre(other);
6810
- }
6811
- compareMain(other) {
6812
- if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
6813
- if (this.major < other.major) return -1;
6814
- if (this.major > other.major) return 1;
6815
- if (this.minor < other.minor) return -1;
6816
- if (this.minor > other.minor) return 1;
6817
- if (this.patch < other.patch) return -1;
6818
- if (this.patch > other.patch) return 1;
6819
- return 0;
6820
- }
6821
- comparePre(other) {
6822
- if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
6823
- if (this.prerelease.length && !other.prerelease.length) return -1;
6824
- else if (!this.prerelease.length && other.prerelease.length) return 1;
6825
- else if (!this.prerelease.length && !other.prerelease.length) return 0;
6826
- let i = 0;
6827
- do {
6828
- const a = this.prerelease[i];
6829
- const b = other.prerelease[i];
6830
- debug("prerelease compare", i, a, b);
6831
- if (a === void 0 && b === void 0) return 0;
6832
- else if (b === void 0) return 1;
6833
- else if (a === void 0) return -1;
6834
- else if (a === b) continue;
6835
- else return compareIdentifiers(a, b);
6836
- } while (++i);
6837
- }
6838
- compareBuild(other) {
6839
- if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
6840
- let i = 0;
6841
- do {
6842
- const a = this.build[i];
6843
- const b = other.build[i];
6844
- debug("build compare", i, a, b);
6845
- if (a === void 0 && b === void 0) return 0;
6846
- else if (b === void 0) return 1;
6847
- else if (a === void 0) return -1;
6848
- else if (a === b) continue;
6849
- else return compareIdentifiers(a, b);
6850
- } while (++i);
6851
- }
6852
- inc(release, identifier, identifierBase) {
6853
- if (release.startsWith("pre")) {
6854
- if (!identifier && identifierBase === false) throw new Error("invalid increment argument: identifier is empty");
6855
- if (identifier) {
6856
- const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
6857
- if (!match || match[1] !== identifier) throw new Error(`invalid identifier: ${identifier}`);
6858
- }
6859
- }
6860
- switch (release) {
6861
- case "premajor":
6862
- this.prerelease.length = 0;
6863
- this.patch = 0;
6864
- this.minor = 0;
6865
- this.major++;
6866
- this.inc("pre", identifier, identifierBase);
6867
- break;
6868
- case "preminor":
6869
- this.prerelease.length = 0;
6870
- this.patch = 0;
6871
- this.minor++;
6872
- this.inc("pre", identifier, identifierBase);
6873
- break;
6874
- case "prepatch":
6875
- this.prerelease.length = 0;
6876
- this.inc("patch", identifier, identifierBase);
6877
- this.inc("pre", identifier, identifierBase);
6878
- break;
6879
- case "prerelease":
6880
- if (this.prerelease.length === 0) this.inc("patch", identifier, identifierBase);
6881
- this.inc("pre", identifier, identifierBase);
6882
- break;
6883
- case "release":
6884
- if (this.prerelease.length === 0) throw new Error(`version ${this.raw} is not a prerelease`);
6885
- this.prerelease.length = 0;
6886
- break;
6887
- case "major":
6888
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) this.major++;
6889
- this.minor = 0;
6890
- this.patch = 0;
6891
- this.prerelease = [];
6892
- break;
6893
- case "minor":
6894
- if (this.patch !== 0 || this.prerelease.length === 0) this.minor++;
6895
- this.patch = 0;
6896
- this.prerelease = [];
6897
- break;
6898
- case "patch":
6899
- if (this.prerelease.length === 0) this.patch++;
6900
- this.prerelease = [];
6901
- break;
6902
- case "pre": {
6903
- const base = Number(identifierBase) ? 1 : 0;
6904
- if (this.prerelease.length === 0) this.prerelease = [base];
6905
- else {
6906
- let i = this.prerelease.length;
6907
- while (--i >= 0) if (typeof this.prerelease[i] === "number") {
6908
- this.prerelease[i]++;
6909
- i = -2;
6910
- }
6911
- if (i === -1) {
6912
- if (identifier === this.prerelease.join(".") && identifierBase === false) throw new Error("invalid increment argument: identifier already exists");
6913
- this.prerelease.push(base);
6914
- }
6915
- }
6916
- if (identifier) {
6917
- let prerelease = [identifier, base];
6918
- if (identifierBase === false) prerelease = [identifier];
6919
- if (isPrereleaseIdentifier(this.prerelease, identifier)) {
6920
- const prereleaseBase = this.prerelease[identifier.split(".").length];
6921
- if (isNaN(prereleaseBase)) this.prerelease = prerelease;
6922
- } else this.prerelease = prerelease;
6923
- }
6924
- break;
6925
- }
6926
- default: throw new Error(`invalid increment argument: ${release}`);
6927
- }
6928
- this.raw = this.format();
6929
- if (this.build.length) this.raw += `+${this.build.join(".")}`;
6930
- return this;
6931
- }
6932
- };
6933
- }));
6934
- //#endregion
6935
- //#region node_modules/semver/functions/compare.js
6936
- var require_compare = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6937
- const SemVer = require_semver();
6938
- const compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
6939
- module.exports = compare;
6940
- }));
6941
- //#endregion
6942
- //#region node_modules/semver/functions/gte.js
6943
- var require_gte = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6944
- const compare = require_compare();
6945
- const gte = (a, b, loose) => compare(a, b, loose) >= 0;
6946
- module.exports = gte;
6947
- }));
6948
- //#endregion
6949
- //#region node_modules/semver/functions/parse.js
6950
- var require_parse = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6951
- const SemVer = require_semver();
6952
- const parse = (version, options, throwErrors = false) => {
6953
- if (version instanceof SemVer) return version;
6954
- try {
6955
- return new SemVer(version, options);
6956
- } catch (er) {
6957
- if (!throwErrors) return null;
6958
- throw er;
6959
- }
6960
- };
6961
- module.exports = parse;
6962
- }));
6963
- //#endregion
6964
- //#region node_modules/semver/functions/valid.js
6965
- var require_valid = /* @__PURE__ */ __commonJSMin(((exports, module) => {
6966
- const parse = require_parse();
6967
- const valid = (version, options) => {
6968
- const v = parse(version, options);
6969
- return v ? v.version : null;
6970
- };
6971
- module.exports = valid;
6972
- }));
6973
- //#endregion
6974
- //#region src/client/plugin-update-store.ts
6975
- var import_gte = /* @__PURE__ */ __toESM(require_gte(), 1);
6976
- var import_valid = /* @__PURE__ */ __toESM(require_valid(), 1);
6977
- const POLL_INTERVAL_MS = 30 * 6e4;
6978
- const FOLLOW_UP_DELAY_MS = 2e3;
6979
- const MAX_STARTUP_FOLLOW_UPS = 3;
6980
- const INSTALL_POLL_INTERVAL_MS = 1e3;
6981
- const INSTALL_MONITOR_TIMEOUT_MS = 12e4;
6982
- const STALLED_INSTALL_POLL_INTERVAL_MS = 1e4;
6983
- const STATUS_TIMEOUT_MS = 15e3;
6984
- const TERMINAL_INSTALL_PHASES = /* @__PURE__ */ new Set([
6985
- "succeeded",
6986
- "failed",
6987
- "rolled-back"
6988
- ]);
6989
- const ACTIVE_INSTALL_PHASES$1 = [
6990
- "preparing",
6991
- "downloading",
6992
- "verifying",
6993
- "installing",
6994
- "restarting"
6995
- ];
6996
- function isOlderInstall(next, current) {
6997
- if (current === void 0) return false;
6998
- if (next.updatedAtMillis < current.updatedAtMillis) return true;
6999
- return next.jobId === current.jobId && ACTIVE_INSTALL_PHASES$1.includes(next.phase) && (TERMINAL_INSTALL_PHASES.has(current.phase) || ACTIVE_INSTALL_PHASES$1.indexOf(next.phase) < ACTIVE_INSTALL_PHASES$1.indexOf(current.phase));
7000
- }
7001
- var ArkmePluginUpdateStore = class {
7002
- listeners = /* @__PURE__ */ new Set();
7003
- call;
7004
- snapshot = {
7005
- checked: false,
7006
- busy: false,
7007
- error: "",
7008
- installError: ""
7009
- };
7010
- pending;
7011
- pendingInstall;
7012
- pendingStatusCheck;
7013
- cancelQueries = /* @__PURE__ */ new Set();
7014
- requestedTargetVersion;
7015
- installStatusFailures = 0;
7016
- interval;
7017
- followUp;
7018
- installPoll;
7019
- installMonitor;
7020
- installMonitorDeadline = 0;
7021
- installProgressKey = "";
7022
- installRevision = 0;
7023
- installReadSequence = 0;
7024
- lifecycleRevision = 0;
7025
- stopped = false;
7026
- pendingPreviousJobId;
7027
- followUpCount = 0;
7028
- running = false;
7029
- onVisibilityChange = () => {
7030
- if (typeof document !== "undefined" && document.visibilityState === "visible") {
7031
- this.followUpCount = 0;
7032
- this.installStatusFailures = 0;
7033
- this.refresh(true);
7034
- this.refreshInstallStatus();
7035
- }
7036
- };
7037
- constructor(call = callArkme) {
7038
- this.call = call;
7039
- }
7040
- subscribe = (listener) => {
7041
- this.listeners.add(listener);
7042
- return () => this.listeners.delete(listener);
7043
- };
7044
- getSnapshot = () => this.snapshot;
7045
- start() {
7046
- if (this.running) return () => void 0;
7047
- this.stopped = false;
7048
- this.running = true;
7049
- this.followUpCount = 0;
7050
- this.installStatusFailures = 0;
7051
- this.refresh(true);
7052
- this.refreshInstallStatus(false);
7053
- this.interval = setInterval(() => {
7054
- this.refresh();
7055
- }, POLL_INTERVAL_MS);
7056
- if (typeof document !== "undefined") document.addEventListener("visibilitychange", this.onVisibilityChange);
7057
- return () => this.stop();
7058
- }
7059
- stop() {
7060
- const wasRunning = this.running;
7061
- this.running = false;
7062
- this.stopped = true;
7063
- this.lifecycleRevision += 1;
7064
- this.installRevision += 1;
7065
- this.installReadSequence += 1;
7066
- this.resetInstallMonitor();
7067
- this.pending = void 0;
7068
- this.pendingInstall = void 0;
7069
- this.pendingStatusCheck = void 0;
7070
- for (const cancel of this.cancelQueries) cancel();
7071
- this.snapshot = {
7072
- ...this.snapshot,
7073
- busy: false,
7074
- installPending: false,
7075
- installStatusChecking: false,
7076
- installWarning: ""
7077
- };
7078
- if (this.interval !== void 0) clearInterval(this.interval);
7079
- if (this.followUp !== void 0) clearTimeout(this.followUp);
7080
- if (this.installPoll !== void 0) clearTimeout(this.installPoll);
7081
- this.interval = void 0;
7082
- this.followUp = void 0;
7083
- this.installPoll = void 0;
7084
- if (wasRunning && typeof document !== "undefined") document.removeEventListener("visibilitychange", this.onVisibilityChange);
7085
- }
7086
- async refresh(manual = false) {
7087
- if (this.pending !== void 0) return await this.pending;
7088
- const lifecycle = this.lifecycleRevision;
7089
- this.setSnapshot({
7090
- ...this.snapshot,
7091
- busy: manual || this.snapshot.installPending === true,
7092
- error: ""
7093
- });
7094
- const task = this.query(manual ? "plugin.update.check" : "plugin.update.status").then((status) => {
7095
- if (lifecycle !== this.lifecycleRevision) return void 0;
7096
- const previousVersion = this.snapshot.status?.installedVersion;
7097
- const reconciled = this.reconcileRunningVersion(status);
7098
- this.setSnapshot({
7099
- ...this.snapshot,
7100
- checked: true,
7101
- busy: this.snapshot.installPending === true,
7102
- status,
7103
- error: ""
7104
- });
7105
- this.scheduleFollowUp(status);
7106
- if (reconciled && previousVersion !== void 0 && status.installedVersion !== previousVersion && typeof location !== "undefined") location.reload();
7107
- return status;
7108
- }).catch((error) => {
7109
- if (lifecycle !== this.lifecycleRevision) return void 0;
7110
- const message = error instanceof Error ? error.message : String(error);
7111
- this.setSnapshot({
7112
- ...this.snapshot,
7113
- checked: true,
7114
- busy: this.snapshot.installPending === true,
7115
- error: message
7116
- });
7117
- }).finally(() => {
7118
- if (this.pending === task) this.pending = void 0;
7119
- });
7120
- this.pending = task;
7121
- return await task;
7122
- }
7123
- async acknowledge(snoozeHours = 24) {
7124
- if (this.pending !== void 0) await this.pending;
7125
- this.setSnapshot({
7126
- ...this.snapshot,
7127
- busy: true,
7128
- error: ""
7129
- });
7130
- try {
7131
- const status = await this.call("plugin.update.acknowledge", { snoozeHours });
7132
- this.setSnapshot({
7133
- ...this.snapshot,
7134
- checked: true,
7135
- busy: this.snapshot.installPending === true,
7136
- status,
7137
- error: ""
7138
- });
7139
- return status;
7140
- } catch (error) {
7141
- const message = error instanceof Error ? error.message : String(error);
7142
- this.setSnapshot({
7143
- ...this.snapshot,
7144
- checked: true,
7145
- busy: this.snapshot.installPending === true,
7146
- error: message
7147
- });
7148
- return;
7149
- }
7150
- }
7151
- async install() {
7152
- if (this.pendingInstall !== void 0) return await this.pendingInstall;
7153
- if (this.snapshot.install !== void 0 && ACTIVE_INSTALL_PHASES$1.includes(this.snapshot.install.phase)) return this.snapshot.install;
7154
- if (this.snapshot.installStatusError) return void 0;
7155
- const revision = ++this.installRevision;
7156
- this.installReadSequence += 1;
7157
- this.pendingPreviousJobId = this.snapshot.install?.jobId;
7158
- this.requestedTargetVersion = this.snapshot.status?.latestVersion ?? this.snapshot.install?.targetVersion;
7159
- if (this.installPoll !== void 0) clearTimeout(this.installPoll);
7160
- this.installPoll = void 0;
7161
- this.monitorInstallProgress("pending");
7162
- const task = Promise.resolve().then(async () => {
7163
- if (revision !== this.installRevision) return void 0;
7164
- try {
7165
- const install = await this.call("plugin.update.install");
7166
- if (revision !== this.installRevision) return void 0;
7167
- this.installReadSequence += 1;
7168
- const current = install.jobId === this.snapshot.install?.jobId && isOlderInstall(install, this.snapshot.install) ? this.snapshot.install : install;
7169
- this.requestedTargetVersion = current.targetVersion;
7170
- this.monitorInstall(current);
7171
- this.setSnapshot({
7172
- ...this.snapshot,
7173
- busy: this.pending !== void 0,
7174
- installPending: false,
7175
- install: current,
7176
- installError: ""
7177
- });
7178
- this.scheduleInstallPoll();
7179
- return install;
7180
- } catch (error) {
7181
- if (revision !== this.installRevision) return void 0;
7182
- this.installReadSequence += 1;
7183
- const observed = this.snapshot.install;
7184
- if (observed !== void 0 && observed.jobId !== this.pendingPreviousJobId) {
7185
- this.monitorInstall(observed);
7186
- this.setSnapshot({
7187
- ...this.snapshot,
7188
- busy: this.pending !== void 0,
7189
- installPending: false,
7190
- installError: ""
7191
- });
7192
- this.scheduleInstallPoll();
7193
- return observed;
7194
- }
7195
- this.resetInstallMonitor();
7196
- const message = error instanceof Error ? error.message : String(error);
7197
- this.setSnapshot({
7198
- ...this.snapshot,
7199
- busy: this.pending !== void 0,
7200
- installPending: false,
7201
- installWarning: "",
7202
- installError: message
7203
- });
7204
- return;
7205
- }
7206
- }).finally(() => {
7207
- if (this.pendingInstall === task) this.pendingInstall = void 0;
7208
- });
7209
- this.pendingInstall = task;
7210
- this.setSnapshot({
7211
- ...this.snapshot,
7212
- busy: true,
7213
- installPending: true,
7214
- installError: "",
7215
- installWarning: ""
7216
- });
7217
- this.scheduleInstallPoll();
7218
- return await task;
7219
- }
7220
- /** Recovery checks are read-only, bounded and shared across all UI entries. */
7221
- async checkInstallStatus() {
7222
- if (this.pendingStatusCheck !== void 0) return await this.pendingStatusCheck;
7223
- const lifecycle = this.lifecycleRevision;
7224
- this.installStatusFailures = 0;
7225
- const task = Promise.resolve().then(async () => {
7226
- if (lifecycle !== this.lifecycleRevision) return;
7227
- await this.refreshInstallStatus();
7228
- if (lifecycle !== this.lifecycleRevision) return;
7229
- await this.refresh(true);
7230
- }).finally(() => {
7231
- if (this.pendingStatusCheck !== task) return;
7232
- this.pendingStatusCheck = void 0;
7233
- this.setSnapshot({
7234
- ...this.snapshot,
7235
- installStatusChecking: false,
7236
- installStatusFeedback: this.snapshot.installStatusError ? "暂时无法连接更新服务,请稍后再检查。" : this.snapshot.installWarning ? "已检查,暂未收到新的更新结果。可稍后再检查。" : ""
7237
- });
7238
- });
7239
- this.pendingStatusCheck = task;
7240
- this.setSnapshot({
7241
- ...this.snapshot,
7242
- installStatusChecking: true,
7243
- installStatusFeedback: ""
7244
- });
7245
- return await task;
7246
- }
7247
- async refreshInstallStatus(reloadOnSuccess = true) {
7248
- const revision = this.installRevision;
7249
- const sequence = ++this.installReadSequence;
7250
- const isCurrent = () => revision === this.installRevision && sequence === this.installReadSequence;
7251
- try {
7252
- const install = await this.query("plugin.update.install-status");
7253
- if (!isCurrent()) return void 0;
7254
- this.installStatusFailures = 0;
7255
- this.setSnapshot({
7256
- ...this.snapshot,
7257
- installStatusError: "",
7258
- installStatusFeedback: ""
7259
- });
7260
- const olderTarget = install !== void 0 && this.requestedTargetVersion !== void 0 && (0, import_valid.default)(install.targetVersion) && (0, import_valid.default)(this.requestedTargetVersion) && !(0, import_gte.default)(install.targetVersion, this.requestedTargetVersion);
7261
- if (this.snapshot.installPending && (install === void 0 || install.jobId === this.pendingPreviousJobId || olderTarget)) {
7262
- await this.refresh();
7263
- if (!isCurrent()) return void 0;
7264
- this.scheduleInstallPoll();
7265
- return;
7266
- }
7267
- if (install !== void 0) {
7268
- if ((!this.snapshot.installPending || install.jobId === this.pendingPreviousJobId) && isOlderInstall(install, this.snapshot.install)) {
7269
- this.scheduleInstallPoll();
7270
- return;
7271
- }
7272
- this.monitorInstall(install);
7273
- this.requestedTargetVersion = install.targetVersion;
7274
- if (this.snapshot.status !== void 0 && this.reconcileRunningVersion(this.snapshot.status)) {
7275
- this.setSnapshot({
7276
- ...this.snapshot,
7277
- busy: this.pending !== void 0
7278
- });
7279
- return;
7280
- }
7281
- if (TERMINAL_INSTALL_PHASES.has(install.phase)) this.releaseInstallCommand();
7282
- this.setSnapshot({
7283
- ...this.snapshot,
7284
- install,
7285
- installPending: false,
7286
- busy: this.pending !== void 0,
7287
- installError: ""
7288
- });
7289
- if (install.phase === "succeeded" && reloadOnSuccess && typeof location !== "undefined") {
7290
- location.reload();
7291
- return install;
7292
- }
7293
- if (TERMINAL_INSTALL_PHASES.has(install.phase)) {
7294
- const expiresIn = PLUGIN_UPDATE_TERMINAL_STATE_TTL_MS - (Date.now() - install.updatedAtMillis);
7295
- this.scheduleInstallPoll(Math.max(1, expiresIn + 1));
7296
- } else this.scheduleInstallPoll();
7297
- } else if (this.snapshot.install !== void 0) {
7298
- const { install: previousInstall, ...snapshot } = this.snapshot;
7299
- const previousVersion = snapshot.status?.installedVersion;
7300
- this.resetInstallMonitor();
7301
- this.setSnapshot({
7302
- ...snapshot,
7303
- installError: "",
7304
- installWarning: ""
7305
- });
7306
- if (!TERMINAL_INSTALL_PHASES.has(previousInstall.phase) && previousInstall.phase !== "idle") {
7307
- if (this.pending !== void 0) await this.pending;
7308
- if (!isCurrent()) return void 0;
7309
- const status = await this.refresh();
7310
- if (isCurrent() && reloadOnSuccess && previousVersion !== void 0 && status !== void 0 && status.installedVersion !== previousVersion && typeof location !== "undefined") location.reload();
7311
- }
7312
- } else if (this.requestedTargetVersion !== void 0) await this.refresh();
7313
- return install;
7314
- } catch {
7315
- if (!isCurrent()) return void 0;
7316
- this.installStatusFailures += 1;
7317
- this.setSnapshot({
7318
- ...this.snapshot,
7319
- installStatusError: "暂时无法获取更新状态,请检查状态后再更新。"
7320
- });
7321
- if (this.installMonitorDeadline > 0) {
7322
- const previousVersion = this.snapshot.status?.installedVersion;
7323
- const status = await this.refresh();
7324
- if (!isCurrent()) return void 0;
7325
- if (reloadOnSuccess && previousVersion !== void 0 && status !== void 0 && status.installedVersion !== previousVersion && typeof location !== "undefined") {
7326
- location.reload();
7327
- return;
7328
- }
7329
- this.scheduleInstallPoll();
7330
- } else if (this.installStatusFailures <= MAX_STARTUP_FOLLOW_UPS) this.scheduleInstallPoll(FOLLOW_UP_DELAY_MS * 2 ** (this.installStatusFailures - 1));
7331
- return;
7332
- }
7333
- }
7334
- releaseInstallCommand() {
7335
- this.installRevision += 1;
7336
- this.pendingInstall = void 0;
7337
- this.pendingPreviousJobId = void 0;
7338
- }
7339
- reconcileRunningVersion(status) {
7340
- const target = this.requestedTargetVersion ?? this.snapshot.install?.targetVersion;
7341
- if (!target || !(0, import_valid.default)(target) || !(0, import_valid.default)(status.installedVersion) || !(0, import_gte.default)(status.installedVersion, target)) return false;
7342
- this.releaseInstallCommand();
7343
- this.requestedTargetVersion = void 0;
7344
- this.resetInstallMonitor();
7345
- if (this.installPoll !== void 0) clearTimeout(this.installPoll);
7346
- this.installPoll = void 0;
7347
- const { install: _install, ...snapshot } = this.snapshot;
7348
- this.snapshot = {
7349
- ...snapshot,
7350
- installPending: false,
7351
- installError: "",
7352
- installWarning: "",
7353
- installStatusError: "",
7354
- installStatusFeedback: ""
7355
- };
7356
- return true;
7357
- }
7358
- async query(operation) {
7359
- const controller = new AbortController();
7360
- let cancel;
7361
- const timeout = new Promise((_, reject) => {
7362
- cancel = () => {
7363
- controller.abort();
7364
- reject(/* @__PURE__ */ new Error("更新状态查询超时"));
7365
- };
7366
- });
7367
- const timer = setTimeout(cancel, STATUS_TIMEOUT_MS);
7368
- this.cancelQueries.add(cancel);
7369
- try {
7370
- return await Promise.race([this.call(operation, void 0, controller.signal), timeout]);
7371
- } finally {
7372
- clearTimeout(timer);
7373
- this.cancelQueries.delete(cancel);
7374
- }
7375
- }
7376
- resetInstallMonitor() {
7377
- if (this.installMonitor !== void 0) clearTimeout(this.installMonitor);
7378
- this.installMonitor = void 0;
7379
- this.installMonitorDeadline = 0;
7380
- this.installProgressKey = "";
7381
- }
7382
- monitorInstall(install) {
7383
- if (!ACTIVE_INSTALL_PHASES$1.includes(install.phase)) {
7384
- this.resetInstallMonitor();
7385
- this.snapshot = {
7386
- ...this.snapshot,
7387
- installWarning: ""
7388
- };
7389
- return;
7390
- }
7391
- this.monitorInstallProgress(`${install.jobId}:${install.phase}:${install.updatedAtMillis}`);
7392
- }
7393
- monitorInstallProgress(key) {
7394
- if (key === this.installProgressKey) return;
7395
- this.resetInstallMonitor();
7396
- this.installProgressKey = key;
7397
- this.installMonitorDeadline = Date.now() + INSTALL_MONITOR_TIMEOUT_MS;
7398
- this.snapshot = {
7399
- ...this.snapshot,
7400
- installWarning: ""
7401
- };
7402
- this.installMonitor = setTimeout(() => {
7403
- this.installMonitor = void 0;
7404
- this.setSnapshot({
7405
- ...this.snapshot,
7406
- installWarning: "更新长时间没有新进展,结果待确认。你可以继续使用,稍后检查状态。"
7407
- });
7408
- }, INSTALL_MONITOR_TIMEOUT_MS);
7409
- }
7410
- scheduleFollowUp(status) {
7411
- if (!this.running || this.followUpCount >= MAX_STARTUP_FOLLOW_UPS || !status.checking && !status.stale && status.availability !== "unknown") return;
7412
- if (this.followUp !== void 0) clearTimeout(this.followUp);
7413
- this.followUpCount += 1;
7414
- this.followUp = setTimeout(() => {
7415
- this.followUp = void 0;
7416
- this.refresh();
7417
- }, FOLLOW_UP_DELAY_MS);
7418
- }
7419
- setSnapshot(snapshot) {
7420
- this.snapshot = snapshot;
7421
- for (const listener of [...this.listeners]) listener();
7422
- }
7423
- scheduleInstallPoll(delayMs = this.snapshot.installWarning ? STALLED_INSTALL_POLL_INTERVAL_MS : INSTALL_POLL_INTERVAL_MS) {
7424
- if (this.stopped) return;
7425
- if (this.installPoll !== void 0) clearTimeout(this.installPoll);
7426
- this.installPoll = setTimeout(() => {
7427
- this.installPoll = void 0;
7428
- this.refreshInstallStatus();
7429
- }, delayMs);
7430
- }
7431
- };
7432
- const arkmePluginUpdateStore = new ArkmePluginUpdateStore();
7433
- //#endregion
7434
- //#region src/client/update-presentation.ts
7435
- var import_gt = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
7436
- const compare = require_compare();
7437
- const gt = (a, b, loose) => compare(a, b, loose) > 0;
7438
- module.exports = gt;
7439
- })))(), 1);
7440
- const ACTIVE_PLUGIN_PHASES = /* @__PURE__ */ new Set([
7441
- "preparing",
7442
- "downloading",
7443
- "verifying",
7444
- "installing",
7445
- "restarting"
7446
- ]);
7447
- function versionLabel$3(version) {
7448
- return version?.trim() || "…";
7449
- }
7450
- function formatBytes$1(value) {
7451
- if (value === void 0 || !Number.isFinite(value) || value <= 0) return void 0;
7452
- if (value < 1024) return `${Math.round(value)} B`;
7453
- if (value < 1024 * 1024) return `${(value / 1024).toFixed(1)} KB`;
7454
- return `${(value / (1024 * 1024)).toFixed(1)} MB`;
7455
- }
7456
- function appUpdateProgress(downloaded, total) {
7457
- if (total === void 0 || total <= 0) return void 0;
7458
- return Math.max(0, Math.min(100, Math.round((downloaded ?? 0) / total * 100)));
7459
- }
7460
- function pluginProgress(phase, busy) {
7461
- switch (phase) {
7462
- case "preparing": return 12;
7463
- case "downloading": return 36;
7464
- case "verifying": return 58;
7465
- case "installing": return 78;
7466
- case "restarting": return 94;
7467
- default: return busy ? 8 : void 0;
7468
- }
7469
- }
7470
- function pluginPhaseMessage(phase) {
7471
- switch (phase) {
7472
- case "preparing": return "正在准备更新";
7473
- case "downloading": return "正在下载更新包";
7474
- case "verifying": return "正在校验更新包";
7475
- case "installing": return "正在安装新版本";
7476
- case "restarting": return "完成后将自动返回新版本";
7477
- case "failed": return "更新未完成,请重试";
7478
- case "rolled-back": return "已恢复到更新前版本";
7479
- default: return;
7480
- }
7481
- }
7482
- function blockedReason$1(status) {
7483
- if (status.canInstallInApp) return void 0;
7484
- switch (status.installBlockedReason) {
7485
- case "local-install": return "当前为本地开发插件,不能在应用内覆盖更新。";
7486
- case "update-disabled": return "插件自动更新当前未启用。";
7487
- case "profile-unavailable": return "当前插件 Profile 不支持应用内更新。";
7488
- default: return "当前运行环境不支持应用内更新。";
7489
- }
7490
- }
7491
- function updateNotes(summary) {
7492
- return (summary?.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).slice(0, 3) ?? []).map((line) => {
7493
- const separator = line.search(/[::—–]/);
7494
- if (separator <= 0 || separator >= line.length - 1) return { title: line };
7495
- return {
7496
- title: line.slice(0, separator).trim(),
7497
- detail: line.slice(separator + 1).trim()
7498
- };
7499
- });
7500
- }
7501
- function appItem(snapshot) {
7502
- const status = snapshot.status;
7503
- if (status === void 0 || ![
7504
- "available",
7505
- "downloading",
7506
- "downloaded",
7507
- "failed"
7508
- ].includes(status.status)) return void 0;
7509
- const latestVersion = versionLabel$3(status.latestVersion);
7510
- const progress = appUpdateProgress(status.downloadedBytes, status.totalBytes);
7511
- const packageSize = formatBytes$1(status.totalBytes);
7512
- const failed = status.status === "failed";
7513
- const ready = status.status === "downloaded";
7514
- return {
7515
- target: "app",
7516
- instanceKey: `app:${latestVersion}`,
7517
- productLabel: "Arkme APP",
7518
- title: failed ? "更新未完成" : ready ? "安装包已下载" : "发现新版本",
7519
- currentVersion: versionLabel$3(status.currentVersion),
7520
- latestVersion,
7521
- ...packageSize === void 0 ? {} : { packageSize },
7522
- notes: updateNotes(status.releaseNotes),
7523
- available: status.status === "available",
7524
- active: status.status === "downloading",
7525
- ready,
7526
- restarting: false,
7527
- failed,
7528
- ...status.status === "downloading" ? {
7529
- phase: "app-downloading",
7530
- phaseMessage: "可继续使用"
7531
- } : {},
7532
- ...ready ? {
7533
- phase: "app-downloaded",
7534
- phaseMessage: `已下载 ${latestVersion}`
7535
- } : {},
7536
- ...failed ? {
7537
- phase: "app-failed",
7538
- phaseMessage: "请重新尝试下载"
7539
- } : {},
7540
- ...status.error?.trim() || snapshot.error.trim() ? { error: status.error?.trim() || snapshot.error.trim() } : {},
7541
- ...progress === void 0 ? {} : { progress }
7542
- };
7543
- }
7544
- function derivePluginUpdateItem(snapshot) {
7545
- const status = snapshot.status;
7546
- const installPending = snapshot.installPending === true;
7547
- const obsoleteActive = !installPending && snapshot.install !== void 0 && ACTIVE_PLUGIN_PHASES.has(snapshot.install.phase) && (0, import_valid.default)(status?.installedVersion) !== null && (0, import_valid.default)(snapshot.install.targetVersion) !== null && !(0, import_gt.default)(snapshot.install.targetVersion, status.installedVersion);
7548
- const installError = obsoleteActive ? "" : snapshot.installError.trim();
7549
- const completed = !installPending && snapshot.install?.phase === "succeeded" ? snapshot.install : void 0;
7550
- if (completed !== void 0 && installError === "" && !(status?.availability === "available" && (0, import_valid.default)(status.latestVersion) !== null && (0, import_valid.default)(completed.targetVersion) !== null && (0, import_gt.default)(status.latestVersion, completed.targetVersion))) return void 0;
7551
- const install = !installPending && !obsoleteActive && completed === void 0 ? snapshot.install : void 0;
7552
- if (status === void 0 && install === void 0 && !installPending && installError === "" && !snapshot.installStatusError) return void 0;
7553
- const active = install !== void 0 && ACTIVE_PLUGIN_PHASES.has(install.phase);
7554
- const uncertain = !obsoleteActive && (Boolean(snapshot.installWarning) && (active || installPending) || Boolean(snapshot.installStatusError) && !active && !installPending);
7555
- const failed = !uncertain && !installPending && (install?.phase === "failed" || install?.phase === "rolled-back" || installError !== "");
7556
- const activeDisplay = !failed && !uncertain && (active || installPending);
7557
- const available = status?.availability === "available" && !activeDisplay && !failed && !uncertain;
7558
- if (!available && !activeDisplay && !failed && !uncertain) return void 0;
7559
- const latestVersion = versionLabel$3(install?.targetVersion ?? status?.latestVersion ?? snapshot.install?.targetVersion);
7560
- const error = failed ? installError || install?.message : void 0;
7561
- const installBlockedReason = status === void 0 ? void 0 : blockedReason$1(status);
7562
- const progress = activeDisplay ? pluginProgress(install?.phase, installPending) : void 0;
7563
- return {
7564
- target: "plugin",
7565
- instanceKey: `plugin:${installPending ? `pending:${latestVersion}` : install?.jobId ?? latestVersion}`,
7566
- productLabel: "Arkme 核心插件",
7567
- title: uncertain ? "更新状态待确认" : failed ? "更新未完成" : "发现新版本",
7568
- currentVersion: versionLabel$3(status?.installedVersion ?? install?.previousVersion),
7569
- latestVersion,
7570
- notes: updateNotes(status?.summary),
7571
- available,
7572
- active: activeDisplay,
7573
- ready: false,
7574
- restarting: activeDisplay && install?.phase === "restarting",
7575
- failed,
7576
- uncertain,
7577
- checkingStatus: snapshot.installStatusChecking === true,
7578
- ...installBlockedReason === void 0 ? {} : { blockedReason: installBlockedReason },
7579
- ...error === void 0 || error === "" ? {} : { error },
7580
- ...install?.phase === void 0 ? {} : { phase: install.phase },
7581
- phaseMessage: uncertain ? snapshot.installStatusChecking ? "正在检查更新状态…" : snapshot.installStatusFeedback || snapshot.installWarning || snapshot.installStatusError || "请检查更新状态。" : installPending ? "正在准备更新" : error || install?.message || pluginPhaseMessage(install?.phase) || "正在准备更新",
7582
- ...progress === void 0 ? {} : { progress }
7583
- };
7584
- }
7585
- /** Pure UI projection over the existing APP and plugin update stores. */
7586
- function deriveArkmeUpdatePresentation(input) {
7587
- const items = [derivePluginUpdateItem(input.plugin), appItem(input.app)].filter((item) => item !== void 0);
7588
- const primary = items.find((item) => item.active) ?? items.find((item) => item.ready || item.failed || item.uncertain) ?? items.find((item) => item.available);
7589
- return {
7590
- items,
7591
- ...primary === void 0 ? {} : { primary }
7592
- };
7593
- }
7594
- //#endregion
7595
6609
  //#region src/client/redesign/contacts/contacts-tab-store.ts
7596
6610
  const DEFAULT_DIRECTORY_CACHE_MAX_AGE_MS = 3e4;
7597
6611
  const defaultExpandedSections = () => ({
@@ -8747,11 +7761,14 @@ window.__ModuleLoader__.load({
8747
7761
  const target = scrollOwner ?? surface;
8748
7762
  target.scrollTop = 0;
8749
7763
  }
8750
- function versionLabel$2(version) {
7764
+ function versionLabel$3(version) {
8751
7765
  return `v${version?.trim() || "…"}`;
8752
7766
  }
7767
+ function aboutArkmeVersion(currentVersion, scope = globalThis) {
7768
+ return versionLabel$3(scope.arkmeDesktop?.appVersion ?? currentVersion);
7769
+ }
8753
7770
  function aboutHarnessVersion(scope = globalThis) {
8754
- return versionLabel$2(scope.arkmeDesktop?.harnessVersion);
7771
+ return versionLabel$3(scope.arkmeDesktop?.harnessVersion);
8755
7772
  }
8756
7773
  function updateVersionText(current, latest) {
8757
7774
  if (current === "v…") return "当前版本读取中…";
@@ -8765,48 +7782,16 @@ window.__ModuleLoader__.load({
8765
7782
  const feedback = input.appError?.trim() ? `检查失败:${input.appError.trim()}` : status === "checking" ? "正在检查更新…" : status === "current" ? input.app?.noUpdateAvailable === true ? "已检查 · 暂无可用版本" : "已检查 · 当前已是最新版本" : status === "available" ? "发现新版本,可以下载更新包" : status === "downloading" ? "正在下载更新包" : status === "downloaded" ? "下载完成,可打开所在文件夹定位安装包" : status === "failed" ? `检查失败:${input.app?.error || "请稍后重试"}` : void 0;
8766
7783
  return {
8767
7784
  label: "APP",
8768
- current: versionLabel$2(input.app?.currentVersion),
8769
- latest: versionLabel$2(input.app?.latestVersion ?? input.app?.currentVersion),
7785
+ current: versionLabel$3(input.app?.currentVersion),
7786
+ latest: versionLabel$3(input.app?.latestVersion ?? input.app?.currentVersion),
8770
7787
  action: unavailable || busy ? "busy" : status === "downloaded" ? "open" : status === "available" ? "download" : "check",
8771
7788
  ...feedback === void 0 ? {} : { feedback },
8772
7789
  ...input.app?.downloadedFilePath === void 0 ? {} : { downloadedFilePath: input.app.downloadedFilePath }
8773
7790
  };
8774
7791
  }
8775
- function buildArkmePluginUpdateRow(input) {
8776
- if (input.snapshot !== void 0) {
8777
- const snapshot = input.snapshot;
8778
- const item = derivePluginUpdateItem(snapshot);
8779
- if (item?.active || item?.uncertain || item?.failed) return {
8780
- label: "核心插件",
8781
- current: item.currentVersion,
8782
- latest: item.latestVersion,
8783
- action: "view",
8784
- feedback: item.uncertain ? `${item.checkingStatus ? "正在检查更新状态…" : "更新状态待确认"} · 查看状态` : item.failed ? "更新未完成 · 查看结果" : `${item.phaseMessage} · 查看进度`
8785
- };
8786
- return buildArkmePluginUpdateRow({
8787
- ...snapshot.status === void 0 ? {} : { plugin: {
8788
- ...snapshot.status,
8789
- ...item === void 0 && snapshot.install?.phase === "succeeded" ? { availability: "current" } : {}
8790
- } },
8791
- pluginBusy: snapshot.busy || snapshot.installStatusChecking === true,
8792
- pluginError: snapshot.error
8793
- });
8794
- }
8795
- const pluginAvailable = input.plugin?.availability === "available";
8796
- const pluginBusy = input.pluginBusy === true || input.plugin?.checking === true;
8797
- const pluginFeedback = pluginBusy ? "正在检查更新…" : input.pluginError?.trim() ? `检查失败:${input.pluginError.trim()}` : input.plugin?.checkFailed === true ? "检查失败:请稍后重试" : input.plugin?.availability === "current" ? "已检查 · 当前已是最新版本" : input.plugin?.availability === "available" ? "发现新版本,可以立即更新" : void 0;
8798
- return {
8799
- label: "核心插件",
8800
- current: versionLabel$2(input.plugin?.installedVersion),
8801
- latest: versionLabel$2(input.plugin?.latestVersion),
8802
- action: pluginBusy ? "busy" : pluginAvailable ? "install" : "check",
8803
- ...pluginFeedback === void 0 ? {} : { feedback: pluginFeedback }
8804
- };
8805
- }
8806
7792
  function ArkmeSettingsSurface() {
8807
7793
  const surfaceRef = (0, react.useRef)(null);
8808
7794
  const authState = (0, react.useSyncExternalStore)(arkmeAuthStore.subscribe, arkmeAuthStore.getSnapshot, arkmeAuthStore.getSnapshot);
8809
- const updateState = (0, react.useSyncExternalStore)(arkmePluginUpdateStore.subscribe, arkmePluginUpdateStore.getSnapshot, arkmePluginUpdateStore.getSnapshot);
8810
7795
  const appUpdateState = (0, react.useSyncExternalStore)(arkmeAppUpdateStore.subscribe, arkmeAppUpdateStore.getSnapshot, arkmeAppUpdateStore.getSnapshot);
8811
7796
  const [profile, setProfile] = (0, react.useState)();
8812
7797
  const [clientConfig, setClientConfig] = (0, react.useState)();
@@ -8879,17 +7864,11 @@ window.__ModuleLoader__.load({
8879
7864
  const displayName = authenticated ? profile?.displayName.trim() || profile?.nickname.trim() || "我的账户" : bindingRequired ? "待完成登录" : authState.checked ? "当前未登录" : "我的账户";
8880
7865
  const accountDescription = authenticated ? profile?.arkmeId ? `即我号 ${profile.arkmeId}` : "即我号读取中…" : bindingRequired ? "请完成手机号绑定" : authState.checked ? "登录后显示账户信息" : "正在读取账户状态…";
8881
7866
  const notificationLabel = notificationPermission === "granted" ? "已开启" : notificationPermission === "denied" ? "已阻止" : notificationPermission === "default" ? "未开启" : "不可用";
8882
- const harnessVersion = aboutHarnessVersion();
8883
7867
  const appUpdateRow = buildArkmeAppUpdateRow({
8884
7868
  ...appUpdateState.status === void 0 ? {} : { app: appUpdateState.status },
8885
7869
  ...appUpdateState.error === "" ? {} : { appError: appUpdateState.error }
8886
7870
  });
8887
- const pluginUpdateRow = buildArkmePluginUpdateRow({ snapshot: updateState });
8888
- const runPluginUpdateAction = (row) => {
8889
- if (row.action === "busy") return;
8890
- if (row.action === "install" || row.action === "view") arkmeUpdateUi.open("plugin");
8891
- else arkmePluginUpdateStore.checkInstallStatus();
8892
- };
7871
+ const appUpdateActionLabel = appUpdateRow.action === "check" ? "检查更新" : appUpdateRow.action === "download" ? "立即更新" : appUpdateRow.action === "open" ? "打开安装包" : appUpdateState.status?.status === "downloading" ? "下载中…" : "检查中…";
8893
7872
  const runAppUpdateAction = (row) => {
8894
7873
  if (row.action === "busy") return;
8895
7874
  if (row.action === "download") arkmeUpdateUi.open("app");
@@ -9003,25 +7982,24 @@ window.__ModuleLoader__.load({
9003
7982
  title: "更新",
9004
7983
  id: "arkme-settings-about",
9005
7984
  children: [
9006
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingsRow, {
7985
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(VersionSettingsRow, {
9007
7986
  title: "ArkME 客户端",
9008
- description: `${updateVersionText(appUpdateRow.current, appUpdateRow.latest)} · ${appUpdateRow.feedback ?? "尚未检查"}` + (appUpdateRow.downloadedFilePath === void 0 ? "" : ` · ${appUpdateRow.downloadedFilePath}`),
7987
+ version: aboutArkmeVersion(appUpdateState.status?.currentVersion),
7988
+ feedback: `${updateVersionText(appUpdateRow.current, appUpdateRow.latest)} · ${appUpdateRow.feedback ?? "尚未检查"}` + (appUpdateRow.downloadedFilePath === void 0 ? "" : ` · ${appUpdateRow.downloadedFilePath}`),
7989
+ actionLabel: appUpdateActionLabel,
9009
7990
  disabled: appUpdateRow.action === "busy",
9010
- ...appUpdateRow.action === "busy" ? {} : { onClick: () => {
7991
+ loading: appUpdateState.status?.status === "checking",
7992
+ onAction: () => {
9011
7993
  runAppUpdateAction(appUpdateRow);
9012
- } }
7994
+ }
9013
7995
  }),
9014
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingsRow, {
7996
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(VersionSettingsRow, {
9015
7997
  title: "ArkME 插件",
9016
- description: `${updateVersionText(pluginUpdateRow.current, pluginUpdateRow.latest)} · ${pluginUpdateRow.feedback ?? "尚未检查"}`,
9017
- disabled: pluginUpdateRow.action === "busy",
9018
- ...pluginUpdateRow.action === "busy" ? {} : { onClick: () => {
9019
- runPluginUpdateAction(pluginUpdateRow);
9020
- } }
7998
+ version: `v${version}`
9021
7999
  }),
9022
8000
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(VersionSettingsRow, {
9023
8001
  title: "DeepSeek Harness",
9024
- version: harnessVersion
8002
+ version: aboutHarnessVersion()
9025
8003
  }),
9026
8004
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingsRow, {
9027
8005
  title: "用户协议",
@@ -12285,9 +11263,6 @@ window.__ModuleLoader__.load({
12285
11263
  e$21.displayName = "AddressBookIcon";
12286
11264
  const c$4 = e$21;
12287
11265
  //#endregion
12288
- //#region package.json
12289
- var version = "0.1.32";
12290
- //#endregion
12291
11266
  //#region assets/branding/arkme-navigation-logo.png
12292
11267
  var arkme_navigation_logo_default = "iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAEAKADAAQAAAABAAAEAAAAAADT3eodAABAAElEQVR4AezdXYxcWX4Y9ktqLEArQSRXglZAhO2hooWEBbzNdYJkDSkmG3AAPwTunrxFQsQmpDwqJJ0E0otEMsmDgSAmGT3aApsKYr8IIOmnwF6EZCDDgRGIpBzbEiJ4SEUOtM5qNaOsV4Aj74T/mr0z/VFVXXXrfpyP3wWa1ay6H+f8/qe66vzvueee+ejt0lgIECBAgAABAgQIECBAgACBogXOFl07lSNAgAABAgQIECBAgAABAgRmAhIAGgIBAgQIECBAgAABAgQIEKhAQAKggiCrIgECBAgQIECAAAECBAgQkADQBggQIECAAAECBAgQIECAQAUCEgAVBFkVCRAgQIAAAQIECBAgQICABIA2QIAAAQIECBAgQIAAAQIEKhCQAKggyKpIgAABAgQIECBAgAABAgQkALQBAgQIECBAgAABAgQIECBQgYAEQAVBVkUCBAgQIECAAAECBAgQICABoA0QIECAAAECBAgQIECAAIEKBCQAKgiyKhIgQIAAAQIECBAgQIAAAQkAbYAAAQIECBAgQIAAAQIECFQgIAFQQZBVkQABAgQIECBAgAABAgQISABoAwQIECBAgAABAgQIECBAoAIBCYAKgqyKBAgQIECAAAECBAgQIEBAAkAbIECAAAECBAgQIECAAAECFQhIAFQQZFUkQIAAAQIECBAgQIAAAQISANoAAQIECBAgQIAAAQIECBCoQEACoIIgqyIBAgQIECBAgAABAgQIEJAA0AYIECBAgAABAgQIECBAgEAFAhIAFQRZFQkQIECAAAECBAgQIECAgASANkCAAAECBAgQIECAAAECBCoQkACoIMiqSIAAAQIECBAgQIAAAQIEJAC0AQIECBAgQIAAAQIECBAgUIGABEAFQVZFAgQIECBAgAABAgQIECAgAaANECBAgAABAgQIECBAgACBCgQkACoIsioSIECAAAECBAgQIECAAAEJAG2AAAECBAgQIECAAAECBAhUICABUEGQVZEAAQIECBAgQIAAAQIECEgAaAMECBAgQIAAAQIECBAgQKACAQmACoKsigQIECBAgAABAgQIECBAQAJAGyBAgAABAgQIECBAgAABAhUISABUEGRVJECAAAECBAgQIECAAAECEgDaAAECBAgQIECAAAECBAgQqEBAAqCCIKsiAQIECBAgQIAAAQIECBCQANAGCBAgQIAAAQIECBAgQIBABQISABUEWRUJECBAgAABAgQIECBAgIAEgDZAgAABAgQIECBAgAABAgQqEJAAqCDIqkiAAAECBAgQIECAAAECBCQAtAECBAgQIECAAAECBAgQIFCBgARABUFWRQIECBAgQIAAAQIECBAgIAGgDRAgQIAAAQIECBAgQIAAgQoEJAAqCLIqEiBAgAABAgQIECBAgAABCQBtgAABAgQIECBAgAABAgQIVCAgAVBBkFWRAAECBAgQIECAAAECBAhIAGgDBAgQIECAAAECBAgQIECgAgEJgAqCrIoECBAgQIAAAQIECBAgQEACQBsgQIAAAQIECBAgQIAAAQIVCEgAVBBkVSRAgAABAgQIECBAgAABAhIA2gABAgQIECBAgAABAgQIEKhAQAKggiCrIgECBAgQIECAAAECBAgQkADQBggQIECAAAECBAgQIECAQAUCEgAVBFkVCRAgQIAAAQIECBAgQICABIA2QIAAAQIECBAgQIAAAQIEKhCQAKggyKpIgAABAgQIECBAgAABAgQkALQBAgQIECBAgAABAgQIECBQgYAEQAVBVkUCBAgQIECAAAECBAgQICABoA0QIECAAAECBAgQIECAAIEKBCQAKgiyKhIgQIAAAQIECBAgQIAAAQkAbYAAAQIECBAgQIAAAQIECFQgIAFQQZBVkQABAgQIECBAgAABAgQISABoAwQIECBAgAABAgQIECBAoAIBCYAKgqyKBAgQIECAAAECBAgQIEBAAkAbIECAAAECBAgQIECAAAECFQhIAFQQZFUkQIAAAQIECBAgQIAAAQISANoAAQIECBAgQIAAAQIECBCoQEACoIIgqyIBAgQIECBAgAABAgQIEJAA0AYIECBAgAABAgQIECBAgEAFAhIAFQRZFQkQIECAAAECBAgQIECAgASANkCAAAECBAgQIECAAAECBCoQkACoIMiqSIAAAQIECBAgQIAAAQIEJAC0AQIECBAgQIAAAQIECBAgUIGABEAFQVZFAgQIECBAgAABAgQIECAgAaANECBAgAABAgQIECBAgACBCgQkACoIsioSIECAAAECBAgQIECAAAEJAG2AAAECBAgQIECAAAECBAhUICABUEGQVZEAAQIECBAgQIAAAQIECEgAaAMECBAgQIAAAQIECBAgQKACAQmACoKsigQIECBAgAABAgQIECBAQAJAGyBAgAABAgQIECBAgAABAhUISABUEGRVJECAAAECBAgQIECAAAECEgDaAAECBAgQIECAAAECBAgQqEBAAqCCIKsiAQIECBAgQIAAAQIECBCQANAGCBAgQIAAAQIECBAgQIBABQISABUEWRUJECBAgAABAgQIECBAgIAEgDZAgAABAgQIECBAgAABAgQqEJAAqCDIqkiAAAECBAgQIECAAAECBCQAtAECBAgQIECAAAECBAgQIFCBgARABUFWRQIECBAgQIAAAQIECBAgIAGgDRAgQIAAAQIECBAgQIAAgQoEJAAqCLIqEiBAgAABAgQIECBAgAABCQBtgAABAgQIECBAgAABAgQIVCAgAVBBkFWRAAECBAgQIECAAAECBAhIAGgDBAgQIECAAAECBAgQIECgAgEJgAqCrIoECBAgQIAAAQIECBAgQEACQBsgQIAAAQIECBAgQIAAAQIVCEgAVBBkVSRAgAABAgQIECBAgAABAhIA2gABAgQIECBAgAABAgQIEKhAQAKggiCrIgECBAgQIECAAAECBAgQkADQBggQIECAAAECBAgQIECAQAUCEgAVBFkVCRAgQIAAAQIECBAgQICABIA2QIAAAQIECBAgQIAAAQIEKhCQAKggyKpIgAABAgQIECBAgAABAgQkALQBAgQIECBAgAABAgQIECBQgYAEQAVBVkUCBAgQIECAAAECBAgQICABoA0QIECAAAECBAgQIECAAIEKBCQAKgiyKhIgQIAAAQIECBAgQIAAAQkAbYAAAQIECBAgQIAAAQIECFQgIAFQQZBVkQABAgQIECBAgAABAgQISABoAwQIECBAgAABAgQIECBAoAIBCYAKgqyKBAgQIECAAAECBAgQIEBAAkAbIECAAAECBAgQIECAAAECFQhIAFQQZFUkQIAAAQIECBAgQIAAAQISANoAAQIECBAgQIAAAQIECBCoQEACoIIgqyIBAgQIECBAgAABAgQIEJAA0AYIECBAgAABAgQIECBAgEAFAhIAFQRZFQkQIECAAAECBAgQIECAgASANkCAAAECBAgQIECAAAECBCoQkACoIMiqSIAAAQIECBAgQIAAAQIEJAC0AQIECBAgQIAAAQIECBAgUIGABEAFQVZFAgQIECBAgAABAgQIECAgAaANECBAgAABAgQIECBAgACBCgQkACoIsioSIECAAAECBAgQIECAAAEJAG2AAAECBAgQIECAAAECBAhUICABUEGQVZEAAQIECBAgQIAAAQIECEgAaAMECBAgQIAAAQIECBAgQKACAQmACoKsigQIECBAgAABAgQIECBAQAJAGyBAgAABAgQIECBAgAABAhUISABUEGRVJECAAAECBAgQIECAAAECEgDaAAECBAgQIECAAAECBAgQqEBAAqCCIKsiAQIECBAgQIAAAQIECBCQANAGCBAgQIAAAQIECBAgQIBABQISABUEWRUJECBAgAABAgQIECBAgIAEgDZAgAABAgQIECBAgAABAgQqEJAAqCDIqkiAAAECBAgQIECAAAECBCQAtAECBAgQIECAAAECBAgQIFCBgARABUFWRQIECBAgQIAAAQIECBAgIAGgDRAgQIAAAQIECBAgQIAAgQoEJAAqCLIqEiBAgAABAgQIECBAgAABCQBtgAABAgQIECBAgAABAgQIVCAgAVBBkFWRAAECBAgQIECAAAECBAhIAGgDBAgQIECAAAECBAgQIECgAgEJgAqCrIoECBAgQIAAAQIECBAgQEACQBsgQIAAAQIECBAgQIAAAQIVCEgAVBBkVSRAgAABAgQIECBAgAABAhIA2gABAgQIECBAgAABAgQIEKhAQAKggiCrIgECBAgQIECAAAECBAgQkADQBggQIECAAAECBAgQIECAQAUCEgAVBFkVCRAgQIAAAQIECBAgQICABIA2QIAAAQIECBAgQIAAAQIEKhCQAKggyKpIgAABAgQIECBAgAABAgQkALQBAgQIECBAgAABAgQIECBQgYAEQAVBVkUCBAgQIECAAAECBAgQICABoA0QIECAAAECBAgQIECAAIEKBCQAKgiyKhIgQIAAAQIECBAgQIAAAQkAbYAAAQIECBAgQIAAAQIECFQgIAFQQZBVkQABAgQIECBAgAABAgQISABoAwQIECBAgAABAgQIECBAoAIBCYAKgqyKBAgQIECAAAECBAgQIEBAAkAbIECAAAECBAgQIECAAAECFQhIAFQQZFUkQIAAAQIECBAgQIAAAQISANoAAQIECBAgQIAAAQIECBCoQEACoIIgqyIBAgQIECBAgAABAgQIEJAA0AYIECBAgAABAgQIECBAgEAFAhIAFQRZFQkQIECAAAECBAgQIECAgASANkCAAAECBAgQIECAAAECBCoQkACoIMiqSIAAAQIECBAgQIAAAQIEJAC0AQIECBAgQIAAAQIECBAgUIGABEAFQVZFAgQIECBAgAABAgQIECAgAaANECBAgAABAgQIECBAgACBCgQkACoIsioSIECAAAECBAgQIECAAAEJAG2AAAECBAgQIECAAAECBAhUICABUEGQVZEAAQIECBAgQIAAAQIECEgAaAMECBAgQIAAAQIECBAgQKACAQmACoKsigQIECBAgAABAgQIECBAQAJAGyBAgAABAgQIECBAgAABAhUISABUEGRVJECAAAECBAgQIECAAAECEgDaAAECBAgQIECAAAECBAgQqEBAAqCCIKsiAQIECBAgQIAAAQIECBCQANAGCBAgQIAAAQIECBAgQIBABQISABUEWRUJECBAgAABAgQIECBAgIAEgDZAgAABAgQIECBAgAABAgQqEJAAqCDIqkiAAAECBAgQIECAAAECBCQAtAECBAgQIECAAAECBAgQIFCBgARABUFWRQIECBAgQIAAAQIECBAgIAGgDRAgQIAAAQIECBAgQIAAgQoEJAAqCLIqEiBAgAABAgQIECBAgAABCQBtgAABAgQIECBAgAABAgQIVCAgAVBBkFWRAAECBAgQIECAAAECBAhIAGgDBAgQIECAAAECBAgQIECgAgEJgAqCrIoECBAgQIAAAQIECBAgQEACQBsgQIAAAQIECBAgQIAAAQIVCEgAVBBkVSRAgAABAgQIECBAgAABAhIA2gABAgQIECBAgAABAgQIEKhAQAKggiCrIgECBAgQIECAAAECBAgQkADQBggQIECAAAECBAgQIECAQAUCEgAVBFkVCRAgQIAAAQIECBAgQICABIA2QIAAAQIECBAgQIAAAQIEKhCQAKggyKpIgAABAgQIECBAgAABAgQkALQBAgQIECBAgAABAgQIECBQgYAEQAVBVkUCBAgQIECAAAECBAgQICABoA0QIECAAAECBAgQIECAAIEKBCQAKgiyKhIgQIAAAQIECBAgQIAAAQkAbYAAAQIECBAgQIAAAQIECFQgIAFQQZBVkQABAgQIECBAgAABAgQISABoAwQIECBAgAABAgQIECBAoAIBCYAKgqyKBAgQIECAAAECBAgQIEBAAkAbIECAAAECBAgQIECAAAECFQhIAFQQZFUkQIAAAQIECBAgQIAAAQISANoAAQIECBAgQIAAAQIECBCoQEACoIIgqyIBAgQIECBAgAABAgQIEJAA0AYIECBAgAABAgQIECBAgEAFAhIAFQRZFQkQIECAAAECBAgQIECAgASANkCAAAECBAgQIECAAAECBCoQkACoIMiqSIAAAQIECBAgQIAAAQIEJAC0AQIECBAgQIAAAQIECBAgUIGABEAFQVZFAgQIECBAgAABAgQIECAgAaANECBAgAABAgQIECBAgACBCgQkACoIsioSIECAAAECBAgQIECAAAEJAG2AAAECBAgQIECAAAECBAhUICABUEGQVZEAAQIECBAgQIAAAQIECEgAaAMECBAgQIAAAQIECBAgQKACAQmACoKsigQIECBAgAABAgQIECBAQAJAGyBAgAABAgQIECBAgAABAhUISABUEGRVJECAAAECBAgQIECAAAECEgDaAAECBAgQIECAAAECBAgQqEBAAqCCIKsiAQIECBAgQIAAAQIECBCQANAGCBAgQIAAAQIECBAgQIBABQISABUEWRUJECBAgAABAgQIECBAgIAEgDZAgAABAgQIECBAgAABAgQqEJAAqCDIqkiAAAECBAgQIECAAAECBCQAtAECBAgQIECAAAECBAgQIFCBgARABUFWRQIECBAgQIAAAQIECBAgIAGgDRAgQIAAAQIECBAgQIAAgQoEJAAqCLIqEiBAgAABAgQIECBAgAABCQBtgAABAgQIECBAgAABAgQIVCAgAVBBkFWRAAECBAgQIECAAAECBAhIAGgDBAgQIECAAAECBAgQIECgAgEJgAqCrIoECBAgQIAAAQIECBAgQEACQBsgQIAAAQIECBAgQIAAAQIVCEgAVBBkVSRAgAABAgQIECBAgAABAhIA2gABAgQIECBAgAABAgQIEKhAQAKggiCrIgECBAgQIECAAAECBAgQkADQBggQIECAAAECBAgQIECAQAUCEgAVBFkVCRAgQIAAAQIECBAgQICABIA2QIAAAQIECBAgQIAAAQIEKhCQAKggyKpIgAABAgQIECBAgAABAgQkALQBAgQIECBAgAABAgQIECBQgYAEQAVBVkUCBAgQIECAAAECBAgQICABoA0QIECAAAECBAgQIECAAIEKBCQAKgiyKhIgQIAAAQIECBAgQIAAAQkAbYAAAQIECBAgQIAAAQIECFQgIAFQQZBVkQABAgQIECBAgAABAgQISABoAwQIECBAgAABAgQIECBAoAIBCYAKgqyKBAgQIECAAAECBAgQIEBAAkAbIECAAAECBAgQIECAAAECFQhIAFQQZFUkQIAAAQIECBAgQIAAAQISANoAAQIECBAgQIAAAQIECBCoQEACoIIgqyIBAgQIECBAgAABAgQIEJAA0AYIECBAgAABAgQIECBAgEAFAhIAFQRZFQkQIECAAAECBAgQIECAgASANkCAAAECBAgQIECAAAECBCoQkACoIMiqSIAAAQIECBAgQIAAAQIEJAC0AQIECBAgQIAAAQIECBAgUIGABEAFQVZFAgQIECBAgAABAgQIECAgAaANECBAgAABAgQIECBAgACBCgQkACoIsioSIECAAAECBAgQIECAAAEJAG2AAAECBAgQIECAAAECBAhUICABUEGQVZEAAQIECBAgQIAAAQIECEgAaAMECBAgQIAAAQIECBAgQKACAQmACoKsigQIECBAgAABAgQIECBAQAJAGyBAgAABAgQIECBAgAABAhUISABUEGRVJECAAAECBAgQIECAAAECEgDaAAECBAgQIECAAAECBAgQqEBAAqCCIKsiAQIECBAgQIAAAQIECBCQANAGCBAgQIAAAQIECBAgQIBABQISABUEWRUJECBAgAABAgQIECBAgIAEgDZAgAABAgQIECBAgAABAgQqEJAAqCDIqkiAAAECBAgQIECAAAECBCQAtAECBAgQIECAAAECBAgQIFCBgARABUFWRQIECBAgQIAAAQIECBAgIAGgDRAgQIAAAQIECBAgQIAAgQoEJAAqCLIqEiBAgAABAgQIECBAgAABCQBtgAABAgQIECBAgAABAgQIVCAgAVBBkFWRAAECBAgQIECAAAECBAhIAGgDBAgQIECAAAECBAgQIECgAgEJgAqCrIoECBAgQIAAAQIECBAgQEACQBsgQIAAAQIECBAgQIAAAQIVCEgAVBBkVSRAgAABAgQIECBAgAABAhIA2gABAgQIECBAgAABAgQIEKhAQAKggiCrIgECBAgQIECAAAECBAgQkADQBggQIECAAAECBAgQIECAQAUCEgAVBFkVCRAgQIAAAQIECBAgQICABIA2QIAAAQIECBAgQIAAAQIEKhCQAKggyKpIgAABAgQIECBAgAABAgQkALQBAgQIECBAgAABAgQIECBQgcA7FdSx+CoeHBw0T548aT744IPi6zqvgvv7+83Vq1fnvbTRc+H58uXL5tWrV83r169nvvFomU7g3XffbW7dutXE46aL980w75vjcYn30ePHj5s3b97M3kfeQx8LXbp0qbl+/Xovbfm4uf8TINDM/t7E35/4mxOP58+fb+J918fnxyq+z549ax4+fDg7/irrl7ZOOPf1eT2UTbSN+J7Xfj5FO2l/5h0z6hTtKH62t7c/aVPxfwuBnATOfPR2yanAynpU4M6dO83t27ePPlnh/27cuNHcvXt345rHB/bz58+beIwfS3oC8QH84sWL2Qdv19J533wsF3874gta30u8d+J9FB3/+HJlmS/QR1uev2fPEihToO2cRcctfj788MPZY/t8/L1pf58nEO+5R48ezRIB817v67n79+838b2k9iW8nz592sRjCku0j8Pf8aKt9LG0yaVIMMVPJAfi0UIgVQEJgFQjs0K54sPv4sWLK6xZxyrRKezyBzc+AOLDOs4Ih6klfYFNOq7eN0fjG1/Orly5cvTJDv+L91Gc7YpOv+TZ6oCbtOXVj2JNAmkLtJ32tgN/uGMff7Pjp11n05rE94T4vjDkEt/NosyWptnb25slXaayiM+jGCUb3/GiDY21RFIgPluj/pcvX04mCTJW/R0nbQGXAKQdn6Wli6Hplk8FwmOdBEB8OLcd/zE/FD4tsd+6CmxyVtn75qh6DH3cZIn3TryP7t27N+qXq03KnNK2m7TllOqhLATmCbQd9/bx8FDr9rl4HHOJ91wcc6iz0rHv+LF8LDDF37j4XJo6IR1liIR4/MQSyYC4ZFUy4ON24d9pBSQApvXf6Oh//Md/vNH2tW6sw5J/5COGXRfvm65yR7fzPjrq0fV/m7Tlrse0HYFNBKLNxk/b0Y2z9e3/jz9uchzbliEwZjIk2l+qCekYidCOjmvnroqkgIXAFAISAFOoO+ZkAvHBEENu40PCQoDA+gIpf8Favza2IECgFYj3dvwc7tjH74efa9dpt/F4UmCokQUnj5TPM9GOhnSJ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tIOOYYPRzskCORsg25Off/75QfZPtxAI5H63PJZn/ygH/vm3C4GtCAgAtjKpM/SZswHylYsN1xmAL1Qyry875SyPt9vLg1m+EvxkXdj7A1p2OBKU5Ps5L7E8iuk5HdWeKfD999+/CZPPfT+aufTrdnW0bfS6um5tkkD2SxMC5Puvv/7618/Zzqy5rVn2i/MYnvtf9ovy3cH+pLVFL3cVEADcVc71CAwWWB5Ar2tx2aFcvl/3t3v9vzzr0L4sOw3L93Z99QhME1h21i+5LVnzwGAN/7ct3/55jdt2GwSmCyz39+zr5Osul6vuV1f9/i634ToEpgoIAKZORl8ECBAgQIAAAQIECBAgQKAo8FGxllIECBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAA/D9eYAABTmSURBVE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUAEBwNDBaIsAAQIECBAgQIAAAQIECDQFBABNTbUIECBAgAABAgQIECBAgMBQAQHA0MFoiwABAgQIECBAgAABAgQINAUEAE1NtQgQIECAAAECBAgQIECAwFABAcDQwWiLAAECBAgQIECAAAECBAg0BQQATU21CBAgQIAAAQIECBAgQIDAUIH/B4hq4XFFfCQ/AAAAAElFTkSuQmCC";
12293
11268
  //#endregion
@@ -13175,19 +12150,90 @@ window.__ModuleLoader__.load({
13175
12150
  const m$4 = r$5;
13176
12151
  //#endregion
13177
12152
  //#region src/client/ArkmeUpdateSurfaces.tsx
12153
+ function versionLabel$2(version) {
12154
+ return version?.trim() || "…";
12155
+ }
12156
+ function formatBytes$1(value) {
12157
+ if (value === void 0 || !Number.isFinite(value) || value <= 0) return void 0;
12158
+ if (value < 1024) return `${Math.round(value)} B`;
12159
+ if (value < 1024 * 1024) return `${(value / 1024).toFixed(1)} KB`;
12160
+ return `${(value / (1024 * 1024)).toFixed(1)} MB`;
12161
+ }
12162
+ function percentage(downloaded, total) {
12163
+ if (total === void 0 || total <= 0) return void 0;
12164
+ return Math.max(0, Math.min(100, Math.round((downloaded ?? 0) / total * 100)));
12165
+ }
12166
+ function updateNotes(summary) {
12167
+ return (summary?.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).slice(0, 3) ?? []).map((line) => {
12168
+ const separator = line.search(/[::—–]/);
12169
+ if (separator <= 0 || separator >= line.length - 1) return { title: line };
12170
+ return {
12171
+ title: line.slice(0, separator).trim(),
12172
+ detail: line.slice(separator + 1).trim()
12173
+ };
12174
+ });
12175
+ }
12176
+ function appItem(snapshot) {
12177
+ const status = snapshot.status;
12178
+ if (status === void 0 || ![
12179
+ "available",
12180
+ "downloading",
12181
+ "downloaded",
12182
+ "failed"
12183
+ ].includes(status.status)) return void 0;
12184
+ const latestVersion = versionLabel$2(status.latestVersion);
12185
+ const progress = percentage(status.downloadedBytes, status.totalBytes);
12186
+ const packageSize = formatBytes$1(status.totalBytes);
12187
+ const failed = status.status === "failed";
12188
+ const ready = status.status === "downloaded";
12189
+ return {
12190
+ target: "app",
12191
+ instanceKey: `app:${latestVersion}`,
12192
+ productLabel: "Arkme APP",
12193
+ title: failed ? "更新未完成" : ready ? "更新包已下载" : "发现新版本",
12194
+ currentVersion: versionLabel$2(status.currentVersion),
12195
+ latestVersion,
12196
+ ...packageSize === void 0 ? {} : { packageSize },
12197
+ notes: updateNotes(status.releaseNotes),
12198
+ available: status.status === "available",
12199
+ active: status.status === "downloading",
12200
+ ready,
12201
+ restarting: false,
12202
+ failed,
12203
+ ...status.status === "downloading" ? {
12204
+ phase: "app-downloading",
12205
+ phaseMessage: "可继续使用"
12206
+ } : {},
12207
+ ...ready ? {
12208
+ phase: "app-downloaded",
12209
+ phaseMessage: `已下载 ${latestVersion}`
12210
+ } : {},
12211
+ ...failed ? {
12212
+ phase: "app-failed",
12213
+ phaseMessage: "请重新尝试下载"
12214
+ } : {},
12215
+ ...status.error?.trim() || snapshot.error.trim() ? { error: status.error?.trim() || snapshot.error.trim() } : {},
12216
+ ...progress === void 0 ? {} : { progress }
12217
+ };
12218
+ }
12219
+ /** Pure UI projection over the APP update store. Plugin updates are Release Set owned. */
12220
+ function deriveArkmeUpdatePresentation(input) {
12221
+ const items = [appItem(input.app)].filter((item) => item !== void 0);
12222
+ const primary = items.find((item) => item.active) ?? items.find((item) => item.ready || item.failed) ?? items.find((item) => item.available);
12223
+ return {
12224
+ items,
12225
+ ...primary === void 0 ? {} : { primary }
12226
+ };
12227
+ }
13178
12228
  function railLabel(item) {
13179
- if (item.uncertain) return "待确认";
13180
12229
  if (item.active) return item.restarting ? "重启" : item.progress === void 0 ? "更新中" : `${item.progress}%`;
13181
- if (item.ready) return "待安装";
12230
+ if (item.ready) return "完成";
13182
12231
  if (item.failed) return "重试";
13183
12232
  return "更新";
13184
12233
  }
13185
12234
  function updateMeta(item) {
13186
12235
  return `${item.productLabel} ${item.latestVersion}${item.packageSize === void 0 ? "" : ` · ${item.packageSize}`}`;
13187
12236
  }
13188
- function updateSelectionKey(item) {
13189
- return `${item.target}:${item.latestVersion}`;
13190
- }
13191
12237
  const ArkmeUpdatePopover = (0, react.forwardRef)(function ArkmeUpdatePopover({ item, style, onClose, onStart }, ref) {
13192
12238
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
13193
12239
  ref,
@@ -13211,7 +12257,7 @@ window.__ModuleLoader__.load({
13211
12257
  }),
13212
12258
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13213
12259
  className: "arkme-update-popover-summary",
13214
- children: item.target === "plugin" ? "更新会在后台进行,完成后将自动重启。" : "可在后台下载,不影响你继续使用。"
12260
+ children: "可在后台下载,不影响你继续使用。"
13215
12261
  }),
13216
12262
  item.notes.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13217
12263
  className: "arkme-update-release-notes",
@@ -13241,31 +12287,26 @@ window.__ModuleLoader__.load({
13241
12287
  ]
13242
12288
  });
13243
12289
  });
13244
- function ArkmeUpdateTopCapsule({ item, onClose, onRetry, onOpenDownloaded, onCheckStatus }) {
13245
- const active = item.active && !item.restarting && !item.ready && !item.failed;
13246
- const hasAction = item.ready && item.target === "app" || item.failed || item.uncertain;
13247
- const title = item.uncertain ? "更新状态待确认" : item.restarting ? "正在自动重启…" : item.ready ? "安装包已下载" : item.failed ? "更新未完成" : "正在更新";
13248
- const detail = item.restarting ? "即将打开新版本" : item.ready ? item.target === "app" ? `已下载 ${item.latestVersion}` : `已安装 ${item.latestVersion}` : item.phaseMessage ?? "可继续使用";
12290
+ function ArkmeUpdateTopCapsule({ item, onClose, onRetry, onOpenDownloaded }) {
12291
+ const active = item.active && !item.restarting;
12292
+ const title = item.restarting ? "正在自动重启…" : item.ready ? "更新包已就绪" : item.failed ? "更新未完成" : "正在更新";
12293
+ const detail = item.restarting ? "即将打开新版本" : item.ready ? `已下载 ${item.latestVersion}` : item.phaseMessage ?? "可继续使用";
13249
12294
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
13250
12295
  className: `arkme-update-capsule${item.ready ? " is-ready" : ""}${item.restarting ? " is-restarting" : ""}${item.failed ? " is-error" : ""}`,
13251
- "data-layout": item.restarting ? "restarting" : active ? "progress" : hasAction ? "action" : "message",
13252
12296
  role: item.failed ? "alert" : "status",
13253
12297
  "aria-live": item.failed ? "assertive" : "polite",
13254
- "aria-label": item.uncertain ? "更新状态待确认" : item.restarting ? "正在自动重启客户端" : item.ready ? "安装包已下载" : item.failed ? "更新未完成" : `正在更新,${item.progress ?? 0}%`,
12298
+ "aria-label": item.restarting ? "正在自动重启客户端" : item.ready ? "更新包已就绪" : item.failed ? "更新未完成" : `正在更新,${item.progress ?? 0}%`,
13255
12299
  children: [
13256
12300
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13257
12301
  className: "arkme-update-capsule-copy",
13258
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: title }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
13259
- title: detail,
13260
- children: detail
13261
- })]
12302
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: title }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: detail })]
13262
12303
  }),
13263
12304
  active && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13264
12305
  className: `arkme-update-progress${item.progress === void 0 ? " is-indeterminate" : ""}`,
13265
12306
  "aria-hidden": true,
13266
12307
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: item.progress === void 0 ? {} : { width: `${item.progress}%` } })
13267
12308
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: item.progress === void 0 ? "···" : `${item.progress}%` })] }),
13268
- item.ready && item.target === "app" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12309
+ item.ready && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
13269
12310
  type: "button",
13270
12311
  className: "arkme-update-ready-action",
13271
12312
  onClick: onOpenDownloaded,
@@ -13277,14 +12318,6 @@ window.__ModuleLoader__.load({
13277
12318
  onClick: onRetry,
13278
12319
  children: "重新尝试"
13279
12320
  }),
13280
- item.uncertain && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
13281
- type: "button",
13282
- className: "arkme-update-ready-action",
13283
- disabled: item.checkingStatus,
13284
- "aria-busy": item.checkingStatus,
13285
- onClick: onCheckStatus,
13286
- children: item.checkingStatus ? "检查中…" : "检查状态"
13287
- }),
13288
12321
  !item.restarting && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
13289
12322
  type: "button",
13290
12323
  className: "arkme-update-capsule-close",
@@ -13298,13 +12331,9 @@ window.__ModuleLoader__.load({
13298
12331
  /** Demo-aligned update entry, anchored popover, and recoverable top progress capsule. */
13299
12332
  function ArkmeUpdateRailSlot() {
13300
12333
  const app = (0, react.useSyncExternalStore)(arkmeAppUpdateStore.subscribe, arkmeAppUpdateStore.getSnapshot, arkmeAppUpdateStore.getSnapshot);
13301
- const plugin = (0, react.useSyncExternalStore)(arkmePluginUpdateStore.subscribe, arkmePluginUpdateStore.getSnapshot, arkmePluginUpdateStore.getSnapshot);
13302
12334
  const request = useArkmeUpdateUiSnapshot();
13303
- const presentation = (0, react.useMemo)(() => deriveArkmeUpdatePresentation({
13304
- app,
13305
- plugin
13306
- }), [app, plugin]);
13307
- const [selectedKey, setSelectedKey] = (0, react.useState)();
12335
+ const presentation = (0, react.useMemo)(() => deriveArkmeUpdatePresentation({ app }), [app]);
12336
+ const [selectedTarget, setSelectedTarget] = (0, react.useState)();
13308
12337
  const [popoverOpen, setPopoverOpen] = (0, react.useState)(false);
13309
12338
  const [topOpen, setTopOpen] = (0, react.useState)(false);
13310
12339
  const [popoverPosition, setPopoverPosition] = (0, react.useState)();
@@ -13314,21 +12343,13 @@ window.__ModuleLoader__.load({
13314
12343
  const handledRequestRef = (0, react.useRef)(0);
13315
12344
  const activeKeyRef = (0, react.useRef)();
13316
12345
  const phaseRef = (0, react.useRef)();
13317
- const restoreRailFocusRef = (0, react.useRef)(false);
13318
- const selectedItem = presentation.items.find((item) => updateSelectionKey(item) === selectedKey);
13319
- (0, react.useEffect)(() => {
13320
- if (selectedKey === void 0 || selectedItem !== void 0) return;
13321
- setSelectedKey(void 0);
13322
- setPopoverOpen(false);
13323
- setTopOpen(false);
13324
- setPopoverPosition(void 0);
13325
- }, [selectedKey, selectedItem]);
12346
+ const selectedItem = presentation.items.find((item) => item.target === selectedTarget) ?? presentation.primary;
13326
12347
  (0, react.useEffect)(() => {
13327
12348
  if (request.revision === 0 || request.revision === handledRequestRef.current) return;
13328
12349
  handledRequestRef.current = request.revision;
13329
12350
  const requested = presentation.items.find((item) => request.target === void 0 || item.target === request.target) ?? presentation.primary;
13330
12351
  if (requested === void 0) return;
13331
- setSelectedKey(updateSelectionKey(requested));
12352
+ setSelectedTarget(requested.target);
13332
12353
  if (requested.available) {
13333
12354
  setTopOpen(false);
13334
12355
  setPopoverOpen(true);
@@ -13339,31 +12360,16 @@ window.__ModuleLoader__.load({
13339
12360
  }, [presentation, request]);
13340
12361
  (0, react.useEffect)(() => {
13341
12362
  const active = presentation.items.find((item) => item.active);
13342
- if (active === void 0) {
13343
- if (presentation.items.length === 0) {
13344
- activeKeyRef.current = void 0;
13345
- phaseRef.current = void 0;
13346
- }
13347
- return;
13348
- }
12363
+ if (active === void 0) return;
13349
12364
  const phaseKey = `${active.instanceKey}:${active.phase ?? "active"}`;
13350
12365
  if (activeKeyRef.current !== active.instanceKey || active.restarting && phaseRef.current !== phaseKey) {
13351
- const continuesRequest = active.target === "plugin" && !active.restarting && activeKeyRef.current === `plugin:pending:${active.latestVersion}`;
13352
12366
  activeKeyRef.current = active.instanceKey;
13353
12367
  phaseRef.current = phaseKey;
13354
- setSelectedKey(updateSelectionKey(active));
13355
- if (!continuesRequest) {
13356
- setPopoverOpen(false);
13357
- setTopOpen(true);
13358
- }
12368
+ setSelectedTarget(active.target);
12369
+ setPopoverOpen(false);
12370
+ setTopOpen(true);
13359
12371
  } else phaseRef.current = phaseKey;
13360
12372
  }, [presentation]);
13361
- (0, react.useLayoutEffect)(() => {
13362
- if (!topOpen && restoreRailFocusRef.current) {
13363
- restoreRailFocusRef.current = false;
13364
- railRef.current?.focus();
13365
- }
13366
- }, [topOpen]);
13367
12373
  (0, react.useEffect)(() => {
13368
12374
  if (!popoverOpen) return;
13369
12375
  const dismiss = (event) => {
@@ -13387,10 +12393,9 @@ window.__ModuleLoader__.load({
13387
12393
  const position = () => {
13388
12394
  const rail = railRef.current?.getBoundingClientRect();
13389
12395
  if (rail === void 0) return;
13390
- const popover = popoverRef.current;
13391
12396
  setPopoverPosition({
13392
- left: Math.round(Math.max(8, Math.min(rail.right + 8, window.innerWidth - (popover?.offsetWidth ?? 356) - 8))),
13393
- bottom: Math.round(Math.max(8, Math.min(window.innerHeight - rail.bottom - 2, window.innerHeight - (popover?.offsetHeight ?? 0) - 8)))
12397
+ left: Math.round(rail.right + 8),
12398
+ bottom: Math.round(window.innerHeight - rail.bottom - 2)
13394
12399
  });
13395
12400
  };
13396
12401
  position();
@@ -13400,13 +12405,13 @@ window.__ModuleLoader__.load({
13400
12405
  window.removeEventListener("resize", position);
13401
12406
  window.removeEventListener("scroll", position, true);
13402
12407
  };
13403
- }, [popoverOpen, selectedItem]);
12408
+ }, [popoverOpen]);
13404
12409
  if (presentation.primary === void 0) return null;
13405
12410
  const railItem = selectedItem ?? presentation.primary;
13406
- const railHidden = topOpen && selectedItem !== void 0 && (railItem.active || railItem.ready || railItem.failed || railItem.uncertain);
12411
+ const railHidden = topOpen && (railItem.active || railItem.ready || railItem.failed);
13407
12412
  const openFromRail = () => {
13408
- setSelectedKey(updateSelectionKey(railItem));
13409
- if (railItem.active || railItem.ready || railItem.failed || railItem.uncertain) {
12413
+ setSelectedTarget(railItem.target);
12414
+ if (railItem.active || railItem.ready || railItem.failed) {
13410
12415
  setPopoverOpen(false);
13411
12416
  setTopOpen(true);
13412
12417
  } else {
@@ -13418,57 +12423,51 @@ window.__ModuleLoader__.load({
13418
12423
  if (selectedItem === void 0 || selectedItem.blockedReason !== void 0) return;
13419
12424
  setPopoverOpen(false);
13420
12425
  setTopOpen(true);
13421
- if (selectedItem.target === "plugin") arkmePluginUpdateStore.install();
13422
- else arkmeAppUpdateStore.download();
12426
+ arkmeAppUpdateStore.download();
13423
12427
  };
13424
12428
  const retry = () => {
13425
12429
  setTopOpen(true);
13426
- if (railItem.target === "plugin") arkmePluginUpdateStore.install();
13427
- else arkmeAppUpdateStore.download();
12430
+ arkmeAppUpdateStore.download();
13428
12431
  };
13429
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
13430
- !railHidden && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13431
- className: "arkme-update-rail-slot",
13432
- ref: slotRef,
13433
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
12432
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12433
+ className: "arkme-update-rail-slot",
12434
+ ref: slotRef,
12435
+ children: [
12436
+ !railHidden && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
13434
12437
  ref: railRef,
13435
12438
  type: "button",
13436
12439
  className: `arkme-update-rail ${railItem.available ? "is-available" : railItem.active ? "is-downloading" : railItem.failed ? "is-error" : "is-ready"}${popoverOpen ? " is-active" : ""}`,
13437
- title: railItem.uncertain ? "更新状态待确认" : railItem.available ? "更新 Arkme" : railItem.active ? "查看更新进度" : railItem.failed ? "重试更新" : "查看更新状态",
13438
- "aria-label": railItem.uncertain ? "更新状态待确认" : railItem.available ? "更新 Arkme" : railItem.active ? `查看更新进度,${railItem.progress ?? 0}%` : railItem.failed ? "重试更新" : "查看更新状态",
12440
+ title: railItem.available ? "更新 Arkme" : railItem.active ? "查看更新进度" : railItem.failed ? "重试更新" : "查看更新状态",
12441
+ "aria-label": railItem.available ? "更新 Arkme" : railItem.active ? `查看更新进度,${railItem.progress ?? 0}%` : railItem.failed ? "重试更新" : "查看更新状态",
13439
12442
  "aria-expanded": popoverOpen || topOpen,
13440
12443
  onClick: openFromRail,
13441
12444
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(m$4, {
13442
12445
  size: 17,
13443
12446
  weight: "regular"
13444
12447
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: railLabel(railItem) })]
13445
- })
13446
- }),
13447
- popoverOpen && selectedItem?.available && typeof document !== "undefined" && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeUpdatePopover, {
13448
- ref: popoverRef,
13449
- item: selectedItem,
13450
- ...popoverPosition === void 0 ? {} : { style: popoverPosition },
13451
- onClose: () => {
13452
- setPopoverOpen(false);
13453
- railRef.current?.focus();
13454
- },
13455
- onStart: start
13456
- }), document.body),
13457
- topOpen && selectedItem !== void 0 && (selectedItem.active || selectedItem.ready || selectedItem.failed || selectedItem.uncertain) && typeof document !== "undefined" && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeUpdateTopCapsule, {
13458
- item: selectedItem,
13459
- onClose: () => {
13460
- restoreRailFocusRef.current = true;
13461
- setTopOpen(false);
13462
- },
13463
- onRetry: retry,
13464
- onCheckStatus: () => {
13465
- arkmePluginUpdateStore.checkInstallStatus();
13466
- },
13467
- onOpenDownloaded: () => {
13468
- arkmeAppUpdateStore.showDownloadedFile();
13469
- }
13470
- }), document.body)
13471
- ] });
12448
+ }),
12449
+ popoverOpen && selectedItem?.available && typeof document !== "undefined" && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeUpdatePopover, {
12450
+ ref: popoverRef,
12451
+ item: selectedItem,
12452
+ ...popoverPosition === void 0 ? {} : { style: popoverPosition },
12453
+ onClose: () => {
12454
+ setPopoverOpen(false);
12455
+ railRef.current?.focus();
12456
+ },
12457
+ onStart: start
12458
+ }), document.body),
12459
+ topOpen && selectedItem !== void 0 && (selectedItem.active || selectedItem.ready || selectedItem.failed) && typeof document !== "undefined" && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeUpdateTopCapsule, {
12460
+ item: selectedItem,
12461
+ onClose: () => {
12462
+ setTopOpen(false);
12463
+ },
12464
+ onRetry: retry,
12465
+ onOpenDownloaded: () => {
12466
+ arkmeAppUpdateStore.showDownloadedFile();
12467
+ }
12468
+ }), document.body)
12469
+ ]
12470
+ });
13472
12471
  }
13473
12472
  //#endregion
13474
12473
  //#region src/client/chat-directory-store.ts
@@ -14148,7 +13147,6 @@ window.__ModuleLoader__.load({
14148
13147
  const ui = (0, react.useSyncExternalStore)(arkmeUi.subscribe, arkmeUi.getSnapshot, arkmeUi.getSnapshot);
14149
13148
  const authState = (0, react.useSyncExternalStore)(arkmeAuthStore.subscribe, arkmeAuthStore.getSnapshot, arkmeAuthStore.getSnapshot);
14150
13149
  const chatDirectory = (0, react.useSyncExternalStore)(arkmeChatDirectory.subscribe, arkmeChatDirectory.getSnapshot, arkmeChatDirectory.getSnapshot);
14151
- const pluginUpdateState = (0, react.useSyncExternalStore)(arkmePluginUpdateStore.subscribe, arkmePluginUpdateStore.getSnapshot, arkmePluginUpdateStore.getSnapshot);
14152
13150
  const [profileOpen, setProfileOpen] = (0, react.useState)(false);
14153
13151
  const [profile, setProfile] = (0, react.useState)();
14154
13152
  const profileTriggerRef = (0, react.useRef)(null);
@@ -14186,7 +13184,6 @@ window.__ModuleLoader__.load({
14186
13184
  };
14187
13185
  }, [profileOpen]);
14188
13186
  const activeId = locked ? "conversations" : ui.mode === "login" ? void 0 : ui.calendarOpen === true ? "calendar" : ui.mode === "extensions" ? "extensions" : ui.mode === "world" ? "world" : ui.mode === "calls" ? "calls" : ui.mode === "recordings" ? "recordings" : ui.mode === "source" && ui.productMode === "contacts" ? "contacts" : "conversations";
14189
- const installedPluginVersion = pluginUpdateState.status?.installedVersion ?? version;
14190
13187
  const conversationUnreadCount = authState.auth?.status === "authenticated" && chatDirectory.baselineReady ? arkmeChatDirectory.totalUnreadCount({ excludeMuted: true }) : 0;
14191
13188
  const conversationUnreadLabel = conversationUnreadCount > 99 ? "99+" : String(conversationUnreadCount);
14192
13189
  const navigationItems = items;
@@ -14238,9 +13235,9 @@ window.__ModuleLoader__.load({
14238
13235
  style: styles$45.brandImage
14239
13236
  }),
14240
13237
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
14241
- "data-arkme-plugin-version": installedPluginVersion,
13238
+ "data-arkme-plugin-version": version,
14242
13239
  style: styles$45.brandVersion,
14243
- children: ["v", installedPluginVersion]
13240
+ children: ["v", version]
14244
13241
  })
14245
13242
  ]
14246
13243
  }),
@@ -14728,34 +13725,6 @@ window.__ModuleLoader__.load({
14728
13725
  lineHeight: "18px",
14729
13726
  fontWeight: 600
14730
13727
  };
14731
- const updateDotStyle = {
14732
- position: "absolute",
14733
- top: -2,
14734
- right: -3,
14735
- width: 7,
14736
- height: 7,
14737
- borderRadius: "50%",
14738
- background: "#1677ff",
14739
- border: "2px solid var(--dsw-specific-sidebar-fill, #fff)",
14740
- boxSizing: "content-box"
14741
- };
14742
- const updateButtonStyle = {
14743
- flex: "none",
14744
- height: 28,
14745
- minWidth: 50,
14746
- margin: "4px 8px 4px 0",
14747
- padding: "0 11px",
14748
- border: "1px solid rgba(22, 119, 255, .24)",
14749
- borderRadius: 8,
14750
- background: "rgba(22, 119, 255, .08)",
14751
- color: "#1677ff",
14752
- cursor: "pointer",
14753
- fontFamily: "inherit",
14754
- fontSize: 12,
14755
- lineHeight: "26px",
14756
- fontWeight: 500,
14757
- whiteSpace: "nowrap"
14758
- };
14759
13728
  function ArkmeMark({ size = 18 }) {
14760
13729
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
14761
13730
  "aria-hidden": true,
@@ -14772,32 +13741,19 @@ window.__ModuleLoader__.load({
14772
13741
  }
14773
13742
  });
14774
13743
  }
14775
- function ArkmeFooterAction({ wide, toggle, useSessions, expanded = false, loggedOut = false, bindingRequired = false, authenticated = false, authPending = false, unreadCount = 0, updateStatus, updateSnapshot, updateBusy = false, onUpdate }) {
13744
+ function ArkmeFooterAction({ wide, toggle, useSessions, expanded = false, loggedOut = false, bindingRequired = false, authenticated = false, authPending = false, unreadCount = 0 }) {
14776
13745
  const currentSession = useSessions((state) => state.current);
14777
13746
  const normalizedUnread = Math.max(0, Math.trunc(unreadCount));
14778
13747
  const unreadLabel = normalizedUnread > 99 ? "99+" : String(normalizedUnread);
14779
13748
  const statusLabel = bindingRequired ? "待绑定" : loggedOut ? "未登录" : "";
14780
- const item = derivePluginUpdateItem(updateSnapshot ?? {
14781
- checked: true,
14782
- busy: updateBusy,
14783
- error: "",
14784
- installError: "",
14785
- ...updateStatus === void 0 ? {} : { status: updateStatus }
14786
- });
14787
- const status = updateSnapshot?.status ?? updateStatus;
14788
- const updateAvailable = item?.available === true;
14789
- const showUpdateButton = wide && item !== void 0 && (!item.available || status?.canInstallInApp) && onUpdate !== void 0;
14790
- const actionLabel = item?.uncertain ? "查看状态" : item?.active ? "查看进度" : item?.failed ? "查看结果" : updateBusy ? "更新中…" : "更新";
14791
- const updateLabel = updateAvailable ? status?.level === "critical" ? "插件有重要更新" : "插件有可用更新" : item === void 0 ? "" : item.uncertain ? "更新状态待确认" : item.failed ? "更新未完成" : "正在更新";
14792
13749
  const accessibleLabel = [
14793
13750
  "Arkme",
14794
13751
  ...statusLabel === "" ? [] : [statusLabel],
14795
- ...statusLabel !== "" || normalizedUnread === 0 ? [] : [`${unreadLabel} 条未读`],
14796
- ...updateLabel === "" ? [] : [updateLabel]
13752
+ ...statusLabel !== "" || normalizedUnread === 0 ? [] : [`${unreadLabel} 条未读`]
14797
13753
  ].join(" · ");
14798
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13754
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
14799
13755
  style: wide ? actionRowStyle : { width: 36 },
14800
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
13756
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
14801
13757
  type: "button",
14802
13758
  disabled: authPending,
14803
13759
  style: {
@@ -14818,20 +13774,12 @@ window.__ModuleLoader__.load({
14818
13774
  toggle(currentSession, authenticated);
14819
13775
  },
14820
13776
  children: [
14821
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
13777
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
14822
13778
  style: {
14823
13779
  position: "relative",
14824
13780
  flex: "none"
14825
13781
  },
14826
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMark, {}), updateAvailable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
14827
- "aria-hidden": true,
14828
- "data-arkme-update-level": status?.level,
14829
- style: {
14830
- ...updateDotStyle,
14831
- ...status?.level === "important" ? { background: "#d97706" } : {},
14832
- ...status?.level === "critical" ? { background: "#dc2626" } : {}
14833
- }
14834
- })]
13782
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeMark, {})
14835
13783
  }),
14836
13784
  wide && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
14837
13785
  style: {
@@ -14860,19 +13808,7 @@ window.__ModuleLoader__.load({
14860
13808
  children: unreadLabel
14861
13809
  })
14862
13810
  ]
14863
- }), showUpdateButton && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
14864
- type: "button",
14865
- style: updateButtonStyle,
14866
- "aria-label": item?.available ? `更新 Arkme 插件到 ${item.latestVersion}` : `${actionLabel}:${updateLabel}`,
14867
- onMouseEnter: (event) => {
14868
- event.currentTarget.style.background = "rgba(22, 119, 255, .14)";
14869
- },
14870
- onMouseLeave: (event) => {
14871
- event.currentTarget.style.background = "rgba(22, 119, 255, .08)";
14872
- },
14873
- onClick: onUpdate,
14874
- children: actionLabel
14875
- })]
13811
+ })
14876
13812
  });
14877
13813
  }
14878
13814
  //#endregion
@@ -65791,6 +64727,38 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
65791
64727
  };
65792
64728
  }
65793
64729
  //#endregion
64730
+ //#region src/client/desktop-quarantine-status.ts
64731
+ function parseArkmeDesktopQuarantineStatus(value) {
64732
+ if (!isObject(value) || typeof value.active !== "boolean" || !Array.isArray(value.entries)) return void 0;
64733
+ const entries = [];
64734
+ for (const entry of value.entries) {
64735
+ if (!isObject(entry) || typeof entry.packageName !== "string" || entry.packageName.trim() === "" || typeof entry.dismissed !== "boolean" || typeof entry.resolved !== "boolean" || entry.extensionId !== void 0 && typeof entry.extensionId !== "string") return void 0;
64736
+ entries.push({
64737
+ packageName: entry.packageName,
64738
+ ...typeof entry.extensionId === "string" ? { extensionId: entry.extensionId } : {},
64739
+ dismissed: entry.dismissed,
64740
+ resolved: entry.resolved
64741
+ });
64742
+ }
64743
+ if (value.mode !== void 0 && value.mode !== "targeted" && value.mode !== "local-safe-mode") return void 0;
64744
+ for (const key of [
64745
+ "quarantineId",
64746
+ "failureSummary",
64747
+ "failureLogTail"
64748
+ ]) if (value[key] !== void 0 && typeof value[key] !== "string") return void 0;
64749
+ return {
64750
+ active: value.active,
64751
+ ...typeof value.quarantineId === "string" ? { quarantineId: value.quarantineId } : {},
64752
+ ...value.mode === "targeted" || value.mode === "local-safe-mode" ? { mode: value.mode } : {},
64753
+ ...typeof value.failureSummary === "string" ? { failureSummary: value.failureSummary } : {},
64754
+ ...typeof value.failureLogTail === "string" ? { failureLogTail: value.failureLogTail } : {},
64755
+ entries
64756
+ };
64757
+ }
64758
+ function isObject(value) {
64759
+ return value !== null && typeof value === "object" && !Array.isArray(value);
64760
+ }
64761
+ //#endregion
65794
64762
  //#region src/client/extension-share-presentation.ts
65795
64763
  /**
65796
64764
  * Prefer the authenticated marketplace identity so Arkme can reuse its normal detail modal.
@@ -66666,6 +65634,12 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
66666
65634
  fontSize: 11,
66667
65635
  lineHeight: "17px"
66668
65636
  },
65637
+ lifecycleQuarantine: {
65638
+ marginTop: 4,
65639
+ color: "#b54708",
65640
+ fontSize: 11,
65641
+ lineHeight: "17px"
65642
+ },
66669
65643
  lifecycleActions: {
66670
65644
  flex: "none",
66671
65645
  display: "flex",
@@ -68407,7 +67381,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
68407
67381
  function extensionHasAuthorIdentity(item) {
68408
67382
  return item.source?.type === "github_repository" || item.owner_user_id !== void 0 || (item.owner_name?.trim() ?? "") !== "" || (item.owner_arkme_id?.trim() ?? "") !== "";
68409
67383
  }
68410
- function ArkmeExtensionLifecycleRow({ item, installed, kind, actionBusy = false, installTask, onOpen, onUpdate, onToggle, onPause, onResume }) {
67384
+ function ArkmeExtensionLifecycleRow({ item, installed, kind, actionBusy = false, installTask, onOpen, onUpdate, onToggle, onPause, onResume, quarantineReason }) {
68411
67385
  const processing = installTask !== void 0 && !installTask.done || actionBusy;
68412
67386
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("article", {
68413
67387
  style: styles$17.lifecycleRow,
@@ -68424,16 +67398,24 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
68424
67398
  size: 38
68425
67399
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
68426
67400
  style: styles$17.lifecycleCopy,
68427
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
68428
- style: styles$17.lifecycleTitle,
68429
- children: item.name
68430
- }), extensionHasAuthorIdentity(item) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
68431
- style: styles$17.lifecycleAuthor,
68432
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeExtensionAuthorIdentity, {
68433
- item,
68434
- size: 20
67401
+ children: [
67402
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
67403
+ style: styles$17.lifecycleTitle,
67404
+ children: item.name
67405
+ }),
67406
+ quarantineReason !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
67407
+ style: styles$17.lifecycleQuarantine,
67408
+ title: quarantineReason,
67409
+ children: "已自动停用"
67410
+ }),
67411
+ extensionHasAuthorIdentity(item) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
67412
+ style: styles$17.lifecycleAuthor,
67413
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeExtensionAuthorIdentity, {
67414
+ item,
67415
+ size: 20
67416
+ })
68435
67417
  })
68436
- })]
67418
+ ]
68437
67419
  })]
68438
67420
  }),
68439
67421
  kind === "installed" && onToggle !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -68701,6 +67683,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
68701
67683
  const [myExtensions, setMyExtensions] = (0, react.useState)([]);
68702
67684
  const [myExtensionWarnings, setMyExtensionWarnings] = (0, react.useState)([]);
68703
67685
  const [installed, setInstalled] = (0, react.useState)([]);
67686
+ const [desktopQuarantine, setDesktopQuarantine] = (0, react.useState)();
68704
67687
  const [updates, setUpdates] = (0, react.useState)([]);
68705
67688
  const [lifecycleCatalogItems, setLifecycleCatalogItems] = (0, react.useState)({});
68706
67689
  const [detail, setDetail] = (0, react.useState)();
@@ -68853,6 +67836,15 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
68853
67836
  (0, react.useEffect)(() => {
68854
67837
  setSort(readMarketplaceSortPreference(currentUserId));
68855
67838
  }, [currentUserId]);
67839
+ (0, react.useEffect)(() => {
67840
+ const controller = new AbortController();
67841
+ callArkme("extensions.quarantine.status", void 0, controller.signal).then((value) => {
67842
+ setDesktopQuarantine(parseArkmeDesktopQuarantineStatus(value));
67843
+ }).catch(() => void 0);
67844
+ return () => {
67845
+ controller.abort();
67846
+ };
67847
+ }, []);
68856
67848
  (0, react.useEffect)(() => {
68857
67849
  classificationController.current?.abort();
68858
67850
  const controller = new AbortController();
@@ -69350,6 +68342,18 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
69350
68342
  setActionBusyExtensionId(void 0);
69351
68343
  }
69352
68344
  };
68345
+ const reenableQuarantinedExtension = async (extensionId, packageName) => {
68346
+ setActionBusyExtensionId(extensionId);
68347
+ setInstallError("");
68348
+ setRestartNotice("");
68349
+ try {
68350
+ await callArkme("extensions.quarantine.reenable", { packageName });
68351
+ setRestartNotice("正在重新启用扩展并重启 DSH;如果扩展仍然加载失败,将继续保持停用。");
68352
+ } catch (caught) {
68353
+ setActionBusyExtensionId(void 0);
68354
+ setInstallError(caught instanceof Error ? caught.message : String(caught));
68355
+ }
68356
+ };
69353
68357
  (0, react.useEffect)(() => {
69354
68358
  if (installTask === void 0 || installTask.done) return;
69355
68359
  const controller = new AbortController();
@@ -69970,18 +68974,23 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
69970
68974
  !busy && error === "" && sharedDetail === void 0 && detail === void 0 && tab === "installed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
69971
68975
  style: styles$17.lifecycleList,
69972
68976
  "data-extension-lifecycle-list": "installed",
69973
- children: visibleInstalled.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeExtensionLifecycleRow, {
69974
- item: mergeInstalledExtensionCatalogItem(item, lifecycleCatalogItems[item.extensionId], iconRefFor(item.extensionId)),
69975
- installed: item,
69976
- kind: "installed",
69977
- actionBusy: actionBusyExtensionId === item.extensionId,
69978
- onOpen: () => {
69979
- inspect(item.extensionId);
69980
- },
69981
- onToggle: (enabled) => {
69982
- toggleEnabled(item.extensionId, enabled);
69983
- }
69984
- }, item.extensionId))
68977
+ children: visibleInstalled.map((item) => {
68978
+ const quarantineEntry = desktopQuarantine?.active === true ? desktopQuarantine.entries.find((entry) => entry.extensionId === item.extensionId && !entry.resolved) : void 0;
68979
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeExtensionLifecycleRow, {
68980
+ item: mergeInstalledExtensionCatalogItem(item, lifecycleCatalogItems[item.extensionId], iconRefFor(item.extensionId)),
68981
+ installed: item,
68982
+ kind: "installed",
68983
+ actionBusy: actionBusyExtensionId === item.extensionId,
68984
+ ...quarantineEntry === void 0 ? {} : { quarantineReason: desktopQuarantine?.failureSummary ?? "扩展启动时加载失败,已自动停用" },
68985
+ onOpen: () => {
68986
+ inspect(item.extensionId);
68987
+ },
68988
+ onToggle: (enabled) => {
68989
+ if (enabled && quarantineEntry !== void 0) reenableQuarantinedExtension(item.extensionId, quarantineEntry.packageName);
68990
+ else toggleEnabled(item.extensionId, enabled);
68991
+ }
68992
+ }, item.extensionId);
68993
+ })
69985
68994
  }), visibleInstalled.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EmptyState, { tab: "installed" })] }),
69986
68995
  !busy && error === "" && sharedDetail === void 0 && detail === void 0 && tab === "updates" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
69987
68996
  style: styles$17.lifecycleList,
@@ -81463,8 +80472,8 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
81463
80472
  borderRadius: 999,
81464
80473
  display: "grid",
81465
80474
  placeItems: "center",
81466
- background: "transparent",
81467
- color: arkmeTheme.base,
80475
+ background: arkmeTheme.primaryAction,
80476
+ color: arkmeTheme.onPrimaryAction,
81468
80477
  cursor: "pointer",
81469
80478
  padding: 0
81470
80479
  },
@@ -85313,7 +84322,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
85313
84322
  setForwardTargetPicker(void 0);
85314
84323
  closeMessageMenu();
85315
84324
  showForwardSuccessFeedback(successfulTargets, successCount, failureCount);
85316
- if (warningText !== "") showMessageActionStatus(warningText);
84325
+ showMessageActionStatus(warningText);
85317
84326
  if (needsTimelineRefresh) await loadTimeline();
85318
84327
  } catch (caught) {
85319
84328
  if (activeSourceRef.current === sourceRef) {
@@ -86475,9 +85484,10 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
86475
85484
  "aria-label": "搜索转发对象",
86476
85485
  disabled: messageActionBusy === "forward",
86477
85486
  onChange: (event) => {
85487
+ const keyword = event.currentTarget.value;
86478
85488
  setForwardTargetPicker((current) => current === void 0 ? current : {
86479
85489
  ...current,
86480
- keyword: event.currentTarget.value
85490
+ keyword
86481
85491
  });
86482
85492
  }
86483
85493
  })]
@@ -86601,9 +85611,10 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
86601
85611
  "aria-label": "转发附言",
86602
85612
  disabled: messageActionBusy === "forward",
86603
85613
  onChange: (event) => {
85614
+ const commentText = event.currentTarget.value;
86604
85615
  setForwardTargetPicker((current) => current === void 0 ? current : {
86605
85616
  ...current,
86606
- commentText: event.currentTarget.value
85617
+ commentText
86607
85618
  });
86608
85619
  },
86609
85620
  onKeyDown: (event) => {
@@ -118025,8 +117036,232 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118025
117036
  ]);
118026
117037
  }
118027
117038
  //#endregion
118028
- //#region src/client/ArkmePersistentShell.tsx
117039
+ //#region src/client/ArkmeExtensionRecoveryNotice.tsx
118029
117040
  const styles$4 = {
117041
+ root: {
117042
+ position: "absolute",
117043
+ zIndex: 30,
117044
+ top: 20,
117045
+ left: "50%",
117046
+ transform: "translateX(-50%)",
117047
+ width: "min(640px, calc(100% - 40px))",
117048
+ padding: "16px 18px",
117049
+ borderRadius: 14,
117050
+ border: "1px solid #f0cf8a",
117051
+ background: "#fffaf0",
117052
+ color: "#20283b",
117053
+ boxShadow: "0 14px 36px rgba(33, 41, 63, 0.16)",
117054
+ fontSize: 13,
117055
+ lineHeight: 1.55
117056
+ },
117057
+ title: {
117058
+ margin: 0,
117059
+ fontSize: 16,
117060
+ lineHeight: 1.4,
117061
+ fontWeight: 650
117062
+ },
117063
+ summary: {
117064
+ margin: "6px 0 0",
117065
+ color: "#4f5c75"
117066
+ },
117067
+ localExplanation: {
117068
+ margin: "5px 0 0",
117069
+ color: "#69758c"
117070
+ },
117071
+ list: {
117072
+ display: "grid",
117073
+ gap: 7,
117074
+ margin: "12px 0 0",
117075
+ padding: 0,
117076
+ listStyle: "none"
117077
+ },
117078
+ entry: {
117079
+ display: "flex",
117080
+ alignItems: "center",
117081
+ justifyContent: "space-between",
117082
+ gap: 12,
117083
+ padding: "8px 10px",
117084
+ borderRadius: 9,
117085
+ background: "rgba(238, 226, 196, 0.45)"
117086
+ },
117087
+ packageName: {
117088
+ minWidth: 0,
117089
+ overflow: "hidden",
117090
+ textOverflow: "ellipsis",
117091
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace"
117092
+ },
117093
+ details: {
117094
+ margin: "10px 0 0",
117095
+ maxHeight: 160,
117096
+ overflow: "auto",
117097
+ padding: 10,
117098
+ borderRadius: 8,
117099
+ background: "#20283b",
117100
+ color: "#e8ecf5",
117101
+ whiteSpace: "pre-wrap",
117102
+ wordBreak: "break-word",
117103
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
117104
+ fontSize: 11
117105
+ },
117106
+ actions: {
117107
+ display: "flex",
117108
+ flexWrap: "wrap",
117109
+ alignItems: "center",
117110
+ gap: 8,
117111
+ marginTop: 13
117112
+ },
117113
+ button: {
117114
+ appearance: "none",
117115
+ border: "1px solid #c8d0df",
117116
+ borderRadius: 8,
117117
+ padding: "7px 11px",
117118
+ background: "#fff",
117119
+ color: "#34415a",
117120
+ cursor: "pointer",
117121
+ fontSize: 12
117122
+ },
117123
+ primaryButton: {
117124
+ borderColor: "#496ee8",
117125
+ background: "#496ee8",
117126
+ color: "#fff"
117127
+ },
117128
+ error: {
117129
+ margin: "9px 0 0",
117130
+ color: "#b42318"
117131
+ }
117132
+ };
117133
+ const defaultRequest = async (operation, params) => await callArkme(operation, params);
117134
+ function ArkmeExtensionRecoveryNotice({ request = defaultRequest, onOpenExtensions = () => {
117135
+ arkmeUi.showExtensions();
117136
+ } }) {
117137
+ const [status, setStatus] = (0, react.useState)();
117138
+ const [detailsVisible, setDetailsVisible] = (0, react.useState)(false);
117139
+ const [busyPackage, setBusyPackage] = (0, react.useState)();
117140
+ const [error, setError] = (0, react.useState)("");
117141
+ (0, react.useEffect)(() => {
117142
+ let active = true;
117143
+ request("extensions.quarantine.status").then((value) => {
117144
+ if (active) setStatus(parseArkmeDesktopQuarantineStatus(value));
117145
+ }).catch(() => void 0);
117146
+ return () => {
117147
+ active = false;
117148
+ };
117149
+ }, [request]);
117150
+ const entries = (0, react.useMemo)(() => status?.entries.filter((entry) => !entry.dismissed && !entry.resolved) ?? [], [status]);
117151
+ if (status?.active !== true || entries.length === 0) return null;
117152
+ const localSafeMode = status.mode === "local-safe-mode" || entries.length > 1;
117153
+ const dismiss = async () => {
117154
+ setError("");
117155
+ try {
117156
+ await Promise.all(entries.map(async (entry) => {
117157
+ await request("extensions.quarantine.dismiss", { packageName: entry.packageName });
117158
+ }));
117159
+ setStatus((current) => current === void 0 ? current : {
117160
+ ...current,
117161
+ entries: current.entries.map((entry) => ({
117162
+ ...entry,
117163
+ dismissed: true
117164
+ }))
117165
+ });
117166
+ } catch (cause) {
117167
+ setError(cause instanceof Error ? cause.message : "暂时无法关闭提示,请稍后重试");
117168
+ }
117169
+ };
117170
+ const reenable = async (packageName) => {
117171
+ setError("");
117172
+ setBusyPackage(packageName);
117173
+ try {
117174
+ await request("extensions.quarantine.reenable", { packageName });
117175
+ } catch (cause) {
117176
+ setBusyPackage(void 0);
117177
+ setError(cause instanceof Error ? cause.message : "重新启用失败,该扩展仍保持停用");
117178
+ }
117179
+ };
117180
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
117181
+ "data-arkme-owned": "extension-recovery-notice",
117182
+ role: "status",
117183
+ style: styles$4.root,
117184
+ children: [
117185
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
117186
+ style: styles$4.title,
117187
+ children: localSafeMode ? "已进入本地扩展安全模式" : "已安全启动"
117188
+ }),
117189
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
117190
+ style: styles$4.summary,
117191
+ children: status.failureSummary ?? (localSafeMode ? `无法确定具体故障扩展,已停用 ${String(entries.length)} 个本地开发扩展。` : `扩展 ${entries[0].packageName} 启动时加载失败,已自动停用。`)
117192
+ }),
117193
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
117194
+ style: styles$4.localExplanation,
117195
+ children: localSafeMode ? "Arkme 其他功能可继续使用。修复本地插件后,可逐个重新启用并重启验证。" : "Arkme 其他功能可继续使用。修复该扩展后,可重新启用并重启验证。"
117196
+ }),
117197
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
117198
+ style: styles$4.list,
117199
+ children: entries.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
117200
+ style: styles$4.entry,
117201
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
117202
+ style: styles$4.packageName,
117203
+ title: entry.packageName,
117204
+ children: entry.packageName
117205
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
117206
+ type: "button",
117207
+ style: {
117208
+ ...styles$4.button,
117209
+ ...styles$4.primaryButton
117210
+ },
117211
+ disabled: busyPackage !== void 0,
117212
+ "data-arkme-quarantine-action": "reenable",
117213
+ onClick: () => {
117214
+ reenable(entry.packageName);
117215
+ },
117216
+ children: busyPackage === entry.packageName ? "正在重新启用…" : "重新启用并重启"
117217
+ })]
117218
+ }, entry.packageName))
117219
+ }),
117220
+ detailsVisible && status.failureLogTail !== void 0 && status.failureLogTail !== "" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
117221
+ style: styles$4.details,
117222
+ children: status.failureLogTail
117223
+ }) : null,
117224
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
117225
+ role: "alert",
117226
+ style: styles$4.error,
117227
+ children: error
117228
+ }),
117229
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
117230
+ style: styles$4.actions,
117231
+ children: [
117232
+ status.failureLogTail !== void 0 && status.failureLogTail !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
117233
+ type: "button",
117234
+ style: styles$4.button,
117235
+ "data-arkme-quarantine-action": "details",
117236
+ onClick: () => {
117237
+ setDetailsVisible((value) => !value);
117238
+ },
117239
+ children: detailsVisible ? "收起详细原因" : "查看详细原因"
117240
+ }),
117241
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
117242
+ type: "button",
117243
+ style: styles$4.button,
117244
+ "data-arkme-quarantine-action": "extensions",
117245
+ onClick: onOpenExtensions,
117246
+ children: "打开扩展管理"
117247
+ }),
117248
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
117249
+ type: "button",
117250
+ style: styles$4.button,
117251
+ "data-arkme-quarantine-action": "dismiss",
117252
+ onClick: () => {
117253
+ dismiss();
117254
+ },
117255
+ children: "知道了"
117256
+ })
117257
+ ]
117258
+ })
117259
+ ]
117260
+ });
117261
+ }
117262
+ //#endregion
117263
+ //#region src/client/ArkmePersistentShell.tsx
117264
+ const styles$3 = {
118030
117265
  sidebar: {
118031
117266
  position: "relative",
118032
117267
  width: "100%",
@@ -118215,7 +117450,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118215
117450
  "data-arkme-login-mode": "true",
118216
117451
  "data-arkme-web-locked": true,
118217
117452
  "data-arkme-directory-visible": "true",
118218
- style: styles$4.sidebar,
117453
+ style: styles$3.sidebar,
118219
117454
  "aria-label": "Arkme 受限工作区导航",
118220
117455
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeProductNavigation, {
118221
117456
  compact: false,
@@ -118223,7 +117458,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118223
117458
  taskExpanded: true,
118224
117459
  locked: true
118225
117460
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
118226
- style: styles$4.taskDirectory,
117461
+ style: styles$3.taskDirectory,
118227
117462
  "data-arkme-directory-mode": "web-locked",
118228
117463
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeNavigation, {
118229
117464
  wide: true,
@@ -118237,7 +117472,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118237
117472
  "data-arkme-login-mode": "true",
118238
117473
  "data-arkme-directory-visible": "false",
118239
117474
  style: {
118240
- ...styles$4.sidebar,
117475
+ ...styles$3.sidebar,
118241
117476
  width: 0
118242
117477
  },
118243
117478
  "aria-hidden": true
@@ -118251,7 +117486,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118251
117486
  "data-arkme-sidebar-resizing": sidebarResizing ? "true" : "false",
118252
117487
  "data-arkme-login-mode": "false",
118253
117488
  ...contactsMode ? { "data-arkme-contacts-mobile-view": scopedContacts.selection.kind !== "none" ? "content" : "directory" } : {},
118254
- style: styles$4.sidebar,
117489
+ style: styles$3.sidebar,
118255
117490
  "aria-label": "Arkme 功能导航栏",
118256
117491
  children: [
118257
117492
  !collapsed && directoryVisible && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", {
@@ -118276,7 +117511,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118276
117511
  currentSessionId: sessionState.current
118277
117512
  }),
118278
117513
  directoryVisible && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
118279
- style: styles$4.taskDirectory,
117514
+ style: styles$3.taskDirectory,
118280
117515
  "data-arkme-directory-mode": contactsMode ? "contacts" : "conversations",
118281
117516
  children: contactsMode ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ContactDirectorySurface, {
118282
117517
  accountKey: contactsAccountKey ?? "",
@@ -118342,7 +117577,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118342
117577
  "aria-valuemin": ARKME_PERSISTENT_SIDEBAR_MIN_WIDTH,
118343
117578
  "aria-valuemax": ARKME_PERSISTENT_SIDEBAR_MAX_WIDTH,
118344
117579
  "aria-valuenow": renderedSidebarWidth,
118345
- style: styles$4.sidebarResizeHandle,
117580
+ style: styles$3.sidebarResizeHandle,
118346
117581
  onPointerDown: beginSidebarResize,
118347
117582
  onPointerMove: continueSidebarResize,
118348
117583
  onPointerUp: (event) => {
@@ -118388,10 +117623,11 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118388
117623
  "data-arkme-owned": "persistent-workspace",
118389
117624
  "data-arkme-workspace": true,
118390
117625
  ...contactsMode ? { "data-arkme-contacts-mobile-view": scopedContacts.selection.kind !== "none" ? "content" : "directory" } : {},
118391
- style: styles$4.workspace,
117626
+ style: styles$3.workspace,
118392
117627
  "aria-label": "Arkme 主界面",
118393
117628
  children: [
118394
117629
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmePersistentClientRuntime, {}),
117630
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeExtensionRecoveryNotice, {}),
118395
117631
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DeepSeekHarnessSurface, {
118396
117632
  visible: harnessVisible,
118397
117633
  nativeSettings: webLockedHarness
@@ -118436,7 +117672,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118436
117672
  }) : !webLockedHarness && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
118437
117673
  "data-arkme-owned": "arkme-conversation-layer",
118438
117674
  style: {
118439
- ...styles$4.conversationLayer,
117675
+ ...styles$3.conversationLayer,
118440
117676
  visibility: harnessVisible ? "hidden" : "visible",
118441
117677
  pointerEvents: harnessVisible ? "none" : "auto",
118442
117678
  zIndex: harnessVisible ? 0 : 1
@@ -118461,7 +117697,7 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118461
117697
  }, [closeDetails]);
118462
117698
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("aside", {
118463
117699
  "data-arkme-owned": "persistent-details",
118464
- style: styles$4.details,
117700
+ style: styles$3.details,
118465
117701
  "aria-hidden": true
118466
117702
  });
118467
117703
  }
@@ -118672,22 +117908,20 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118672
117908
  }
118673
117909
  //#endregion
118674
117910
  //#region src/client/ArkmeFooterDropdown.tsx
118675
- const styles$3 = { root: {
117911
+ const styles$2 = { root: {
118676
117912
  width: "100%",
118677
117913
  minWidth: 0
118678
117914
  } };
118679
117915
  function ArkmeFooterDropdown(props) {
118680
117916
  const ui = (0, react.useSyncExternalStore)(arkmeUi.subscribe, arkmeUi.getSnapshot, arkmeUi.getSnapshot);
118681
117917
  const authState = (0, react.useSyncExternalStore)(arkmeAuthStore.subscribe, arkmeAuthStore.getSnapshot, arkmeAuthStore.getSnapshot);
118682
- const updateState = (0, react.useSyncExternalStore)(arkmePluginUpdateStore.subscribe, arkmePluginUpdateStore.getSnapshot, arkmePluginUpdateStore.getSnapshot);
118683
117918
  const chatDirectory = (0, react.useSyncExternalStore)(arkmeChatDirectory.subscribe, arkmeChatDirectory.getSnapshot, arkmeChatDirectory.getSnapshot);
118684
117919
  const auth = authState.auth;
118685
- const currentSession = props.useSessions((state) => state.current);
118686
117920
  const unreadCount = auth?.status === "authenticated" && chatDirectory.revision > 0 ? arkmeChatDirectory.totalUnreadCount() : 0;
118687
117921
  useArkmeRealtimeClientEvents(auth, ui.authRevision, false);
118688
117922
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeOutgoingCallHost, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
118689
117923
  style: {
118690
- ...styles$3.root,
117924
+ ...styles$2.root,
118691
117925
  width: props.wide ? "100%" : 36
118692
117926
  },
118693
117927
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeFooterAction, {
@@ -118697,19 +117931,13 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118697
117931
  bindingRequired: auth?.status === "binding-required",
118698
117932
  authenticated: auth?.status === "authenticated",
118699
117933
  authPending: !authState.checked || authState.busy,
118700
- unreadCount,
118701
- ...updateState.status === void 0 ? {} : { updateStatus: updateState.status },
118702
- updateSnapshot: updateState,
118703
- onUpdate: () => {
118704
- props.activate(currentSession);
118705
- arkmeUpdateUi.open("plugin");
118706
- }
117934
+ unreadCount
118707
117935
  })
118708
117936
  })] });
118709
117937
  }
118710
117938
  //#endregion
118711
117939
  //#region src/client/ArkmeAppUpdateDialog.tsx
118712
- const styles$2 = {
117940
+ const styles$1 = {
118713
117941
  backdrop: {
118714
117942
  position: "absolute",
118715
117943
  inset: 0,
@@ -118835,20 +118063,20 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118835
118063
  const downloading = status.status === "downloading";
118836
118064
  const downloaded = status.status === "downloaded";
118837
118065
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
118838
- style: styles$2.backdrop,
118066
+ style: styles$1.backdrop,
118839
118067
  role: "presentation",
118840
118068
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
118841
- style: styles$2.dialog,
118069
+ style: styles$1.dialog,
118842
118070
  role: "dialog",
118843
118071
  "aria-modal": "true",
118844
118072
  "aria-label": "Arkme APP 更新",
118845
118073
  children: [
118846
118074
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
118847
- style: styles$2.title,
118075
+ style: styles$1.title,
118848
118076
  children: downloaded ? "更新包下载完成" : downloading ? "正在下载更新包" : "发现新版本"
118849
118077
  }),
118850
118078
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
118851
- style: styles$2.version,
118079
+ style: styles$1.version,
118852
118080
  children: [
118853
118081
  "当前 ",
118854
118082
  versionLabel(status.currentVersion),
@@ -118857,41 +118085,41 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118857
118085
  ]
118858
118086
  }),
118859
118087
  !downloading && !downloaded && status.releaseNotes?.trim() && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
118860
- style: styles$2.notes,
118088
+ style: styles$1.notes,
118861
118089
  children: status.releaseNotes.trim()
118862
118090
  }),
118863
118091
  downloading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
118864
- style: styles$2.progressTrack,
118092
+ style: styles$1.progressTrack,
118865
118093
  "aria-label": "下载进度",
118866
118094
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { style: {
118867
- ...styles$2.progressValue,
118095
+ ...styles$1.progressValue,
118868
118096
  width: progressPercentage(status)
118869
118097
  } })
118870
118098
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
118871
- style: styles$2.progressText,
118099
+ style: styles$1.progressText,
118872
118100
  children: progressText(status)
118873
118101
  })] }),
118874
118102
  downloaded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
118875
- style: styles$2.notes,
118103
+ style: styles$1.notes,
118876
118104
  children: "安装包已下载到本机,可打开所在文件夹进行安装。"
118877
118105
  }),
118878
118106
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
118879
- style: styles$2.actions,
118107
+ style: styles$1.actions,
118880
118108
  children: [!downloading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
118881
118109
  type: "button",
118882
- style: styles$2.button,
118110
+ style: styles$1.button,
118883
118111
  onClick: dismiss,
118884
118112
  children: downloaded ? "关闭" : "稍后"
118885
118113
  }), downloaded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
118886
118114
  type: "button",
118887
- style: styles$2.primaryButton,
118115
+ style: styles$1.primaryButton,
118888
118116
  onClick: () => {
118889
118117
  arkmeAppUpdateStore.showDownloadedFile();
118890
118118
  },
118891
118119
  children: "打开所在文件夹"
118892
118120
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
118893
118121
  type: "button",
118894
- style: styles$2.primaryButton,
118122
+ style: styles$1.primaryButton,
118895
118123
  disabled: state.busy,
118896
118124
  onClick: () => {
118897
118125
  arkmeAppUpdateStore.download();
@@ -118904,262 +118132,6 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
118904
118132
  });
118905
118133
  }
118906
118134
  //#endregion
118907
- //#region src/client/ArkmePluginUpdateDialog.tsx
118908
- const styles$1 = {
118909
- backdrop: {
118910
- position: "fixed",
118911
- inset: 0,
118912
- zIndex: 950,
118913
- display: "grid",
118914
- placeItems: "center",
118915
- padding: 24,
118916
- background: "rgba(16, 20, 28, 0.42)",
118917
- color: "var(--dsw-alias-label-primary, #17191c)"
118918
- },
118919
- dialog: {
118920
- width: "min(480px, 100%)",
118921
- maxHeight: "min(620px, calc(100vh - 48px))",
118922
- overflow: "auto",
118923
- boxSizing: "border-box",
118924
- border: "1px solid var(--dsw-alias-border-l1, #e2e5e9)",
118925
- borderRadius: 20,
118926
- padding: 28,
118927
- background: "var(--dsw-alias-bg-base, #fff)",
118928
- boxShadow: "0 24px 72px rgba(15, 23, 42, 0.24)"
118929
- },
118930
- header: {
118931
- display: "flex",
118932
- alignItems: "flex-start",
118933
- justifyContent: "space-between",
118934
- gap: 20
118935
- },
118936
- title: {
118937
- margin: 0,
118938
- fontSize: 20,
118939
- lineHeight: "28px",
118940
- fontWeight: 600
118941
- },
118942
- closeButton: {
118943
- width: 32,
118944
- height: 32,
118945
- flex: "none",
118946
- display: "grid",
118947
- placeItems: "center",
118948
- padding: 0,
118949
- border: 0,
118950
- borderRadius: 9,
118951
- background: "transparent",
118952
- color: "var(--dsw-alias-label-secondary, #68707c)",
118953
- cursor: "pointer"
118954
- },
118955
- version: {
118956
- margin: "10px 0 0",
118957
- color: "var(--dsw-alias-label-secondary, #68707c)",
118958
- fontSize: 14,
118959
- lineHeight: "22px"
118960
- },
118961
- notes: {
118962
- marginTop: 20,
118963
- padding: "16px 18px",
118964
- borderRadius: 12,
118965
- background: "var(--dsw-alias-fill-l1, #f3f4f6)"
118966
- },
118967
- notesTitle: {
118968
- margin: 0,
118969
- fontSize: 14,
118970
- lineHeight: "22px",
118971
- fontWeight: 600
118972
- },
118973
- notesBody: {
118974
- margin: "6px 0 0",
118975
- color: "var(--dsw-alias-label-secondary, #68707c)",
118976
- fontSize: 14,
118977
- lineHeight: "22px",
118978
- whiteSpace: "pre-wrap"
118979
- },
118980
- releaseLink: {
118981
- display: "inline-block",
118982
- marginTop: 9,
118983
- color: "var(--dsw-alias-state-brand-primary, #3569e8)",
118984
- fontSize: 12,
118985
- lineHeight: "18px",
118986
- textDecoration: "none"
118987
- },
118988
- status: {
118989
- margin: "16px 0 0",
118990
- color: "var(--dsw-alias-label-secondary, #68707c)",
118991
- fontSize: 13,
118992
- lineHeight: "20px"
118993
- },
118994
- error: {
118995
- margin: "16px 0 0",
118996
- color: "var(--dsw-alias-state-error-primary, #c2413b)",
118997
- fontSize: 13,
118998
- lineHeight: "20px"
118999
- },
119000
- actions: {
119001
- display: "flex",
119002
- justifyContent: "flex-end",
119003
- gap: 10,
119004
- marginTop: 26
119005
- },
119006
- button: {
119007
- minHeight: 38,
119008
- border: "1px solid var(--dsw-alias-border-l2, #d8dce2)",
119009
- borderRadius: 9,
119010
- padding: "0 14px",
119011
- background: "var(--dsw-alias-bg-base, #fff)",
119012
- color: "var(--dsw-alias-label-primary, #17191c)",
119013
- cursor: "pointer",
119014
- font: "inherit",
119015
- fontSize: 14
119016
- },
119017
- primaryButton: {
119018
- minHeight: 38,
119019
- border: 0,
119020
- borderRadius: 9,
119021
- padding: "0 14px",
119022
- background: "var(--dsw-alias-state-brand-primary, #3569e8)",
119023
- color: "#fff",
119024
- cursor: "pointer",
119025
- font: "inherit",
119026
- fontSize: 14,
119027
- fontWeight: 600
119028
- }
119029
- };
119030
- const ACTIVE_INSTALL_PHASES = /* @__PURE__ */ new Set([
119031
- "preparing",
119032
- "downloading",
119033
- "verifying",
119034
- "installing",
119035
- "restarting"
119036
- ]);
119037
- function blockedReason(status) {
119038
- if (status.canInstallInApp) return void 0;
119039
- switch (status.installBlockedReason) {
119040
- case "local-install": return "当前为本地开发插件,不能在应用内覆盖更新。";
119041
- case "update-disabled": return "插件自动更新当前未启用。";
119042
- case "profile-unavailable": return "当前插件 Profile 不支持应用内更新。";
119043
- default: return "当前运行环境不支持应用内更新。";
119044
- }
119045
- }
119046
- function progressLabel(install) {
119047
- switch (install?.phase) {
119048
- case "preparing": return "正在准备…";
119049
- case "downloading": return "正在下载…";
119050
- case "verifying": return "正在校验…";
119051
- case "installing": return "正在安装…";
119052
- case "restarting": return "正在重启…";
119053
- default: return "更新并重启";
119054
- }
119055
- }
119056
- function ArkmePluginUpdateDialog({ status, install, busy, error, onDismiss, onInstall }) {
119057
- const installActive = install !== void 0 && ACTIVE_INSTALL_PHASES.has(install.phase);
119058
- const actionBusy = busy || installActive;
119059
- const reason = blockedReason(status);
119060
- const updateSummary = status.summary?.trim() || "此版本包含功能改进与问题修复。";
119061
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
119062
- style: styles$1.backdrop,
119063
- role: "presentation",
119064
- onMouseDown: (event) => {
119065
- if (event.target === event.currentTarget && !actionBusy) onDismiss();
119066
- },
119067
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
119068
- style: styles$1.dialog,
119069
- role: "dialog",
119070
- "aria-modal": "true",
119071
- "aria-labelledby": "arkme-plugin-update-title",
119072
- children: [
119073
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
119074
- style: styles$1.header,
119075
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
119076
- id: "arkme-plugin-update-title",
119077
- style: styles$1.title,
119078
- children: "发现插件新版本"
119079
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
119080
- style: styles$1.version,
119081
- children: [
119082
- "当前 v",
119083
- status.installedVersion,
119084
- " → 最新 v",
119085
- status.latestVersion ?? "…"
119086
- ]
119087
- })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
119088
- type: "button",
119089
- style: {
119090
- ...styles$1.closeButton,
119091
- ...actionBusy ? {
119092
- opacity: .5,
119093
- cursor: "default"
119094
- } : {}
119095
- },
119096
- "aria-label": "关闭插件更新",
119097
- disabled: actionBusy,
119098
- onClick: onDismiss,
119099
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(n$3, { size: 18 })
119100
- })]
119101
- }),
119102
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
119103
- style: styles$1.notes,
119104
- children: [
119105
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
119106
- style: styles$1.notesTitle,
119107
- children: "更新说明"
119108
- }),
119109
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
119110
- style: styles$1.notesBody,
119111
- children: updateSummary
119112
- }),
119113
- status.releaseNotesUrl !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
119114
- style: styles$1.releaseLink,
119115
- href: status.releaseNotesUrl,
119116
- target: "_blank",
119117
- rel: "noreferrer",
119118
- children: "查看完整更新说明"
119119
- })
119120
- ]
119121
- }),
119122
- reason !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
119123
- style: styles$1.status,
119124
- children: reason
119125
- }),
119126
- installActive && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
119127
- style: styles$1.status,
119128
- role: "status",
119129
- children: install.message
119130
- }),
119131
- error.trim() !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
119132
- style: styles$1.error,
119133
- role: "alert",
119134
- children: error.trim()
119135
- }),
119136
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
119137
- style: styles$1.actions,
119138
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
119139
- type: "button",
119140
- style: styles$1.button,
119141
- disabled: actionBusy,
119142
- onClick: onDismiss,
119143
- children: "稍后"
119144
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
119145
- type: "button",
119146
- disabled: actionBusy || reason !== void 0,
119147
- style: {
119148
- ...styles$1.primaryButton,
119149
- ...actionBusy || reason !== void 0 ? {
119150
- opacity: .5,
119151
- cursor: "default"
119152
- } : {}
119153
- },
119154
- onClick: onInstall,
119155
- children: progressLabel(install)
119156
- })]
119157
- })
119158
- ]
119159
- })
119160
- });
119161
- }
119162
- //#endregion
119163
118135
  //#region src/client/ArkmeConversationSurface.tsx
119164
118136
  const root = {
119165
118137
  width: "100%",
@@ -122346,7 +121318,6 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
122346
121318
  en: arkmeLoginEn
122347
121319
  }), "dsh-arkme: login dictionaries");
122348
121320
  const loginT = ctx.locale.bind(ARKME_LOGIN_LOCALE_NAMESPACE);
122349
- ctx.effect(() => arkmePluginUpdateStore.start(), "dsh-arkme: client plugin update status");
122350
121321
  ctx.effect(() => arkmeAppUpdateStore.start(), "dsh-arkme: client app update status");
122351
121322
  ctx.effect(() => {
122352
121323
  let disposed = false;
@@ -122540,8 +121511,6 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
122540
121511
  exports.ArkmePersistentDetails = ArkmePersistentDetails;
122541
121512
  exports.ArkmePersistentSidebar = ArkmePersistentSidebar;
122542
121513
  exports.ArkmePersistentWorkspace = ArkmePersistentWorkspace;
122543
- exports.ArkmePluginUpdateDialog = ArkmePluginUpdateDialog;
122544
- exports.ArkmePluginUpdateStore = ArkmePluginUpdateStore;
122545
121514
  exports.ArkmePrivateCallMenu = ArkmePrivateCallMenu;
122546
121515
  exports.ArkmeProductNavigation = ArkmeProductNavigation;
122547
121516
  exports.ArkmeRecordingSurface = ArkmeRecordingSurface;
@@ -122560,7 +121529,6 @@ yoga yokohama you youtube yt yun za zappos zara zero zip zm zone zuerich zw
122560
121529
  exports.DeepSeekHarnessSurface = DeepSeekHarnessSurface;
122561
121530
  exports.apply = apply;
122562
121531
  exports.arkmeAppUpdateStore = arkmeAppUpdateStore;
122563
- exports.arkmePluginUpdateStore = arkmePluginUpdateStore;
122564
121532
  exports.consumeExtensionShareDeepLink = consumeExtensionShareDeepLink;
122565
121533
  exports.consumeExtensionShareDeepLinkIntent = consumeExtensionShareDeepLinkIntent;
122566
121534
  exports.deepSeekHarnessEmbedRequested = deepSeekHarnessEmbedRequested;