"vault backup: 2026-03-31 14:09:22 from Flow"

This commit is contained in:
2026-03-31 14:09:22 -05:00
parent 586608f863
commit 7eda728af6
4 changed files with 303 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
<TaskerData sr="" dvi="1" tv="6.6.20">
<Task sr="task9">
<cdate>1774931800563</cdate>
<edate>1774932946532</edate>
<id>9</id>
<nme>Git Sync</nme>
<Action sr="act0" ve="7">
<code>107361459</code>
<Bundle sr="arg0">
<Vals sr="val">
<EnableDisableAccessibilityService>&lt;null&gt;</EnableDisableAccessibilityService>
<EnableDisableAccessibilityService-type>java.lang.String</EnableDisableAccessibilityService-type>
<Password>&lt;null&gt;</Password>
<Password-type>java.lang.String</Password-type>
<com.twofortyfouram.locale.intent.extra.BLURB>Actions To Perform: openApp(com.viscouspot.gitsync)
click(text,SYNC CHANGES)
backOutOfApp()
Not In AutoInput: true
Not In Tasker: true
Separator: ,
Check Millis: 1000</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<net.dinglisch.android.tasker.JSON_ENCODED_KEYS>parameters</net.dinglisch.android.tasker.JSON_ENCODED_KEYS>
<net.dinglisch.android.tasker.JSON_ENCODED_KEYS-type>java.lang.String</net.dinglisch.android.tasker.JSON_ENCODED_KEYS-type>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ailastbounds
Last Bounds
Bounds (left,top,right,bottom) of the item that the action last interacted with&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%ailastcoordinates
Last Coordinates
Center coordinates (x,y) of the item that the action last interacted with&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%err
Error Code
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;%errmsg
Error Message
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;&lt;/StringArray&gt;</net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>parameters plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
<parameters>{"_action":"openApp(com.viscouspot.gitsync)\n\nclick(text,SYNC CHANGES)\n\nbackOutOfApp()","_additionalOptions":{"checkMs":"1000","separator":",","withCoordinates":false},"_whenToPerformAction":{"notInAutoInput":true,"notInTasker":true},"generatedValues":{}}</parameters>
<parameters-type>java.lang.String</parameters-type>
<plugininstanceid>5910f160-ad6a-4b47-ab40-810a62e77df1</plugininstanceid>
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
<plugintypeid>com.joaomgcd.autoinput.intent.IntentActionv2</plugintypeid>
<plugintypeid-type>java.lang.String</plugintypeid-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigActionv2</Str>
<Int sr="arg3" val="60"/>
<Int sr="arg4" val="1"/>
</Action>
<Action sr="act1" ve="7">
<code>130</code>
<Str sr="arg0" ve="3">JWL_Merge</Str>
<Int sr="arg1">
<var>%priority</var>
</Int>
<Int sr="arg10" val="1"/>
<Str sr="arg2" ve="3"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Int sr="arg5" val="0"/>
<Int sr="arg6" val="0"/>
<Str sr="arg7" ve="3"/>
<Int sr="arg8" val="0"/>
<Int sr="arg9" val="0"/>
</Action>
</Task>
</TaskerData>

View File

@@ -0,0 +1,110 @@
# JW Library Sync System: Architecture & Roadmap
**Date:** 2026-03-31
**Core Stack:** Android (Tablet/Phone), Tasker, AutoInput, GitSync, Gitea, n8n, jwlFusion.
---
## ## SYSTEM OVERVIEW
### 1. Local Backup (Tablet & Phone)
* **Trigger:** Time-based (04:30 AM Tablet / 04:35 AM Phone).
* **Action:** Tasker copies the `.jwlibrary` export from the app's export location to the local `vault` directory.
* **Sync:** Tasker uses **AutoInput** to:
1. Launch GitSync.
2. Click the "Sync" or "Push" button for the `vault` repository.
3. Wait for the notification/UI change indicating success.
### 2. Central Merge (The "Global Truth")
* **Trigger:** Tablet at 04:45 AM.
* **Action:** Tasker sends an **HTTP POST** to the n8n webhook (`bunny-wyvern.ts.net`).
* **n8n Logic:** 1. SSH into the server.
2. Pull all branch updates from Gitea.
3. Run `jwlFusion` to merge device backups into `master.jwlibrary`.
4. Commit and Push the merged file back to Gitea.
5. Return a `200 OK` "Sync successful" message to Tasker.
### 3. Restoration (Sync Back)
* **Action:** Upon receiving the `200 OK`, Tasker triggers the `RestoreFromMaster` task.
* **Logic:** GitSync pulls the latest `master.jwlibrary`, and Tasker (via AutoInput or intent) imports it back into the JW Library app.
---
## ## CURRENT CONFIGURATION (POST-INTENT DEPRECATION)
* **GitSync:** Bypassing Intent issues by using **AutoInput** to physically click the sync buttons.
* **Storage:** Vault is located at `/storage/emulated/0/vault` (Shared Storage).
* **Git Settings:** "Safe Directory" and "Credential Store" have been configured in the environment to prevent ownership/password prompts.
---
## ## TO-DO LIST (FOR TOMORROW)
- [ ] **AutoInput Optimization:** Refine the "Click" sequence in Tasker to ensure it handles the screen being off (using `Turn On` and `Dismiss Keyguard` actions).
- [ ] **Validation Check:** Run a manual end-to-end test:
1. Manually trigger Tablet Sync.
2. Manually trigger Phone Sync.
3. Manually trigger n8n Webhook via Tasker.
- [ ] **Error Handling:** Add a Tasker "Else" condition for the HTTP Request—if n8n returns an error, send a Join/Gotify notification so you know the merge failed.
- [ ] **Gitea Cleanup:** Verify the `.gitignore` in the `vault` folder is correctly ignoring temporary `.tmp` files created during the export process.
- [ ] **Staggering Review:** Confirm if 5 minutes is enough buffer for the Phone to finish its push before the Tablet initiates the Merge Script.
---
## ## FINAL SYSTEM LOGIC (4:30 AM SEQUENCE)
1. **04:30** (Tablet): Tasker -> AutoInput (GitSync Push).
2. **04:35** (Phone): Tasker -> AutoInput (GitSync Push).
3. **04:45** (Tablet): Tasker -> HTTP Request (n8n Webhook).
4. **On Success**: Tasker -> Perform Task (RestoreFromMaster).
# DETAILS
## PROJECT: Automated JW Library Multi-Device Sync (via Gitea/n8n)
**Status:** In Progress (Active Debugging Phase)
**User Persona:** INTJ (Prefers logic-first, no-fluff, technical precision)
---
### 1. THE ARCHITECTURE
The goal is to sync JW Library backups (.jwlibrary) across multiple Android devices using a central "Master" merge script.
* **Source Devices:** Android Tablet & Phone.
* **Storage:** Local Git "Vault" folder at `/storage/emulated/0/vault`.
* **Git Client:** GitSync (Android App).
* **Remote:** Self-hosted Gitea instance.
* **Orchestration:** n8n (running on `bunny-wyvern.ts.net`).
* **Merge Logic:** `jwlFusion` script on the server.
---
### 2. TECHNICAL HURDLES & CURRENT FIXES
* **Termux Plugin Failure:** The `Termux:Tasker` plugin failed with "Missing/Disabled Receiver" errors (likely due to Android 14 security or Play Store/F-Droid version mismatch). We abandoned Termux scripts for now.
* **GitSync Intent Failure:** Attempted to trigger GitSync via `com.viscouspot.gitsync.action.SYNC` intents, but the app did not respond to background broadcasts.
* **Current Solution:** Using **Tasker + AutoInput**. Tasker wakes the device, opens the GitSync UI, and AutoInput physically clicks "Sync" to ensure the push/pull happens.
---
### 3. THE DAILY TIMELINE (SCHEDULED)
* **04:30 AM (Tablet):** Tasker triggers. AutoInput clicks through GitSync to push the latest local backup to its own branch on Gitea.
* **04:35 AM (Phone):** Same process. Pushes its unique backup to its own branch.
* **04:45 AM (Tablet - Master Trigger):**
1. Tasker sends an **HTTP POST** to the n8n Webhook.
2. **n8n Workflow:** * SSH into the server.
* Pull all device branches.
* Run `jwlFusion` to merge everything into `master.jwlibrary`.
* Push `master.jwlibrary` to the `master` branch.
3. **Restoration:** Once n8n returns `200 OK`, the Tablet (and later the Phone) triggers a "Restore" task to pull the new `master` and import it into JW Library.
---
### 4. AGENT "TO-DO" LIST (FOR NEXT SESSION)
1. **Refine AutoInput:** Ensure the "Sync" clicks are robust (handling screen-off states or unexpected popups).
2. **n8n Webhook Verification:** Confirm the n8n SSH node is correctly executing the `jwlFusion` command and handling Git conflicts.
3. **Restore Logic:** Finalize the Tasker task that takes the pulled `master.jwlibrary` and automates the "Import" into the JW Library app.
4. **Race Condition Check:** Verify the 5-minute stagger between devices is sufficient for GitSync to finish its network operations.
---
### 5. REFERENCE DATA
* **Vault Path:** `/storage/emulated/0/vault`
* **n8n Webhook:** `http://n8n.bunny-wyvern.ts.net:5678/webhook/sync-jw-backup`
* **Personality Context:** User is an INTJ. Provide direct, technical solutions. No fluff.

View File

@@ -0,0 +1,86 @@
<TaskerData sr="" dvi="1" tv="6.6.20">
<Task sr="task8">
<cdate>1774931254224</cdate>
<edate>1774932950369</edate>
<id>8</id>
<nme>JWL_Merge</nme>
<Action sr="act0" ve="7">
<code>339</code>
<Bundle sr="arg0">
<Vals sr="val">
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%http_cookies
Cookies
The cookies the server sent in the response in the Cookie:COOKIE_VALUE format. You can use this directly in the 'Headers' field of the HTTP Request action&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%http_data
Data
Data that the server responded from the HTTP request.&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%http_file_output
File Output
Will always contain the file's full path even if you specified a directory as the File to save.&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;%http_response_code
Response Code
The HTTP Code the server responded&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4&gt;%http_headers()
Response Headers
The HTTP Headers the server sent in the response. Each header is in the 'key:value' format&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5&gt;%http_response_length
Response Length
The size of the response in bytes&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5&gt;&lt;/StringArray&gt;</net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
</Vals>
</Bundle>
<Int sr="arg1" val="1"/>
<Int sr="arg10" val="0"/>
<Int sr="arg11" val="0"/>
<Int sr="arg12" val="1"/>
<Str sr="arg2" ve="3">http://n8n.bunny-wyvern.ts.net:5678/webhook/sync-jw-backup</Str>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3">{"device": "Samsung-Tablet-S10+"}</Str>
<Str sr="arg6" ve="3"/>
<Str sr="arg7" ve="3"/>
<Int sr="arg8" val="60"/>
<Int sr="arg9" val="0"/>
</Action>
<Action sr="act1" ve="7">
<code>30</code>
<Int sr="arg0" val="0"/>
<Int sr="arg1" val="2"/>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
<Action sr="act2" ve="7">
<code>37</code>
<ConditionList sr="if">
<Condition sr="c0" ve="3">
<lhs>%http_data</lhs>
<op>2</op>
<rhs>*Successful*</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr="act3" ve="7">
<code>30</code>
<Int sr="arg0" val="0"/>
<Int sr="arg1" val="3"/>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
<Action sr="act4" ve="7">
<code>130</code>
<Str sr="arg0" ve="3">JWL_Restore_From_Git</Str>
<Int sr="arg1">
<var>%priority+1</var>
</Int>
<Int sr="arg10" val="1"/>
<Str sr="arg2" ve="3"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
<Int sr="arg5" val="0"/>
<Int sr="arg6" val="0"/>
<Str sr="arg7" ve="3"/>
<Int sr="arg8" val="0"/>
<Int sr="arg9" val="0"/>
</Action>
<Action sr="act5" ve="7">
<code>38</code>
</Action>
</Task>
</TaskerData>

View File

@@ -0,0 +1,146 @@
<TaskerData sr="" dvi="1" tv="6.6.20">
<Task sr="task5">
<cdate>1774912401659</cdate>
<edate>1774932910304</edate>
<id>5</id>
<nme>JWL_Restore_From_Git</nme>
<pri>100</pri>
<Action sr="act0" ve="7">
<code>20</code>
<App sr="arg0">
<appClass>org.jw.jwlibrary.mobile.MainActivity</appClass>
<appPkg>org.jw.jwlibrary.mobile</appPkg>
<label>JW Library</label>
</App>
<Str sr="arg1" ve="3"/>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="1"/>
</Action>
<Action sr="act1" ve="7">
<code>30</code>
<Int sr="arg0" val="0"/>
<Int sr="arg1" val="3"/>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
<Action sr="act2" ve="7">
<code>107361459</code>
<Bundle sr="arg0">
<Vals sr="val">
<EnableDisableAccessibilityService>&lt;null&gt;</EnableDisableAccessibilityService>
<EnableDisableAccessibilityService-type>java.lang.String</EnableDisableAccessibilityService-type>
<Password>&lt;null&gt;</Password>
<Password-type>java.lang.String</Password-type>
<com.twofortyfouram.locale.intent.extra.BLURB>Actions To Perform: click(id,org.jw.jwlibrary.mobile:id/nav_personal_study)
click(id,org.jw.jwlibrary.mobile:id/action_backup_restore)
click(text,Restore Backup)
Not In AutoInput: true
Not In Tasker: true
Separator: ,
Check Millis: 1000</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<net.dinglisch.android.tasker.JSON_ENCODED_KEYS>parameters</net.dinglisch.android.tasker.JSON_ENCODED_KEYS>
<net.dinglisch.android.tasker.JSON_ENCODED_KEYS-type>java.lang.String</net.dinglisch.android.tasker.JSON_ENCODED_KEYS-type>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ailastbounds
Last Bounds
Bounds (left,top,right,bottom) of the item that the action last interacted with&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%ailastcoordinates
Last Coordinates
Center coordinates (x,y) of the item that the action last interacted with&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%err
Error Code
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;%errmsg
Error Message
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;&lt;/StringArray&gt;</net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>parameters plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
<parameters>{"_action":"click(id,org.jw.jwlibrary.mobile:id/nav_personal_study)\n\nclick(id,org.jw.jwlibrary.mobile:id/action_backup_restore)\n\nclick(text,Restore Backup)","_additionalOptions":{"checkMs":"1000","separator":",","withCoordinates":false},"_whenToPerformAction":{"notInAutoInput":true,"notInTasker":true},"generatedValues":{}}</parameters>
<parameters-type>java.lang.String</parameters-type>
<plugininstanceid>4a568374-2445-46f3-be31-a879d2940e36</plugininstanceid>
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
<plugintypeid>com.joaomgcd.autoinput.intent.IntentActionv2</plugintypeid>
<plugintypeid-type>java.lang.String</plugintypeid-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigActionv2</Str>
<Int sr="arg3" val="60"/>
<Int sr="arg4" val="1"/>
</Action>
<Action sr="act3" ve="7">
<code>30</code>
<Int sr="arg0" val="0"/>
<Int sr="arg1" val="3"/>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
<Action sr="act4" ve="7">
<code>107361459</code>
<Bundle sr="arg0">
<Vals sr="val">
<EnableDisableAccessibilityService>&lt;null&gt;</EnableDisableAccessibilityService>
<EnableDisableAccessibilityService-type>java.lang.String</EnableDisableAccessibilityService-type>
<Password>&lt;null&gt;</Password>
<Password-type>java.lang.String</Password-type>
<com.twofortyfouram.locale.intent.extra.BLURB>Actions To Perform: click(text,Show roots)
click(text,Spencer's Tab S8+)
click(text,Vault)
click(text,JW_Backups)
wait(500)
click(id,com.google.android.documentsui:id/icon_thumb)
wait(500)
click(text,RESTORE)
click(text,CLOSE)
wait(500)
backOutOfApp()
Not In AutoInput: true
Not In Tasker: true
Separator: ,
Check Millis: 1000</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<net.dinglisch.android.tasker.JSON_ENCODED_KEYS>parameters</net.dinglisch.android.tasker.JSON_ENCODED_KEYS>
<net.dinglisch.android.tasker.JSON_ENCODED_KEYS-type>java.lang.String</net.dinglisch.android.tasker.JSON_ENCODED_KEYS-type>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ailastbounds
Last Bounds
Bounds (left,top,right,bottom) of the item that the action last interacted with&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%ailastcoordinates
Last Coordinates
Center coordinates (x,y) of the item that the action last interacted with&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%err
Error Code
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;%errmsg
Error Message
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;&lt;/StringArray&gt;</net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>parameters plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
<parameters>{"_action":"click(text,Show roots)\n\nclick(text,Spencer's Tab S8+)\n\nclick(text,Vault)\n\nclick(text,JW_Backups)\n\nwait(500)\n\nclick(id,com.google.android.documentsui:id/icon_thumb)\n\nwait(500)\n\nclick(text,RESTORE)\n\nclick(text,CLOSE)\n\nwait(500)\n\nbackOutOfApp()","_additionalOptions":{"checkMs":"1000","separator":",","withCoordinates":false},"_whenToPerformAction":{"notInAutoInput":true,"notInTasker":true},"generatedValues":{}}</parameters>
<parameters-type>java.lang.String</parameters-type>
<plugininstanceid>b68fb928-2b48-41e9-b01f-359d4826b699</plugininstanceid>
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
<plugintypeid>com.joaomgcd.autoinput.intent.IntentActionv2</plugintypeid>
<plugintypeid-type>java.lang.String</plugintypeid-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigActionv2</Str>
<Int sr="arg3" val="60"/>
<Int sr="arg4" val="1"/>
</Action>
</Task>
</TaskerData>