@dxos/plugin-native 0.9.1-staging.ee54ba693a → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/lib/NativePlugin.mjs +30 -0
  2. package/dist/lib/NativePlugin.mjs.map +1 -0
  3. package/dist/lib/capabilities.mjs +11 -0
  4. package/dist/lib/capabilities.mjs.map +1 -0
  5. package/dist/lib/chunk-NativeSettings.mjs +102 -0
  6. package/dist/lib/chunk-NativeSettings.mjs.map +1 -0
  7. package/dist/lib/{neutral/chunk-WU6IZ56J.mjs → chunk-meta.mjs} +15 -24
  8. package/dist/lib/chunk-meta.mjs.map +1 -0
  9. package/dist/lib/chunk-ollama.mjs +307 -0
  10. package/dist/lib/chunk-ollama.mjs.map +1 -0
  11. package/dist/lib/chunk-react-surface.mjs +16 -0
  12. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  13. package/dist/lib/chunk-settings.mjs +23 -0
  14. package/dist/lib/chunk-settings.mjs.map +1 -0
  15. package/dist/lib/chunk-spotlight-listener.mjs +61 -0
  16. package/dist/lib/chunk-spotlight-listener.mjs.map +1 -0
  17. package/dist/lib/chunk-updater.mjs +212 -0
  18. package/dist/lib/chunk-updater.mjs.map +1 -0
  19. package/dist/lib/containers.mjs +7 -0
  20. package/dist/lib/containers.mjs.map +1 -0
  21. package/dist/lib/index.mjs +2 -0
  22. package/dist/lib/meta.mjs +2 -0
  23. package/dist/lib/plugin.mjs +8 -0
  24. package/dist/lib/plugin.mjs.map +1 -0
  25. package/dist/lib/translations.mjs +26 -0
  26. package/dist/lib/translations.mjs.map +1 -0
  27. package/dist/lib/types.mjs +33 -0
  28. package/dist/lib/types.mjs.map +1 -0
  29. package/dist/types/src/capabilities/ollama.d.ts +1 -1
  30. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  31. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  32. package/dist/types/src/capabilities/settings.d.ts +1 -1
  33. package/dist/types/src/capabilities/spotlight-listener.d.ts +1 -1
  34. package/dist/types/src/capabilities/updater.d.ts +1 -1
  35. package/dist/types/src/containers/NativeSettings/NativeSettings.d.ts +4 -4
  36. package/dist/types/src/containers/NativeSettings/NativeSettings.d.ts.map +1 -1
  37. package/dist/types/src/types/NativeCapabilities.d.ts +1 -1
  38. package/dist/types/src/types/NativeCapabilities.d.ts.map +1 -1
  39. package/dist/types/src/types/Update.d.ts +1 -1
  40. package/dist/types/src/types/Update.d.ts.map +1 -1
  41. package/dist/types/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +26 -25
  43. package/src/capabilities/ollama.ts +1 -1
  44. package/src/capabilities/{react-surface.tsx → react-surface.ts} +2 -7
  45. package/src/capabilities/updater.ts +1 -1
  46. package/src/containers/NativeSettings/NativeSettings.tsx +9 -6
  47. package/src/types/NativeCapabilities.ts +1 -1
  48. package/src/types/Update.ts +1 -1
  49. package/dist/lib/neutral/NativePlugin.mjs +0 -46
  50. package/dist/lib/neutral/NativePlugin.mjs.map +0 -7
  51. package/dist/lib/neutral/NativeSettings-33K63AVG.mjs +0 -120
  52. package/dist/lib/neutral/NativeSettings-33K63AVG.mjs.map +0 -7
  53. package/dist/lib/neutral/capabilities/index.mjs +0 -17
  54. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  55. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  56. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  57. package/dist/lib/neutral/chunk-WU6IZ56J.mjs.map +0 -7
  58. package/dist/lib/neutral/containers/index.mjs +0 -9
  59. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  60. package/dist/lib/neutral/index.mjs +0 -8
  61. package/dist/lib/neutral/index.mjs.map +0 -7
  62. package/dist/lib/neutral/meta.json +0 -1
  63. package/dist/lib/neutral/meta.mjs +0 -8
  64. package/dist/lib/neutral/meta.mjs.map +0 -7
  65. package/dist/lib/neutral/ollama-HZEXAT2P.mjs +0 -312
  66. package/dist/lib/neutral/ollama-HZEXAT2P.mjs.map +0 -7
  67. package/dist/lib/neutral/plugin.mjs +0 -12
  68. package/dist/lib/neutral/plugin.mjs.map +0 -7
  69. package/dist/lib/neutral/react-surface-YST5DQA3.mjs +0 -27
  70. package/dist/lib/neutral/react-surface-YST5DQA3.mjs.map +0 -7
  71. package/dist/lib/neutral/settings-S5MFUI42.mjs +0 -28
  72. package/dist/lib/neutral/settings-S5MFUI42.mjs.map +0 -7
  73. package/dist/lib/neutral/spotlight-listener-K7S6LGL3.mjs +0 -48
  74. package/dist/lib/neutral/spotlight-listener-K7S6LGL3.mjs.map +0 -7
  75. package/dist/lib/neutral/translations.mjs +0 -34
  76. package/dist/lib/neutral/translations.mjs.map +0 -7
  77. package/dist/lib/neutral/types/index.mjs +0 -31
  78. package/dist/lib/neutral/types/index.mjs.map +0 -7
  79. package/dist/lib/neutral/updater-5ETKR4S3.mjs +0 -244
  80. package/dist/lib/neutral/updater-5ETKR4S3.mjs.map +0 -7
@@ -1,34 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/translations.ts
4
- import { meta } from "#meta";
5
- var translations = [
6
- {
7
- "en-US": {
8
- [meta.profile.key]: {
9
- "update-ready.label": "Ready to update",
10
- "update-ready.description": "A new version of Composer is available.",
11
- "update.label": "Update",
12
- "update.alt": "Relaunch the app to update",
13
- "settings.updates.label": "Updates",
14
- "settings.updates.check.label": "Check for updates",
15
- "settings.updates.checking.label": "Checking\u2026",
16
- "settings.updates.update-now.label": "Update now",
17
- "settings.updates.downloading.label": "Downloading\u2026",
18
- "settings.updates.relaunch.label": "Restart to install",
19
- "settings.updates.idle.message": "Check now for a newer version of Composer.",
20
- "settings.updates.checking.message": "Checking for updates\u2026",
21
- "settings.updates.up-to-date.message": "You are running the latest version of Composer. Checked {{checkedAt}}.",
22
- "settings.updates.available.message": "Version {{version}} is available.",
23
- "settings.updates.downloading.message": "Downloading\u2026 {{percent}}%",
24
- "settings.updates.ready.message": "Update ready. Restart Composer to apply.",
25
- "settings.updates.failed.message": "Update failed: {{error}}",
26
- "settings.updates.unsupported.message": "Updates are not available on this platform."
27
- }
28
- }
29
- }
30
- ];
31
- export {
32
- translations
33
- };
34
- //# sourceMappingURL=translations.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.profile.key]: {\n 'update-ready.label': 'Ready to update',\n 'update-ready.description': 'A new version of Composer is available.',\n 'update.label': 'Update',\n 'update.alt': 'Relaunch the app to update',\n 'settings.updates.label': 'Updates',\n 'settings.updates.check.label': 'Check for updates',\n 'settings.updates.checking.label': 'Checking…',\n 'settings.updates.update-now.label': 'Update now',\n 'settings.updates.downloading.label': 'Downloading…',\n 'settings.updates.relaunch.label': 'Restart to install',\n 'settings.updates.idle.message': 'Check now for a newer version of Composer.',\n 'settings.updates.checking.message': 'Checking for updates…',\n 'settings.updates.up-to-date.message': 'You are running the latest version of Composer. Checked {{checkedAt}}.',\n 'settings.updates.available.message': 'Version {{version}} is available.',\n 'settings.updates.downloading.message': 'Downloading… {{percent}}%',\n 'settings.updates.ready.message': 'Update ready. Restart Composer to apply.',\n 'settings.updates.failed.message': 'Update failed: {{error}}',\n 'settings.updates.unsupported.message': 'Updates are not available on this platform.',\n },\n },\n },\n] as const satisfies Resource[];\n"],
5
- "mappings": ";;;AAMA,SAASA,YAAY;AAEd,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACD,KAAKE,QAAQC,GAAG,GAAG;QAClB,sBAAsB;QACtB,4BAA4B;QAC5B,gBAAgB;QAChB,cAAc;QACd,0BAA0B;QAC1B,gCAAgC;QAChC,mCAAmC;QACnC,qCAAqC;QACrC,sCAAsC;QACtC,mCAAmC;QACnC,iCAAiC;QACjC,qCAAqC;QACrC,uCAAuC;QACvC,sCAAsC;QACtC,wCAAwC;QACxC,kCAAkC;QAClC,mCAAmC;QACnC,wCAAwC;MAC1C;IACF;EACF;;",
6
- "names": ["meta", "translations", "profile", "key"]
7
- }
@@ -1,31 +0,0 @@
1
- import {
2
- __export
3
- } from "../chunk-J5LGTIGS.mjs";
4
-
5
- // src/types/NativeCapabilities.ts
6
- var NativeCapabilities_exports = {};
7
- __export(NativeCapabilities_exports, {
8
- Settings: () => Settings,
9
- UpdateManager: () => UpdateManager
10
- });
11
- import { Capability } from "@dxos/app-framework";
12
- import { meta } from "#meta";
13
- var Settings = Capability.make(`${meta.profile.key}.capability.settings`);
14
- var UpdateManager = Capability.make(`${meta.profile.key}.capability.update-manager`);
15
-
16
- // src/types/Settings.ts
17
- var Settings_exports = {};
18
- __export(Settings_exports, {
19
- Settings: () => Settings2
20
- });
21
- import * as Schema from "effect/Schema";
22
- var Settings2 = Schema.mutable(Schema.Struct({}));
23
-
24
- // src/types/Update.ts
25
- var Update_exports = {};
26
- export {
27
- NativeCapabilities_exports as NativeCapabilities,
28
- Settings_exports as Settings,
29
- Update_exports as Update
30
- };
31
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/types/NativeCapabilities.ts", "../../../../src/types/Settings.ts", "../../../../src/types/Update.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type { Atom } from '@effect-atom/atom-react';\n\nimport { Capability } from '@dxos/app-framework';\n\nimport { meta } from '#meta';\n\n// Inline imports to avoid `Settings` / `Update` namespace aliases colliding with the\n// capability constants exported below.\nexport const Settings = Capability.make<Atom.Writable<import('./Settings').Settings>>(\n `${meta.profile.key}.capability.settings`,\n);\nexport const UpdateManager = Capability.make<import('./Update').Manager>(\n `${meta.profile.key}.capability.update-manager`,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nexport const Settings = Schema.mutable(Schema.Struct({}));\n\nexport interface Settings extends Schema.Schema.Type<typeof Settings> {}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\n\n// @import-as-namespace\n\nexport type Status =\n | { kind: 'unsupported' }\n | { kind: 'idle' }\n | { kind: 'checking' }\n | { kind: 'up-to-date'; checkedAt: number }\n | { kind: 'available'; version: string }\n | { kind: 'downloading'; downloaded: number; contentLength: number }\n | { kind: 'ready' }\n | { kind: 'failed'; error: string };\n\nexport type Manager = {\n status: Atom.Writable<Status>;\n check: () => Promise<void>;\n install: () => Promise<void>;\n relaunch: () => Promise<void>;\n};\n"],
5
- "mappings": ";;;;;AAAA;;;;;AAQA,SAASA,kBAAkB;AAE3B,SAASC,YAAY;AAId,IAAMC,WAAWF,WAAWG,KACjC,GAAGF,KAAKG,QAAQC,GAAG,sBAAsB;AAEpC,IAAMC,gBAAgBN,WAAWG,KACtC,GAAGF,KAAKG,QAAQC,GAAG,4BAA4B;;;AClBjD;;kBAAAE;;AAMA,YAAYC,YAAY;AAEjB,IAAMD,YAAkBE,eAAeC,cAAO,CAAC,CAAA,CAAA;;;ACRtD;",
6
- "names": ["Capability", "meta", "Settings", "make", "profile", "key", "UpdateManager", "Settings", "Schema", "mutable", "Struct"]
7
- }
@@ -1,244 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/capabilities/updater.ts
4
- import { Atom } from "@effect-atom/atom-react";
5
- import { type } from "@tauri-apps/plugin-os";
6
- import { relaunch } from "@tauri-apps/plugin-process";
7
- import * as Updater from "@tauri-apps/plugin-updater";
8
- import * as Duration from "effect/Duration";
9
- import * as Effect from "effect/Effect";
10
- import * as Fiber from "effect/Fiber";
11
- import * as Match from "effect/Match";
12
- import * as Schedule from "effect/Schedule";
13
- import { Capabilities, Capability } from "@dxos/app-framework";
14
- import { LayoutOperation } from "@dxos/app-toolkit";
15
- import { log } from "@dxos/log";
16
- import { meta } from "#meta";
17
- import { NativeCapabilities } from "#types";
18
-
19
- // src/constants.ts
20
- var TAURI_LOCALHOST_PORT = "26777";
21
-
22
- // src/capabilities/updater.ts
23
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-native/src/capabilities/updater.ts";
24
- var SUPPORTS_OTA = [
25
- "linux",
26
- "macos",
27
- "windows"
28
- ];
29
- var safeCheck = async () => {
30
- try {
31
- return {
32
- ok: true,
33
- update: await Updater.check()
34
- };
35
- } catch (error) {
36
- log.error("failed to check for updates", {
37
- error
38
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 31, S: void 0 });
39
- return {
40
- ok: false,
41
- error: formatError(error)
42
- };
43
- }
44
- };
45
- var safeDownloadAndInstall = async (update, onEvent) => {
46
- try {
47
- await update.downloadAndInstall(onEvent);
48
- return {
49
- ok: true
50
- };
51
- } catch (error) {
52
- log.error("failed to download and install update", {
53
- error
54
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 47, S: void 0 });
55
- return {
56
- ok: false,
57
- error: formatError(error)
58
- };
59
- }
60
- };
61
- var formatError = (error) => {
62
- if (typeof error === "string") {
63
- return error;
64
- }
65
- if (error instanceof Error) {
66
- return error.message;
67
- }
68
- return String(error);
69
- };
70
- var updater_default = Capability.makeModule(Effect.fnUntraced(function* () {
71
- const platform = type();
72
- const isDevServer = window.location.port !== TAURI_LOCALHOST_PORT;
73
- const enabled = SUPPORTS_OTA.includes(platform) && !isDevServer;
74
- const registry = yield* Capability.get(Capabilities.AtomRegistry);
75
- const { invoke } = yield* Capability.get(Capabilities.OperationInvoker);
76
- const statusAtom = Atom.make(enabled ? {
77
- kind: "idle"
78
- } : {
79
- kind: "unsupported"
80
- }).pipe(Atom.keepAlive);
81
- let pendingUpdate = null;
82
- const doCheck = async () => {
83
- registry.set(statusAtom, {
84
- kind: "checking"
85
- });
86
- log.info("checking for updates", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 84, S: this });
87
- const result = await safeCheck();
88
- if (!result.ok) {
89
- pendingUpdate = null;
90
- registry.set(statusAtom, {
91
- kind: "failed",
92
- error: result.error
93
- });
94
- return null;
95
- }
96
- const update = result.update;
97
- if (!update?.available) {
98
- pendingUpdate = null;
99
- registry.set(statusAtom, {
100
- kind: "up-to-date",
101
- checkedAt: Date.now()
102
- });
103
- return null;
104
- }
105
- log.info("update available", {
106
- version: update.version
107
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 103, S: this });
108
- pendingUpdate = update;
109
- registry.set(statusAtom, {
110
- kind: "available",
111
- version: update.version
112
- });
113
- return update;
114
- };
115
- const doInstall = async () => {
116
- const update = pendingUpdate;
117
- if (!update) {
118
- return false;
119
- }
120
- let downloaded = 0;
121
- let contentLength = 0;
122
- registry.set(statusAtom, {
123
- kind: "downloading",
124
- downloaded: 0,
125
- contentLength: 0
126
- });
127
- const onEvent = Match.type().pipe(Match.when({
128
- event: "Started"
129
- }, (event) => {
130
- contentLength = event.data.contentLength ?? 0;
131
- registry.set(statusAtom, {
132
- kind: "downloading",
133
- downloaded,
134
- contentLength
135
- });
136
- }), Match.when({
137
- event: "Progress"
138
- }, (event) => {
139
- downloaded += event.data.chunkLength;
140
- registry.set(statusAtom, {
141
- kind: "downloading",
142
- downloaded,
143
- contentLength
144
- });
145
- }), Match.when({
146
- event: "Finished"
147
- }, () => {
148
- log.info("download completed", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 147, S: this });
149
- }), Match.exhaustive);
150
- const result = await safeDownloadAndInstall(update, onEvent);
151
- if (result.ok) {
152
- registry.set(statusAtom, {
153
- kind: "ready"
154
- });
155
- return true;
156
- }
157
- registry.set(statusAtom, {
158
- kind: "failed",
159
- error: result.error
160
- });
161
- return false;
162
- };
163
- const manager = {
164
- status: statusAtom,
165
- check: async () => {
166
- if (!enabled) {
167
- return;
168
- }
169
- await doCheck();
170
- },
171
- install: async () => {
172
- if (!enabled) {
173
- return;
174
- }
175
- await doInstall();
176
- },
177
- relaunch: async () => {
178
- await relaunch();
179
- }
180
- };
181
- const managerContribution = Capability.contributes(NativeCapabilities.UpdateManager, manager);
182
- if (!enabled) {
183
- log.info("updater disabled", {
184
- platform,
185
- port: window.location.port
186
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 182, S: this });
187
- return [
188
- managerContribution
189
- ];
190
- }
191
- const backgroundAction = Effect.gen(function* () {
192
- const update = yield* Effect.promise(() => doCheck());
193
- if (!update) {
194
- return true;
195
- }
196
- const ok = yield* Effect.promise(() => doInstall());
197
- if (!ok) {
198
- return true;
199
- }
200
- yield* invoke(LayoutOperation.AddToast, {
201
- id: `${meta.profile.key}.update-ready`,
202
- title: [
203
- "update-ready.label",
204
- {
205
- ns: meta.profile.key
206
- }
207
- ],
208
- description: [
209
- "update-ready.description",
210
- {
211
- ns: meta.profile.key
212
- }
213
- ],
214
- duration: Infinity,
215
- actionLabel: [
216
- "update.label",
217
- {
218
- ns: meta.profile.key
219
- }
220
- ],
221
- actionAlt: [
222
- "update.alt",
223
- {
224
- ns: meta.profile.key
225
- }
226
- ],
227
- onAction: () => relaunch()
228
- });
229
- return false;
230
- });
231
- const schedule = Schedule.fixed(Duration.hours(1)).pipe(Schedule.whileInput((keepChecking) => keepChecking));
232
- const fiber = yield* backgroundAction.pipe(Effect.repeat(schedule), Effect.forkDaemon);
233
- log.info("updater module initialized, update check scheduled", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 234, S: this });
234
- return [
235
- managerContribution,
236
- // Return the interruption effect directly; Fiber.interrupt is async and would throw
237
- // AsyncFiberException if wrapped in Effect.runSync.
238
- Capability.contributes(Capabilities.Null, null, () => Fiber.interrupt(fiber))
239
- ];
240
- }));
241
- export {
242
- updater_default as default
243
- };
244
- //# sourceMappingURL=updater-5ETKR4S3.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/updater.ts", "../../../src/constants.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport { type } from '@tauri-apps/plugin-os';\nimport { relaunch } from '@tauri-apps/plugin-process';\nimport * as Updater from '@tauri-apps/plugin-updater';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as Match from 'effect/Match';\nimport * as Schedule from 'effect/Schedule';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { log } from '@dxos/log';\n\nimport { meta } from '#meta';\nimport { NativeCapabilities, type Update } from '#types';\n\nimport { TAURI_LOCALHOST_PORT } from '../constants';\n\nconst SUPPORTS_OTA = ['linux', 'macos', 'windows'];\n\n/** Safe wrapper around Updater.check(). Distinguishes \"no update\" (ok with null update) from a thrown error. */\nconst safeCheck = async (): Promise<{ ok: true; update: Updater.Update | null } | { ok: false; error: string }> => {\n try {\n return { ok: true, update: await Updater.check() };\n } catch (error) {\n log.error('failed to check for updates', { error });\n return { ok: false, error: formatError(error) };\n }\n};\n\n/** Safe wrapper around update.downloadAndInstall(). */\nconst safeDownloadAndInstall = async (\n update: Updater.Update,\n onEvent: (event: Updater.DownloadEvent) => void,\n): Promise<{ ok: true } | { ok: false; error: string }> => {\n try {\n await update.downloadAndInstall(onEvent);\n return { ok: true };\n } catch (error) {\n log.error('failed to download and install update', { error });\n return { ok: false, error: formatError(error) };\n }\n};\n\n/** Extract a user-readable error string from whatever the Tauri updater threw. */\nconst formatError = (error: unknown): string => {\n if (typeof error === 'string') {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const platform = type();\n const isDevServer = window.location.port !== TAURI_LOCALHOST_PORT;\n const enabled = SUPPORTS_OTA.includes(platform) && !isDevServer;\n\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const { invoke } = yield* Capability.get(Capabilities.OperationInvoker);\n\n const statusAtom = Atom.make<Update.Status>(enabled ? { kind: 'idle' } : { kind: 'unsupported' }).pipe(\n Atom.keepAlive,\n );\n\n // Updater.Update is a class with instance methods (downloadAndInstall) and can't live in an\n // atom value; cache it here between check and install.\n let pendingUpdate: Updater.Update | null = null;\n\n // Core: check for an update and update the status atom. Returns the update if available.\n const doCheck = async (): Promise<Updater.Update | null> => {\n registry.set(statusAtom, { kind: 'checking' });\n log.info('checking for updates');\n const result = await safeCheck();\n if (!result.ok) {\n pendingUpdate = null;\n registry.set(statusAtom, { kind: 'failed', error: result.error });\n return null;\n }\n const update = result.update;\n if (!update?.available) {\n pendingUpdate = null;\n registry.set(statusAtom, { kind: 'up-to-date', checkedAt: Date.now() });\n return null;\n }\n log.info('update available', { version: update.version });\n pendingUpdate = update;\n registry.set(statusAtom, { kind: 'available', version: update.version });\n return update;\n };\n\n // Core: download + install the cached pending update, streaming progress to the status atom.\n const doInstall = async (): Promise<boolean> => {\n const update = pendingUpdate;\n if (!update) {\n return false;\n }\n let downloaded = 0;\n let contentLength = 0;\n registry.set(statusAtom, { kind: 'downloading', downloaded: 0, contentLength: 0 });\n const onEvent = Match.type<Updater.DownloadEvent>().pipe(\n Match.when({ event: 'Started' }, (event) => {\n contentLength = event.data.contentLength ?? 0;\n registry.set(statusAtom, { kind: 'downloading', downloaded, contentLength });\n }),\n Match.when({ event: 'Progress' }, (event) => {\n downloaded += event.data.chunkLength;\n registry.set(statusAtom, { kind: 'downloading', downloaded, contentLength });\n }),\n Match.when({ event: 'Finished' }, () => {\n log.info('download completed');\n }),\n Match.exhaustive,\n );\n const result = await safeDownloadAndInstall(update, onEvent);\n if (result.ok) {\n registry.set(statusAtom, { kind: 'ready' });\n return true;\n }\n registry.set(statusAtom, { kind: 'failed', error: result.error });\n return false;\n };\n\n const manager: Update.Manager = {\n status: statusAtom,\n check: async () => {\n if (!enabled) {\n return;\n }\n await doCheck();\n },\n install: async () => {\n if (!enabled) {\n return;\n }\n await doInstall();\n },\n relaunch: async () => {\n await relaunch();\n },\n };\n\n const managerContribution = Capability.contributes(NativeCapabilities.UpdateManager, manager);\n\n if (!enabled) {\n log.info('updater disabled', { platform, port: window.location.port });\n return [managerContribution];\n }\n\n // Background flow: periodic check + auto-install + toast when ready.\n // The toast is the entry point for users who weren't watching the settings panel.\n const backgroundAction = Effect.gen(function* () {\n const update = yield* Effect.promise(() => doCheck());\n if (!update) {\n return true;\n }\n const ok = yield* Effect.promise(() => doInstall());\n if (!ok) {\n return true;\n }\n yield* invoke(LayoutOperation.AddToast, {\n id: `${meta.profile.key}.update-ready`,\n title: ['update-ready.label', { ns: meta.profile.key }],\n description: ['update-ready.description', { ns: meta.profile.key }],\n duration: Infinity,\n actionLabel: ['update.label', { ns: meta.profile.key }],\n actionAlt: ['update.alt', { ns: meta.profile.key }],\n onAction: () => relaunch(),\n });\n return false;\n });\n\n const schedule = Schedule.fixed(Duration.hours(1)).pipe(\n Schedule.whileInput((keepChecking: boolean) => keepChecking),\n );\n const fiber = yield* backgroundAction.pipe(Effect.repeat(schedule), Effect.forkDaemon);\n log.info('updater module initialized, update check scheduled');\n\n return [\n managerContribution,\n // Return the interruption effect directly; Fiber.interrupt is async and would throw\n // AsyncFiberException if wrapped in Effect.runSync.\n Capability.contributes(Capabilities.Null, null, () => Fiber.interrupt(fiber)),\n ];\n }),\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n/// Stable port for the Tauri localhost asset server in production builds.\n/// Must match LOCALHOST_PORT in src-tauri/src/lib.rs.\nexport const TAURI_LOCALHOST_PORT = '26777';\n"],
5
- "mappings": "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",
6
- "names": ["Atom", "type", "relaunch", "Updater", "Duration", "Effect", "Fiber", "Match", "Schedule", "Capabilities", "Capability", "LayoutOperation", "log", "meta", "NativeCapabilities", "TAURI_LOCALHOST_PORT", "SUPPORTS_OTA", "update", "log", "error", "onEvent", "ok", "String", "Capability", "isDevServer", "window", "TAURI_LOCALHOST_PORT", "enabled", "registry", "get", "Capabilities", "statusAtom", "make", "kind", "pipe", "info", "result", "pendingUpdate", "set", "checkedAt", "version", "downloaded", "contentLength", "Match", "event", "safeDownloadAndInstall", "manager", "check", "install", "relaunch", "platform", "port", "managerContribution", "invoke", "title", "description", "duration", "actionLabel", "actionAlt", "onAction", "schedule"]
7
- }