From 5d7f8a0a587a133ff2058692f7c61e1cbb9d361e Mon Sep 17 00:00:00 2001 From: Izaak Kuipers Date: Tue, 29 Sep 2026 21:41:55 +0200 Subject: [PATCH 1/7] fixes --- src/apps/core/loginapp/runtime.ts | 6 ++++ src/ts/basic/engine/index.ts | 1 + src/ts/kernel/mods/fs/drives/admin.ts | 32 +++++++++++++++---- src/ts/kernel/mods/fs/drives/userfs.ts | 8 ++--- .../mods/server/connectors/ShareConnector.ts | 6 ++-- src/ts/user/store.ts | 2 ++ vite.config.ts | 1 + 7 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/apps/core/loginapp/runtime.ts b/src/apps/core/loginapp/runtime.ts index af39e6917..b9f30c7d0 100755 --- a/src/apps/core/loginapp/runtime.ts +++ b/src/apps/core/loginapp/runtime.ts @@ -237,6 +237,9 @@ export class LoginAppRuntime extends AppProcess implements ILoginAppRuntime { }; if (userDaemon) { + broadcast("Notifying login activity"); + await userDaemon.activity?.logActivity("shutdown"); + broadcast("Stopping Service Host"); await userDaemon.serviceHost?.spinDown(broadcast); @@ -268,6 +271,9 @@ export class LoginAppRuntime extends AppProcess implements ILoginAppRuntime { this.loadingStatus.set(`Restarting...`); if (userDaemon) { + broadcast("Notifying login activity"); + await userDaemon.activity?.logActivity("shutdown"); + broadcast("Stopping Service Host"); await userDaemon.serviceHost?.spinDown(broadcast); diff --git a/src/ts/basic/engine/index.ts b/src/ts/basic/engine/index.ts index ef97157cc..9b1d43159 100644 --- a/src/ts/basic/engine/index.ts +++ b/src/ts/basic/engine/index.ts @@ -430,6 +430,7 @@ export class ArcBasicEngine { await this.setVariable("ERR", message); if (exit) { + this.HALT = true; const line = this.source[this.programCounter]; const lineNumber = `${this.programCounter + 1}`; const columnNumber = Math.max(columnIndexHint ? line.indexOf(columnIndexHint) : 0, 0); diff --git a/src/ts/kernel/mods/fs/drives/admin.ts b/src/ts/kernel/mods/fs/drives/admin.ts index 1690c4873..1a6ad153b 100644 --- a/src/ts/kernel/mods/fs/drives/admin.ts +++ b/src/ts/kernel/mods/fs/drives/admin.ts @@ -1,16 +1,18 @@ import type { IFilesystemDrive } from "$interfaces/IFilesystemDrive"; -import { Daemon } from "$ts/env"; +import { Daemon, Server } from "$ts/env"; import { FilesystemDrive } from "$ts/kernel/mods/fs/drives/generic"; import { Backend } from "$ts/kernel/mods/server/axios"; -import { ToAxiosProgress } from "$ts/util"; +import { authcode, ToAxiosProgress } from "$ts/util"; import { arrayBufferToBlob } from "$ts/util/convert"; import { toForm } from "$ts/util/form"; import { getItemNameFromPath, join } from "$ts/util/fs"; import type { DirectoryReadReturn, DriveCapabilities, + ExtendedStat, FilesystemProgressCallback, FilesystemStat, + FsAccess, RecursiveDirectoryReadReturn, UserQuota, } from "$types/system/fs"; @@ -184,18 +186,34 @@ export class AdminFileSystem extends FilesystemDrive implements IFilesystemDrive } async direct(path: string): Promise { - const content = await this.readFile(path, () => {}); - if (!content) return undefined; + try { + const response = await Backend.post( + `/admin/afs/accessors/${path}`, + {}, + { headers: { Authorization: `Bearer ${Daemon!.token}` } } + ); - const blob = arrayBufferToBlob(content); - return URL.createObjectURL(blob); + const data = response.data as FsAccess; + + return `${this.server.url}/admin/afs/direct/${data.userId}/${data.accessor}${authcode()}`; + } catch { + return undefined; + } } async stat(path: string): Promise { try { const response = await Backend.get(`/admin/afs/stat/${path}`, { headers: { Authorization: `Bearer ${Daemon!.token}` } }); + const data = response.data as ExtendedStat; + + if (data.modifiers?.createdBy?.user?.profilePicture) { + data.modifiers.createdBy.user.profilePicture = `${Server.url}${data.modifiers.createdBy.user.profilePicture}${authcode()}`; + } + if (data.modifiers?.lastWrite?.user?.profilePicture) { + data.modifiers.lastWrite.user.profilePicture = `${Server.url}${data.modifiers.lastWrite.user.profilePicture}${authcode()}`; + } - return response.data as FilesystemStat; + return data as FilesystemStat; } catch { return undefined; } diff --git a/src/ts/kernel/mods/fs/drives/userfs.ts b/src/ts/kernel/mods/fs/drives/userfs.ts index dc4437833..cf1ecb723 100644 --- a/src/ts/kernel/mods/fs/drives/userfs.ts +++ b/src/ts/kernel/mods/fs/drives/userfs.ts @@ -247,11 +247,11 @@ export class UserDrive extends FilesystemDrive implements IFilesystemDrive { const response = await Backend.get(`/fs/stat/${path}`, { headers: { Authorization: `Bearer ${Daemon!.token}` } }); const data = response.data as ExtendedStat; - if (data.modifiers?.createdBy?.user) { - data.modifiers.createdBy.user.profilePicture = `${Server.url}${data.modifiers.createdBy.user.profilePicture}`; + if (data.modifiers?.createdBy?.user?.profilePicture) { + data.modifiers.createdBy.user.profilePicture = `${Server.url}${data.modifiers.createdBy.user.profilePicture}${authcode()}`; } - if (data.modifiers?.lastWrite?.user) { - data.modifiers.lastWrite.user.profilePicture = `${Server.url}${data.modifiers.lastWrite.user.profilePicture}`; + if (data.modifiers?.lastWrite?.user?.profilePicture) { + data.modifiers.lastWrite.user.profilePicture = `${Server.url}${data.modifiers.lastWrite.user.profilePicture}${authcode()}`; } return data as ExtendedStat; diff --git a/src/ts/kernel/mods/server/connectors/ShareConnector.ts b/src/ts/kernel/mods/server/connectors/ShareConnector.ts index 366682407..54ff89af6 100644 --- a/src/ts/kernel/mods/server/connectors/ShareConnector.ts +++ b/src/ts/kernel/mods/server/connectors/ShareConnector.ts @@ -2,7 +2,7 @@ import type { ICommandResult } from "$interfaces/ICommandResult"; import type { IShareConnector } from "$interfaces/modules/server/IShareConnector"; import { Server } from "$ts/env"; import { CommandResult } from "$ts/result"; -import { ToAxiosProgress } from "$ts/util"; +import { authcode, ToAxiosProgress } from "$ts/util"; import { arrayBufferToBlob } from "$ts/util/convert"; import { toForm } from "$ts/util/form"; import { getItemNameFromPath, join } from "$ts/util/fs"; @@ -131,8 +131,8 @@ export class ShareConnector extends ServerConnector implements IShareConnector { const response = CommandResult.FromResponse(await this.server.get(`/stat/${shareId}/${path}`)); if (!response.success) return response as ICommandResult; - response.result.modifiers.createdBy.user.profilePicture = `${Server.url}${response.result.modifiers.createdBy.user.profilePicture}`; - response.result.modifiers.lastWrite.user.profilePicture = `${Server.url}${response.result.modifiers.lastWrite.user.profilePicture}`; + response.result.modifiers.createdBy.user.profilePicture = `${Server.url}${response.result.modifiers.createdBy.user.profilePicture}${authcode()}`; + response.result.modifiers.lastWrite.user.profilePicture = `${Server.url}${response.result.modifiers.lastWrite.user.profilePicture}${authcode()}`; return response; } catch (e) { diff --git a/src/ts/user/store.ts b/src/ts/user/store.ts index 9ed9fbf74..691e6cd1d 100644 --- a/src/ts/user/store.ts +++ b/src/ts/user/store.ts @@ -198,12 +198,14 @@ export const ActivityIconTranslations = { unknown: "shield-question", login: "log-in", logout: "log-out", + shutdown: "power", }; export const ActivityCaptionTranslations = { unknown: "Unknown activity", login: "Logged in", logout: "Logged out", + shutdown: "Shut down ArcOS", }; export const TimeFrames: Record = { diff --git a/vite.config.ts b/vite.config.ts index 42b29dfa0..27f693640 100755 --- a/vite.config.ts +++ b/vite.config.ts @@ -41,6 +41,7 @@ export default defineConfig({ }, assetsInlineLimit: 1, minify: true, + target: [] }, esbuild: { keepNames: true, From 55cfd40431d44704db9c5f65e6885adb804a2145 Mon Sep 17 00:00:00 2001 From: Izaak Kuipers Date: Thu, 1 Oct 2026 09:55:15 +0200 Subject: [PATCH 2/7] admin get bug report fixes --- .../AdminPortal/Page/BugHunt/QuickView.svelte | 2 +- src/apps/admin/adminportal/store.ts | 6 +++--- .../user/logging/Logging/Content/List.svelte | 1 + .../logging/Logging/Content/List/Item.svelte | 1 + src/apps/user/logging/Logging/Sidebar.svelte | 10 ++++++++++ src/apps/user/logging/runtime.ts | 4 +++- src/css/apps/user/logging.css | 7 ++++++- src/css/apps/user/settings.css | 2 +- src/css/apps/user/settings/section.css | 2 +- src/css/apps/user/settings/slide/manageapps.css | 17 ++++++++--------- src/interfaces/services/IAdminBootstrapper.ts | 3 ++- .../services/AdminBootstrapper/index.ts | 7 ++++--- src/ts/servicehost/services/ArcFindSvc/index.ts | 4 +++- .../services/GlobalDispatch/index.ts | 9 +++++++++ .../commands/admin/commands/bughunt/get.ts | 6 +++--- src/types/server/admin.ts | 6 ++++++ 16 files changed, 62 insertions(+), 25 deletions(-) diff --git a/src/apps/admin/adminportal/AdminPortal/Page/BugHunt/QuickView.svelte b/src/apps/admin/adminportal/AdminPortal/Page/BugHunt/QuickView.svelte index 74a0f77d8..6c99ad39b 100755 --- a/src/apps/admin/adminportal/AdminPortal/Page/BugHunt/QuickView.svelte +++ b/src/apps/admin/adminportal/AdminPortal/Page/BugHunt/QuickView.svelte @@ -11,7 +11,7 @@ let loading = $state(true); onMount(async () => { - report = await process.admin.getBugReport(id); + report = (await process.admin.getBugReport(id))?.report; loading = false; }); diff --git a/src/apps/admin/adminportal/store.ts b/src/apps/admin/adminportal/store.ts index 421247cbf..be03666da 100755 --- a/src/apps/admin/adminportal/store.ts +++ b/src/apps/admin/adminportal/store.ts @@ -73,7 +73,7 @@ export const AdminPortalPageStore: AdminPortalPages = new Map { const id = process.switchPageProps().id; - return { report: await process.admin.getBugReport(id) }; + return (await process.admin.getBugReport(id)) ?? {}; }, }, ], @@ -89,9 +89,9 @@ export const AdminPortalPageStore: AdminPortalPages = new Map { const id = process.switchPageProps().id; const report = await process.admin.getBugReport(id); - if (!report) return { report }; + if (!report) return report; - const source = await process.admin.getReportSourceFile(report); + const source = await process.admin.getReportSourceFile(report.report); return { report, source }; }, diff --git a/src/apps/user/logging/Logging/Content/List.svelte b/src/apps/user/logging/Logging/Content/List.svelte index a62752c4d..589c548a8 100755 --- a/src/apps/user/logging/Logging/Content/List.svelte +++ b/src/apps/user/logging/Logging/Content/List.svelte @@ -10,6 +10,7 @@
Timestamp
+
Source
Message
diff --git a/src/apps/user/logging/Logging/Content/List/Item.svelte b/src/apps/user/logging/Logging/Content/List/Item.svelte index 6981ed0f0..57c8c006a 100755 --- a/src/apps/user/logging/Logging/Content/List/Item.svelte +++ b/src/apps/user/logging/Logging/Content/List/Item.svelte @@ -22,5 +22,6 @@
{timestamp}
+
{item.source}
{item.message}
diff --git a/src/apps/user/logging/Logging/Sidebar.svelte b/src/apps/user/logging/Logging/Sidebar.svelte index 82808d574..d3bfa83a3 100755 --- a/src/apps/user/logging/Logging/Sidebar.svelte +++ b/src/apps/user/logging/Logging/Sidebar.svelte @@ -5,6 +5,16 @@ - + + +
{#if !$store.length}

No results!

{:else} {#each $store as app (`${app.originId}-${app.id}-${app.metadata.name}`)} - + {#if view === "grid"} + + {:else if view === "list"} + + {/if} {/each} {/if}
diff --git a/src/apps/user/settings/Settings/Slides/ManageApps/FIlter.svelte b/src/apps/user/settings/Settings/Slides/ManageApps/FIlter.svelte new file mode 100644 index 000000000..af73faf4d --- /dev/null +++ b/src/apps/user/settings/Settings/Slides/ManageApps/FIlter.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/apps/user/settings/Settings/Slides/ManageApps/GridAppItem.svelte b/src/apps/user/settings/Settings/Slides/ManageApps/GridAppItem.svelte new file mode 100644 index 000000000..ca2999312 --- /dev/null +++ b/src/apps/user/settings/Settings/Slides/ManageApps/GridAppItem.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/apps/user/settings/Settings/Slides/ManageApps/GridListItem.svelte b/src/apps/user/settings/Settings/Slides/ManageApps/GridListItem.svelte new file mode 100644 index 000000000..b8deb8175 --- /dev/null +++ b/src/apps/user/settings/Settings/Slides/ManageApps/GridListItem.svelte @@ -0,0 +1,24 @@ + + + diff --git a/src/apps/user/settings/Settings/Slides/ManageApps/SearchBar.svelte b/src/apps/user/settings/Settings/Slides/ManageApps/SearchBar.svelte new file mode 100644 index 000000000..3d5019148 --- /dev/null +++ b/src/apps/user/settings/Settings/Slides/ManageApps/SearchBar.svelte @@ -0,0 +1,10 @@ + + + diff --git a/src/apps/user/settings/Settings/Slides/ManageApps/ViewMode.svelte b/src/apps/user/settings/Settings/Slides/ManageApps/ViewMode.svelte new file mode 100644 index 000000000..e08624f54 --- /dev/null +++ b/src/apps/user/settings/Settings/Slides/ManageApps/ViewMode.svelte @@ -0,0 +1,20 @@ + + +
+ + +
diff --git a/src/apps/user/settings/systemSettings.ts b/src/apps/user/settings/systemSettings.ts index 07151b50b..69c877ef7 100644 --- a/src/apps/user/settings/systemSettings.ts +++ b/src/apps/user/settings/systemSettings.ts @@ -6,13 +6,13 @@ import Settings from "./Settings.svelte"; export const SystemSettings: App = { metadata: { name: "System Settings", - author: "Izaak Kuipers", + author: "Izaak Kuipers", version: "6.0.4", icon: "SettingsIcon", appGroup: "systemTools", }, - size: { w: 730, h: 560 }, - minSize: { w: 730, h: 560 }, + size: { w: 810, h: 560 }, + minSize: { w: 810, h: 560 }, maxSize: { w: 1000, h: 800 }, position: { centered: true }, state: { diff --git a/src/css/apps/user/settings/section.css b/src/css/apps/user/settings/section.css index 1380743fb..dc59d0ec1 100755 --- a/src/css/apps/user/settings/section.css +++ b/src/css/apps/user/settings/section.css @@ -1,5 +1,5 @@ #systemSettings section { - width: 450px; + width: 350px; margin: 0 auto; margin-top: 20px; } diff --git a/src/css/apps/user/settings/slide/manageapps.css b/src/css/apps/user/settings/slide/manageapps.css index ac9f0e14f..e25edda41 100755 --- a/src/css/apps/user/settings/slide/manageapps.css +++ b/src/css/apps/user/settings/slide/manageapps.css @@ -9,8 +9,8 @@ #systemSettings div.apps_manageApps div.options { display: flex; align-items: center; - gap: 10px; - padding: 0 10px; + gap: 15px; + padding: 0 15px; } #systemSettings div.apps_manageApps div.options div.view-mode { @@ -63,7 +63,7 @@ position: relative; height: 0; flex-grow: 1; - padding: 10px; + padding: 15px; overflow-y: scroll; } @@ -81,15 +81,17 @@ --font-size: 12px; padding: 12px; outline: none; - border-radius: 6px; + border-radius: 10px; width: 250px; height: fit-content; margin-right: 8px; margin-bottom: 8px; } -#systemSettings div.apps_manageApps div.apps.grid-large button.app { - width: 200px; +#systemSettings div.apps_manageApps div.apps button.app:hover { + background-color: var(--button-glass-bg); + outline: var(--button-glass-bg) 1px solid; + outline-offset: -1px; } #systemSettings div.apps_manageApps div.apps button.app h1 { @@ -113,17 +115,15 @@ grid-area: icon; } -#systemSettings div.apps_manageApps div.apps.grid-large button.app img { - width: 40px; - height: 40px; -} - -#systemSettings div.apps_manageApps div.apps.grid-large button.app h1 { - font-size: 14px; +#systemSettings div.apps_manageApps div.apps button.app.list-item img { + width: 32px; + height: 32px; } -#systemSettings div.apps_manageApps div.apps.list { - display: block; +#systemSettings div.apps_manageApps div.apps button.app.list-item p.type { + opacity: 0.5; + margin-left: auto; + padding: 0 10px; } #systemSettings div.apps_manageApps div.apps.list button.app { @@ -145,13 +145,10 @@ font-style: italic; } -#systemSettings div.apps_manageApps div.apps.list button.app img { - width: 20px; - height: 20px; -} - -#systemSettings div.apps_manageApps div.apps.list button.app h1 { - margin-right: auto; +#systemSettings div.apps_manageApps div.apps button.app.grid-item:hover { + background-color: var(--button-glass-hover-bg); + outline: var(--button-glass-hover-bg) 1px solid; + outline-offset: -1px; } #systemSettings div.apps_manageApps p.no-results { diff --git a/src/ts/basic/commands/setpref.ts b/src/ts/basic/commands/setpref.ts new file mode 100644 index 000000000..e3900e6ee --- /dev/null +++ b/src/ts/basic/commands/setpref.ts @@ -0,0 +1,25 @@ +import { Daemon } from "$ts/env"; +import { setJsonHierarchy } from "$ts/util/hierarchy"; +import { BasicCommand } from "../engine/command"; + +export class SetprefCommand extends BasicCommand { + static keyword: string = "setpref"; + + async execute(line: string): Promise { + const [rawHierarchy, ...values] = await this.interpreter.getStrings(line, false); + + if (values.length > 1) { + return "SETPREF takes exactly one value"; + } + + const hierarchy = await this.interpreter.replaceVariables(rawHierarchy, false); + const value = await this.interpreter.replaceVariables(values[0], true); + + Daemon.preferences.update((v) => { + setJsonHierarchy(v, hierarchy, value); + return v; + }); + + return undefined; + } +} diff --git a/src/ts/basic/config/commandset.ts b/src/ts/basic/config/commandset.ts index 59dfc9b30..da4c903e9 100644 --- a/src/ts/basic/config/commandset.ts +++ b/src/ts/basic/config/commandset.ts @@ -5,6 +5,7 @@ import { GosubCommand } from "../commands/gosub"; import { IfCommand } from "../commands/if"; import { KillCommand } from "../commands/kill"; import { PrintCommand } from "../commands/print"; +import { SetprefCommand } from "../commands/setpref"; import { SoundbusCommand } from "../commands/soundbus"; import { StopCommand } from "../commands/stop"; import { SubCommand } from "../commands/sub"; @@ -13,16 +14,17 @@ import { WhileCommand } from "../commands/while"; import type { BasicCommand } from "../engine/command"; export const BasicCommandSet: (typeof BasicCommand)[] = [ - PrintCommand, - IfCommand, - VarCommand, + EndsubCommand, + ErrorCommand, + GostartCommand, GosubCommand, - SubCommand, - StopCommand, + IfCommand, KillCommand, - GostartCommand, - WhileCommand, + PrintCommand, + SetprefCommand, SoundbusCommand, - EndsubCommand, - ErrorCommand, + StopCommand, + SubCommand, + VarCommand, + WhileCommand, ]; diff --git a/src/ts/basic/engine/index.ts b/src/ts/basic/engine/index.ts index 9b1d43159..1bbfe2dd3 100644 --- a/src/ts/basic/engine/index.ts +++ b/src/ts/basic/engine/index.ts @@ -391,7 +391,7 @@ export class ArcBasicEngine { async findNextEndling(endling: string, startIdx = this.programCounter): Promise { this.Debug(`findNextEndling >>${endling}<< startIdx=${startIdx}`); - const lookahead = this.source.slice(startIdx, this.source.length - 1); + const lookahead = this.source.slice(startIdx, this.source.length); const endKeyword = `end${endling.toLowerCase()}`; const idx = lookahead.findIndex((l) => l.toLowerCase().trim().startsWith(endKeyword)); @@ -433,7 +433,7 @@ export class ArcBasicEngine { this.HALT = true; const line = this.source[this.programCounter]; const lineNumber = `${this.programCounter + 1}`; - const columnNumber = Math.max(columnIndexHint ? line.indexOf(columnIndexHint) : 0, 0); + const columnNumber = Math.max(columnIndexHint ? line?.indexOf(columnIndexHint) ?? 0 : 0, 0); const linePrefix = " ".repeat(lineNumber.length) + " ║ "; const leftOffset = " ".repeat(columnNumber); diff --git a/src/ts/basic/engine/regex.ts b/src/ts/basic/engine/regex.ts index b8a983d3d..fa65e89d8 100644 --- a/src/ts/basic/engine/regex.ts +++ b/src/ts/basic/engine/regex.ts @@ -1,10 +1,10 @@ export const REGEXES = { STRING: /"(?[^"]+|)"/gm, - FUNCTION: /(?[a-zA-Z]+)\((?.+|)\)/gm, + FUNCTION: /\b(?[a-zA-Z]+)\((?(?:"(?:[^"\\]|\\.)*"|[^()"])*)\)/gm, IF: /(?NOT |not |)(?.+) (?:THEN|then)($| (?.+))/, DUALEXPR: /(?.+) (?[A-Za-z]+) (?.+)/, WHILE: /(?NOT |not |)(?.+) (?:DO|do)($| (?.+))/, - VARGET: /\$(?[A-Za-z]{1,6})(?:\[(?[0-9\-]+|\+|\$[A-Za-z]{1,6}|LEN)\]|\{(?[a-zA-Z\_\.0-9]+)\}|)/g, + VARGET: /\$(?[A-Za-z]{1,6})(?:\[(?[0-9\-]+|\+|\$[A-Za-z]{1,6}|LEN|len)\]|\{(?[a-zA-Z\_\.0-9]+)\}|)/g, VARSET: - /(?[A-Za-z]{1,6})(?:\[(?[0-9\-]+|\+|\$[A-Za-z]{1,6}|LEN)\]|\{(?[a-zA-Z\_\.0-9]+)\}|) = (?.+|)/, + /(?[A-Za-z]{1,6})(?:\[(?[0-9\-]+|\+|\$[A-Za-z]{1,6}|LEN|len)\]|\{(?[a-zA-Z\_\.0-9]+)\}|) = (?.+|)/, }; diff --git a/src/ts/basic/highlight.ts b/src/ts/basic/highlight.ts index 7b698da32..98d7d0f54 100644 --- a/src/ts/basic/highlight.ts +++ b/src/ts/basic/highlight.ts @@ -24,6 +24,7 @@ export default function ArcBasicHighlighter(hljs: HLJSApi): Language { "THEN", "VAR", "WHILE", + "SETPREF" ]; const VARGET = { From c69d65331a1c647487fc54f87cf0e4c2525150fe Mon Sep 17 00:00:00 2001 From: Izaak Kuipers Date: Fri, 2 Oct 2026 14:27:22 +0200 Subject: [PATCH 4/7] Rename MemoryFilesystemDrive --- .../contexts/IFilesystemUserContext.ts | 4 ++-- ...mDrive.ts => ITemporaryFilesystemDrive.ts} | 2 +- src/main.ts | 4 ++-- src/ts/basic/commands/setpref.ts | 6 ++++- src/ts/daemon/contexts/filesystem.ts | 6 ++--- src/ts/kernel/init.ts | 4 ++-- src/ts/kernel/mods/fs/drives/temp.ts | 4 ++-- src/ts/util/html.ts | 24 +++++++++++++++++++ 8 files changed, 41 insertions(+), 13 deletions(-) rename src/interfaces/drives/{IMemoryFilesystemDrive.ts => ITemporaryFilesystemDrive.ts} (73%) create mode 100644 src/ts/util/html.ts diff --git a/src/interfaces/contexts/IFilesystemUserContext.ts b/src/interfaces/contexts/IFilesystemUserContext.ts index f547ea33a..bcf8612ad 100644 --- a/src/interfaces/contexts/IFilesystemUserContext.ts +++ b/src/interfaces/contexts/IFilesystemUserContext.ts @@ -1,7 +1,7 @@ import type { FileProgressMutator, FsProgressOperation } from "$apps/components/fsprogress/types"; import type { LoadSaveDialogData } from "$apps/user/filemanager/types"; import type { ILegacyServerDrive } from "$interfaces/drives/ILegacyServerDrive"; -import type { IMemoryFilesystemDrive } from "$interfaces/drives/IMemoryFilesystemDrive"; +import type { ITemporaryFilesystemDrive } from "$interfaces/drives/ITemporaryFilesystemDrive"; import type { ICommandResult } from "$interfaces/ICommandResult"; import type { IFilesystemDrive } from "$interfaces/IFilesystemDrive"; import type { IUserContext } from "$interfaces/IUserDaemon"; @@ -12,7 +12,7 @@ import type { CategorizedDiskUsage } from "$types/user"; // !tpa export interface IFilesystemUserContext extends IUserContext { - TempFs?: IMemoryFilesystemDrive; + TempFs?: ITemporaryFilesystemDrive; fileHandlers: Record; mountedDrives: string[]; _init(): Promise; diff --git a/src/interfaces/drives/IMemoryFilesystemDrive.ts b/src/interfaces/drives/ITemporaryFilesystemDrive.ts similarity index 73% rename from src/interfaces/drives/IMemoryFilesystemDrive.ts rename to src/interfaces/drives/ITemporaryFilesystemDrive.ts index 4f98eda5a..2b8d01e98 100644 --- a/src/interfaces/drives/IMemoryFilesystemDrive.ts +++ b/src/interfaces/drives/ITemporaryFilesystemDrive.ts @@ -1,7 +1,7 @@ import type { IFilesystemDrive } from "$interfaces/IFilesystemDrive"; // !tpa -export interface IMemoryFilesystemDrive extends IFilesystemDrive { +export interface ITemporaryFilesystemDrive extends IFilesystemDrive { takeSnapshot(): Promise>; restoreSnapshot(snapshot: Record): void; } diff --git a/src/main.ts b/src/main.ts index 8368727d2..3d0c3eb95 100755 --- a/src/main.ts +++ b/src/main.ts @@ -1,14 +1,14 @@ import "dseg/css/dseg.css"; import "./css/main.css"; +import { HtmlUtil } from "$ts/util/html"; // CODE EXECUTION STARTS HERE async function Main() { const { WaveKernel } = await import("$ts/kernel/wavekernel"); - const kernel = new WaveKernel(); window.__DW_STATUS__ = "async Main"; - document.querySelector("#stateLoader")!.innerText = ".."; + HtmlUtil.GetStateLoader().innerText = ".."; await kernel._init(); } diff --git a/src/ts/basic/commands/setpref.ts b/src/ts/basic/commands/setpref.ts index e3900e6ee..f2d95b956 100644 --- a/src/ts/basic/commands/setpref.ts +++ b/src/ts/basic/commands/setpref.ts @@ -8,7 +8,11 @@ export class SetprefCommand extends BasicCommand { async execute(line: string): Promise { const [rawHierarchy, ...values] = await this.interpreter.getStrings(line, false); - if (values.length > 1) { + if (!rawHierarchy) { + return "No hierarchy found. Did you wrap it in a string?" + } + + if (values.length !== 1) { return "SETPREF takes exactly one value"; } diff --git a/src/ts/daemon/contexts/filesystem.ts b/src/ts/daemon/contexts/filesystem.ts index 8e7cc29fb..731c4558a 100644 --- a/src/ts/daemon/contexts/filesystem.ts +++ b/src/ts/daemon/contexts/filesystem.ts @@ -2,7 +2,7 @@ import { DummyFileProgress, type FileProgressMutator, type FsProgressOperation } import type { LoadSaveDialogData } from "$apps/user/filemanager/types"; import type { IFilesystemUserContext } from "$interfaces/contexts/IFilesystemUserContext"; import type { ILegacyServerDrive } from "$interfaces/drives/ILegacyServerDrive"; -import type { IMemoryFilesystemDrive } from "$interfaces/drives/IMemoryFilesystemDrive"; +import type { ITemporaryFilesystemDrive } from "$interfaces/drives/ITemporaryFilesystemDrive"; import type { ICommandResult } from "$interfaces/ICommandResult"; import type { IFilesystemDrive } from "$interfaces/IFilesystemDrive"; import type { IUserDaemon } from "$interfaces/IUserDaemon"; @@ -30,7 +30,7 @@ import { UserContext } from "../context"; export class FilesystemUserContext extends UserContext implements IFilesystemUserContext { private thumbnailCache: Record = {}; - public TempFs?: IMemoryFilesystemDrive; + public TempFs?: ITemporaryFilesystemDrive; public fileHandlers: Record; public mountedDrives: string[] = []; private TempFsSnapshot: Record = {}; @@ -46,7 +46,7 @@ export class FilesystemUserContext extends UserContext implements IFilesystemUse } async _init() { - this.TempFs = Fs.getDriveById("temp") as IMemoryFilesystemDrive; + this.TempFs = Fs.getDriveById("temp") as ITemporaryFilesystemDrive; this.TempFsSnapshot = await this.TempFs.takeSnapshot(); } diff --git a/src/ts/kernel/init.ts b/src/ts/kernel/init.ts index 51c46c683..e8e131cb8 100755 --- a/src/ts/kernel/init.ts +++ b/src/ts/kernel/init.ts @@ -2,7 +2,7 @@ import type { IStateHandler } from "$interfaces/IStateHandler"; import type { IServerManager } from "$interfaces/modules/IServerManager"; import { __Console__ } from "$ts/console"; import { ArcOSVersion, Env, Fs, getKMod, Kernel, SetCurrentStateHandler, Stack } from "$ts/env"; -import { MemoryFilesystemDrive } from "$ts/kernel/mods/fs/drives/temp"; +import { TemporaryFilesystemDrive } from "$ts/kernel/mods/fs/drives/temp"; import { ArcBuild } from "$ts/metadata/build"; import { ArcMode } from "$ts/metadata/mode"; import { States } from "$ts/state/store"; @@ -58,7 +58,7 @@ export class InitProcess extends Process { this.Log("Initializing TEMP"); try { - await Fs.mountDrive("temp", MemoryFilesystemDrive, "T"); + await Fs.mountDrive("temp", TemporaryFilesystemDrive, "T"); await Fs.createDirectory("T:/Apps"); await Fs.createDirectory("T:/Meta"); await Fs.writeFile("T:/Meta/ARCOS_BUILD", textToBlob(ArcBuild())); diff --git a/src/ts/kernel/mods/fs/drives/temp.ts b/src/ts/kernel/mods/fs/drives/temp.ts index f9bd939be..20243023c 100644 --- a/src/ts/kernel/mods/fs/drives/temp.ts +++ b/src/ts/kernel/mods/fs/drives/temp.ts @@ -1,4 +1,4 @@ -import type { IMemoryFilesystemDrive } from "$interfaces/drives/IMemoryFilesystemDrive"; +import type { ITemporaryFilesystemDrive } from "$interfaces/drives/ITemporaryFilesystemDrive"; import { FilesystemDrive } from "$ts/kernel/mods/fs/drives/generic"; import { deepCopyWithBlobs, sortByKey } from "$ts/util"; import { UUID } from "$ts/util/uuid"; @@ -11,7 +11,7 @@ import type { UserQuota, } from "$types/system/fs"; -export class MemoryFilesystemDrive extends FilesystemDrive implements IMemoryFilesystemDrive { +export class TemporaryFilesystemDrive extends FilesystemDrive implements ITemporaryFilesystemDrive { private readonly data: Record = {}; public FIXED: boolean = true; public override IDENTIFIES_AS: string = "temp"; diff --git a/src/ts/util/html.ts b/src/ts/util/html.ts new file mode 100644 index 000000000..acb1bfa16 --- /dev/null +++ b/src/ts/util/html.ts @@ -0,0 +1,24 @@ +export class HtmlUtil { + public static GetStateLoader() { + return this.GetElement("#stateLoader", "StateLoader"); + } + + public static GetAppRenderer() { + return this.GetElement("#appRenderer", "AppRenderer"); + } + + public static GetKernelLog() { + return this.GetElement("#kernelLog", "KernelLog"); + } + + public static GetMain() { + return this.GetElement("body > main#main", "Main"); + } + + private static GetElement(selectors: string, qualifiedName: string): T { + const element = document.querySelector(selectors); + if (!element) throw new Error(`${this.GetElement.name}::${qualifiedName} failed`); + + return element; + } +} From f1fbc06d00106f9f257bb1fabfddccde0b22f27a Mon Sep 17 00:00:00 2001 From: Izaak Kuipers Date: Tue, 13 Oct 2026 11:13:17 +0200 Subject: [PATCH 5/7] Revert logging all-mode, fix msgcomposer height --- src/apps/components/messagecomposer/MessageComposer.ts | 4 ++-- src/apps/user/logging/Logging/Content/List.svelte | 1 - src/apps/user/logging/Logging/Content/List/Item.svelte | 1 - src/apps/user/logging/Logging/Sidebar.svelte | 10 ---------- src/apps/user/logging/runtime.ts | 4 +--- src/css/apps/user/logging.css | 4 ---- 6 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/apps/components/messagecomposer/MessageComposer.ts b/src/apps/components/messagecomposer/MessageComposer.ts index 9109b8013..8d71b7fc0 100644 --- a/src/apps/components/messagecomposer/MessageComposer.ts +++ b/src/apps/components/messagecomposer/MessageComposer.ts @@ -12,8 +12,8 @@ export const MessageComposerApp: App = { appGroup: "multimedia", }, position: { centered: true }, - size: { w: 800, h: 650 }, - minSize: { w: 800, h: 650 }, + size: { w: 800, h: 500 }, + minSize: { w: 800, h: 500 }, maxSize: { w: NaN, h: NaN }, state: { maximized: false, diff --git a/src/apps/user/logging/Logging/Content/List.svelte b/src/apps/user/logging/Logging/Content/List.svelte index 589c548a8..a62752c4d 100755 --- a/src/apps/user/logging/Logging/Content/List.svelte +++ b/src/apps/user/logging/Logging/Content/List.svelte @@ -10,7 +10,6 @@
Timestamp
-
Source
Message
diff --git a/src/apps/user/logging/Logging/Content/List/Item.svelte b/src/apps/user/logging/Logging/Content/List/Item.svelte index 57c8c006a..6981ed0f0 100755 --- a/src/apps/user/logging/Logging/Content/List/Item.svelte +++ b/src/apps/user/logging/Logging/Content/List/Item.svelte @@ -22,6 +22,5 @@
{timestamp}
-
{item.source}
{item.message}
diff --git a/src/apps/user/logging/Logging/Sidebar.svelte b/src/apps/user/logging/Logging/Sidebar.svelte index d3bfa83a3..82808d574 100755 --- a/src/apps/user/logging/Logging/Sidebar.svelte +++ b/src/apps/user/logging/Logging/Sidebar.svelte @@ -5,16 +5,6 @@