diff --git a/elm-to-be-migrated/Browserless.elm b/elm-to-be-migrated/Browserless.elm index 1c3852a2..137a5af7 100644 --- a/elm-to-be-migrated/Browserless.elm +++ b/elm-to-be-migrated/Browserless.elm @@ -4,9 +4,9 @@ import Browser import Html as PlainHtml import Html.Styled exposing (node, toUnstyled) import Main exposing (Msg, StoredRON) +import OldShared.Model exposing (..) import Profile exposing (..) import Replicated.Change as Change exposing (ChangeSet, Frame) -import OldShared.Model exposing (..) import Url import VirtualDom @@ -25,7 +25,7 @@ main = -- } -initBrowserless : ( String, Profile ) -> ( List Change.Frame, Main.MainModel, Cmd Msg ) +initBrowserless : ( String, Profile ) -> ( List (Change.Frame String), Main.MainModel, Cmd Msg ) initBrowserless ( urlAsString, profile ) = let flags = diff --git a/elm-to-be-migrated/Headless.elm b/elm-to-be-migrated/Headless.elm index 71567cae..e54e8d8f 100644 --- a/elm-to-be-migrated/Headless.elm +++ b/elm-to-be-migrated/Headless.elm @@ -2,10 +2,10 @@ port module Headless exposing (main) import Json.Decode.Exploration exposing (..) import Main exposing (..) +import OldShared.Model exposing (..) import Platform exposing (worker) import Profile exposing (..) import Replicated.Change as Change exposing (ChangeSet, Frame) -import OldShared.Model exposing (..) import Url @@ -22,7 +22,7 @@ main = -- } -initHeadless : ( String, Profile ) -> ( List Change.Frame, MainModel, Cmd Msg ) +initHeadless : ( String, Profile ) -> ( List (Change.Frame String), MainModel, Cmd Msg ) initHeadless ( urlAsString, profile ) = let flags = diff --git a/elm-to-be-migrated/ProjectEditor.elm b/elm-to-be-migrated/ProjectEditor.elm index 3091395e..011bcb49 100644 --- a/elm-to-be-migrated/ProjectEditor.elm +++ b/elm-to-be-migrated/ProjectEditor.elm @@ -33,6 +33,7 @@ import Json.Encode.Extra as Encode2 exposing (..) import List.Extra as List import Log import Maybe.Extra as Maybe +import OldShared.Model exposing (..) import Process import Profile exposing (..) import Refocus @@ -42,7 +43,6 @@ import Replicated.Reducer.Register as Reg exposing (Reg) import Replicated.Reducer.RepDb as RepDb exposing (RepDb) import Replicated.Reducer.RepDict as RepDict exposing (RepDict, RepDictEntry(..)) import Replicated.Reducer.RepList as RepList exposing (RepList) -import OldShared.Model exposing (..) import SmartTime.Duration exposing (Duration) import SmartTime.Human.Calendar as Calendar exposing (CalendarDate) import SmartTime.Human.Clock as Clock exposing (TimeOfDay) @@ -342,7 +342,7 @@ type Msg | LogError String -update : Msg -> ViewState -> Profile -> Environment -> ( ViewState, Change.Frame, Cmd Msg ) +update : Msg -> ViewState -> Profile -> Environment -> ( ViewState, Change.Frame String, Cmd Msg ) update msg state profile env = case msg of Add -> diff --git a/elm/Components/Replicator.elm b/elm/Components/Replicator.elm index 7d52087a..efeb5f93 100644 --- a/elm/Components/Replicator.elm +++ b/elm/Components/Replicator.elm @@ -14,12 +14,12 @@ import Task {-| Internal Model of the replicator component. -} -type Replicator replica +type Replicator replica frameDesc = ReplicatorModel { node : Node , replicaCodec : SkelCodec ReplicaError replica , replica : replica - , outPort : String -> Cmd Msg + , outPort : String -> Cmd (Msg frameDesc) } @@ -29,14 +29,14 @@ type alias ReplicaError = {-| Data required to initialize the replicator. -} -type alias ReplicatorConfig replica = +type alias ReplicatorConfig replica yourFrameDesc = { launchTime : Maybe Moment , replicaCodec : SkelCodec ReplicaError replica - , outPort : String -> Cmd Msg + , outPort : String -> Cmd (Msg yourFrameDesc) } -init : ReplicatorConfig replica -> ( Replicator replica, replica ) +init : ReplicatorConfig replica desc -> ( Replicator replica desc, replica ) init { launchTime, replicaCodec, outPort } = let ( startNode, initChanges ) = @@ -58,15 +58,15 @@ init { launchTime, replicaCodec, outPort } = {-| This component's internal Msg type. -} -type Msg +type Msg desc = LoadRon Int (List String) - | ApplyFrames (List Change.Frame) Moment + | ApplyFrames (List (Change.Frame desc)) Moment update : - Msg - -> Replicator replica - -> { newReplicator : Replicator replica, newReplica : replica, warnings : List OpImportWarning, cmd : Cmd Msg } + Msg desc + -> Replicator replica desc + -> { newReplicator : Replicator replica desc, newReplica : replica, warnings : List OpImportWarning, cmd : Cmd (Msg desc) } update msg (ReplicatorModel oldReplicator) = case msg of LoadRon originalFrameCount [] -> @@ -144,8 +144,8 @@ update msg (ReplicatorModel oldReplicator) = {-| Type for your "incoming frames" port. Use this on your JS port which is called when you receive new changeframes from elsewhere. The RON data (as a string) will be processed into the replicator. -} -type alias IncomingFramesPort = - (String -> Msg) -> Sub Msg +type alias IncomingFramesPort desc = + (String -> Msg desc) -> Sub (Msg desc) {-| Wire this component's subscriptions up into your `Shared.subscriptions`, using `Sub.map` to convert it to your message type, like: @@ -159,7 +159,7 @@ type alias IncomingFramesPort = `incomingRon` is a port you create (you can put it in the `Effect` module if you like) that receives a String, and has the type `IncomingFramesPort`. -} -subscriptions : IncomingFramesPort -> Sub Msg +subscriptions : IncomingFramesPort desc -> Sub (Msg desc) subscriptions incomingFramesPort = let splitIncomingFrames inRon = @@ -172,7 +172,7 @@ subscriptions incomingFramesPort = incomingFramesPort splitIncomingFrames -saveEffect : List Change.Frame -> Cmd Msg +saveEffect : List (Change.Frame desc) -> Cmd (Msg desc) saveEffect framesToSave = case Change.nonEmptyFrames framesToSave of [] -> diff --git a/elm/Effect.elm b/elm/Effect.elm index 1f7f8cf2..5572cc26 100644 --- a/elm/Effect.elm +++ b/elm/Effect.elm @@ -4,7 +4,7 @@ port module Effect exposing , sendCmd, sendMsg , pushRoute, replaceRoute, loadExternalUrl , map, toCmd - , PromptOptions, cancelNotification, clearPreferences, closePopup, dialogPrompt, incomingRon, mlPredict, requestNotificationPermission, saveChanges, saveFrame, saveFrames, sendNotifications, sendSharedMsg, setStorage, syncMarvin, syncTodoist, toast, updateTime + , PromptOptions, cancelNotification, clearPreferences, closePopup, dialogPrompt, incomingRon, mlPredict, requestNotificationPermission, saveFrame, saveFrames, saveSystemChanges, saveUserChanges, sendNotifications, sendSharedMsg, setStorage, syncMarvin, syncTodoist, toast, updateTime, userChangeNow ) {-| @@ -61,7 +61,7 @@ type Effect msg | SendSharedMsg Shared.Msg.Msg | UpdateTime -- REPLICATOR - | Save (List Change.Frame) + | Save (List (Change.Frame String)) -- EXTERNAL APP | ClearPreferences | RequestNotificationPermission @@ -196,19 +196,24 @@ toast toastMsg = Toast toastMsg -saveFrame : Change.Frame -> Effect msg +saveFrame : Change.Frame String -> Effect msg saveFrame changeFrame = Save [ changeFrame ] -saveFrames : List Change.Frame -> Effect msg +saveFrames : List (Change.Frame String) -> Effect msg saveFrames changeFrames = Save changeFrames -saveChanges : String -> List Change.Change -> Effect msg -saveChanges frameTitle changes = - saveFrame (Change.saveChanges frameTitle changes) +saveUserChanges : String -> List Change.Change -> Effect msg +saveUserChanges frameTitle changes = + saveFrame (Change.saveUserChanges frameTitle changes) + + +saveSystemChanges : List Change.Change -> Effect msg +saveSystemChanges changes = + saveFrame (Change.saveSystemChanges changes) sendNotifications : List Notif.Notification -> Effect msg @@ -225,6 +230,11 @@ mlPredict = MLPredict +userChangeNow : Profile.UserChange -> Effect msg +userChangeNow profileChange = + SendSharedMsg <| Shared.Msg.ProfileChange profileChange + + -- {- The goal here is to get (mouse x / window width) on each mouse event. So if -- the mouse is at 500px and the screen is 1000px wide, we should get 0.5 from this. diff --git a/elm/Integrations/Marvin.elm b/elm/Integrations/Marvin.elm index 72b55e46..ab53b8c9 100644 --- a/elm/Integrations/Marvin.elm +++ b/elm/Integrations/Marvin.elm @@ -281,7 +281,7 @@ getLabelsCmd = Cmd.batch [ getLabels partialAccessToken ] -handle : Profile -> ( Moment, HumanMoment.Zone ) -> Msg -> ( Change.Frame, String, Cmd Msg ) +handle : Profile -> ( Moment, HumanMoment.Zone ) -> Msg -> ( Change.Frame String, String, Cmd Msg ) handle profile ( time, timeZone ) response = let projectLayers = @@ -291,13 +291,13 @@ handle profile ( time, timeZone ) response = TestResult result -> case result of Ok serversays -> - ( Change.saveChanges "Logging Marvin changes" [ RepList.insert RepList.Last ("Marvin TestResult: " ++ serversays) profile.errors ] + ( Change.saveUserChanges "Logging Marvin changes" [ RepList.insert RepList.Last ("Marvin TestResult: " ++ serversays) profile.errors ] , serversays , Cmd.none ) Err err -> - ( Change.saveChanges "Logging Marvin error" [ RepList.insert RepList.Last (Debug.toString err) profile.errors ] + ( Change.saveUserChanges "Logging Marvin error" [ RepList.insert RepList.Last (Debug.toString err) profile.errors ] , describeError err , Cmd.none ) @@ -305,13 +305,13 @@ handle profile ( time, timeZone ) response = AuthResult result -> case result of Ok serversays -> - ( Change.saveChanges "Logging Marvin changes" [ RepList.insert RepList.Last ("Marvin AuthResult: " ++ serversays) profile.errors ] + ( Change.saveUserChanges "Logging Marvin changes" [ RepList.insert RepList.Last ("Marvin AuthResult: " ++ serversays) profile.errors ] , serversays , Cmd.none ) Err err -> - ( Change.saveChanges "Logging Marvin error" [ RepList.insert RepList.Last (Debug.toString err) profile.errors ] + ( Change.saveUserChanges "Logging Marvin error" [ RepList.insert RepList.Last (Debug.toString err) profile.errors ] , describeError err , Cmd.none ) @@ -323,13 +323,13 @@ handle profile ( time, timeZone ) response = changes = importItems profile itemList in - ( Change.saveChanges "Imported Marvin Items" changes + ( Change.saveUserChanges "Imported Marvin Items" changes , "Fetched items: " ++ Debug.toString itemList , getTimeBlockAssignments ) Err err -> - ( Change.saveChanges "Logging Marvin error" [ RepList.insert RepList.Last (Debug.toString err) profile.errors ] + ( Change.saveUserChanges "Logging Marvin error" [ RepList.insert RepList.Last (Debug.toString err) profile.errors ] , "when getting items: " ++ describeError err , Cmd.none ) @@ -341,7 +341,7 @@ handle profile ( time, timeZone ) response = changes = importLabels profile labelList in - ( Change.saveChanges "Imported Marvin Labels" changes + ( Change.saveUserChanges "Imported Marvin Labels" changes , "Fetched labels: " ++ Debug.toString labelList , getTodayItems partialAccessToken ) @@ -355,7 +355,7 @@ handle profile ( time, timeZone ) response = GotTimeBlocks assignments result -> case result of Ok timeBlockList -> - ( Change.saveChanges "Imported Marvin Timeblocks" <| importTimeBlocks profile assignments timeBlockList + ( Change.saveUserChanges "Imported Marvin Timeblocks" <| importTimeBlocks profile assignments timeBlockList , "Fetched timeblocks: " ++ Debug.toString timeBlockList , getTrackedItem partialAccessToken ) @@ -438,7 +438,7 @@ handle profile ( time, timeZone ) response = logMsg = "got timetrack acknowledgement at " ++ HumanMoment.toStandardString time ++ " my time, newest marvin time was off by " ++ (Maybe.withDefault "none" <| Maybe.map newestReport (List.last timesList)) in - ( Change.saveChanges "Got Marvin tracking acknowledgement" updateTimeline + ( Change.saveUserChanges "Got Marvin tracking acknowledgement" updateTimeline , logMsg , Cmd.none ) diff --git a/elm/Integrations/Todoist.elm b/elm/Integrations/Todoist.elm index 0b1ce638..49a7c1dc 100644 --- a/elm/Integrations/Todoist.elm +++ b/elm/Integrations/Todoist.elm @@ -49,7 +49,7 @@ devSecret = "0bdc5149510737ab941485bace8135c60e2d812b" -handle : Todoist.Msg -> Profile -> ( Change.Frame, String ) +handle : Todoist.Msg -> Profile -> ( Change.Frame String, String ) handle msg app = case Todoist.handleResponse msg app.todoist.cache of Ok ( newCache, changes ) -> @@ -89,7 +89,7 @@ handle msg app = -- } [] in - ( Change.saveChanges "" finalChanges + ( Change.saveUserChanges "" finalChanges , describeSuccess changes ) @@ -98,7 +98,7 @@ handle msg app = description = Todoist.describeError err in - ( Change.saveChanges "" [ saveError app description ], description ) + ( Change.saveUserChanges "" [ saveError app description ], description ) describeSuccess : Todoist.LatestChanges -> String diff --git a/elm/Popup/Editor/Assignable.elm b/elm/Popup/Editor/Assignable.elm index ded8070f..afe5f1f8 100644 --- a/elm/Popup/Editor/Assignable.elm +++ b/elm/Popup/Editor/Assignable.elm @@ -297,7 +297,7 @@ update msg model = ) -outputToChanges : Maybe Assignable -> Output -> Change.Frame +outputToChanges : Maybe Assignable -> Output -> Change.Frame String outputToChanges assignableMaybe output = case assignableMaybe of Just assignable -> @@ -342,7 +342,7 @@ outputToChanges assignableMaybe output = else Just (Assignable.setMaxEffort output.maxEffort assignable) in - Change.saveChanges "Editing an assignable" <| + Change.saveUserChanges "Editing an assignable" <| List.filterMap identity [ updateTitle , updateImportance diff --git a/elm/Popup/Editor/Assignment.elm b/elm/Popup/Editor/Assignment.elm index a4561927..39250e2d 100644 --- a/elm/Popup/Editor/Assignment.elm +++ b/elm/Popup/Editor/Assignment.elm @@ -201,7 +201,7 @@ update msg model = ) -outputToChanges : Maybe Assignment -> Output -> Change.Frame +outputToChanges : Maybe Assignment -> Output -> Change.Frame String outputToChanges existingAssignmentMaybe output = case existingAssignmentMaybe of Just existingAssignment -> @@ -234,7 +234,7 @@ outputToChanges existingAssignmentMaybe output = else Just (Assignment.setCompletion output.completion existingAssignment) in - Change.saveChanges "Editing an assignment" <| + Change.saveUserChanges "Editing an assignment" <| List.filterMap identity [ updateRelevanceStarts , updateRelevanceEnds diff --git a/elm/Refocus.elm b/elm/Refocus.elm index 3ba78310..4f4a1b7b 100644 --- a/elm/Refocus.elm +++ b/elm/Refocus.elm @@ -174,7 +174,7 @@ switchTracking trackable profile projectLayers ( time, timeZone ) = reactToNewSession trackable ( time, timeZone ) profile projectLayers in -- TODO RUN reactToNewSession AFTER CHANGE - Effect.batch [ reaction, Effect.saveChanges "Started tracking" switchChanges ] + Effect.batch [ reaction, Effect.saveUserChanges "Started tracking" switchChanges ] reactToNewSession trackable ( time, timeZone ) oldProfile projectLayers = diff --git a/elm/Replicated/Change.elm b/elm/Replicated/Change.elm index cd431076..331ec0e6 100644 --- a/elm/Replicated/Change.elm +++ b/elm/Replicated/Change.elm @@ -1,4 +1,4 @@ -module Replicated.Change exposing (Change(..), ChangeSet(..), Changer, ComplexAtom(..), ComplexPayload, Context(..), Creator, DelayedChange, ExistingID, Frame(..), ObjectChange(..), Parent, PendingID, Pointer(..), PrimitiveAtom(..), PrimitivePayload, SoloObjectEncoded, becomeDelayedParent, becomeInstantParent, changeObject, changeObjectWithExternal, changeSetDebug, collapseChangesToChangeSet, complexFromSolo, contextDifferentiatorString, delayedChangeObject, delayedChangesToSets, emptyChangeSet, emptyFrame, equalPointers, extractOwnSubChanges, genesisParent, getContextLocation, getContextParent, getObjectChanges, getPointerObjectID, getPointerReducer, isEmptyChangeSet, isPlaceholder, mapChanger, mapCreator, mergeChanges, mergeMaybeChange, newPointer, noChange, nonEmptyFrames, pendingIDToComparable, pendingIDToString, primitiveAtomToRonAtom, primitiveAtomToString, redundantObjectChange, reuseContext, saveChanges, startContext) +module Replicated.Change exposing (Change(..), ChangeSet(..), Changer, ComplexAtom(..), ComplexPayload, Context(..), Creator, DelayedChange, ExistingID, Frame(..), ObjectChange(..), Parent, PendingID, Pointer(..), PrimitiveAtom(..), PrimitivePayload, SoloObjectEncoded, becomeDelayedParent, becomeInstantParent, changeObject, changeObjectWithExternal, changeSetDebug, collapseChangesToChangeSet, complexFromSolo, contextDifferentiatorString, delayedChangeObject, delayedChangesToSets, emptyChangeSet, emptyFrame, equalPointers, extractOwnSubChanges, genesisParent, getContextLocation, getContextParent, getObjectChanges, getPointerObjectID, getPointerReducer, isEmptyChangeSet, isPlaceholder, mapChanger, mapCreator, mergeChanges, mergeMaybeChange, newPointer, noChange, nonEmptyFrames, pendingIDToComparable, pendingIDToString, primitiveAtomToRonAtom, primitiveAtomToString, redundantObjectChange, reuseContext, saveSystemChanges, saveUserChanges, startContext) import Console import Dict.Any as AnyDict exposing (AnyDict) @@ -621,31 +621,36 @@ redundantObjectChange possiblyRedundantObjectChange canonicalObjectChange = -- CHANGEFRAMES ------------------------------------------------ -type Frame +type Frame desc = Frame { changes : ChangeSet - , description : String + , description : Maybe desc } -saveChanges : String -> List Change -> Frame -saveChanges description changes = - Frame { changes = collapseChangesToChangeSet "save" changes, description = description } +saveUserChanges : desc -> List Change -> Frame desc +saveUserChanges description changes = + Frame { changes = collapseChangesToChangeSet "save" changes, description = Just description } + + +saveSystemChanges : List Change -> Frame desc +saveSystemChanges changes = + Frame { changes = collapseChangesToChangeSet "save" changes, description = Nothing } {-| An empty Frame, for when you have no changes to save. -} -emptyFrame : Frame +emptyFrame : Frame desc emptyFrame = - Frame { changes = emptyChangeSet, description = "Empty Frame" } + Frame { changes = emptyChangeSet, description = Nothing } -isEmpty : Frame -> Bool +isEmpty : Frame desc -> Bool isEmpty (Frame { changes }) = isEmptyChangeSet changes -nonEmptyFrames : List Frame -> List Frame +nonEmptyFrames : List (Frame desc) -> List (Frame desc) nonEmptyFrames frames = List.filter (not << isEmpty) frames diff --git a/elm/Replicated/Node/Node.elm b/elm/Replicated/Node/Node.elm index 84255fac..f80c1ae5 100644 --- a/elm/Replicated/Node/Node.elm +++ b/elm/Replicated/Node/Node.elm @@ -111,7 +111,7 @@ startNewNode nowMaybe testMode givenStartChanges = [] firstChangeFrame = - Change.saveChanges "Node initialized" (givenStartChanges ++ startChanges) + Change.saveUserChanges "Node initialized" (givenStartChanges ++ startChanges) startNode = { identity = firstSessionEver @@ -343,7 +343,7 @@ Always supply the current time (`Just moment`). (Else, new Ops will be timestamped as if they occurred mere milliseconds after the previous save, which can cause them to always be considered "older" than other ops that happened between.) If the clock is set backwards or another node loses track of time, we will never go backwards in timestamps. -} -apply : Maybe Moment -> Bool -> Node -> Change.Frame -> { outputFrame : List Op.ClosedChunk, updatedNode : Node, created : List ObjectID } +apply : Maybe Moment -> Bool -> Node -> Change.Frame desc -> { outputFrame : List Op.ClosedChunk, updatedNode : Node, created : List ObjectID } apply timeMaybe testMode node (Change.Frame { changes, description }) = let nextUnseenCounter = diff --git a/elm/Shared/Model.elm b/elm/Shared/Model.elm index d40222d4..31282ca2 100644 --- a/elm/Shared/Model.elm +++ b/elm/Shared/Model.elm @@ -20,7 +20,7 @@ import SmartTime.Moment exposing (Moment) Intentionally minimal - we originally went with the common elm habit of stuffing any and all kinds of 'state' into the model, but we find it cleaner to separate the _"real" state_ (transient stuff, e.g. "dialog box is open", all stored in the page's URL (`viewState`)) from _"application data"_ (e.g. "task is due thursday", all stored in App "Database"). -} type alias Model = - { replicator : Components.Replicator.Replicator Profile + { replicator : Components.Replicator.Replicator Profile String , replica : Profile , viewportSize : { width : Int, height : Int } , viewportSizeClass : Element.DeviceClass @@ -36,4 +36,5 @@ type alias Model = , modal : Maybe PopupType , tickEnabled : Bool , oddModel : Odd.Model + , uiHistory : List Profile.UserChange } diff --git a/tests/ReplicaTests.elm b/tests/ReplicaTests.elm index 36833ddd..f813a656 100644 --- a/tests/ReplicaTests.elm +++ b/tests/ReplicaTests.elm @@ -252,7 +252,7 @@ nodeModifications = List.map (\( changer, _ ) -> changer exampleObjectFound) changeList { updatedNode, outputFrame } = - Node.apply Nothing beforeNode (Change.saveChanges "making some changes to the writable object" makeChanges) + Node.apply Nothing beforeNode (Change.saveUserChanges "making some changes to the writable object" makeChanges) logOps = Log.logMessageOnly (Console.green <| Op.closedChunksToFrameText outputFrame) () @@ -315,7 +315,7 @@ fakeNodeWithSimpleList = Ok repList -> let applied = - Node.apply Nothing startNode (Change.saveChanges "adding replist changes" [ addChanges repList ]) + Node.apply Nothing startNode (Change.saveUserChanges "adding replist changes" [ addChanges repList ]) logOps = Op.closedChunksToFrameText applied.outputFrame @@ -366,7 +366,7 @@ fakeNodeWithModifiedList = ] applied = - Node.apply Nothing fakeNodeWithSimpleList (Change.saveChanges "making some changes to the replist" changes) + Node.apply Nothing fakeNodeWithSimpleList (Change.saveUserChanges "making some changes to the replist" changes) logOps = Op.closedChunksToFrameText applied.outputFrame @@ -536,7 +536,7 @@ nodeWithModifiedNestedStressTest = SomeOfBoth (Codec.newN 1 (Codec.repList exampleSubObjectCodec) p) (Codec.newN 2 (Codec.repList exampleSubObjectCodec) p) applied = - Node.apply Nothing startNode (Change.saveChanges "modifying the nested stress test" changes) + Node.apply Nothing startNode (Change.saveUserChanges "modifying the nested stress test" changes) ronData = Op.closedChunksToFrameText startFrame ++ Console.bold (Op.closedChunksToFrameText applied.outputFrame) @@ -730,7 +730,7 @@ testDelayedCreation = -- outChunks = -- Debug.log "changes to delay test" <| all.outputFrame all = - Node.apply Nothing startNode (Change.saveChanges "making some changes to the delay test object" (givenChanges delayTestReplica)) + Node.apply Nothing startNode (Change.saveUserChanges "making some changes to the delay test object" (givenChanges delayTestReplica)) in all @@ -851,7 +851,7 @@ testSpawning = -- outChunks = -- Debug.log "changes to delay test" <| all.outputFrame all = - Node.apply Nothing startNode (Change.saveChanges "making some changes to the spawn test object" (givenChanges spawnTestReplica)) + Node.apply Nothing startNode (Change.saveUserChanges "making some changes to the spawn test object" (givenChanges spawnTestReplica)) in all